@@ -113,19 +113,26 @@ function explode() {
113113}
114114
115115function emptyDuplicateLayer ( layer ) {
116-
117116 var new_layer = layer . containingComp . layers . addShape ( ) ;
118117
119- copyProperty ( 'anchorPoint' , layer , new_layer ) ;
120- copyProperty ( 'position' , layer , new_layer ) ;
121- copyProperty ( 'scale' , layer , new_layer ) ;
122- copyProperty ( 'rotation' , layer , new_layer ) ;
123- copyProperty ( 'opacity' , layer , new_layer ) ;
118+ new_layer [ 'anchorPoint' ] . setValue ( layer [ 'anchorPoint' ] . value ) ;
119+ new_layer [ 'position' ] . setValue ( layer [ 'position' ] . value ) ;
120+ new_layer [ 'scale' ] . setValue ( layer [ 'scale' ] . value ) ;
121+ new_layer [ 'rotation' ] . setValue ( layer [ 'rotation' ] . value ) ;
122+ new_layer [ 'opacity' ] . setValue ( layer [ 'opacity' ] . value ) ;
124123
125124 return new_layer ;
126-
127125}
128126
127+ var treeChildPrefix = "⌞ " ;
128+ var propertiesBlacklist = [
129+ 'ADBE Vector Taper StartWidthPx' ,
130+ 'ADBE Vector Taper EndWidthPx' ,
131+ 'ADBE Vector Taper Wave Cycles' ,
132+ 'ADBE Vector Stroke Dashes' ,
133+ 'ADBE Vector Materials Group' ,
134+ ] ;
135+
129136/**
130137 * Copy properties of a layer to another (recursive).
131138 *
@@ -134,119 +141,68 @@ function emptyDuplicateLayer(layer) {
134141 * @param {Number } level
135142 */
136143function copyProperties ( origin , target , level ) {
137- var indent = repeatStr ( " " , level === undefined ? 0 : level ) ;
138- var prefix = indent + "⌞-" ;
144+ var indent = repeatStr ( " " , level ) ;
139145
140- cDebug ( indent + origin . name ) ;
146+ // if(level === 0) {
147+ cDebug ( indent + origin . name ) ;
148+ // }
141149
150+ // Process (copy) each property of the origin to the target
142151 for ( var i = 1 ; i <= origin . numProperties ; i ++ ) {
152+ var originalProp = origin . property ( i ) ;
153+ var matchName = originalProp . matchName ;
143154
144- var _prop = origin . property ( i ) ;
155+ // Do not copy disabled properties
156+ if ( ! originalProp . enabled ) {
157+ cDebug ( indent + treeChildPrefix + matchName + " (skipped: disabled)" ) ;
158+ continue ;
159+ } ;
160+
145161
146- if ( ! _prop . enabled || ! target . canAddProperty ( _prop . matchName ) ) return ;
162+ // Get or create the target property
163+ var targetProp = target . property ( matchName ) ;
147164
148- // Skipped properties
149- if ( arrayIncludes ( [ 'ADBE Vector Materials Group' ] , _prop . matchName ) ) {
150- cDebug ( prefix + _prop . matchName + " (skipped)" ) ;
165+ if ( ! targetProp ) {
166+ targetProp = target . addProperty ( matchName ) ;
167+ }
168+
169+ // Still no property ? Then the property is probably not supported
170+ if ( ! targetProp ) {
171+ cDebug ( indent + treeChildPrefix + matchName + " (skipped: cannot be added)" ) ;
151172 continue ;
152173 }
153174
154- cDebug ( prefix + _prop . matchName ) ;
155-
156- var prop = target . addProperty ( _prop . matchName ) ;
157-
158- switch ( _prop . matchName ) {
159-
160- case 'ADBE Vector Filter - Merge' :
161- copyProperty ( 'mode' , _prop , prop )
162- break ;
163-
164- case 'ADBE Vector Graphic - Stroke' :
165- copyProperty ( 'composite' , _prop , prop ) ;
166- copyProperty ( 'color' , _prop , prop ) ;
167- copyProperty ( 'strokeWidth' , _prop , prop ) ;
168- copyProperty ( 'lineCap' , _prop , prop ) ;
169- copyProperty ( 'lineJoin' , _prop , prop ) ;
170- copyProperty ( 'miterLimit' , _prop , prop ) ;
171- break ;
172-
173- case 'ADBE Vector Graphic - Fill' :
174- copyProperty ( 'composite' , _prop , prop ) ;
175- copyProperty ( 'fillRule' , _prop , prop ) ;
176- copyProperty ( 'color' , _prop , prop ) ;
177- break ;
178-
179- case 'ADBE Vector Transform Group' :
180- copyProperty ( 'anchorPoint' , _prop , prop ) ;
181- copyProperty ( 'position' , _prop , prop ) ;
182- copyProperty ( 'scale' , _prop , prop ) ;
183- copyProperty ( 'skew' , _prop , prop ) ;
184- copyProperty ( 'skewAxis' , _prop , prop ) ;
185- copyProperty ( 'rotation' , _prop , prop ) ;
186- copyProperty ( 'opacity' , _prop , prop ) ;
187- break ;
188-
189- case 'ADBE Vector Shape - Rect' :
190- copyProperty ( 'shapeDirection' , _prop , prop )
191- copyProperty ( 'size' , _prop , prop )
192- copyProperty ( 'position' , _prop , prop )
193- copyProperty ( 'roundness' , _prop , prop )
194- break ;
195-
196- case 'ADBE Vector Shape - Ellipse' :
197- copyProperty ( 'shapeDirection' , _prop , prop )
198- copyProperty ( 'size' , _prop , prop )
199- copyProperty ( 'position' , _prop , prop )
200- break ;
201-
202- case 'ADBE Vector Shape - Star' :
203- copyProperty ( 'shapeDirection' , _prop , prop )
204- copyProperty ( 'type' , _prop , prop )
205- copyProperty ( 'points' , _prop , prop )
206- copyProperty ( 'position' , _prop , prop )
207- copyProperty ( 'rotation' , _prop , prop )
208- copyProperty ( 'innerRadius' , _prop , prop )
209- copyProperty ( 'outerRadius' , _prop , prop )
210- copyProperty ( 'innerRoundness' , _prop , prop )
211- copyProperty ( 'outerRoundness' , _prop , prop )
212- break ;
213-
214- case 'ADBE Root Vectors Group' :
215- case 'ADBE Vectors Group' :
216- case 'ADBE Vector Group' :
217- copyProperties ( _prop , prop , level + 1 ) ;
218- break ;
219-
220- case 'ADBE Vector Shape - Group' :
221- prop . property ( 'ADBE Vector Shape' ) . setValue ( _prop . property ( 'ADBE Vector Shape' ) . value ) ;
222- break ;
223-
224- // case 'Vector Stroke Taper':
225- // copyProperty('startLength', _prop, prop);
226- // copyProperty('endLength', _prop, prop);
227- // copyProperty('startWidth', _prop, prop);
228- // copyProperty('endWidth', _prop, prop);
229- // copyProperty('startEase', _prop, prop);
230- // copyProperty('endEase', _prop, prop);
231- // break;
232-
233- case 'ADBE Vector Blend Mode' :
234- prop . setValue ( _prop . value ) ;
235- break ;
236-
237- default :
238- cDebug ( prefix + '>> not supported!' ) ;
239- break ;
175+ // Skip properties that cannot be set without being displayed
176+ if ( arrayIncludes ( propertiesBlacklist , matchName ) ) {
177+ cDebug ( indent + "⚬ " + matchName + " (skipped: not editable when hidden)" ) ;
178+ continue ;
179+ }
180+
181+ // Handle property
182+ if ( typeof originalProp . setValue === "function" ) {
183+ cDebug ( indent + treeChildPrefix + matchName ) ;
184+ targetProp . setValue ( originalProp . value ) ;
185+ continue ;
186+ }
187+
188+ // Handle property groups/layers
189+ if ( originalProp . numProperties > 0 ) {
190+ cDebug ( indent + treeChildPrefix + matchName ) ;
191+ copyProperties ( originalProp , targetProp , level + 1 ) ;
192+ continue ;
240193 }
241194
195+ cDebug ( indent + "⦵ " + matchName + " (skipped: no reason)" ) ;
242196 }
243-
244- }
245-
246- function copyProperty ( name , origin , target ) {
247- target [ name ] . setValue ( origin [ name ] . value ) ;
248197}
249198
199+ /**
200+ * Check if an element (the needle) is present in a given array.
201+ *
202+ * @param {Array } arr
203+ * @param {* } needle
204+ * @returns Boolean
205+ */
250206function arrayIncludes ( arr , needle ) {
251207 for ( var i = arr . length - 1 ; i >= 0 ; i -- ) {
252208 if ( arr [ i ] === needle ) {
@@ -257,6 +213,13 @@ function arrayIncludes(arr, needle) {
257213 return false ;
258214}
259215
216+ /**
217+ * Repeat a string a given times into a single string output.
218+ *
219+ * @param {String } str
220+ * @param {Number } amount
221+ * @returns String
222+ */
260223function repeatStr ( str , amount ) {
261224 var rtn = "" ;
262225 for ( var i = 0 ; i < amount ; i ++ ) {
@@ -266,7 +229,6 @@ function repeatStr(str, amount) {
266229}
267230
268231function createUI ( that ) {
269-
270232 if ( that instanceof Panel ) {
271233
272234 var _panel = that ;
@@ -276,13 +238,13 @@ function createUI(that) {
276238 var _panel = new Window ( 'palette' , configs . title , undefined , {
277239 resizeable : true ,
278240 } ) ;
241+
279242 _panel . show ( ) ;
280243
281244 }
282245
283246 var btn = _panel . add ( "button" , [ 10 , 10 , 100 , 30 ] , "Explode layer" ) ;
284247
285- // _panel.text = configs.title;
286248 _panel . bounds . width = 120 ;
287249 _panel . bounds . height = 40 ;
288250
0 commit comments