Hi,
Is there any way to pipe a bunch of lines for creating spaceframe ?
It is simple enough to āpipe a bunch of linesā if that is enough. The problem is joining of the tubes at the nodes.
What are you expecting?
Iām curious about how would you turn those lines into cylinders or āpipesā. Iāve been puzzling on this one and havenāt seen a solution yet.
Given a selection of edges
for e in edges
grp=ent.add_group;gent=grp.entities
p0,vector=e.line
circle=gent.add_circle(p0,vector,radius,@sides)
face=gent.add_face(circle)
face.followme e
end
There are several plugins available to do things like thisā¦
@sdmitch has one that puts a premade componentās instance on each line, and scales it along that line, along the Z/blue axis of the component, along the line.
The issue is that these component instancesā geometry will overlap at each ānodeā vertex where several lines meet.
Placing a ānodeā component and adjusting the related tubeās start/end locations would be possible, but not so easy.
And since the nodes will have various angle this could be an issue - perhaps the simplest node would be a āsphereā, so the springing/arrival of each tube would be masked by the sphere-node ??
Can You explain how to run this script?
We need to add a few lines first then you can copy and paste it into the Ruby Console
mod = Sketchup.active_model
ent = mod.active_entities
sel = mod.selection
edges = sel.grep(Sketchup::Edge)
val = UI.inputbox(["Radius:","#Sides"],[1.0,12],"Edge 2 Tube")
if val
radius,sides = val
for e in edges
grp=ent.add_group;gent=grp.entities
p0,vector=e.line
circle=gent.add_circle(p0,vector,radius,sides)
face=gent.add_face(circle)
face.followme e
end
end
Ummmā¦ I expect just have lines :)) connections is not important!
from Sketchup 7 to 2017 we have two plugins do that thing: 1- lines2Tube 2- Pipe Along Path and other plugins have that option: 1001bit pro, but any of them have problems! 1- line2Tube: doesnāt make these bunch of lines and crashes!2- Pipe Along Path: when I select a whole bunch of lines plugin goes selecting a loop of three or four lines and then make it pipe :)) 1001bit pro works same as Pipe Along Path.
These script lines works well so much thanks to you
Using a script/plugin that places reused scaled components/groups would greatly decrease the file size (and speed up SU) because it would reuse the same cylinder. For this model my guess is the file size could be as small as 1/20 of what it is when all cylinders are drawn separately.
Not at all, I used script above and my SU file goes 25 Mb !! on the other hand I used Lunchbox plugin in rhino, grasshopper and import it to sketchup file goes 18 Mb.
I think this snippet should just increase the file size with one MB or so. That is the power of groups and components in SketchUp!
model = Sketchup.active_model
edges = model.selection.grep(Sketchup::Edge)
# Variables
segments = 12
radius = 5.cm # <-- EDIT THIS NUMBER TO DESIRED RADIUS.
model.start_operation("Pipe", true)
# Cretate group definition
group = model.active_entities.add_group
group.entities.add_circle(ORIGIN, Z_AXIS, radius, segments).first.find_faces
face = group.entities.grep(Sketchup::Face).first
face.reverse! unless face.normal.samedirection?(Z_AXIS)
face.pushpull(1)
definition = group.definition
# Place group instances
edges.each do |edge|
tr = Geom::Transformation.new(*edge.line) * Geom::Transformation.scaling(1, 1, edge.length)
instance = model.active_entities.add_instance(definition, tr)
end
# Purge original group
group.erase!
model.commit_operation
It works fine How to edit this script to make Rectangular profile instead of pipe and make it component instead of groups?
Iām not familiar with Ruby
To use components instead, create a component Definition object from the add factory method of the DefinitionList object, instead of creating a temporary Group using the add_group factory method of an Entities object.
model = Sketchup.active_model
edges = model.selection.grep(Sketchup::Edge)
# Variables
segments = 12
radius = 5.cm
model.start_operation("Pipe", true)
# Cretate component definition
definition = model.definitions.add("Pipe")
definition.entities.add_circle(ORIGIN, Z_AXIS, radius, segments).first.find_faces
face = definition.entities.grep(Sketchup::Face).first
face.reverse! unless face.normal.samedirection?(Z_AXIS)
face.pushpull(1)
# Place group instances
edges.each do |edge|
tr = Geom::Transformation.new(*edge.line) * Geom::Transformation.scaling(1, 1, edge.length)
instance = model.active_entities.add_instance(definition, tr)
end
model.commit_operation
For a square cross section you can set the segment count to 4 instead of 12 but the edges will still be soften. Maybe itās easiest to unsoften them manually. Also note that the rotation of the cross section is quite arbitrary which is why circular pipes are so useful for these designs.
If you want to learn Ruby you can read the different code snippets and try to understand them. Modifying and experiment is also a great way to learn . The Ruby API documentation lists all SketchUpās classes and their methods.
Btw, how much did your original wireframe model gain in file size using my snippet?
OR use these additional lines inserted in the āgroupā version, as shownā¦
@eneroth3 beat me to it with her compo version !
###... include the previous code up to here...
face.pushpull(1)
### insert this new line to make the group into a component...
group = group.to_component
### actually it is now a component-instance, but the reference to 'group' is used later on in the code !
### define the definition as in original code...
definition = group.definition
### then insert this new line which names this definition...
definition.name = "Pipe"
###... leave the rest of the code to the end...
Incidentally the sides reference is omitted in the examples, so the default will then be used for the circle [24]ā¦
Itās easily added back in.
sides = 12
definition.entities.add_circle(ORIGIN, Z_AXIS, radius, sides).first.find_faces
You could use an ngon instead of a circle and then the tubeās edges donāt get smoothedā¦
With 4 sides itāll be a square tube, but itās orientation/rotation around the line might not be what you want ?
A smoothed circular tube is more āforgivingā as its orientation is not obviousā¦
sides = 4
definition.entities.add_ngon(ORIGIN, Z_AXIS, radius, sides).first.find_faces
Wops, forgot to reference the variable . Iāll edit my posts, thanks!
Using ngon is also a good idea!
1- with first script with Radius:20cm & Sides:5 file goes 25MB result shows after 2 min
With your Script Radius:20cm & Sides:5 goes 4 MB The result is displayed immediately after interpolation.
2- for square cross section you said, If possible to set any axes that profile applies to line it might be possible same as what happens in reality for modern gridshell structures. for example profiles add in z direction of each line.
At least so much thanks for your great guide
In my snippets I use Geom::Transformation.new with a Point3d and Vector3d as arguments to define a transformation matrix. SketchUp decides arbitrary vectors for the other axes. The API docs describes more ways to create matrices: Class: Geom::Transformation ā SketchUp Ruby API Documentation.
You can experimenting with passing an additional vector to the Transformation constructor method. However then you also need to change the orientation of the circle further up in the code. X_AXIS, Y_AXIS and Z_AXIS are constants containing unit vectors in the three axes and often very useful.