I create a piston-like object with the ruby API (i.e. two cylinders that slide inside of each other).
I do this by first creating a Circle (circle = Entities::add_circle), then adding a face to it the resulting edges (face = Entities::add_face(circle)) and the pushpulling it (face.pushpull(length)).
This will create a simple cylinder, which I want to color in dynamically (i.e. around once per frame).
Unfortunately, this slows the simulation, I have running, down a lot (about 10 fps drop per cylinder). Inside the simulation there are a few much more complex bottle structures, which work much quicker.
Investigating the problem, I found out, that the bottle structures are loaded via an .skp file and calling entity.definition.entities reveals, that the only have two entities that are being colored in. On the other hand, the cylinders I create with the Ruby API have almost 100 entities, which all have to be colored. I assume that this is where the performance is going away.
Is there a way to “squash” all the entities of my object into one contiguous face that can be colored? Might it bring performance improvements, if I would create an .skp file for the cylinders?
EDIT:
This is how I create the cylinders
def create_cylinder(name, diameter)
definition = Sketchup.active_model.definitions.add(name)
circle_edgearray = definition.entities.add_circle(@center,
@up_vector,
diameter, 12)
face = definition.entities.add_face(circle_edgearray)
face.pushpull(-2 * @length / 3, false)
definition
end
and then, in order to render it correctly, I create a component instance
def create_entity
return @entity if @entity
translation = Geom::Transformation.translation(@center)
rotation_angle = Geometry.rotation_angle_between(Geometry::Z_AXIS,
@vector)
rotation_axis = Geometry.perpendicular_rotation_axis(Geometry::Z_AXIS,
@vector)
rotation = Geom::Transformation.rotation(@center,
rotation_axis,
rotation_angle)
transformation = rotation * translation
entity = Sketchup.active_model.active_entities.add_instance(@definition,
transformation).make_unique
entity
end
changing the color is done like this:
def change_color(color)
@entity.definition.entities.each do |ent|
if ent.material != color
ent.material = color
ent.material.alpha = 1.0
end
end
end
A skp file of the bottle model is attached.
5-small-single-bottle(23cm).skp (26.7 KB)