How to set x,y dimensions for component?

I wante to add some tree textures around my model to create forest. I decided to add the texture to cylinders or pipes 10m high.

Normally when the cylinder is not in component and I need to copy it I duplicate it using move tool and move it up +20m. Then I rescale every circle of the cylinder down by 0.98. Then I move the cylinder down -20m. This way I copy the cylinders to be a bit smaller than the previous one. But now I decided to add the cylinder to component.

When it is in component, I cannot rescale it as in the previous example. If I would rescale so the height of the cylinder would be samaller (0.98*10). Hence the trees would be smaller. This is not what I want.

So I need to set the dimensions on horizontal plane to scale it, excluding z axis. Any idea how to do it?

Create a transform for scaling (i.e., scale = Geom::Transformation.scaling(0.98,0.98, 1)) and apply it to the instance of the component you’ve created (i.e., componentinstance.transform!(scale))

IDK how to define componentinstance. Is it possible to start with selection? There are two components having the same definition name.

My code:

ss = Sketchup.active_model.selection;
scale = Geom::Transformation.scaling(0.98,0.98, 0)

That’s all I have

Assuming that just one instance is selected, use…

componentinstance=ss[0]

The transformation only affects the one instance.
Any other instances of the same definition are unaffected.

If you want to actually change the entire ‘contents’ of a component [or group] you can a similar transformation thus:

definition.entities(scale, definition.entities.to_a)

This will change the definition itself, so that all of its instances will then change to match…
Where you have set: definition=componentinstance.definition

I tried this:

comp = ss.grep(Sketchup::ComponentInstance);
comp.transform!(scale)

Error: ArgumentError: (eval):2536:in `transform!': wrong number of values in array
(eval):2536

That was just try. Why did not work?

In your example comp will be an array.

So logically I’d rename it comps and then iterate its array…
comps = ss.grep(Sketchup::ComponentInstance)
comps.each{|comp| comp.transform!(scale) }

comp[0].transform!(scale)
#<Sketchup::ComponentInstance:0x97f1c38>

It’s strange I had 3-4 tubes and now I see only 2. I cannot find out where the component tube disappeared.

This is what I see:

When I double click on the polygon it disappeared.

Also I did not want to change the content of the component but this changed it (erased the content) so both components disappeared.

Note: In the undo menu there is: Undo Move. Not Undo scale.

All actions result to the same behaviour.

Edit:
I upload the sketchup test.skp (88.9 KB)
file

@jimhami42 Could you please correct your answer?

not 0.98, 0,98, 0 but
scale = Geom::Transformation.scaling(0.98,0.98, 1)

Because 0 erases the object.

This does the right job:

ss = Sketchup.active_model.selection;
scale = Geom::Transformation.scaling(0.98,0.98, 1)
comps = ss.grep(Sketchup::ComponentInstance)
comps[0].transform!(scale)

Thank you

You are correct … I’ve corrected my entry. Sorry about the mis-info ;(

Thank you. I asked because I gonna confirm your answer as solution.