본문 바로가기

흔한말 (collection)/Python

Python For 문을 연습하는 방법(feat. Revit Dynamo)

300x250

오늘은 Python의 for 문을 알아볼텐데,
Revit Dynamo에서 파이썬 노드를 꺼내서 실습해보겠습니다.
굳이 다이나모에서 실습하는 이유는
레빗 프로젝트와 연동해서 객체를 반복문으로 다루는 법을 보이고자 함입니다.

Python for문을 어떻게 접근하고 익힐까요?

 

기본 개념 (코딩도 언스마트하게 하면 육체노동을 할 수 있다?!)

for 문을 공부하는 것은 어떤 언어에서든 기본이 됩니다.
“다이나모 기본노드 활용 시리즈-2” 에서 언급했었는데,

1개의 개체를 다루는 코드와, 2개 이상의 개체를 다루는 코드는 구조가 다릅니다.
2개 이상을 다루는 코드의 재료가 되는 것 중 가장 이해하기 쉬운 것이 리스트입니다.

라는 말을 한 적이 있죠?
2개 이상의 개체를 다루기 위해서는, 하나의 객체를 다루는 코드를 반복시켜야합니다.

위 그림을 볼까요?
“어떤리스트” 라는 변수에 1부터 10까지의 숫자가 담긴 리스트를 할당했습니다.(이것이 재료이겠죠?)
그다음에 “전체계산결과”라는 이름의 변수에 빈 리스트를 준비시켜놓고요.
그 다음에는 for 문이 등장합니다.

읽어보면,

  1. 어떤리스트에 있는 {원소} 하나마다
  2. 그 원소의 값을 제곱한 값을 “계산결과”라는 변수에 할당한 뒤
  3. 그 계산결과라는 값을  "전체계산결과" 라는 리스트에 넣어라.

 

이런 흐름이 됩니다.

이 코드에서는 "어떤일" 구간에서 대상숫자를 제곱하도록 되어있죠?



이걸 하드코딩으로 바꿔볼까요.

아찔하죠?
재료가 되는 리스트의 개수가 100개가 넘어가면 그때부터는 육체노동입니다.
코딩의 기본은 축약입니다.
반복되는 패턴을 하나의 문구로 축약해서 표현하는 것이 기본입니다.
이제 for 문 없이는 살 수 없는 몸이 되셨군요.

 

 

 

 

 

응용 (feat. Revit Dynamo - 기본노드 + Python Script Node)

숫자로만 이루어진 리스트를 다루면 사실 어떻게 이런 문법을 갖고 복잡한 기능을 하는 프로그램을 짜는지 의구심이 들 때가 있습니다.
그래서 레빗 다이나모를 통해, 수가 많은 레빗 객체를 for문으로 컨트롤 하는 코드를 한 번 짜보도록 하겠습니다.

위 그림처럼 레빗으로 샘플프로젝트를 열고, 다이나모를 실행해서 위와 같이 노드를 세팅해 둡니다.
외우세요 라고 표시된 부분을 보면, Revit에 존재하는 모든 객체들 중에서, Walls 카테고리에 해당하는 객체들만 모아서 리스트로 만들어 주는 것을 볼 수 있죠?

이 내용은 하기 링크에도 자세히 나와있으니 참고하세요.
Dynamo로 Revit 객체의 형상을 포함한 각종 정보들을 가져오기

 

Dynamo로 Revit 객체의 형상을 포함한 각종 정보들을 가져오기

Revit에서 작성된 BIM 객체들의 정보를 조회하고 조작하는 것은 Revit 안에서도 가능합니다. 하지만 작성된 정보들을 데이터베이스의 형태로 조작하고 변형하거나, 기존 데이터를 활용하여 새로운

hnanmal.tistory.com



레빗에서 벽체를 하나 클릭해보면 좌측 Property창에 수만은 매개변수 들이 있는데, Mark라는 매개변수 안에는 아무 값도 없는 것을 볼 수 있습니다.
여기에 벽체별로 다른 이름을 집어넣어서, 추후에 관리가 쉽도록 해보려고 합니다.

그림처럼 “All Elements of Category”노드의 출력포트를 새로 만든 파이썬 노드의 입력값에 연결해 줍니다.

그다음에 “모든벽들” 이라는 변수를 만들고 입력포트인 IN[0]로 들어온 전체 벽 객체 리스트를 ‘=’ 기호로 할당해주면 준비는 다 끝났습니다.

그 다음에 for 문을 그림과 같이 적어줍니다.
enumerate함수는 재료리스트에서 원소를 호출할 때, 인덱스 번호와 함께 호출해 주는 함수입니다.
자세한 설명은 하기 링크 참고하세요.
내장 함수 enumerate()

 

내장 함수 enumerate()

반복문을 사용할 때, 원소와 인덱스를 동시에 얻고 싶을 때가 있습니다. 가장 흔하게 떠올릴 수 있는 코드는 아래와 같습니다. idx = 0 for element in ['AA', 'bb', 'Cc']: print(idx, element) idx += 1 ... 0 A..

hnanmal.tistory.com



그래서 “번호객체세트” 라는 변수에는 (1, Wall객체) 의 형식으로 데이터가 들어오게 되겠죠?
번호객체세트의 [0]번째 데이터를 “벽번호”라는 변수에 할당하고,
번호객체세트의 [1]번째 데이터를 “벽객체”라는 변수에 할당한 다음
벽객체.SetParameterByName이라고 입력합니다.

.SetParameterByName는 다이나모의 Element.SetParameterByName()노드와 동일한 기능을 합니다.

그림처럼 객체를 재료로 받고, 객체가 갖고 있는 매개변수 이름을 받은 다음,
그 매개변수에 할당할 값을 연결하면 객체의 매개변수 값을 바꿔주는 노드입니다.

이 그림처럼 사용하면 됩니다.

파이썬 코드에서 f"wall-{벽번호}” 라고 쓰여진 부분은
객체의 인덱스번호인 벽번호에 따라, 문자열을
“wall-1”.. “wall-2”..”wall-3”으로 변경하며 적용해 달라는 의미입니다.
(이것에 대해서는 다시 포스팅하겠습니다.)
자 이제 다 끝났습니다.

파이썬 노드의 결과로 반환된 벽 객체들의 “Mark” 파라미터 값을 다시 조회해 보았더니,
맨 처음에는 모두 빈칸이었는데 지금은 “wall-숫자”의 형태로 바뀌어 있죠?

레빗에서 벽 객체를 하나 클릭해보면 wall-57 로 “Mark”매개변수에 값이 잘 반영된것을 볼 수 있습니다.

결론

반복문이 어떤 식으로 사용되는지, 어떤 상황에 사용될 수 있는지 조금은 구체적인 사례로 보여드리고 싶었습니다.
리스트컴프리헨션 문법을 사용하시면 for문을 극단적으로 한줄로 축약하여 작성할 수 있으나,
먼저 처음에는 정석적으로 for 문을 고심해서 천천히 작성하는 연습을 해보세요.
10000개가 넘는 부재들이 있어도, 손쉽게 처리할 수 있습니다.

반응형