Skip to main content
Participating Frequently
February 8, 2020
Answered

Scale shape while maintaining stroke width expression error

  • February 8, 2020
  • 3 replies
  • 10931 views

Hi there. I followed a tutorial on youtube to scale a shape while maintaing a constant stroke width. Tutorial link: https://www.youtube.com/watch?v=0Bpf_H3vtZ0&t=21s

 

He uses the expression: 

 

sf = thisComp.layer("CONTROL").transform.scale[0]/100;

ov = value;

nv = ov / sf


The shapes are tied to a parent null where the transformations are keyframed. 

However, I keep getting an orange pop-up warning me: 

 It says: "After Effects warning: Expression Disabled
Error at line 1 in propert 'Stroke Width' of layer 2 ('Circle WERT') in comp 'Charlie.001'.
couldn't turn result into numeric value."

The stroke width is 2px and the scaling value are keyframed at whole numbers, 0 and 100%. In the preview, everything looks fine. 

Any ideas why? Or are there other expressions to try? 

This topic has been closed for replies.
Correct answer Rick Gerard

I would give that tutorial a C-. The explanation is incomplete and the workflow is inefficient. The expression makes no allowance for divide by zero errors. 

 

Here is the expression I would use for Stroke:

 

 

if (hasParent)
{scl = thisLayer.parent.scale[0]/100;
if (scl == 0)
	sv = 1
else
	sv = scl;
value / sv }

else
	value

 

 

The layer name if the parent no longer a potential problem, the expression is just looking for a layer with a parent. The first if statement keeps the original stroke value is there is no parent. f there is no parent the original stroke value is retained. The second if statement prevents divide by zero errors and retains the original stroke value if the scale gets to zero. The Stroke value is now modified by the X layer scale no matter what the parent layer is. 

 

When you get the expression working for one stroke you can copy expression only, type Stroke in the timeline search to show all stroke properties on the layer and then select them all and paste. It will take about 2 seconds and you could have a couple hundred stroked layers tied to the scale of their parent layer and show no errors if there was no parent. The expression is so good that I'm saving it as an animation preset. It's something that I will use once in a while.

 

Here you go: https://www.dropbox.com/s/w4rn60hlf1je8kj/stroke%20tied%20to%20parent.ffx?dl=0

 

All you have to do is type Stroke in the timeline search field to reveal all stroke width properties in all shape layers, drag a selection around all of them and then apply the animation preset. Then parent the shape layer to any null and the stroke will remain the same relative size no matter what the scale of the parent layer is. 

 

I think I'll work on one that ties stroke width to distance from the camera. That will also be useful for some designs.

 

 

3 replies

Participant
December 11, 2020

Thanks Rick. For negetive value I have added   || scl<0   in the 2nd if condition. and it worked perfectly.

 

if (hasParent)
{scl = thisLayer.parent.scale[0]/100;
if (scl == 0 || scl<0)
	sv = 1
else
	sv = scl;
value / sv }

else
	value
 
Participant
December 11, 2020

previous did not worked but this one did

 

if (hasParent)
{scl = thisLayer.parent.scale[0]/100;
if (scl == 0 || scl<0)
	sv = 1
else
	sv = Math.abs(scl);
value / sv }

else
	value

 

 

for whatever reason Adobe is not letting me delete my previous reply. I have made a mistake on that one.

this one is working though

Participant
December 16, 2020

In my case neither seems to work, I have a shape and when i connect the shape layer to the null the stroke width turns from 5 px to 0.3. I have a big shape which is scaled in only to smaller stages within the animation. Using the expression above Strokes get squeezed and stretched wich creates a really odd look.

Are there any updates on this topic?

Rick GerardCommunity ExpertCorrect answer
Community Expert
February 8, 2020

I would give that tutorial a C-. The explanation is incomplete and the workflow is inefficient. The expression makes no allowance for divide by zero errors. 

 

Here is the expression I would use for Stroke:

 

 

if (hasParent)
{scl = thisLayer.parent.scale[0]/100;
if (scl == 0)
	sv = 1
else
	sv = scl;
value / sv }

else
	value

 

 

The layer name if the parent no longer a potential problem, the expression is just looking for a layer with a parent. The first if statement keeps the original stroke value is there is no parent. f there is no parent the original stroke value is retained. The second if statement prevents divide by zero errors and retains the original stroke value if the scale gets to zero. The Stroke value is now modified by the X layer scale no matter what the parent layer is. 

 

When you get the expression working for one stroke you can copy expression only, type Stroke in the timeline search to show all stroke properties on the layer and then select them all and paste. It will take about 2 seconds and you could have a couple hundred stroked layers tied to the scale of their parent layer and show no errors if there was no parent. The expression is so good that I'm saving it as an animation preset. It's something that I will use once in a while.

 

Here you go: https://www.dropbox.com/s/w4rn60hlf1je8kj/stroke%20tied%20to%20parent.ffx?dl=0

 

All you have to do is type Stroke in the timeline search field to reveal all stroke width properties in all shape layers, drag a selection around all of them and then apply the animation preset. Then parent the shape layer to any null and the stroke will remain the same relative size no matter what the scale of the parent layer is. 

 

I think I'll work on one that ties stroke width to distance from the camera. That will also be useful for some designs.

 

 

Participating Frequently
February 8, 2020

Worked perfectly! Thanks Rick!

Roland Kahlenberg
Legend
February 8, 2020
Very Advanced After Effects Training | Adaptive &amp; Responsive Toolkits | Intelligent Design Assets (IDAs) | MoGraph Design System DEV
Participating Frequently
February 8, 2020

Hi thanks for the response. the expression is for a fixed height and only follows a change in X value. I am looking for something that can be changed with a null because there are many shapes in my shape layer. 

Participating Frequently
February 8, 2020

Noticed that the expression I used from the tutorial only kicks up an error when the parent scale is keyframed to 0. Any idea how to fix it? Or should I ignore it?