Skip to content

Commit b9d63ad

Browse files
committed
Version 1.2.0
1 parent 6910e93 commit b9d63ad

File tree

2 files changed

+128
-159
lines changed

2 files changed

+128
-159
lines changed

dist/explode_shape_layer.jsx

Lines changed: 127 additions & 158 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
var configs = {
22
title: 'Explode layer tool',
33
debug : false,
4-
log : true,
4+
log : false,
55
itemAmountWarning : 50,
66
dryRun : false,
77
};
88

99
function cLog(text) {
10-
if (configs.log)
11-
$.writeln(text);
10+
if (!configs.log) {
11+
return;
12+
}
13+
14+
$.writeln(text);
1215
}
1316

1417
function cDebug(text) {
15-
if (configs.debug)
16-
$.writeln(text);
18+
if (!configs.debug) {
19+
return;
20+
}
21+
22+
$.writeln(text);
1723
}
1824

1925
function 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

245257
function 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

403373
function 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

Comments
 (0)