파라메트릭 모델링(parametric modeling)을 위해서 여러 조합을 생성하려면, 그래스호퍼 컴포넌트에 접근해서 이름과 값을 읽고 내가 원하는 값으로 수정을 할 수도 있어야 한다. 따라서 이번 포스트에서는 그래스호퍼 파이썬을 이용하여 내가 정의한 컴포넌트에 접근하고 쓰는 방법에 대해서 알아보도록 하겠다. 다루는 컴포넌트는 다음과 같다:
- 불리언 토글(Boolean Toggle) 컴포넌트
- 값 리스트(Value List) 컴포넌트
- 그래스호퍼 파이썬(GHpython)
불리언 토글(Boolean Toggle) 컨트롤
현재 초기 값으로 모두 거짓(False)으로 되어 있는데, 아래 파이썬 컴포넌트를 만들면서 이 Boolean Toggle들을 일괄적으로 제어해보려고 한다. 닉네임(Nickname)은 그냥 10~50까지 부여했다. 컴포넌트 위에 마우스 우클릭을 하면 닉네임 수정이 가능하다.
이제 저 5 가지 토글을 키고 끄면서 모두 False인 경우를 제외한 케이스 조합을 만들고 그 히스토리를 남겨보려고 한다. 어떤 히스토리를 남길 것이냐? 켜진 토글의 닉네임을 이어붙인 글자(String)를 반환하도록 하려고 한다. 제대로 작동한다면, 31 가지의 조합이 나올 예정.
파이썬 컴포넌트를 작동시키기에 앞서, 컴포넌트 동작 여부를 컨트롤할 수 있는 Value List에 True/False만 넣어서 True이면 파이썬 스크립트가 작동하도록 아래와 같이 구성했다.
Value List 설정
Value List 컴포넌트 초기 값으로는 위의 상태가 아니고 One, Two, Three, Four에 해당하는 변수나 식이 할당되어 있다. 커스텀이 가능한 컴포넌트이니, 참(True), 거짓(False) 값만 새로 할당해준다.
파이썬 스크립트 작성
import rhinoscriptsyntax as rs
import scriptcontext as sc
import Grasshopper as gh
import itertools
def getNick(boolList):
filename = ''
if button:
# Harvest Grasshopper canvas for named object data
for i, obj in enumerate(ghenv.Component.OnPingDocument().Objects):
# Get toggle name & value
if type(obj) is gh.Kernel.Special.GH_BooleanToggle:
obj.Value = boolList[i-2] # 0번: Python 1번: List, 다음이 Boolean Toggle 순서
if obj.Value:
filename += obj.NickName
return filename
if __name__ == "__main__":
# Bool combinations
bool_list = list(itertools.product([True, False], repeat = 5)) # 2^5=32 cases
# Delete all False case
bool_list.pop() # bool_list => 31 cases
print bool_list[1]
out = getNick(bool_list[1]) # True, True, True, True, False => 10203040
위와 같이 python 스크립트를 작성하면, 5 가지의 불리언 토글을 컨트롤하여 각각의 닉네임을 이어붙인 스트링(string)이 반환된다. 앞서 언급한 것처럼 모두 선택되지 않은 경우를 제외하면 총 31가지의 string 조합을 반환하려고 하는데, 일단 한 가지 케이스에 대해서 예상한 output 값이 반환이 잘 되는지 테스트를 해보면 다음과 같다.
간단하게 작성한 코드를 설명해보면, 컴포넌트 중에 불리언 토글의 닉네임 값을 받아오고, 각 토글의 불리언 값을 31가지의 True/False 조합에 맞게 입력을 해주도록 한다. 위의 예시는 만든 bool_list 중에 두 번째 리스트 값인 [True, True, True, True, False]를 함수에 입력하여, False에 해당하는 50을 제외한 10, 20, 30, 40을 이어붙인 filename이라고 이름 지은 변수가 output으로 반환이 된다.
최종적인 목표는 31 가지 이름 조합이 나오도록하는 것인데, out으로 나오는 결과가 리스트가 되도록 빈 배열을 정의해놓고 루프만 추가해주면 된다.
if __name__ == "__main__":
# Bool combinations
bool_list = list(itertools.product([True, False], repeat = 5)) # 2^5=32 cases
# Delete all False case
bool_list.pop() # bool_list => 31 cases
a = []
for i in range(len(bool_list)):
a.append(getNick(bool_list[i]))
out = a
파이썬 컴포넌트를 위와 같이 수정해주면 다음과 같이 원하는 결과를 얻을 수 있다.
다음에도 내가 하면서 정리해 둘만한 것으로 돌아오겠다.
'Researches > Rhino(라이노) | Grasshopper' 카테고리의 다른 글
[Rhino | Grasshopper] 원호(arc) 아크 그리기 - 그래스호퍼 3d 파이썬 활용 (0) | 2023.04.07 |
---|---|
[Rhino | Grasshopper] 그래스호퍼 3d 파이썬 - GHpython 활용해보기 (0) | 2023.03.29 |
[Rhino | Grasshopper] 원하는 객체의 바운딩 박스(bounding box) - 그래스호퍼 활용 (2) | 2023.03.27 |