diff --git a/dist/explode_shape_layer.jsx b/dist/explode_shape_layer.jsx index acf6652..0a14d0b 100644 --- a/dist/explode_shape_layer.jsx +++ b/dist/explode_shape_layer.jsx @@ -1,14 +1,21 @@ var configs = { title: 'Explode layer tool', + debug : false, log : true, itemAmountWarning : 50, + dryRun : false, }; -function consLog(text) { +function cLog(text) { if (configs.log) $.writeln(text); } +function cDebug(text) { + if (configs.debug) + $.writeln(text); +} + function listMatchNames(object) { for(var i=1; i <= object.numProperties; i++) { @@ -20,49 +27,113 @@ function listMatchNames(object) { } -_progressBar = new Window('palette', configs.title, undefined, { - resizeable : false, - borderless : 'not quite true', -}); - -_progressBar.preferredSize = [420, 40]; -_progressBar.bar = _progressBar.add("progressbar", undefined, 0, 100); -_progressBar.bar.value = 0; -_progressBar.bar.preferredSize.width = 400; -_progressBar.bar.show() - -_progressBar.barInfos = _progressBar.add("statictext", undefined, 'Loading, please wait', { - justify: 'center' -}); -_progressBar.barInfos.preferredSize = [400, 17]; - -_progressBar.make = function (min, max, current) { - this.barProps = { - min : min, - max : max, - current : current, +function ExecutionTime() { + + var startTime; + var endTime; + var execTime; + + this.constructor = function () {} + + this.start = function () { + startTime = new Date().getTime(); + } + + this.stop = function () { + endTime = new Date().getTime() + execTime = endTime - startTime; + } + + this.time = function () { + return 'Execution time : ' + Math.floor(execTime / 1000) + 's ' + (execTime % 1000) + 'ms'; } - this.barProps.total = (this.barProps.max - this.barProps.min) + 1; - this.barProps.step = (this.barProps.current - this.barProps.min) + 1; -} -_progressBar.updateBar = function () { - this.bar.value = Math.round(( (this.barProps.step) * 100) / this.barProps.max) - consLog('Processing element ' + (this.barProps.step + 1) + ' on ' + this.barProps.total); - this.barInfos.text = 'Processing element ' + (this.barProps.step + 1) + ' on ' + this.barProps.total; } -_progressBar.showBar = function () { this.show(); } +function ProgressBar(min, max, current) { + + var _window, + _progressBar, + _infos, + _real, + _cursor, + _isVisible; + + this.testInfos = 'Processing element :current on :max'; + + this.constructor = function(min, max, current) { -_progressBar.hideBar = function () { this.hide(); } + _this = this; + _isVisible = false; + + _real = { min : min, max : max, current : current }; + _cursor = { min : 0, max : 100, current : 0 }; + + _cursor.max = (_real.max - _real.min) + 1; + + // Instanciate the window + _window = new Window('palette', configs.title, undefined, { + resizeable : false, + borderless : 'not quite true', + }); + _window.preferredSize = [420, 40]; + + // Instanciate the progress bar + _progressBar = _window.add("progressbar", undefined, _cursor.min, _cursor.max); + _progressBar.preferredSize.width = 400; + _progressBar.show(); + + // Instanciate text infos + _infos = _window.add("statictext", undefined, 'Loading, please wait', { + justify: 'center' + }); + _infos.preferredSize = [400, 17]; + + this.update(current); + + + return this; + + } + + this.start = function () { + _isVisible = true; + this.update(_real.current) + _window.show(); + } + + this.end = function () { + _window.hide(); + } + + this.update = function(step) { + + _real.current = step; + _cursor.current = (_real.current + 1) - _real.min; + + var infos = this.testInfos + .replace(':current', _cursor.current) + .replace(':max', _cursor.max); + + _progressBar.value = _cursor.current; + _infos.text = infos; + + cDebug(infos); + + updateGraphics(); + } + + function updateGraphics() { + if(!_isVisible) return; + _window.update(); + } + + return this.constructor(min, max, current); -_progressBar.setCurrent = function (current, text) { - this.barProps.current = current; - this.barProps.step = (this.barProps.current - this.barProps.min) + 1; - this.updateBar(); - this.update(); } +// this.bar.value = Math.round(( (this.barProps.step) * 100) / this.barProps.max) + /* * @requires utils.jsx * @requires progressBar.jsx @@ -70,7 +141,7 @@ _progressBar.setCurrent = function (current, text) { function explodeLayer(layer) { - consLog('==============\n=============='); + cLog('Exploding layer : ' + layer.name); // Get the elements of the original shape layer var contents = layer.property("Contents"); @@ -87,15 +158,15 @@ function explodeLayer(layer) { } - _progressBar.make(1, contents.numProperties, 1); - _progressBar.showBar(); + var pb = new ProgressBar(1, contents.numProperties, 1); + pb.start(); // Browse through contents array for(var i = contents.numProperties; i > 0; i--) { // Get the original property var _prop = contents.property(i); - _progressBar.setCurrent(contents.numProperties - i) + pb.update(contents.numProperties - i) // Skip the property if not enabled if (!_prop.enabled) continue; @@ -105,6 +176,7 @@ function explodeLayer(layer) { new_layer.name = layer.name + ' - ' + _prop.name; new_layer.enabled = false; + new_layer.shy = true; layers.push(new_layer); @@ -116,12 +188,16 @@ function explodeLayer(layer) { } - _progressBar.hideBar(); + pb.end(); for(var i = 0; i < layers.length; i++) { layers[i].enabled = true; + layers[i].shy = false; + if(configs.dryRun) layers[i].remove(); } + return layers; + } function explode() { @@ -140,7 +216,29 @@ function explode() { return; } - explodeLayer(selectedLayer); + cLog('==================') + + cLog('Configs :') + for(config in configs) { + if(configs.hasOwnProperty(config)) + cLog(' ' + config + ' : ' + configs[config]) + } + + cLog('') + + var execTime = new ExecutionTime(); + execTime.start(); + + var hideShyLayers_originalState = selectedLayer.containingComp.hideShyLayers; + selectedLayer.containingComp.hideShyLayers = true; + + var layers = explodeLayer(selectedLayer); + + selectedLayer.moveToBeginning() + selectedLayer.containingComp.hideShyLayers = hideShyLayers_originalState; + + execTime.stop(); + cLog(execTime.time()); } @@ -166,7 +264,7 @@ function copyProperties(origin, target, prefix) { if(!_prop.enabled || !target.canAddProperty(_prop.matchName)) return; - consLog(prefix + _prop.matchName); + cDebug(prefix + _prop.matchName); var prop = target.addProperty(_prop.matchName); @@ -177,7 +275,7 @@ function copyProperties(origin, target, prefix) { break; case 'ADBE Vector Materials Group': - consLog(prefix + '-- skipped'); + cDebug(prefix + '-- skipped'); break; case 'ADBE Vector Graphic - Stroke': @@ -306,7 +404,7 @@ function createUI(that) { if(that instanceof Panel) { - var myPanel = that; + var _panel = that; } else { @@ -319,20 +417,14 @@ function createUI(that) { var btn = _panel.add("button", [10, 10, 100, 30], "Explode layer"); - _panel.text = configs.title; + // _panel.text = configs.title; _panel.bounds.width = 120; _panel.bounds.height = 40; btn.onClick = function() { - var startTime = new Date().getTime(); - explode(); - var execTime = new Date().getTime() - startTime; - - consLog('Execution time : ' + Math.floor(execTime / 1000) + 's ' + (execTime % 1000) + 'ms'); - } return _panel; diff --git a/dist/explode_shape_layer.min.jsx b/dist/explode_shape_layer.min.jsx index cf46aba..a0fba74 100644 --- a/dist/explode_shape_layer.min.jsx +++ b/dist/explode_shape_layer.min.jsx @@ -1 +1 @@ -function consLog(r){configs.log&&$.writeln(r)}function listMatchNames(r){for(var e=1;e<=r.numProperties;e++){var o=r.property(e);consLog(o.matchName+"("+o.name+")")}}function explodeLayer(r){consLog("==============\n==============");var e=r.property("Contents"),o=[];if(!(e.numProperties>configs.itemAmountWarning)||confirm("You have more than "+configs.itemAmountWarning+" elements. Execution time might be long, are you sure you want to continue ?")){_progressBar.make(1,e.numProperties,1),_progressBar.showBar();for(a=e.numProperties;a>0;a--){var t=e.property(a);if(_progressBar.setCurrent(e.numProperties-a),t.enabled){var p=emptyDuplicateLayer(r);p.name=r.name+" - "+t.name,p.enabled=!1,o.push(p),p.property("Contents").canAddProperty(t.matchName)&©Properties(t,p.property("Contents").addProperty(t.matchName),"")}}_progressBar.hideBar();for(var a=0;a1)alert("Select a single shape layer");else{var r=app.project.activeItem.selectedLayers[0];void 0!=r&&"ADBE Vector Layer"===r.matchName?explodeLayer(r):alert("Select a shape layer")}}function emptyDuplicateLayer(r){var e=r.containingComp.layers.addShape();return copyProperty("anchorPoint",r,e),copyProperty("position",r,e),copyProperty("scale",r,e),copyProperty("rotation",r,e),copyProperty("opacity",r,e),e}function copyProperties(r,e,o){for(var t=1;t<=r.numProperties;t++){var p=r.property(t);if(!p.enabled||!e.canAddProperty(p.matchName))return;consLog(o+p.matchName);var a=e.addProperty(p.matchName);switch(p.matchName){case"ADBE Vector Filter - Merge":copyProperty("mode",p,a);break;case"ADBE Vector Materials Group":consLog(o+"-- skipped");break;case"ADBE Vector Graphic - Stroke":copyPropertyStroke(p,a);break;case"ADBE Vector Graphic - Fill":copyPropertyFill(p,a);break;case"ADBE Vector Transform Group":copyPropertyTransform(p,a);break;case"ADBE Vector Shape - Rect":copyPropertyRect(p,a);break;case"ADBE Vector Shape - Ellipse":copyPropertyEllipse(p,a);break;case"ADBE Vector Shape - Star":copyPropertyStar(p,a);break;case"ADBE Root Vectors Group":case"ADBE Vectors Group":case"ADBE Vector Group":copyProperties(p,a,o+=" ");break;case"ADBE Vector Shape - Group":copyPropertyShape(p,a);break;case"ADBE Vector Blend Mode":a.setValue(p.value)}}}function copyProperty(r,e,o){o[r].setValue(e[r].value)}function copyPropertyShape(r,e){e.property("ADBE Vector Shape").setValue(r.property("ADBE Vector Shape").value)}function copyPropertyStroke(r,e){copyProperty("composite",r,e),copyProperty("color",r,e),copyProperty("strokeWidth",r,e),copyProperty("lineCap",r,e),copyProperty("lineJoin",r,e),copyProperty("miterLimit",r,e)}function copyPropertyFill(r,e){copyProperty("composite",r,e),copyProperty("fillRule",r,e),copyProperty("color",r,e)}function copyPropertyTransform(r,e){copyProperty("anchorPoint",r,e),copyProperty("position",r,e),copyProperty("scale",r,e),copyProperty("skew",r,e),copyProperty("skewAxis",r,e),copyProperty("rotation",r,e),copyProperty("opacity",r,e)}function copyPropertyRect(r,e){copyProperty("shapeDirection",r,e),copyProperty("size",r,e),copyProperty("position",r,e),copyProperty("roundness",r,e)}function copyPropertyEllipse(r,e){copyProperty("shapeDirection",r,e),copyProperty("size",r,e),copyProperty("position",r,e)}function copyPropertyStar(r,e){copyProperty("shapeDirection",r,e),copyProperty("type",r,e),copyProperty("points",r,e),copyProperty("position",r,e),copyProperty("rotation",r,e),copyProperty("innerRadius",r,e),copyProperty("outerRadius",r,e),copyProperty("innerRoundness",r,e),copyProperty("outerRoundness",r,e)}function createUI(r){if(r instanceof Panel);else{var e=new Window("palette",configs.title,void 0,{resizeable:!0});e.show()}var o=e.add("button",[10,10,100,30],"Explode layer");return e.text=configs.title,e.bounds.width=120,e.bounds.height=40,o.onClick=function(){var r=(new Date).getTime();explode();var e=(new Date).getTime()-r;consLog("Execution time : "+Math.floor(e/1e3)+"s "+e%1e3+"ms")},e}var configs={title:"Explode layer tool",log:!0,itemAmountWarning:50};_progressBar=new Window("palette",configs.title,void 0,{resizeable:!1,borderless:"not quite true"}),_progressBar.preferredSize=[420,40],_progressBar.bar=_progressBar.add("progressbar",void 0,0,100),_progressBar.bar.value=0,_progressBar.bar.preferredSize.width=400,_progressBar.bar.show(),_progressBar.barInfos=_progressBar.add("statictext",void 0,"Loading, please wait",{justify:"center"}),_progressBar.barInfos.preferredSize=[400,17],_progressBar.make=function(r,e,o){this.barProps={min:r,max:e,current:o},this.barProps.total=this.barProps.max-this.barProps.min+1,this.barProps.step=this.barProps.current-this.barProps.min+1},_progressBar.updateBar=function(){this.bar.value=Math.round(100*this.barProps.step/this.barProps.max),consLog("Processing element "+(this.barProps.step+1)+" on "+this.barProps.total),this.barInfos.text="Processing element "+(this.barProps.step+1)+" on "+this.barProps.total},_progressBar.showBar=function(){this.show()},_progressBar.hideBar=function(){this.hide()},_progressBar.setCurrent=function(r,e){this.barProps.current=r,this.barProps.step=this.barProps.current-this.barProps.min+1,this.updateBar(),this.update()};var _panel=createUI(this); \ No newline at end of file +function cLog(e){configs.log&&$.writeln(e)}function cDebug(e){configs.debug&&$.writeln(e)}function listMatchNames(e){for(var r=1;r<=e.numProperties;r++){var o=e.property(r);consLog(o.matchName+"("+o.name+")")}}function ExecutionTime(){var e,r,o;this.constructor=function(){},this.start=function(){e=(new Date).getTime()},this.stop=function(){r=(new Date).getTime(),o=r-e},this.time=function(){return"Execution time : "+Math.floor(o/1e3)+"s "+o%1e3+"ms"}}function ProgressBar(e,r,o){function t(){s&&n.update()}var n,p,c,i,a,s;return this.testInfos="Processing element :current on :max",this.constructor=function(e,r,o){return _this=this,s=!1,i={min:e,max:r,current:o},a={min:0,max:100,current:0},a.max=i.max-i.min+1,n=new Window("palette",configs.title,void 0,{resizeable:!1,borderless:"not quite true"}),n.preferredSize=[420,40],p=n.add("progressbar",void 0,a.min,a.max),p.preferredSize.width=400,p.show(),c=n.add("statictext",void 0,"Loading, please wait",{justify:"center"}),c.preferredSize=[400,17],this.update(o),this},this.start=function(){s=!0,this.update(i.current),n.show()},this.end=function(){n.hide()},this.update=function(e){i.current=e,a.current=i.current+1-i.min;var r=this.testInfos.replace(":current",a.current).replace(":max",a.max);p.value=a.current,c.text=r,cDebug(r),t()},this.constructor(e,r,o)}function explodeLayer(e){cLog("Exploding layer : "+e.name);var r=e.property("Contents"),o=[];if(!(r.numProperties>configs.itemAmountWarning)||confirm("You have more than "+configs.itemAmountWarning+" elements. Execution time might be long, are you sure you want to continue ?")){var t=new ProgressBar(1,r.numProperties,1);t.start();for(c=r.numProperties;c>0;c--){var n=r.property(c);if(t.update(r.numProperties-c),n.enabled){var p=emptyDuplicateLayer(e);p.name=e.name+" - "+n.name,p.enabled=!1,p.shy=!0,o.push(p),p.property("Contents").canAddProperty(n.matchName)&©Properties(n,p.property("Contents").addProperty(n.matchName),"")}}t.end();for(var c=0;c1)alert("Select a single shape layer");else{var e=app.project.activeItem.selectedLayers[0];if(void 0!=e&&"ADBE Vector Layer"===e.matchName){cLog("=================="),cLog("Configs :");for(config in configs)configs.hasOwnProperty(config)&&cLog(" "+config+" : "+configs[config]);cLog("");var r=new ExecutionTime;r.start();var o=e.containingComp.hideShyLayers;e.containingComp.hideShyLayers=!0;explodeLayer(e);e.moveToBeginning(),e.containingComp.hideShyLayers=o,r.stop(),cLog(r.time())}else alert("Select a shape layer")}}function emptyDuplicateLayer(e){var r=e.containingComp.layers.addShape();return copyProperty("anchorPoint",e,r),copyProperty("position",e,r),copyProperty("scale",e,r),copyProperty("rotation",e,r),copyProperty("opacity",e,r),r}function copyProperties(e,r,o){for(var t=1;t<=e.numProperties;t++){var n=e.property(t);if(!n.enabled||!r.canAddProperty(n.matchName))return;cDebug(o+n.matchName);var p=r.addProperty(n.matchName);switch(n.matchName){case"ADBE Vector Filter - Merge":copyProperty("mode",n,p);break;case"ADBE Vector Materials Group":cDebug(o+"-- skipped");break;case"ADBE Vector Graphic - Stroke":copyPropertyStroke(n,p);break;case"ADBE Vector Graphic - Fill":copyPropertyFill(n,p);break;case"ADBE Vector Transform Group":copyPropertyTransform(n,p);break;case"ADBE Vector Shape - Rect":copyPropertyRect(n,p);break;case"ADBE Vector Shape - Ellipse":copyPropertyEllipse(n,p);break;case"ADBE Vector Shape - Star":copyPropertyStar(n,p);break;case"ADBE Root Vectors Group":case"ADBE Vectors Group":case"ADBE Vector Group":copyProperties(n,p,o+=" ");break;case"ADBE Vector Shape - Group":copyPropertyShape(n,p);break;case"ADBE Vector Blend Mode":p.setValue(n.value)}}}function copyProperty(e,r,o){o[e].setValue(r[e].value)}function copyPropertyShape(e,r){r.property("ADBE Vector Shape").setValue(e.property("ADBE Vector Shape").value)}function copyPropertyStroke(e,r){copyProperty("composite",e,r),copyProperty("color",e,r),copyProperty("strokeWidth",e,r),copyProperty("lineCap",e,r),copyProperty("lineJoin",e,r),copyProperty("miterLimit",e,r)}function copyPropertyFill(e,r){copyProperty("composite",e,r),copyProperty("fillRule",e,r),copyProperty("color",e,r)}function copyPropertyTransform(e,r){copyProperty("anchorPoint",e,r),copyProperty("position",e,r),copyProperty("scale",e,r),copyProperty("skew",e,r),copyProperty("skewAxis",e,r),copyProperty("rotation",e,r),copyProperty("opacity",e,r)}function copyPropertyRect(e,r){copyProperty("shapeDirection",e,r),copyProperty("size",e,r),copyProperty("position",e,r),copyProperty("roundness",e,r)}function copyPropertyEllipse(e,r){copyProperty("shapeDirection",e,r),copyProperty("size",e,r),copyProperty("position",e,r)}function copyPropertyStar(e,r){copyProperty("shapeDirection",e,r),copyProperty("type",e,r),copyProperty("points",e,r),copyProperty("position",e,r),copyProperty("rotation",e,r),copyProperty("innerRadius",e,r),copyProperty("outerRadius",e,r),copyProperty("innerRoundness",e,r),copyProperty("outerRoundness",e,r)}function createUI(e){if(e instanceof Panel)var r=e;else(r=new Window("palette",configs.title,void 0,{resizeable:!0})).show();var o=r.add("button",[10,10,100,30],"Explode layer");return r.bounds.width=120,r.bounds.height=40,o.onClick=function(){explode()},r}var configs={title:"Explode layer tool",debug:!1,log:!0,itemAmountWarning:50,dryRun:!1},_panel=createUI(this); \ No newline at end of file