usingRhino;usingRhino.Geometry;usingRhino.Commands;usingRhino.Input.Custom;usingRhino.DocObjects;namespace examples_cs
{publicclassCustomGeometryFilterCommand:Command{privatedouble m_tolerance;publicoverridestringEnglishName{get{return"csCustomGeometryFilter";}}protectedoverrideResultRunCommand(RhinoDoc doc,RunMode mode){
m_tolerance = doc.ModelAbsoluteTolerance;// only use a custom geometry filter if no simpler filter does the job// only curvesvar gc =newGetObject();
gc.SetCommandPrompt("select curve");
gc.GeometryFilter=ObjectType.Curve;
gc.DisablePreSelect();
gc.SubObjectSelect=false;
gc.Get();if(gc.CommandResult()!=Result.Success)return gc.CommandResult();if(null== gc.Object(0).Curve())returnResult.Failure;Rhino.RhinoApp.WriteLine("curve was selected");// only closed curvesvar gcc =newGetObject();
gcc.SetCommandPrompt("select closed curve");
gcc.GeometryFilter=ObjectType.Curve;
gcc.GeometryAttributeFilter=GeometryAttributeFilter.ClosedCurve;
gcc.DisablePreSelect();
gcc.SubObjectSelect=false;
gcc.Get();if(gcc.CommandResult()!=Result.Success)return gcc.CommandResult();if(null== gcc.Object(0).Curve())returnResult.Failure;Rhino.RhinoApp.WriteLine("closed curve was selected");// only circles with a radius of 10var gcc10 =newGetObject();
gcc10.SetCommandPrompt("select circle with radius of 10");
gc.GeometryFilter=ObjectType.Curve;
gcc10.SetCustomGeometryFilter(CircleWithRadiusOf10GeometryFilter);// custom geometry filter
gcc10.DisablePreSelect();
gcc10.SubObjectSelect=false;
gcc10.Get();if(gcc10.CommandResult()!=Result.Success)return gcc10.CommandResult();if(null== gcc10.Object(0).Curve())returnResult.Failure;RhinoApp.WriteLine("circle with radius of 10 was selected");returnResult.Success;}privateboolCircleWithRadiusOf10GeometryFilter(Rhino.DocObjects.RhinoObject rhObject,GeometryBase geometry,ComponentIndex componentIndex){bool is_circle_with_radius_of10 =false;Circle circle;if(geometry isCurve&&(geometry asCurve).TryGetCircle(out circle))
is_circle_with_radius_of10 = circle.Radius<=10.0+ m_tolerance && circle.Radius>=10.0- m_tolerance;return is_circle_with_radius_of10;}}}
import rhinoscriptsyntax as rs
from scriptcontext import*importRhinodefcircleWithRadiusOf10GeometryFilter(rhObject, geometry, componentIndex):
isCircleWithRadiusOf10 =False
c = rs.coercecurve(geometry)if c:
b, circle = c.TryGetCircle()if b:
isCircleWithRadiusOf10 = circle.Radius<=10.0+Rhino.RhinoMath.ZeroToleranceand circle.Radius>=10.0-Rhino.RhinoMath.ZeroTolerancereturn isCircleWithRadiusOf10
defRunCommand():# only use a custom geometry filter if no simpler filter does the job# for curves - only a simple filter is neededif rs.GetObject("select curve", rs.filter.curve):#Rhino.DocObjects.ObjectType.Curve):
print "curve vas selected"# for circles with a radius of 10 - a custom geometry filter is neededif rs.GetObject("select circle with radius of 10", rs.filter.curve,False,False, circleWithRadiusOf10GeometryFilter):
print "circle with radius of 10 was selected"if __name__=="__main__":RunCommand()
ImportsRhinoImportsRhino.GeometryImportsRhino.CommandsImportsRhino.Input.CustomImportsRhino.DocObjectsNamespace examples_vb
PublicClassCustomGeometryFilterCommandInheritsCommandPrivate _tolerance AsDoublePublicOverridesReadOnlyPropertyEnglishName()AsStringGetReturn"vbCustomGeometryFilter"EndGetEndPropertyProtectedOverridesFunctionRunCommand(doc AsRhinoDoc, mode AsRunMode)AsResult
_tolerance = doc.ModelAbsoluteTolerance' only use a custom geometry filter if no simpler filter does the job' only curvesDim gc =NewGetObject()
gc.SetCommandPrompt("select curve")
gc.GeometryFilter=ObjectType.Curve
gc.DisablePreSelect()
gc.SubObjectSelect=False
gc.[Get]()If gc.CommandResult()<>Result.SuccessThenReturn gc.CommandResult()EndIfIf gc.[Object](0).Curve()IsNothingThenReturnResult.FailureEndIfRhino.RhinoApp.WriteLine("curve was selected")' only closed curvesDim gcc =NewGetObject()
gcc.SetCommandPrompt("select closed curve")
gcc.GeometryFilter=ObjectType.Curve
gcc.GeometryAttributeFilter=GeometryAttributeFilter.ClosedCurve
gcc.DisablePreSelect()
gcc.SubObjectSelect=False
gcc.[Get]()If gcc.CommandResult()<>Result.SuccessThenReturn gcc.CommandResult()EndIfIf gcc.[Object](0).Curve()IsNothingThenReturnResult.FailureEndIfRhino.RhinoApp.WriteLine("closed curve was selected")' only circles with a radius of 10Dim gcc10 =NewGetObject()
gcc10.SetCommandPrompt("select circle with radius of 10")
gc.GeometryFilter=ObjectType.Curve
gcc10.SetCustomGeometryFilter(AddressOfCircleWithRadiusOf10GeometryFilter)' custom geometry filter
gcc10.DisablePreSelect()
gcc10.SubObjectSelect=False
gcc10.[Get]()If gcc10.CommandResult()<>Result.SuccessThenReturn gcc10.CommandResult()EndIfIf gcc10.[Object](0).Curve()IsNothingThenReturnResult.FailureEndIfRhino.RhinoApp.WriteLine("circle with radius of 10 was selected")ReturnResult.SuccessEndFunctionPrivateFunctionCircleWithRadiusOf10GeometryFilter(rhObject AsRhino.DocObjects.RhinoObject, geometry AsGeometryBase, componentIndex AsComponentIndex)AsBooleanDim isCircleWithRadiusOf10 AsBoolean=FalseDim circle AsCircleIfTypeOf geometry IsCurveAndAlsoTryCast(geometry,Curve).TryGetCircle(circle)Then
isCircleWithRadiusOf10 = circle.Radius<=10.0+ _tolerance AndAlso circle.Radius>=10.0- _tolerance
EndIfReturn isCircleWithRadiusOf10
EndFunctionEndClassEndNamespace