Select object by WindowBox


#1

I want the programm select object by a closed curve in xy plane. I do not want get all object and see which in the closed curve. I just want to input the curve and get the object in the curve on plane xy.Am I clear Thank you!
Some thing like _SelBoundary


(Dale Fugier) #2

If you are using Rhino 5, the Rhino 5 C++ SDK, and you want to select a region of objects (like SelBoundary), then use the RhinoRegionSelect() SDK function. See rhinoSdkUtilities.h for more details.


#3

Sorry dale, I use .net. I can’t find this function in net!


(Dale Fugier) #4

I will get together with @stevebaer and see that support for this C++ SDK function is added to RhinoCommon.


#5

Thank you. hope I can use it soon!


(Steve Baer) #6

I just added two new functions to RhinoCommon. FindByWindowRegion and FindByCrossingWindowRegion functions will be available on the object table (doc.Objects) in SR7.


#7

two maybe not enough. can you give a function that findbypolylineRegion ?


(Steve Baer) #8

The functions do take polylines as input defining the region, so they should work for you.


#9

OH,yes. dying for that.Can you tell me when will SR7 be released?


(Steve Baer) #10

We are very close to releasing SR6. Once that is out, we will focus on releasing a SR7 release candidate shortly after.


#11

Hi, Steve. I want use the two function ,but I can’t create a right RhinoViewport. Can you tell me how to create a right RhinoViewport? I just have the ability to get the activeViewport!
I am confused about the RhinoViewport Class!

    Dim mview As Rhino.Display.RhinoViewport = New Rhino.Display.RhinoViewport'Me.RhinoDocument.Views.ActiveView.ActiveViewport
Dim acview As rhino.Display.RhinoViewport = Me.RhinoDocument.Views.ActiveView.ActiveViewport
MVIEW.SETCONSTRUCTIONPLANE(ACVIEW.CONSTRUCTIONPLANE)
MVIEW.SETCAMERADIRECTION(ACVIEW.CAMERADIRECTION, 0)
MVIEW.SETCAMERALOCATION(ACVIEW.CAMERALOCATION, 0)
MVIEW.SETCAMERATARGET(ACVIEW.CAMERATARGET, 0)
MVIEW.SETCLIPPINGPLANES(ME.RHINODOCUMENT.VIEWS.ACTIVEVIEW.ACTIVEVIEWPORT.GETFRUSTUMBOUNDINGBOX)
Dim Mcurobjts As rhinoobject() =Me.RhinoDocument.Objects.FindByWindowRegion(MVIEW, x, True, objecttype.Curve)
Dim mcurvelist As New list(Of curve)
For Each rhinobj As rhinoobject In mcurobjts
  mcurvelist.add(rhinobj.Geometry)
Next
a = mcurvelist

I GEt nothing


(Dale Fugier) #12

If you need to set a viewport to a “right” view, then you can do something like this:

Dim view As Rhino.Display.RhinoView = doc.Views.ActiveView
If (view IsNot Nothing) Then
    view.ActiveViewport.SetProjection(Rhino.Display.DefinedViewportProjection.Right, "Right", True)
    view.Redraw()
End If

Does this help?


#13

yes, then another question.
I want store the orginal view, and restore the view after my code perform.
I don’t how to do that.
thank you.


(Dale Fugier) #14

Something like this should work:

Rhino.Display.RhinoView view = doc.Views.ActiveView;
if (null == view)
  return Result.Failure;

view.ActiveViewport.PushViewProjection();

// TODO: modify view here...

view.ActiveViewport.PopViewProjection();
view.Redraw();

#15

Thank you ,I will try it


#16

What’ the code mean, PushviewProjection and popviewprojection?


(Dale Fugier) #17

Rhino maintains a view “stack” so you can undo/redo view changes using the UndoView/RedoView commands.


#18

I feel confused about the class about views.
I handle many view operates,Undoview may take too much time


#19

