Bounding Rectangle instead of Bounding Box?


#1

Hi Everyone
I am wondering if there is any trick to have a bounding rectangle instead of a box when applying CageEdit over an object.


(Dale Fugier) #2

Hi Clive,

I’m not sure what you mean by trick. If this is a usability issue, please move the topic to either the Rhino for Windows or Rhino for Mac category.

– Dale


#3

Hi Dale,
My apologies for the confusion,
I am certainly looking for an algorithm in RhinoScript to provide a Bounding 2D CageEdit for Objects rather than “Bounding Box”


(Dale Fugier) #4

Hi Clive,

The CageEdit command does has an option for creating a Rectangle control object. Or am I confused?

– Dale


#5

It does have the option you mentioned,
But it wont let you make a “bounding Frame” just like a “bounding Box” whereas it asks for either 3Points, Vertical frame or the Center of the frame.


(Dale Fugier) #6

Hi Clive,

Use RhinoScript’s BoundingBox method to calculate the bounding box of the object. Then use the points returned by the method as input when scripting the Rectangle option of CageEdit.

– Dale


#7

Hi again Dale
Thanks
following what you suggested, the goal is to take the highlighted control points in the image,


I did the code below:

Option Explicit

Call Main()
Sub Main()
    Dim strObject,arrObjects,arrGrips,intCount,i

    strObject = Rhino.GetObject("Pick an Object")
    Rhino.SelectObject strObject
    Rhino.Command("CageEdit _Boundingbox _World _X=2 _Y=2 _Z=3 _Enter _Global _Enter")
    arrObjects = Rhino.LastCreatedObjects
    If Not IsNull(arrObjects) Then

        Rhino.EnableObjectGrips arrObjects(0)
        intCount = Rhino.ObjectGripCount(arrObjects(0))
        For i = 1 To intCount Step 3
            Rhino.SelectObjectGrip arrObjects(0), i
        Next
        arrGrips = Rhino.SelectedObjectGrips(arrObjects(0))

        If IsArray(arrGrips) Then

            Rhino.Print CStr(UBound(arrGrips)) +1 & " grips selected."
        End If
    End If

End Sub

So The following control points get selected: (as long as Z=3 in CageEdit)

Would you please walk me through

  1. how to extract the selected control points Coordinates (Rhino.Pt2Str did not work)
  2. how to take the same control points if X and Y in CageEdit equal anything other than 2
    Thanks

#8

@Clive,

below might help to get the 4 points. To pick the rectangle in _CageEdit via a script, you only need two of them:

Option Explicit

Call Main()
Sub Main()
    
    Dim strObject, strView, arrBBox, arrPoints(3)
    
    strObject = Rhino.GetObject("Curve to CageEdit", 4, True, False)
    If IsNull(strObject) Then Exit Sub
    
    strView = Rhino.CurrentView()
    arrBBox = Rhino.BoundingBox(strObject, strView, True)
    If Not IsArray(arrBBox) Then Exit Sub
    
    arrPoints(0) = MidPt(arrBBox(0), arrBBox(4))
    arrPoints(1) = MidPt(arrBBox(1), arrBBox(5))
    arrPoints(2) = MidPt(arrBBox(2), arrBBox(6))
    arrPoints(3) = MidPt(arrBBox(3), arrBBox(7))
    
End Sub

Private Function MidPt (ByRef v1, ByRef v2)
    MidPt = Array((v1(0) + v2(0)) / 2, (v1(1) + v2(1)) / 2, (v1(2) + v2(2)) / 2)
End Function

c.


#9

Thanks,
But Since CageEdit is run via Rhino.Command I think I can not use Rhino.Pt2str to insert the coordinates into the command like:

strObject = Rhino.GetObject("Select captive Object(s)", 4, True, False)
arrPoints(0) = MidPt(arrBBox(0), arrBBox(4))
arrPoints(2) = MidPt(arrBBox(2), arrBBox(6))

strPt0 = Rhino.Pt2Str(arrPoints(0))
strPt2 = Rhino.Pt2Str(arrPoints(2))

Rhino.SelectObject strObject
Rhino.Command("CageEdit _Rectangle strPt0 strPt2 Enter Global")

#10

@Clive, you almost got it. Try below with a planar curve or any other object:

Option Explicit

Call Main()
Sub Main()
    
    Dim strObject, strView, arrBBox, arrPoints(3)
    Dim strCmd, strPtA, strPtB
    
    strObject = Rhino.GetObject("Object to CageEdit", 4 + 8 + 16 + 32, True, True)
    If IsNull(strObject) Then Exit Sub
    
    strView = Rhino.CurrentView()
    arrBBox = Rhino.BoundingBox(strObject, strView, True)
    If Not IsArray(arrBBox) Then Exit Sub
    
    strPtA = Rhino.Pt2Str(MidPt(arrBBox(0), arrBBox(4)))
    strPtB = Rhino.Pt2Str(MidPt(arrBBox(2), arrBBox(6)))
    
    strCmd = "_CageEdit _Rectangle " & strPtA & " " & strPtB & " "
    strCmd = strCmd + "_UDegree=1 _VDegree=1 _UPointCount=2 _VPointCount=2 "
    strCmd = strCmd + "_Global _Enter _Enter"
    
    Rhino.Command strCmd, False
    
End Sub

Private Function MidPt (ByRef v1, ByRef v2)
    MidPt = Array((v1(0) + v2(0)) / 2, (v1(1) + v2(1)) / 2, (v1(2) + v2(2)) / 2)
End Function

c.


#11

Got it,
Thanks a lot :slight_smile: