The MultiSweep command for Rhino 3D is a great idea and very useful when modeling. The jewelry industry, in particular, needs it.
Checked any jewelry plugins? There is matrix Gold i think has multisweep
Is this what you are looking for? https://youtu.be/Q_ViZTpR0Y4?is=brjIj4WgoxPyP--z
I have the Gemvision Matrix software you recommended. Unfortunately, I can’t get results as efficiently and naturally as with Rhino’s sweep commands. They didn’t add it to the program in subsequent versions either. They’ve released four more versions. I’m thinking of a command that’s already in Rhino’s native code. I think it would be great…
Can you specify MultiSweep?
The sweep2 command allows us to deform the profile in two axes while sweeping. I think it would be possible to achieve much more aesthetically pleasing forms by controlling many more axes. The network command doesn’t work on the same principle and doesn’t produce the same results. Why not 10 axes? I think it would be a unique command.
Perhaps this is something for you.
For MultiSweep (more than two rails) you need a rail at the startpoint and one at the endpoint of the sweepshape.
- Select the rails in order (from start to end or vice versa)
- Select the sweepshape (only one shape is accepted)
The continuity between the sweep-segments is G0 (position), for tangency/curvature manually adjust the surfaces using MatchSrf.
Rails (blue) and shape (red):
#! python 3
import Rhino
def SweepIntersect(doc, shape, splitter):
intersect = Rhino.Geometry.Intersect.Intersection.CurveCurve(shape, splitter, doc.ModelAbsoluteTolerance, doc.ModelAbsoluteTolerance)[0].PointA
parameter = shape.ClosestPoint(intersect)
divide = shape.Split(parameter[1])
return divide[0], divide[1]
def FlipRail(rail, shape):
intersect = Rhino.Geometry.Intersect.Intersection.CurveCurve(shape, rail, doc.ModelAbsoluteTolerance, doc.ModelAbsoluteTolerance)[0].PointA
if rail.PointAtStart.DistanceTo(intersect) > rail.PointAtEnd.DistanceTo(intersect):
return rail.Reverse()
else:
return rail
doc = Rhino.RhinoDoc.ActiveDoc
rails = []
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt('Select rails')
go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
go.GetMultiple(1, 0)
for i in range(go.ObjectCount):
rails.append(go.Object(i).Curve())
go = Rhino.Input.Custom.GetObject()
go.SetCommandPrompt('Select shape')
go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
go.Get()
shape = go.Object(0).Curve()
flipped = []
for i in rails:
flipped.append(FlipRail(i, shape))
if len(rails) == 1:
sweep = Rhino.Geometry.SweepOneRail()
srf = sweep.PerformSweep(flipped[0], shape)[0]
doc.Objects.AddBrep(srf)
if len(rails) == 2:
sweep = Rhino.Geometry.SweepTwoRail()
srf = sweep.PerformSweep(flipped[0], flipped[1], shape)[0]
doc.Objects.AddBrep(srf)
elif len(flipped) > 2:
segments = []
rest = shape
for i in range(len(flipped) - 2):
split = SweepIntersect(doc, rest, flipped[i+1] )
segments.append(split[0])
rest = split[1]
segments.append(rest)
sweeps = []
for i in range(len(segments)):
sweep = Rhino.Geometry.SweepTwoRail()
srf = sweep.PerformSweep(flipped[i], flipped[i+1], segments[i])[0]
sweeps.append(srf)
doc.Objects.AddBrep(srf)
don’t we all…
c’mon @wim, just call Dale’s bluff, he said it’s now very hard! ![]()


