2013-05-03 3 views
0

Я пытаюсь написать команду JSFL, которая работает с выбранной в данный момент точкой/точками вершин/вершин, я не могу найти какой-либо метод для доступа к выбранной точке или точкам ..Как получить текущую выбранную точку/вершину с помощью JSFL

Я просмотрел справочник JSFL, и единственный метод, который имеет дело с выбранными вершинами, - moveSelectedBezierPointsBy();

ответ

0

Это действительно зависит от того, что вы пытаетесь сделать с вершинами, но это должно заставить вас начать.

Вот код, который я использовал в прошлом, чтобы получить информацию из вершин фигур на сцене:

// Trace Vertex Information - Andrew Doll 
// http://www.andrewdollanimation.com/ 

// Clear the output panel. 
fl.outputPanel.clear(); 

var dom = fl.getDocumentDOM(); 
var tl = dom.getTimeline(); 
var foundMovieClips = false; 
var layer; 
var frame; 
var element; 
var vertices = []; 
var movieClips = []; 
var newLine = "\r\n"; 
var lockStatus; 

// grab layers 
var layers = tl.layers; 

// layer loop 
for (var i = 0; i < layers.length; i++) 
{ 
    layer = layers[i]; 

    // Check if the layer is locked. 
    lockStatus = layer.locked; 
    if (lockStatus) 
    { 
     layer.locked = false; 
    } 
    // Frame loop 
    for (var j = 0; j < layer.frames.length; j++) 
    { 
     frame = layer.frames[j]; 

     // Element loop 
     for (var k = 0; k < frame.elements.length; k++) 
     { 
      element = frame.elements[k]; 
      element.selected = true; 

      // Only check elements that are shapes. 
      if (element.elementType == 'shape') 
      { 
       vertices = element.vertices; 
       var vertArray = []; 

       // Vertice loop 
       for (var l = 0; l < vertices.length; l++) 
       { 
        // Push the x and y coordinates of the vertices to the vertArray. 
        vertArray.push(' x: ' + vertices[l].x + ' y: ' + vertices[l].y); 
       } 

       // Trace the vertex count per frame. 
       fl.trace('The vertex count of frame ' + (j + 1) + ' on ' + layer.name + ' is: ' + vertices.length + newLine); 

       for (var m = 0; m < vertArray.length; m++) 
       { 
        // Trace the vertex locations. 
        fl.trace('Vertex ' + (m + 1) + ' on frame ' + (j + 1) + ' is located at: ' + vertArray[m]); 
       } 
      } 
      else if (element.elementType == 'instance') 
      { 
       // If a movie clip is found add it to the movie clips array. 
       foundMovieClips = true; 
       movieClips.push(element.libraryItem.name); 
      } 
     } 
     if (foundMovieClips) 
     { 
      foundMovieClips = false; 
      fl.trace('LAYER: ' + layer.name + ' FRAME: ' + (j + 1) + ' SYMBOL: ' + movieClips[j]); 
     } 
    } 
} 

Код выше будет работать через кадры на все слои основной временной шкалы и проследить количество вершин каждого кадра, и если он встречает мувиклип вместо формы, он будет прослеживать имя клипа. Помимо отслеживания количества вершин, он также проследит координаты X и Y каждой вершины на элементах формы, если находит на каждом кадре.

Идя далее, вы можете использовать метод JSFL: vertex.setLocation() для запуска массива объектов вершин и перемещения их к новым X и Y, если это то, что вы хотите сделать. Опять же, это действительно зависит от того, что вы пытаетесь сделать с вершинами в конце, но это должно заставить вас начать. Надеюсь, вы найдете этот ответ полезным.

+0

Спасибо за ответ, это решение полезно, но не решить мою проблему. Чтобы уточнить, я объясню, что я пытаюсь сделать ... Например, у меня есть форма, содержащая 8 вершин, если я нахожусь в «Subselection Tool», и у меня есть две из выбранных вершин, я хочу для выполнения моей команды и получения расстояния x и y между двумя вершинами – vidhill

1

Попытка решить подобную проблему я сделать некоторые пакости, которые могут быть полезны:

// array for some manipulations 
var selPoints = new Object(); 

// array with all points in layer[0] and frames[0] 
var allBezierPoints = fl.getDocumentDOM().getTimeline().layers[0].frames[0].elements[0].vertices 

// read and write all points coord 
for (i in allBezierPoints) { 
    selPoints[i] = { x:allBezierPoints[i].x, y:allBezierPoints[i].y } 
} 

// now dirty trick - move selected points by 1 px on X 
fl.getDocumentDOM().moveSelectedBezierPointsBy({x:1, y:0}); 

// reseting all points 
allBezierPoints = fl.getDocumentDOM().getTimeline().layers[0].frames[0].elements[0].vertices 

// compare old coord and new coord of all points 
for (i in allBezierPoints) { 
    // if coords similar, ther erase this point from array 
    if (allBezierPoints[i].x == selPoints[i].x) delete selPoints[i]; 
} 

// move selected points back 
fl.getDocumentDOM().moveSelectedBezierPointsBy({x:-1, y:0}); 

// now we have array with selected points and they coordinates 
for (i in selPoints) { 
    fl.trace ("Point " + i + " X: "+selPoints[i].x +", Y: "+ selPoints[i].y) 
} 
+0

Массовый отложенный ответ, но да, кажется, что это единственный способ сделать то, что я хотел. Спасибо – vidhill