December 19, 2008

RhinoScript | Cut solids

절삭의 방법으로 형상을 디자인할때 솔리드를 평면을 기준으로 컷팅하는 방법이 아주 유용하다. 그러나 라이노에서는 평면을 생성하고 다시 불린 커맨드를 실행해야하는 불편함을 요구하는 분들이 있다.

그래서, 3점을 입력하면 그 점을 기준으로 하는 평면으로 오브젝트를 잘라주는 스크립트를 만들었다. 점을 입력할때 클릭하는 방향에 따라 생셩되는 평면의 Normal방향이 달라져 잘려나가는 부분이 바뀌게 된다.






Option Explicit
'2008.12.10
'Script by sac3@rhinos.co.kr

CutSolid
Sub CutSolid ()

Dim arrObjects, arrPoints, arrVector1, arrVector2, arrBD, strCut

arrObjects = Rhino.GetObjects ("Select Solids to Cut",8+16,vbTrue,vbTrue)
If IsNull(arrObjects) Then Exit Sub

arrPoints = Rhino.GetPoints (True, False , "Pick 3 Points",, 3 )
If IsNull(arrPoints) Then Exit Sub
If UBound(arrPoints) <2 Then Exit Sub

Rhino.EnableRedraw False

arrVector1= Rhino.VectorCreate (arrPoints(0), arrPoints(1) )
arrVector2= Rhino.VectorCreate (arrPoints(0), arrPoints(2) )
strCut = Rhino.AddCutPlane (arrObjects, arrPoints(0), arrPoints(1) , arrVector2)
arrBD = Rhino.BooleanDifference (arrObjects, Array(strCut) )

If IsArray(arrBD) Then
Rhino.ShrinkTrimmedSurface arrBD(0)
Rhino.SelectObjects arrBD
Else
Rhino.DeleteObject strCut
Rhino.Print "Failed to Cut"
End If

Rhino.EnableRedraw True

End Sub



참고로 평면들이 서로 겹친 부분들이 있는 경우, BooleanUnion을 하고나면, 그 부분의 평면이 나뉘게 되는데, 그 부분을 하나의 면으로 합쳐주기 위해서는 MergeAllFaces 커맨드를 사용하면 된다.
동영상에서는 두 커맨드를 macro를 이용하여 한번에 실행되도록 해둔 것 이다.

! _BooleanUnion Pause
_SetRedrawOff _SelLast
_MergeAllFaces _SelNone
_SetRedrawOn

2 comments:

muyee said...

End Sub
)

Remove the ')' at the end of the Script?
Thanks, i like it:)

Sanghoon Yoon said...

Hi muyee,
Fixed, Thanks!