이번 포스팅에서는 rhinoscriptsyntax를 이용해 그래스호퍼의 Deconstruct Point 컴포넌트와 동일하게 포인트의 좌표를 구하는 법을 다룹니다.
동영상 설명
rs.PointCoordinates()
먼저 GH Python 컴포넌트를 불러오고 인풋의 이름을 보기 좋게 P로 바꿉니다. 그리고 Construct Point 컴포넌트를 불러와 P에 연결해줍니다. 임의의 포인트를 생성하여 넣어주기 위함입니다.
이때 파이썬 컴포넌트의 인풋의 속성은 불러왔을 때 그대로인 상태입니다. Item Access이고 타입 힌트는 ghdoc 기본입니다.
파이썬 컴포넌트를 켜줍니다. 인풋으로 들어오는 P의 타입을 출력해보면 Guid라고 뜹니다. 그리고 P 자체를 출력해보면 복잡한 문자열이 나옵니다.
GUID란 Globally Unique Identifier의 준말로 한글로는 전역 고유 식별자입니다. 간단하게 말해서 우리나라의 주민등록번호 혹은 DNA와 같은 역할을 합니다. 성별, 이름, 키, 몸무게, 생김새 전부 같더라도 주민등록번호 혹은 DNA가 다르면 다른 사람입니다. 그래스호퍼에서도 마찬가지로 똑같은 위치에 있는 2개의 포인트이더라도, 혹은 같은 위치에 같은 크기로 있는 5개의 Box이더라도 각각은 구별되어야 합니다. 각 개체의 고유한 Guid가 그것을 구별하게 해주는 역할을 합니다.
포인트의 좌표를 얻기 위해선 rhinoscriptsyntax의 PointCoordinates 라는 함수를 사용합니다. coordinates, 좌표라는 뜻 그대로 포인트의 좌표를 구해줍니다. 인수로는 obejct_id 즉 GUID를 받습니다.
우리가 받아온 P를 넣어줍니다. 그리고 pt라는 변수에 할당해줍니다. 마지막으로 파이썬 컴포넌트의 출력값인 a에 pt를 할당해준 뒤 패널로 연결해보면 Construct Point의 기본값으로 생성된 [0,0,0] 이라는 좌표가 출력되는 걸 확인할 수 있습니다.
Construct Point의 X, Y, Z 값에 넘버 슬라이더를 연결해 바꿔보면 실시간으로 업데이트 되어 출력되는 걸 확인할 수 있습니다.
Multiple Points
그럼 이번에는 포인트 여러개의 좌표를 추출해볼까요? 포인트 하나를 더 만듭니다. 그리고 그 포인트를 shift를 누른 채 파이썬 컴포넌트에 연결합니다. 정상적으로 2개의 좌표가 출력되는 걸 확인할 수 있습니다.
그런데 파이썬 컴포넌트 위에 마우스를 올려보면 "This component ran twice."라고 뜹니다. 즉, 컴포넌트가 두번 실행됐다는 것입니다. 포인트 하나 하나에 대해 코드가 각각 실행이 된 것입니다. 이렇게 되면 추후 많은 데이터를 처리할 때 문제가 생깁니다.
이것을 해결하기 위해 파이썬 컴포넌트의 P를 우클릭 하여 List Access로 바꿔줍니다.
리스트로 바꾸니 오류가 생깁니다. PointCoordinates 함수의 인수로는 Guid만 받을 수 있습니다. 그런데 우리가 지금 입력한 P의 타입을 확인해보니 이전에는 Guid였는데 이제는 list로 바뀌었습니다. 4번줄처럼 P 자체를 출력해보면 [<System.Guid ~~ >, <System.Guid ~~>] 가 출력됩니다. 즉 P는 Guid의 리스트라는 말이에요. 우리는 이 Guid 하나 하나를 꺼내서 좌표를 확인한 뒤 그 값을 좌표 리스트에 넣어줄 거예요.
pts = [] 를 통해 pts라는 빈 리스트를 새로 선언해줍니다. 그리고 for loop을 사용하여 P 리스트 안의 값을 i라는 변수로 불러옵니다. i (포인트 Guid) 하나 하나에 대해 PointCoordinates를 통해 좌표를 얻은 뒤 그 값을 pt에 할당합니다. 그리고 그 pt를 앞서 만들었던 pts라는 리스트에 append 합니다. 마지막으로 컴포넌트 출력값인 a에 pts를 할당합니다.
패널을 보면 값이 정상적으로 출력되고 컴포넌트도 한번만 작동되었다고 뜨는 것을 확인할 수 있습니다.
rs.coerce3dpoint()
이때까지는 Type Hint를 기본 값인 ghdoc으로 두고 작업했습니다. 이렇게 되면 우리가 받는 인풋의 type이 무엇인지 우리가 정하는 것이 아니기 때문에 명시적인 코딩이 어렵습니다. 더하여 기본적으로 type이 캐스팅이 되어서 들어오는 과정을 한번 거치기 때문에 조금 더 느리다는 단점도 있습니다. 그러니 이번에는 Type Hint를 없애서 No Type Hint로 하여 기본적인 형태로 인풋을 받아보겠습니다.
List Access이기 때문에 여전히 P의 타입은 list입니다. 그렇다면 P 리스트에서 첫번째 값을 봐볼까요? P[0]라고 인덱스를 해서 확인해보겠습니다. Point3d 라는 타입입니다. 밑에 오류를 보면 "Parameter must be Guid ..."라고 되어 있습니다. 즉, rs.Pointcoordinates 함수의 인수에 Guid가 아니라 Point3d가 들어가고 있기 때문에 생기는 오류입니다.
Point3d의 좌표를 확인할 수 있는 함수는 coerce3dpoint입니다. 이 함수는 인수로 point를 받습니다.
이쯤 되면 rhinoscriptsyntax를 잘 모르시는 분들은 의문이 하나 들 수도 있을 것입니다. "어떤 특정한 기능을 하는 함수가 있는지 어떻게 알까?", "저 함수들이 어떤 기능을 하는지 어떻게 알까?" 여기에 드릴 수 있는 답변은 세 개입니다.
1. 제 글을 참고하면 됩니다. 그러한 의문을 해결하는 정보를 제공하려고 제가 이렇게 글을 쓰는 것입니다. 제가 rhinoscriptsyntax를 공부하면서 겪었던 시행착오를 바탕으로 설명하고 있습니다.
2. rhinoscriptsyntax Api 를 참고하면 됩니다. 여기 있는 모든 함수를 아는 것은 불가능하겠지만, 적어도 어떤 기능을 하는 함수들이 존재하는지는 익힐 수 있도록 계속 해서 살펴보면 좋습니다. 혹은 구글링을 활용하여 그래스호퍼의 특정 컴포넌트 기능을 하는 함수가 있는지 검색해보면 됩니다. 예를 들어 "rhinoscriptsyntax contsruct point"와 같이 말입니다.
3. 그저 많이 해봐야 합니다. rhinoscriptsyntax Api라는 문법을 익히는 것이기 때문에, 문법을 익히기 위해선 많이 접해봐야 합니다. 그렇다고 모든 것을 다 외울 필요는 전혀 없습니다. 그때 그때 검색하여 사용하면 되니까요. 그러나 어떤 기능이 있는지조차도 모른다면 검색을 하는 것부터 난관일 것입니다.
그럼 다시 이어서 설명하자면 rs.coerce3dpoint라는 함수에 인수로 i 즉, Point3d 하나를 넣습니다. 그리고 그 결과값을 pts라는 리스트에 넣은 뒤 출력하면 오류 없이 정상적으로 작동하는 걸 확인할 수 있습니다.
여기까지 rhinoscriptsyntax를 활용하여 포인트의 좌표를 구하는 방법에 대해 설명드렸습니다. rhinoscriptsyntax 외에 rhinocommon을 이용하여 포인트의 좌표를 구하는 방법도 있습니다. 이건 더 간단하고 실용적입니다. 이에 대해서는 설명이 길어 유튜브 영상으로 대체하였으니 참고해주시길 바랍니다.
혹시 읽다가 모르는 부분이 있었다면 댓글로 달아주세요!
'GH Python > 튜토리얼' 카테고리의 다른 글
파이썬 기초 문법 스터디 (0) | 2022.04.20 |
---|---|
그래스호퍼 파이썬 | Surface 만들기 PlanarSrf, Loft, Sweep1, Sweep2 (0) | 2022.04.08 |
그래스호퍼 파이썬 | AddPoint 포인트 생성 및 포인트 그리드 (0) | 2022.03.21 |
그래스호퍼 파이썬 공부 자료 | rhinoscriptsyntax (0) | 2022.03.09 |
댓글