Your tips seems usless.I paste code here,hope someone can give me a better solution!

 Protected Overrides Sub SolveInstance(ByVal DA As Kernel.IGH_DataAccess)
            If TypeFilter = "\\" Then
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "必须在菜单中选择一个类型(Must select a type in menu)")
                Return
            End If
            Dim Selectplane As New GH_Structure(Of GH_Plane)
            Dim pts As New GH_Structure(Of GH_Point)
            If Not DA.GetDataTree(0, Selectplane) Then Return
            If Not DA.GetDataTree(1, pts) Then Return
            Dim Tcount As Integer = 0
            If Selectplane.Branches.Count <> pts.Branches.Count Then
                AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, "plane的树枝数不等于points的树枝数(Plane's branch count not equal Points' branch count)")
                Return
            Else
                Tcount = Selectplane.Branches.Count
            End If

            Dim Mview As Rhino.Display.RhinoViewport = RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport
            '  RhinoDoc.ActiveDoc.Views.RedrawEnabled = False
            Dim Rtree As New GH_Structure(Of IGH_Goo)
            Dim originmess As String = Message
            Dim Morginview As Rhino.Display.RhinoView = RhinoDoc.ActiveDoc.Views.ActiveView
            If Morginview Is Nothing Then Return
            Morginview.ActiveViewport.PushViewProjection()
            Try
                ' Dim Selplane As Plane = RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport.ConstructionPlane

                For Ibranch As Integer = 0 To Tcount - 1
                    Application.DoEvents()
                    Message = "T:" & Ibranch & ",P:" & (Ibranch / (Tcount - 1)).ToString("0.0%")
                    Dim ppts As New List(Of Point3d)
                    For Each Derghpt As GH_Point In pts.Branch(Ibranch)
                        Application.DoEvents()
                        ppts.Add(Derghpt.Value)
                    Next
                    Dim ghplane As GH_Plane = Selectplane.Branches(Ibranch).First
                    Dim splane As Plane = ghplane.Value
                    'If Vector3d.CrossProduct(splane.ZAxis, Selplane.ZAxis).Length > 0.1 Then
                    Mview.SetToPlanView(splane.Origin, splane.XAxis, splane.YAxis, False)
                    '   End If

                    Dim arrtype As String() = {"point", "curve", "brep", "mesh", "Annotation", "dot"}
                    Dim arrtypeindex As Integer() = {DocObjects.ObjectType.Point, _
                                                     DocObjects.ObjectType.Curve, _
                                                     DocObjects.ObjectType.Brep, _
                                                     DocObjects.ObjectType.Mesh, _
                                                     DocObjects.ObjectType.Annotation, _
                                                     DocObjects.ObjectType.TextDot}
                    Dim arrbrepindex As Integer() = {DocObjects.ObjectType.Brep, DocObjects.ObjectType.Surface, _
                                                     DocObjects.ObjectType.Extrusion}

                    Dim doc As RhinoDoc = RhinoDoc.ActiveDoc
                    Dim docobj As ObjectTable = doc.Objects
                    Dim rt As New List(Of IGH_Goo)
                    Dim Mfilter As New ObjectEnumeratorSettings
                    If Regex.IsMatch("brep", TypeFilter) Then
                        For Each Intindex As Integer In arrbrepindex
                            Application.DoEvents()
                            Dim docobjlist As New List(Of RhinoObject)
                            If Order = 1 Then
                                For Each alldocobj As RhinoObject In docobj.FindByCrossingWindowRegion(Mview, ppts, True, Intindex)
                                    Application.DoEvents()
                                    docobjlist.Add(alldocobj)
                                Next
                            Else
                                For Each alldocobj As RhinoObject In docobj.FindByWindowRegion(Mview, ppts, True, Intindex)
                                    Application.DoEvents()
                                    docobjlist.Add(alldocobj)
                                Next
                            End If

                            rt.AddRange(docobjlist.Select(Function(geoobj As RhinoObject) GH_Convert.ObjRefToGeometry(New ObjRef(geoobj.Id))))
                        Next
                    End If
                    For i As Integer = 0 To arrtype.Count - 1
                        Application.DoEvents()
                        If i = 2 Then Continue For
                        If Regex.IsMatch(arrtype(i), TypeFilter) Then
                            Dim docobjlist As New List(Of RhinoObject)
                            If Order = 1 Then
                                For Each alldocobj As RhinoObject In docobj.FindByCrossingWindowRegion(Mview, ppts, True, arrtypeindex(i))
                                    Application.DoEvents()
                                    docobjlist.Add(alldocobj)

                                Next
                            Else
                                For Each alldocobj As RhinoObject In docobj.FindByWindowRegion(Mview, ppts, True, arrtypeindex(i))
                                    Application.DoEvents()
                                    docobjlist.Add(alldocobj)
                                Next
                            End If

                            If arrtypeindex(i) = 512 Or arrtypeindex(i) = 8192 Then
                                rt.AddRange(docobjlist.Select(Function(geoobj As RhinoObject) GH_Convert.ToVariant(geoobj)))
                            Else
                                rt.AddRange(docobjlist.Select(Function(geoobj As RhinoObject) GH_Convert.ObjRefToGeometry(New ObjRef(geoobj.Id))))
                            End If
                        End If
                    Next
                    Rtree.AppendRange(rt, Selectplane.Path(Ibranch))

                Next
                Message = originmess
                Morginview.ActiveViewport.PopViewProjection()
                Morginview.Redraw()
                ' Mview.ParentView.Redraw()
                ' RhinoDoc.ActiveDoc.Views.RedrawEnabled = True
                '  Mview.PreviousViewProjection()
            Catch ex As Exception
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, ex.Message & Environment.NewLine & ex.StackTrace)
                Message = originmess
                Return
            End Try
            DA.SetDataTree(0, Rtree)
        End Sub

(Dale Fugier) #20

Sorry my tips are useless to you. Maybe you should provide more information. You never mentioned you were writing a Grasshopper component. What is the component supposed to do? What problem are you trying to solve? Perhaps if you provide more information and detail, you might get a tip that is not useless…