Flash 如何使用JSFL获取当前选定的点/顶点

Flash 如何使用JSFL获取当前选定的点/顶点,flash,jsfl,Flash,Jsfl,我正在尝试编写一个JSFL命令来处理当前选定的顶点/垂直点/点,我找不到任何方法来访问当前选定的点 我已经搜索了JSFL参考,处理选定顶点的唯一方法是moveSelectedBezierPointsBy() 这实际上取决于你试图对顶点做什么,但这应该让你开始 下面是我过去用来从舞台上的形状检索顶点信息的一些代码: // Trace Vertex Information - Andrew Doll // http://www.andrewdollanimation.com/ // Clear t

我正在尝试编写一个JSFL命令来处理当前选定的顶点/垂直点/点,我找不到任何方法来访问当前选定的点


我已经搜索了JSFL参考,处理选定顶点的唯一方法是moveSelectedBezierPointsBy()

这实际上取决于你试图对顶点做什么,但这应该让你开始

下面是我过去用来从舞台上的形状检索顶点信息的一些代码:

// 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]);
        }
    }
}
//跟踪顶点信息-Andrew Doll
// http://www.andrewdollanimation.com/
//清除输出面板。
fl.outputPanel.clear();
var dom=fl.getDocumentDOM();
var tl=dom.getTimeline();
var foundMovieClips=false;
var层;
var框架;
var元素;
var顶点=[];
var movieClips=[];
var newLine=“\r\n”;
var锁定状态;
//抓取层
var层=tl.layers;
//层环
对于(变量i=0;i
上面的代码将在主时间轴的所有层上的帧中运行,并跟踪出每个帧的顶点计数,如果遇到的是movieclip而不是形状,则将跟踪出电影剪辑的名称。除了追踪顶点计数,如果在每个帧上找到,它还将追踪形状元素上每个顶点的X和Y坐标


更进一步,您可以使用JSFL方法:运行顶点对象数组,并将它们移动到新的X和Y(如果您希望这样做的话)。再次强调,这实际上取决于您最终尝试对顶点执行的操作,但这应该让您开始。希望这个答案对你有帮助。

为了解决类似的问题,我做了一些肮脏的把戏,可能会有帮助:

// 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)
}

感谢您的回复,该解决方案很有帮助,但无法解决我的问题。为了澄清,我将解释我试图做什么。。。例如,我有一个包含8个顶点的形状,如果我在“子选择工具”中,并且选择了其中两个顶点,我想运行命令并获得两个顶点之间的x和y距离。回复延迟过大,但是,是的,这似乎是我想做的唯一方法。谢谢