/* JSFL TransformationPoint.jsfl Flash CS3 extension "TrasformationPoint" Version 1.1.1 author Eiji Saito since 2008-05-11 update 2008-07-31 : Version 1.1.0 rotation & skew busgfix update 2008-07-31 : Version 1.1.1 fl.trace busgfix WindowSWF/TrasformationPoint.swf WindowSWF/TrasformationPoint/TransformationPoint.jsfl Flash CS3 fl.getDocumentDOM().setTransformationPoint crashes when two or more elements have been selected. */ /* var isElementMode = true; var setX = 0; var setY = 0; var isCenterMode = true; var isRatioMode = false; setAdvancedTransformationPoint( setX, setY, isCenterMode, isRatioMode, isElementMode ); resetTransformationPoint(); */ var doc = fl.getDocumentDOM(); var ACTION_NAME = "TransformationPoint"; /** * set TransformationPoint. * @param {String} TransformationPoint X point or X Ratio( 0.0 - 1.0) * @param {String} TransformationPoint Y point or Y Ratio( 0.0 - 1.0) * @param {Boolean} centerMode * @param {Boolean} ratioMode * @param {Boolean} elementMode */ function setAdvancedTransformationPoint( setX, setY, isCenterMode, isRatioMode, isElementMode ) { if ( doc == null ) { return; } //-------------------------------------- // Bug? ( Flash CS3 ) // fl.getDocumentDOM().setTransformationPoint crashes when two or more elements have been selected. //-------------------------------------- if ( isElementMode == null ) { isElementMode = true; } //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- startFlOutput( ACTION_NAME ); //-------------------------------------- var pX = eval( setX ); var pY = eval( setY ); if ( pX == Infinity || isNaN( pX ) ) { pX = 0; } if ( pY == Infinity || isNaN( pY ) ) { pY = 0; } if ( isElementMode ) { // fl.trace( "\t" + "Element Mode" ); elementTransformationPoint( pX, pY, isCenterMode, isRatioMode ); } else { // fl.trace( "\t" + "Selection Mode" ); // fl.getDocumentDOM().setTransformationPoint crashes when two or more elements have been selected. selectionTransformationPoint( pX, pY, isCenterMode, isRatioMode ); } } /** * set elements transformation point. * @param {Number} TransformationPoint X point or X Ratio( 0.0 - 1.0) * @param {Number} TransformationPoint Y point or Y Ration( 0.0 - 1.0) * @param {Boolean} centerMode * @param {Boolean} ratioMode */ function elementTransformationPoint( pointX, pointY, isCenter, isRatio ) { if ( isCenter ) { isRatio = false; } var selectionArray = doc.selection; var len = selectionArray.length; var noApplyLen = 0; //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- settingsFlOutput( pointX, pointY, isCenter, isRatio ); //-------------------------------------- for ( var i = 0 ; i < len ; i++ ) { var element = selectionArray[ i ]; //-------------------------------------- // CHECK ROTATION & SKEW //-------------------------------------- // value of element's rotation -180 ~ 180 var orgElementRotation = element.rotation; // check skew if( isNaN( orgElementRotation) ) { noApplyLen++; continue; } // ajust rotation var val1 = Math.abs( Math.round( orgElementRotation ) ); var val2 = Math.abs( orgElementRotation ); if( Math.abs( val1 - val2 ) < 0.1 ) { orgElementRotation = Math.round(orgElementRotation); } // check 45 90 135 -45 -90 -135- if ( ( orgElementRotation % 45 ) != 0 ) { noApplyLen++; continue; } //-------------------------------------- // SAVE ORIGINAL TRANSFORM //-------------------------------------- var orgElementScX = element.scaleX; var orgElementScY = element.scaleY; var orgElementX = element.x; var orgElementY = element.y; // reset rotation element.rotation = 0; //-------------------------------------- // GET ELEMENT'S VALUE //-------------------------------------- // value of element's size var elementW = element.width; var elementH = element.height; // value of element's scale var elementScX = element.scaleX; var elementScY = element.scaleY; // value of element's x & y ( depends on symbol's registration point ) var elementX = element.x; var elementY = element.y; // value of element's LEFT & TOP var elementLeft = element.left; var elementTop = element.top; // value of symbol's LEFT & TOP var registrationX = 0; var registrationY = 0; if ( elementLeft != elementX ) { registrationX = ( elementLeft - elementX ) / elementScX; } if ( elementLeft != elementX ) { registrationY = ( elementTop - elementY ) / elementScY; } //-------------------------------------- // TRANSFORMATION POINT //-------------------------------------- var tpX = pointX; var tpY = pointY; // scale ajust tpX /= elementScX; tpY /= elementScY; // for ratio mode if ( isRatio ) { tpX *= elementW; tpY *= elementH; } // registration point ajust tpX += registrationX; tpY += registrationY; //-------------------------------------- // SET TRANSFORMATION POINT //-------------------------------------- /* elementType : "shape", "text", "instance" "shape" : drawing object, primitive object, group "text" : text field "instance" : symbol, bitmap, video shape : 0,0 is center point text : 0,0 is LEFT-TOP point instance : 0,0 is symbol's registration point */ var elementType = element.elementType; switch ( elementType ) { case "shape" : if ( isCenter ) { tpX = 0 + pointX; tpY = 0 + pointY; if ( tpX != 0 ) { tpX /= elementScX; } if ( tpY != 0 ) { tpY /= elementScX; } } element.setTransformationPoint ( { x:tpX, y:tpY } ); break; case "text" : case "instance" : if ( isCenter ) { var centerX = ( elementW / 2 ) / elementScX; var centerY = ( elementH / 2 ) / elementScY; tpX += centerX; tpY += centerY; } element.setTransformationPoint ( { x:tpX, y:tpY } ); break; default : break; } //end of switch //-------------------------------------- // APPLY ORIGINAL TRANSFORM //-------------------------------------- element.rotation = orgElementRotation; element.scaleX = orgElementScX; element.scaleY = orgElementScY; element.x = orgElementX; element.y = orgElementY; } // end of for //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- itemCntFlOutput( len, noApplyLen ); endFlOutput(); //-------------------------------------- } /** * set selection transformation point. * @param {Number} TransformationPoint X point or X Ratio( 0.0 - 1.0) * @param {Number} TransformationPoint Y point or Y Ratio( 0.0 - 1.0) * @param {Boolean} centerMode * @param {Boolean} ratioMode */ function selectionTransformationPoint( pointX, pointY, isCenter, isRatio ) { //-------------------------------------- // NOTICE // Bug? ( Flash CS3 ) // fl.getDocumentDOM().setTransformationPoint crashes when two or more elements have been selected. //-------------------------------------- if ( isCenter ) { isRatio = false; } var selectionRect = doc.getSelectionRect(); //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- settingsFlOutput( pointX, pointY, isCenter, isRatio ); //-------------------------------------- //-------------------------------------- // GET SELECTION'S VALUE //-------------------------------------- var selectionLeft = selectionRect.left; var selectionTop = selectionRect.top; var selectionRight = selectionRect.right; var selectionBottom = selectionRect.bottom; var selectionW = selectionRight - selectionLeft; var selectionH = selectionBottom - selectionTop; //-------------------------------------- // TRANSFORMATION POINT //-------------------------------------- var tpX = pointX; var tpY = pointY; if ( isRatio ) { tpX *= selectionW; tpY *= selectionH; } tpX += selectionLeft; tpY += selectionTop; if ( isCenter ) { var centerX = selectionW / 2; var centerY = selectionH / 2; tpX += centerX; tpY += centerY; } //-------------------------------------- // SET TRANSFORMATION POINT //-------------------------------------- doc.setTransformationPoint( { x:tpX, y:tpY } ); //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- endFlOutput(); //-------------------------------------- } /** * reset TransformationPoint. */ function resetTransformationPoint() { if ( doc == null ) { return; } //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- startFlOutput( ACTION_NAME ); //-------------------------------------- var selectionArray = doc.selection; var len = selectionArray.length; //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- resetFlOutput(); //-------------------------------------- //-------------------------------------- // SET TRANSFORMATION POINT //-------------------------------------- for ( var i = 0 ; i < len ; i++ ) { var element = selectionArray[ i ]; element.setTransformationPoint ( { x:0, y:0 } ); } //-------------------------------------- // FOR OUTPUT PANEL //-------------------------------------- itemCntFlOutput( len, 0 ); endFlOutput(); //-------------------------------------- } //-------------------------------------- // FUNCTION FOR FLASH OUTPUT PANEL //-------------------------------------- function startFlOutput( actionName ) { fl.outputPanel.clear(); fl.trace( "> " + actionName ); } function settingsFlOutput( valueX, valueY, centerMode, ratioMode ) { var traceStr = ""; if ( centerMode ) { fl.trace( "\t" + "from CENTER" ); fl.trace( "\t" + "X : " + valueX + ", Y : " + valueY ); } else { fl.trace( "\t" + "from LEFT-TOP" ); if ( ratioMode ) { fl.trace( "\t" + "X Ratio : " + valueX + ", Y Ratio : " + valueY ); } else { fl.trace( "\t" + "X : " + valueX + ", Y : " + valueY ); } } } function resetFlOutput() { fl.trace( "\t" + "RESET" ); } function itemCntFlOutput( itemLength, noApplyCount ) { var lenStr = " item"; if ( itemLength > 1 ) { lenStr += "s"; } fl.trace( "\t" + "selected : " + itemLength + lenStr ); var applyCount = itemLength - noApplyCount; var cntStr = " item"; if ( applyCount > 1 ) { cntStr += "s"; } fl.trace( "\t" + " applied : " + applyCount + cntStr ); } function endFlOutput() { fl.trace( "> done." ); fl.trace( "" ); }