Skip to content

Instantly share code, notes, and snippets.

@pgolay
Created January 30, 2019 00:23
Show Gist options
  • Save pgolay/51bde7cce1b153186c85358c913d9ba7 to your computer and use it in GitHub Desktop.
Save pgolay/51bde7cce1b153186c85358c913d9ba7 to your computer and use it in GitHub Desktop.
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Rhino
def SetArcDegrees():
def arc_filter( rhino_object, geometry, component_index):
return geometry.IsArc()
looped = False
while True:
angDeg = 15
if sc.sticky.has_key('ARC_EX_ANGLE'):
angDeg = sc.sticky['ARC_EX_ANGLE']
go = Rhino.Input.Custom.GetObject()
strMessage = "Pick the flip of the arc to move."
if looped: strMessage = "Pick the flip of the arc to move. Press enter to finish."
go.SetCommandPrompt(strMessage)
go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve
go.SetCustomGeometryFilter(arc_filter)
opAngDeg = Rhino.Input.Custom.OptionDouble(angDeg)
go.AddOptionDouble("AngleDegrees", opAngDeg)
go.AcceptNumber(True, False)
go.EnablePreSelect(False, True)
rc = go.Get()
if go.CommandResult() != Rhino.Commands.Result.Success:
return go.CommandResult()
if rc == Rhino.Input.GetResult.Option:
angDeg = opAngDeg.CurrentValue
if angDeg > 360 or angDeg == 0: continue
sc.sticky['ARC_EX_ANGLE'] = angDeg
continue
if rc == Rhino.Input.GetResult.Number:
angDeg = go.Number()
if angDeg > 360 or angDeg == 0: continue
sc.sticky['ARC_EX_ANGLE'] = angDeg
continue
if rc == Rhino.Input.GetResult.Object:
objref = go.Object(0)
geo = objref.Geometry()
selPt = objref.SelectionPoint()
p_rc, par = geo.ClosestPoint(selPt)
flip = False
if p_rc:
if par>= geo.Domain.Mid:
flip = True
print geo.Reverse()
a_rc, arc = geo.TryGetArc()
crntSweep = arc.AngleDomain
radius = arc.Radius
rads = Rhino.RhinoMath.ToRadians(abs(angDeg))
if flip:
#print 'flip'
if angDeg > 0:
sweep = Rhino.Geometry.Interval(crntSweep.Max - rads, crntSweep.Max)
else:
sweep = Rhino.Geometry.Interval( crntSweep.Max , crntSweep.Max + rads)
else:
#print 'start'
if angDeg > 0:
sweep = Rhino.Geometry.Interval(crntSweep.Max - rads, crntSweep.Max )
else:
sweep = Rhino.Geometry.Interval(crntSweep.Max, crntSweep.Max+ rads )
flip = True
arc.AngleDomain = sweep
if flip: arc.Reverse()
if arc.IsValid:
arcCrv = Rhino.Geometry.ArcCurve(arc)
sc.doc.Objects.Replace(objref, arcCrv)
print "Arc angle set to " + str(round(angDeg, 3))
looped = True
sc.doc.Views.Redraw()
continue
if __name__ == '__main__':SetArcDegrees()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment