11var configs = {
22 title : 'Explode layer tool' ,
33 debug : false ,
4- log : true ,
4+ log : false ,
55 itemAmountWarning : 50 ,
66 dryRun : false ,
77} ;
88
99function cLog ( text ) {
10- if ( configs . log )
11- $ . writeln ( text ) ;
10+ if ( ! configs . log ) {
11+ return ;
12+ }
13+
14+ $ . writeln ( text ) ;
1215}
1316
1417function cDebug ( text ) {
15- if ( configs . debug )
16- $ . writeln ( text ) ;
18+ if ( ! configs . debug ) {
19+ return ;
20+ }
21+
22+ $ . writeln ( text ) ;
1723}
1824
1925function listMatchNames ( object ) {
@@ -161,33 +167,39 @@ function explodeLayer(layer) {
161167 var pb = new ProgressBar ( 1 , contents . numProperties , 1 ) ;
162168 pb . start ( ) ;
163169
164- // Browse through contents array
165- for ( var i = contents . numProperties ; i > 0 ; i -- ) {
170+ try {
171+ // Browse through contents array
172+ for ( var i = contents . numProperties ; i > 0 ; i -- ) {
166173
167- // Get the original property
168- var _prop = contents . property ( i ) ;
169- pb . update ( contents . numProperties - i )
174+ // Get the original property
175+ var _prop = contents . property ( i ) ;
176+ pb . update ( contents . numProperties - i )
170177
171- // Skip the property if not enabled
172- if ( ! _prop . enabled ) continue ;
178+ // Skip the property if not enabled
179+ if ( ! _prop . enabled ) continue ;
173180
174- // Duplicate the original layer and rename with property name
175- var new_layer = emptyDuplicateLayer ( layer )
181+ // Duplicate the original layer and rename with property name
182+ var new_layer = emptyDuplicateLayer ( layer )
176183
177- new_layer . name = layer . name + ' - ' + _prop . name ;
178- new_layer . enabled = false ;
179- new_layer . shy = true ;
184+ new_layer . name = layer . name + ' - ' + _prop . name ;
185+ new_layer . enabled = false ;
186+ new_layer . shy = true ;
180187
181- layers . push ( new_layer ) ;
188+ layers . push ( new_layer ) ;
182189
183- if ( ! new_layer . property ( "Contents" ) . canAddProperty ( _prop . matchName ) ) continue ;
190+ if ( ! new_layer . property ( "Contents" ) . canAddProperty ( _prop . matchName ) ) continue ;
184191
185- var prop = new_layer . property ( "Contents" ) . addProperty ( _prop . matchName )
192+ var prop = new_layer . property ( "Contents" ) . addProperty ( _prop . matchName )
186193
187- copyProperties ( _prop , prop , '' )
194+ copyProperties ( _prop , prop , 0 )
188195
196+ }
197+ } catch ( e ) {
198+ cLog ( "An error occured: " + e . message ) ;
199+ pb . end ( ) ;
189200 }
190201
202+
191203 pb . end ( ) ;
192204
193205 for ( var i = 0 ; i < layers . length ; i ++ ) {
@@ -243,165 +255,122 @@ function explode() {
243255}
244256
245257function emptyDuplicateLayer ( layer ) {
246-
247258 var new_layer = layer . containingComp . layers . addShape ( ) ;
248259
249- copyProperty ( 'anchorPoint' , layer , new_layer ) ;
250- copyProperty ( 'position' , layer , new_layer ) ;
251- copyProperty ( 'scale' , layer , new_layer ) ;
252- copyProperty ( 'rotation' , layer , new_layer ) ;
253- copyProperty ( 'opacity' , layer , new_layer ) ;
260+ new_layer [ 'anchorPoint' ] . setValue ( layer [ 'anchorPoint' ] . value ) ;
261+ new_layer [ 'position' ] . setValue ( layer [ 'position' ] . value ) ;
262+ new_layer [ 'scale' ] . setValue ( layer [ 'scale' ] . value ) ;
263+ new_layer [ 'rotation' ] . setValue ( layer [ 'rotation' ] . value ) ;
264+ new_layer [ 'opacity' ] . setValue ( layer [ 'opacity' ] . value ) ;
254265
255266 return new_layer ;
256-
257267}
258268
259- function copyProperties ( origin , target , prefix ) {
269+ var treeChildPrefix = "⌞ " ;
270+ var propertiesBlacklist = [
271+ 'ADBE Vector Taper StartWidthPx' ,
272+ 'ADBE Vector Taper EndWidthPx' ,
273+ 'ADBE Vector Taper Wave Cycles' ,
274+ 'ADBE Vector Stroke Dashes' ,
275+ 'ADBE Vector Materials Group' ,
276+ ] ;
277+
278+ /**
279+ * Copy properties of a layer to another (recursive).
280+ *
281+ * @param {Object } origin
282+ * @param {Object } target
283+ * @param {Number } level
284+ */
285+ function copyProperties ( origin , target , level ) {
286+ var indent = repeatStr ( " " , level ) ;
287+
288+ // if(level === 0) {
289+ cDebug ( indent + origin . name ) ;
290+ // }
260291
292+ // Process (copy) each property of the origin to the target
261293 for ( var i = 1 ; i <= origin . numProperties ; i ++ ) {
294+ var originalProp = origin . property ( i ) ;
295+ var matchName = originalProp . matchName ;
262296
263- var _prop = origin . property ( i ) ;
264-
265- if ( ! _prop . enabled || ! target . canAddProperty ( _prop . matchName ) ) return ;
266-
267- cDebug ( prefix + _prop . matchName ) ;
297+ // Do not copy disabled properties
298+ if ( ! originalProp . enabled ) {
299+ cDebug ( indent + treeChildPrefix + matchName + " (skipped: disabled)" ) ;
300+ continue ;
301+ } ;
302+
268303
269- var prop = target . addProperty ( _prop . matchName ) ;
304+ // Get or create the target property
305+ var targetProp = target . property ( matchName ) ;
270306
271- switch ( _prop . matchName ) {
272-
273- case 'ADBE Vector Filter - Merge' :
274- copyProperty ( 'mode' , _prop , prop )
275- break ;
276-
277- case 'ADBE Vector Materials Group' :
278- cDebug ( prefix + '-- skipped' ) ;
279- break ;
280-
281- case 'ADBE Vector Graphic - Stroke' :
282- copyPropertyStroke ( _prop , prop ) ;
283- break ;
284-
285- case 'ADBE Vector Graphic - Fill' :
286- copyPropertyFill ( _prop , prop ) ;
287- break ;
288-
289- case 'ADBE Vector Transform Group' :
290- copyPropertyTransform ( _prop , prop ) ;
291- break ;
292-
293- case 'ADBE Vector Shape - Rect' :
294- copyPropertyRect ( _prop , prop ) ;
295- break ;
296-
297- case 'ADBE Vector Shape - Ellipse' :
298- copyPropertyEllipse ( _prop , prop ) ;
299- break ;
300-
301- case 'ADBE Vector Shape - Star' :
302- copyPropertyStar ( _prop , prop ) ;
303- break ;
304-
305- case 'ADBE Root Vectors Group' :
306- case 'ADBE Vectors Group' :
307- case 'ADBE Vector Group' :
308- copyProperties ( _prop , prop , prefix += ' ' )
309- break ;
310-
311- case 'ADBE Vector Shape - Group' :
312- copyPropertyShape ( _prop , prop ) ;
313- break ;
314-
315- case 'ADBE Vector Blend Mode' :
316- prop . setValue ( _prop . value ) ;
317- break ;
307+ if ( ! targetProp ) {
308+ targetProp = target . addProperty ( matchName ) ;
309+ }
310+
311+ // Still no property ? Then the property is probably not supported
312+ if ( ! targetProp ) {
313+ cDebug ( indent + treeChildPrefix + matchName + " (skipped: cannot be added)" ) ;
314+ continue ;
315+ }
318316
317+ // Skip properties that cannot be set without being displayed
318+ if ( arrayIncludes ( propertiesBlacklist , matchName ) ) {
319+ cDebug ( indent + "⚬ " + matchName + " (skipped: not editable when hidden)" ) ;
320+ continue ;
321+ }
322+
323+ // Handle property
324+ if ( typeof originalProp . setValue === "function" ) {
325+ cDebug ( indent + treeChildPrefix + matchName ) ;
326+ targetProp . setValue ( originalProp . value ) ;
327+ continue ;
328+ }
329+
330+ // Handle property groups/layers
331+ if ( originalProp . numProperties > 0 ) {
332+ cDebug ( indent + treeChildPrefix + matchName ) ;
333+ copyProperties ( originalProp , targetProp , level + 1 ) ;
334+ continue ;
319335 }
320336
337+ cDebug ( indent + "⦵ " + matchName + " (skipped: no reason)" ) ;
321338 }
322-
323- }
324-
325- function copyProperty ( name , origin , target ) {
326- target [ name ] . setValue ( origin [ name ] . value ) ;
327- }
328-
329- function copyPropertyShape ( origin , target ) {
330- target . property ( 'ADBE Vector Shape' ) . setValue ( origin . property ( 'ADBE Vector Shape' ) . value ) ;
331339}
332340
333- function copyPropertyStroke ( origin , target ) {
334-
335- copyProperty ( 'composite' , origin , target ) ;
336- copyProperty ( 'color' , origin , target ) ;
337- copyProperty ( 'strokeWidth' , origin , target ) ;
338- copyProperty ( 'lineCap' , origin , target ) ;
339- copyProperty ( 'lineJoin' , origin , target ) ;
340- copyProperty ( 'miterLimit' , origin , target ) ;
341-
342- // TOFIX : dash are present, no mater if deleted or not ! (disabled for now)
343- // if(false && origin.dash.enabled) {
344- //
345- // for(var i=1; i <= origin.dash.numProperties; i++) {
346- //
347- // var dashProp = origin.dash.property(i);
348- //
349- // if(dashProp.enabled)
350- // target.dash.addProperty(dashProp.matchName).setValue(dashProp.value);
351- //
352- // }
353- //
354- // }
355-
356- }
357-
358- function copyPropertyFill ( origin , target ) {
359-
360- copyProperty ( 'composite' , origin , target ) ;
361- copyProperty ( 'fillRule' , origin , target ) ;
362- copyProperty ( 'color' , origin , target ) ;
363-
364- }
365-
366- function copyPropertyTransform ( origin , target ) {
367-
368- copyProperty ( 'anchorPoint' , origin , target ) ;
369- copyProperty ( 'position' , origin , target ) ;
370- copyProperty ( 'scale' , origin , target ) ;
371- copyProperty ( 'skew' , origin , target ) ;
372- copyProperty ( 'skewAxis' , origin , target ) ;
373- copyProperty ( 'rotation' , origin , target ) ;
374- copyProperty ( 'opacity' , origin , target ) ;
375-
376- }
377-
378- function copyPropertyRect ( origin , target ) {
379- copyProperty ( 'shapeDirection' , origin , target )
380- copyProperty ( 'size' , origin , target )
381- copyProperty ( 'position' , origin , target )
382- copyProperty ( 'roundness' , origin , target )
383- }
341+ /**
342+ * Check if an element (the needle) is present in a given array.
343+ *
344+ * @param {Array } arr
345+ * @param {* } needle
346+ * @returns Boolean
347+ */
348+ function arrayIncludes ( arr , needle ) {
349+ for ( var i = arr . length - 1 ; i >= 0 ; i -- ) {
350+ if ( arr [ i ] === needle ) {
351+ return true ;
352+ }
353+ }
384354
385- function copyPropertyEllipse ( origin , target ) {
386- copyProperty ( 'shapeDirection' , origin , target )
387- copyProperty ( 'size' , origin , target )
388- copyProperty ( 'position' , origin , target )
355+ return false ;
389356}
390357
391- function copyPropertyStar ( origin , target ) {
392- copyProperty ( 'shapeDirection' , origin , target )
393- copyProperty ( 'type' , origin , target )
394- copyProperty ( 'points' , origin , target )
395- copyProperty ( 'position' , origin , target )
396- copyProperty ( 'rotation' , origin , target )
397- copyProperty ( 'innerRadius' , origin , target )
398- copyProperty ( 'outerRadius' , origin , target )
399- copyProperty ( 'innerRoundness' , origin , target )
400- copyProperty ( 'outerRoundness' , origin , target )
358+ /**
359+ * Repeat a string a given times into a single string output.
360+ *
361+ * @param {String } str
362+ * @param {Number } amount
363+ * @returns String
364+ */
365+ function repeatStr ( str , amount ) {
366+ var rtn = "" ;
367+ for ( var i = 0 ; i < amount ; i ++ ) {
368+ rtn += str ;
369+ }
370+ return rtn ;
401371}
402372
403373function createUI ( that ) {
404-
405374 if ( that instanceof Panel ) {
406375
407376 var _panel = that ;
@@ -411,13 +380,13 @@ function createUI(that) {
411380 var _panel = new Window ( 'palette' , configs . title , undefined , {
412381 resizeable : true ,
413382 } ) ;
383+
414384 _panel . show ( ) ;
415385
416386 }
417387
418388 var btn = _panel . add ( "button" , [ 10 , 10 , 100 , 30 ] , "Explode layer" ) ;
419389
420- // _panel.text = configs.title;
421390 _panel . bounds . width = 120 ;
422391 _panel . bounds . height = 40 ;
423392
0 commit comments