Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
코드 블록은 Dynamo의 고유한 기능으로서, 시각적 프로그래밍 환경을 문자 기반 환경에 동적으로 연결해 줍니다. 코드 블록은 모든 Dynamo 노드에 액세스할 수 있으며 하나의 노드에서 전체 그래프를 정의할 수 있습니다. 코드 블록은 Dynamo의 기본적인 빌딩 블록이므로 이 장을 자세히 읽어 보십시오.
Dynamo에서 AEC 세계에 대한 코딩을 시작하면 좋습니다. 코딩 여정을 시작하려는 경우 다음 섹션 중 일부에 관심이 있을 것입니다.
코드 블록은 Dynamo에서 핵심적으로 사용되는 프로그래밍 언어인 DesignScript를 깊이 있게 볼 수 있는 창입니다. 예비 설계 워크플로우를 지원할 목적으로 완전히 새로 제작된 DesignScript는 사람이 읽을 수 있는 간결한 언어로, 소량의 코드에는 즉각적인 피드백을 제공하고 크고 복잡한 상호작용에 맞게 확장됩니다. 또한 DesignScript는 "내부적으로" Dynamo의 대부분을 구동하는 엔진의 토대를 형성합니다. Dynamo 노드에 포함된 거의 모든 기능과 상호작용은 스크립팅 언어와 일대일 관계가 있으므로, 노드 기반 상호작용과 스크립팅 간에 유연하게 전환할 수 있는 특별한 기능이 있습니다.
초보자를 위해 노드는 DesignScript 학습을 지원할 목적으로 또는 단순히 규모가 더 큰 그래프 섹션의 크기를 줄일 목적으로 자동으로 변환될 수 있습니다. 이 작업은 "Node to Code" 프로세스를 사용하여 수행합니다. 이 프로세스에 대한 자세한 설명은 DesignScript 구문 섹션에 나와 있습니다. 더 숙련된 사용자는 코드 블록을 사용하여 기존 기능과 많은 표준 코딩 패러다임을 활용한 사용자 작성 관계로 구성된 사용자화된 매쉬업을 만들 수 있습니다. 초급자와 고급 사용자 사이에는 방대한 바로 가기 및 코드 조각이 있는데, 바로 이러한 요소가 설계를 가속화해 줍니다. 프로그래머가 아닌 사람에게 '코드 블록'이라는 용어는 생소할 수 있지만 코드 블록은 사용하기 쉽고 강력합니다. 초급 사용자는 최소한의 코딩으로 코드 블록을 효율적으로 사용할 수 있으며, 고급 사용자는 스크립팅된 정의를 지정하여 Dynamo 정의의 다른 위치에서 다시 호출할 수 있습니다.
간단히 말해, 코드 블록은 시각적 스크립팅 환경 내의 문자 스크립팅 인터페이스입니다. 숫자, 문자열, 수식 및 기타 데이터 유형으로 사용할 수 있습니다. 코드 블록은 Dynamo용으로 설계되었으므로 사용자는 코드 블록에서 임의의 변수를 정의할 수 있으며, 이러한 변수는 노드의 입력에 자동으로 추가됩니다.
코드 블록을 사용하면 사용자가 입력 지정 방식을 유연하게 결정할 수 있습니다. 아래에 좌표 (10, 5, 0) 으로 기본 점을 만드는 다양한 방법이 나와 있습니다.
라이브러리의 사용 가능한 함수에 대해 자세히 알아볼 때 라이브러리에서 검색한 후 적절한 노드를 찾는 것보다 "Point.ByCoordinates"를 입력하는 것이 더 빠르다는 것을 알게 될 것입니다. "Point." 를 입력하면 점에 적용할 수 있는 함수 리스트가 Dynamo에 표시됩니다. 이렇게 하면 스크립팅을 더 직관적으로 사용할 수 있으며 Dynamo에서 함수를 적용하는 방식을 배우는 데 도움이 됩니다.
코드 블록은 코어>입력>작업>코드 블록 에서 찾을 수 있습니다. 하지만 단순히 캔버스를 두 번 클릭하기만 하면 코드 블록이 더 빠르게 나타납니다. 이 노드는 너무 자주 사용되어 두 번 클릭 권한이 완전하게 부여되어 있습니다.
코드 블록은 데이터 유형에 대해서도 유연하게 작동합니다. 사용자는 숫자, 문자열, 수식을 빠르게 정의할 수 있으며 코드 블록은 원하는 출력을 제공합니다.
아래 이미지에서는 작업을 수행하는 "구식" 방법이 오랜 걸린다는 것을 알 수 있습니다. 사용자는 인터페이스에서 의도한 노드를 검색하고 노드를 캔버스에 추가한 다음, 데이터를 입력해야 합니다. 코드 블록을 사용하는 경우 사용자는 캔버스를 두 번 클릭하여 노드를 표시하고 기본 구문을 사용하여 올바른 데이터 유형을 입력하면 됩니다.
코드 블록과 비교하여 더 이상 사용되지 않을 것이 거의 확실한 Dynamo 노드의 세 가지는 number, string 및 formula 노드입니다.
"구식"
코드 블록
함수는 코드 블록에서 작성한 후 Dynamo 정의의 다른 위치에서 다시 호출할 수 있습니다. 이를 통해 파라메트릭 파일에 또 다른 제어층이 작성되며, 이는 텍스트 기반 버전의 사용자 노드로 볼 수 있습니다. 이 경우 "parent" 코드 블록에 쉽게 액세스할 수 있으며 그래프의 모든 위치에 배치할 수 있습니다. 와이어는 필요하지 않습니다.
첫 번째 줄에는 키워드 “def”, 그다음에 함수 이름, 괄호로 묶인 입력 이름이 차례로 표시됩니다. 중괄호는 함수의 본문을 정의합니다. "return ="을 사용하여 값을 반환합니다. 함수를 정의하는 Code Block은 다른 Code Block에서 호출되기 때문에 입력 또는 출력 포트가 없습니다.
동일한 파일의 다른 Code Block에서 해당 이름 및 동일한 개수의 인수를 지정하여 함수를 호출합니다. 이 노드는 라이브러리의 기본 제공 노드처럼 작동합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습에서는 점의 입력 리스트에서 구를 작성하는 일반 정의를 만들겠습니다. 이러한 구의 반지름은 각 점의 Z 특성에 의해 결정됩니다.
각각 0에서 100 사이의 값을 갖는 10개의 값 범위로 시작하겠습니다. 이러한 값을 Point.ByCoordinates 노드에 연결하여 대각선을 작성합니다.
Code Block을 작성하고 정의를 소개합니다.
다음 코드 줄을 사용합니다.
inputPt 는 함수를 구동할 점을 나타내기 위해 지정한 이름입니다. 현재, 이 함수는 아무 기능도 하지 않지만 이후 단계에서 구축할 것입니다.
Code Block 함수에 추가하여 주석과 각 점의 Z 위치를 조회하는 sphereRadius 변수를 배치합니다. inputPt.Z 에는 괄호가 메서드로 필요하지 않습니다. 기존 요소 특성의 조회 이므로 입력이 필요하지 않습니다.
이제 다른 Code Block에서 작성한 함수를 불러오겠습니다. 캔버스를 두 번 클릭하여 새 code block 을 작성하고 sphereB 를 입력하면 Dynamo는 정의한 sphereByZ 함수를 제안합니다. 함수가 intellisense 라이브러리에 추가되었습니다. 멋지지 않은가요?
이제 함수를 호출하고, 이전 단계에서 생성한 점에 연결할 Pt 라는 변수를 작성합니다.
출력에서 모든 값이 null이라는 것을 확인할 수 있습니다. 그 이유는 무엇일까요? 함수를 정의했을 때 sphereRadius 변수를 계산하지만 함수가 출력 으로 반환 해야 하는 결과를 정의하지 않았습니다. 이 문제는 다음 단계에서 해결할 수 있습니다.
중요한 단계로, 선
return = sphereRadius;
를 sphereByZ 함수에 추가하여 함수의 출력을 정의해야 합니다.이제 Code Block의 출력이 각 점의 Z 좌표를 나타낸다는 것을 알 수 있습니다.
이제 Parent 함수를 편집하여 실제 구를 작성하겠습니다.
먼저 다음 코드 줄로 구를 정의합니다.
sphere=Sphere.ByCenterPointRadius(inputPt,sphereRadius);
다음으로, 반환 값을 sphereRadius 대신 sphere 로 변경합니다.
return = sphere;
이렇게 하면 Dynamo 미리보기에 몇 개의 큰 구가 표시됩니다.
1. 이러한 구의 크기를 조절하기 위해 구분선
sphereRadius = inputPt.Z/20;
을 추가하여 sphereRadius 값을 업데이트하겠습니다. 이제 별도의 구가 표시되며 반지름과 Z 값 간의 관계를 이해할 수 있습니다.
Point.ByCoordinates 노드에서 레이싱을 최단 리스트에서 외적으로 변경하여 점 그리드를 작성합니다. sphereByZ 함수는 여전히 전체 효과를 나타내므로 모든 점이 Z 값을 기준으로 하는 반지름의 구를 작성합니다.
물을 테스트하기 위해 숫자의 원래 리스트를 Point.ByCoordinates에 대한 X 입력에 연결합니다. 이제 정육면체 및 구가 구현되었습니다.
참고: 컴퓨터에서 계산하는 데 시간이 오래 걸리는 경우 #10 을 #5 와 같은 값으로 변경해 보십시오.
작성한 sphereByZ 함수는 일반 함수이므로 이전 단원에서 사용한 나선을 다시 불러와 이 함수를 적용할 수 있습니다.
마지막 단계: 사용자 정의 매개변수로 반지름 비율을 구동해 보겠습니다. 이렇게 하려면 함수에 대한 새 입력을 작성하고 20 구분자를 매개변수로 대치해야 합니다.
다음과 같이 sphereByZ 정의를 업데이트합니다.
입력에
sphereByZ(Pt,ratio);
와 같이 ratio 변수를 추가하여 하위 Code Block을 업데이트합니다. 슬라이더를 새로 작성한 Code Block 입력에 연결하고, 반지름 비율에 따라 반지름의 크기를 변경합니다.
Dynamo의 노드 이름에서는 일반적인 테마를 확인할 수 있습니다. 각 노드에서는 공백 없이 "." 구문을 사용합니다. 그 이유는 각 노드의 맨 위에 있는 문자가 스크립팅의 실제 구문을 나타내고 "."(또는 점 표기법)은 호출할 수 있는 방법과 요소를 구분하기 때문입니다. 이를 통해 시각적 스크립팅에서 문자 기반 스크립팅으로 쉽게 변환할 수 있습니다.
점 표기법의 일반적인 비유로, Dynamo에서 파라메트릭 사과는 어떻게 처리할 수 있을까요? 다음은 사과를 먹기로 결정하기 전에 사과에 대해 실행할 몇 가지 메서드입니다. 참고: 이는 실제 Dynamo 메서드가 아닙니다.
인간 판독 가능 | 점 표기법 | Output |
---|---|---|
여러분에 대해서는 잘 모르지만 위 표의 출력을 통해 판단해보면 이는 맛있는 사과처럼 보입니다. Apple.eat() 를 수행해 보겠습니다.
사과의 비유를 생각하면서 Point.ByCoordinates 를 살펴보고 code block을 사용하여 점을 작성하는 방법을 살펴보겠습니다.
code block 구문 Point.ByCoordinates(0,10);
는 하나의 노드를 사용하여 점을 작성할 수 있다는 점을 제외하고 Dynamo의 Point.ByCoordinates 노드와 동일한 결과를 제공합니다. 이 구문은 별도의 노드를 "X" 및 "Y" 에 연결하는 것보다 더 효율적입니다.
code block에서 Point.ByCoordinates 를 사용하여 즉시 사용 가능한 노드 (X,Y) 와 동일한 순서로 입력을 지정합니다.
노드가 특수한 "UI" 노드 가 아닌 한, Code Block을 통해 특수 사용자 인터페이스 기능을 사용하는 라이브러리의 모든 일반 노드를 호출할 수 있습니다. 예를 들어 Circle.ByCenterPointRadius 는 호출할 수 있지만 Watch 3D 노드를 호출하는 것은 적절하지 않습니다.
일반 노드(대부분의 라이브러리)는 일반적으로 다음과 같은 세 가지 유형으로 사용됩니다. 이러한 카테고리에 유의하면 라이브러리 구성을 이해할 수 있습니다. 이러한 세 가지 유형의 메서드 또는 노드는 Code Block 내에서 호출될 때 다르게 취급됩니다.
Create - 항목 작성 또는 구성
Action - 항목에 대해 작업 수행
Query - 이미 존재하는 항목의 특성을 가져오기
"Create" 카테고리에서는 형상을 처음부터 새로 구성합니다. code block에 값을 왼쪽에서 오른쪽으로 입력합니다. 이러한 입력은 위에서 아래로의 노드 입력과 같은 순서로 되어 있습니다.
Line.ByStartPointEndPoint 노드와 code block의 해당 구문을 비교해 보면 동일한 결과를 얻을 수 있습니다.
Action은 해당 유형의 객체에 대해 수행할 수 있는 작업입니다. Dynamo에서는 많은 코딩 언어에 공통되는 _점 표기법_을 사용하여 항목에 작업을 적용합니다. 작업이 완료되면 점을 입력한 후 작업의 이름을 입력합니다. action-type 메서드의 입력은 create-type 메서드와 같이 괄호로 묶으며, 표시되는 첫 번째 입력을 해당 노드에 지정할 필요가 없습니다. 대신, 작업을 수행할 요소를 지정합니다.
Point.Add 노드는 action-type 노드이므로 구문이 조금 다르게 작동합니다.
입력은 (1) point 와 여기에 추가할 (2) vector 입니다. Code Block 에서는 점(항목)의 이름을 “pt” 로 지정했습니다. *“vec”*라는 벡터를 “pt” 에 추가하려면 pt.Add(vec) 또는 thing, dot, action이라고 씁니다. Add 작업에는 입력이 하나만 있거나 Point.Add 노드의 모든 입력에서 첫 번째 입력을 뺀 입력이 포함됩니다. Point.Add 노드에 대한 첫 번째 입력은 점 자체입니다.
query-type 메서드는 객체의 특성을 가져옵니다. 객체 자체가 입력이므로 입력을 지정할 필요가 없습니다. 괄호는 필요하지 않습니다.
노드를 사용하는 레이싱은 code block을 사용하는 레이싱과 약간 다릅니다. 노드를 사용할 경우 사용자는 노드를 마우스 오른쪽 버튼으로 클릭하고 수행할 레이싱 옵션을 선택하면 됩니다. code block을 사용할 경우에는 사용자가 데이터 구성 방법을 보다 강력하게 제어할 수 있습니다. code block 줄임 메서드에서는 복제 가이드 를 사용하여 여러 1차원 리스트를 쌍으로 연결하는 방법을 설정합니다. "<>" 꺾쇠괄호로 묶은 숫자를 통해 내포된 결과 리스트의 계층(<1>,<2>,<3> 등)이 정의됩니다.
이 예에서는 두 개의 범위를 정의하는 줄임 메서드를 사용합니다(이 장의 다음 섹션에서 줄임 메서드에 대해 좀 더 자세히 설명함). 간단히 말해
0..1;
은{0,1}
과 동일하며-3..-7
은{-3,-4,-5,-6,-7}
과 동일합니다. 결과적으로 x 값 2개와 y 값 5개가 표시됩니다. 이러한 불일치 리스트에서 복제 가이드를 사용하지 않는 경우 최단 리스트의 길이에 해당하는 두 점의 리스트가 표시됩니다. 복제 가이드를 사용하여 2개 및 5개 좌표의 가능한 모든 조합(또는 외적)을 찾을 수 있습니다.Point.ByCoordinates
(x_vals<1>,y_vals<2>);
구문을 사용하면 각 리스트에 5 개의 항목이 포함된 2 개의 리스트를 얻게 됩니다.Point.ByCoordinates
(x_vals<2>,y_vals<1>);
구문을 사용하면 각 리스트에 2 개의 항목이 포함된 5 개의 리스트를 얻게 됩니다.
이 표기법을 사용하여 주요 리스트(5개 항목으로 구성된 2개 리스트 또는 2개 항목으로 구성된 5개 리스트)를 지정할 수도 있습니다. 이 예에서 복제 가이드의 순서를 변경하여 그리드 내의 점 행 리스트나 그리드 내의 점 열 리스트를 포함하는 결과를 생성합니다.
위의 code block 메서드에 익숙해지는 데 다시 시간이 걸릴 수 있지만 Dynamo에는 프로세스를 보다 쉽게 만들어주는 "Node to Code"라는 기능이 있습니다. 이 기능을 사용하려면 Dynamo 그래프에서 노드 배열을 선택하고 캔버스를 마우스 오른쪽 버튼으로 클릭한 다음, "Node to Code"를 선택합니다. Dynamo에서는 이러한 노드를 입출력을 모두 포함하는 하나의 code block으로 축소했습니다. 이 기능은 code block을 학습하는 데 유용한 도구일 뿐만 아니라 보다 효율적인 파라메트릭 Dynamo 그래프를 사용하여 작업할 수 있도록 합니다. "Node to Code"를 사용하여 아래의 연습을 마무리할 예정이므로 이 내용을 빼먹지 마십시오.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
code block의 효과를 표시하기 위해 기존 어트랙터 필드 정의를 code block 형식으로 변환하려고 합니다. 기존 정의로 작업하면 code block이 시각적 스크립팅과 어떻게 연관되는지 알 수 있으며 DesignScript 구문을 배우는 데 도움이 됩니다.
먼저 위 이미지의 정의를 다시 작성하거나 샘플 파일을 엽니다.
Point.ByCoordinates의 레이싱이 외적 으로 설정되어 있습니다.
그리드의 각 점이 참조점까지의 거리를 기준으로 Z 방향으로 위로 이동합니다.
표면이 다시 작성되고 두꺼워지면서 참조점까지의 거리를 기준으로 형상에 돌출이 작성됩니다.
가장 첫 단계로, Point.ByCoordinates
(x,y,0);
참조점을 먼저 정의해 보겠습니다. 참조점 노드 맨 위에 지정된 것과 동일한 Point.ByCoordinates 구문을 사용합니다.슬라이더를 사용하여 동적으로 업데이트할 수 있도록 변수 x 및 y 가 Code Block 에 삽입됩니다.
-50에서 50까지의 범위에 해당하는 Code Block 입력에 슬라이더 를 추가합니다. 이렇게 하면 기본 Dynamo 그리드에 걸쳐 나타낼 수 있습니다.
Code Block의 두 번째 줄에서는 Number Sequence 노드를 대치할 축약형
coordsXY = (-50..50..#11);
을 정의합니다. 이 내용은 다음 섹션에서 자세히 살펴보겠습니다. 지금은 일단 이 줄임 코드가 시각적 스크립트의 Number Sequence 노드와 동일하다는 것만 이해합니다.
이제 coordsXY 시퀀스에서 점의 그리드를 작성하려고 합니다. 이렇게 하려면 Point.ByCoordinates 구문을 사용해야 하지만, 시각적 스크립트에서 수행한 것과 동일한 방식으로 리스트의 _외적_도 시작해야 합니다. 이를 위해
gridPts = Point.ByCoordinates(coordsXY<1>,coordsXY<2>,0);
줄을 입력합니다. 꺾쇠괄호는 외적 참조를 나타냅니다.Watch3D 노드에는 Dynamo 그리드를 가로지르는 점 그리드가 있습니다.
이제 다소 까다롭지만 참조점까지의 거리를 기준으로 점 그리드를 위로 이동하려고 합니다. 먼저 이 새 점 세트를 transPts 라고 지정합니다. 변환은 기존 요소에 대한 작업이므로
Geometry.Translate...
를 사용하는 대신,gridPts.Translate
를 사용합니다.캔버스의 실제 노드에서 읽으면 3개의 입력이 있는 것을 알 수 있습니다. 해당 요소에 대해 작업을 수행하고 있으므로(gridPts.Translate 사용) 변환할 형상은 이미 선언되어 있습니다. 나머지 두 입력은 함수 direction 및 distance 의 괄호 안에 삽입됩니다.
방향은 충분히 단순하므로
Vector.ZAxis()
를 사용하여 수직으로 이동합니다.여전히 참조점과 각 그리드 점 사이의 거리를 계산해야 하므로 이 작업을 참조점에 대한 작업과 동일한 방식으로 수행합니다.
refPt.DistanceTo(gridPts)
코드의 마지막 줄은 변환된 점을 반환합니다.
transPts=gridPts.Translate(Vector.ZAxis(),refPt.DistanceTo(gridPts));
이제 Nurbs 표면을 작성하기 위한 적절한 데이터 구조를 가진 점 그리드가 있습니다.
srf = NurbsSurface.ByControlPoints(transPts);
를 사용하여 표면을 구성합니다.
마지막으로, 표면에 깊이를 추가하기 위해
solid = srf.Thicken(5);
을 사용하여 솔리드를 구성합니다. 이 경우 코드에서 표면을 5개 단위씩 두껍게 만들었지만 항상 이 값을 변수로 선언한 다음(예: thickness로 지칭) 슬라이더를 사용하여 해당 값을 제어할 수 있습니다.
"Node to Code" 기능은 방금 버튼 클릭으로 완료한 전체 연습을 자동화합니다. 이 기능은 사용자 정의 및 재사용 가능한 code block을 작성하는 데 유용할 뿐만 아니라 Dynamo에서 스크립팅하는 방법을 배울 수 있는 매우 유용한 도구이기도 합니다.
연습의 1단계에서 사용했던 기존 시각적 스크립트로 시작합니다. 모든 노드를 선택하고 캔버스를 마우스 오른쪽 버튼으로 클릭한 다음, "Node to Code" 를 선택합니다. 아주 간단합니다.
Dynamo에서는 시각적 그래프, 레이싱 및 모든 항목의 문자 기반 버전을 자동화했습니다. 시각적 스크립트에서 이 기능을 테스트하고 code block의 강력한 성능을 활용해보십시오.
code block에는 데이터 관리를 훨씬 더 쉽게 해주는 몇 가지 기본적인 축약 방법이 있습니다. 아래의 기본 사항을 분석하고 이러한 축약형을 데이터 작성 및 조회에 어떻게 사용할 수 있는지 알아보겠습니다.
범위 및 시퀀스를 정의하는 방법을 기본 축약형으로 줄일 수 있습니다. code block으로 숫자 데이터 리스트를 정의하기 위한 ".." 구문을 작성할 때 아래 이미지를 참고하십시오. 이 표기법을 이해한 후에는 숫자 데이터를 정말 효율적으로 작성할 수 있게 됩니다.
이 예에서는 숫자 범위가
beginning..end..step-size;
를 정의하는 기본 Code Block 구문으로 대치됩니다. 숫자로 표현하면0..10..1;
입니다.
0..10..1;
구문은0..10;
과 같습니다. 단계 크기 1은 축약형 표기의 기본값입니다. 따라서0..10;
을 사용하면 단계 크기가 1인 0~10의 시퀀스가 지정됩니다.Sequence 의 예는 최대 15개의 리스트가 아니라, 리스트에 포함된 15개의 값을 원한다는 사실을 나타내기 위해 "#"을 사용한다는 점을 제외하고 비슷합니다. 여기서는
beginning..#ofSteps..step-size:
를 정의합니다. 시퀀스의 실제 구문은0..#15..2
입니다.이번에는 이전 단계의 "#" 을 구문의 "step-size" 부분에 배치합니다. 이제 숫자 범위 는 "beginning" 부터 "end" 까지 걸쳐 있으며, "step-size" 표기법은 여러 개의 값을 둘 사이에 균일하게 분산합니다(
beginning..end..#ofSteps
).
고급 범위를 작성하면 리스트의 리스트를 간단하게 사용할 수 있습니다. 아래 예에서는 1차 범위 표기법에서 변수를 분리한 후 해당 리스트의 다른 범위를 작성합니다.
1. 중첩된 범위를 작성하여 "#"이 있는 표기법과 없는 표기법을 비교합니다. 약간 더 복잡해질 수 있지만 기본 범위와 동일한 논리가 적용됩니다.
2. 1차 범위 내의 임의 위치에서 하위 범위를 정의할 수 있으며, 하위 범위가 2개 있을 수도 있습니다.
3. 범위의 "end" 값을 제어하여 길이가 다른 범위를 더 많이 작성합니다.
논리 연습의 일환으로, 위의 두 축약형을 비교하고, 하위 범위 및 # 표기법에 따라 결과 출력이 어떻게 달라지는지 구문 분석해 봅니다.
또한 축약형을 사용해서 리스트를 만드는 것 외에, 리스트를 즉석에서 작성할 수도 있습니다. 이러한 리스트는 광범위한 요소 유형을 포함할 수 있으며 조회도 가능합니다(리스트는 그 자체가 객체임). 요약하면, Code Block을 통해 대괄호( “꺽쇠괄호”라고도 함)를 사용해서 리스트를 만들고, 리스트의 항목을 조회합니다.
1. 문자열을 사용하여 리스트를 빠르게 작성하고 항목 색인을 사용하여 조회합니다.
2. 변수를 사용해서 리스트를 작성하고, 범위 축약형 표기법을 사용해서 조회합니다.
내포된 리스트로 관리하는 작업도 유사한 프로세스입니다. 리스트 순서를 인식하고 여러 대괄호 세트를 사용해서 명확히 구분합니다.
1. 리스트의 리스트를 정의합니다.
2. 단일 대괄호 표기법으로 리스트를 조회합니다.
3. 이중 대괄호 표기법을 사용하여 항목을 조회합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습에서는 새로운 축약형 기술을 조정하면서 범위 및 수식으로 정의된 달걀 껍질형 표면을 작성합니다. 이 연습에서는 code block과 기존 Dynamo 노드를 동시에 사용하는 방법을 살펴봅니다. 정의를 이해할 수 있도록 Dynamo 노드를 시각적으로 배치하면서, 과도한 데이터 이동 작업에는 code block을 사용합니다.
먼저 위의 노드를 연결하여 표면을 작성해 보겠습니다. 숫자 노드를 사용하여 폭과 길이를 정의하는 대신, 캔버스를 두 번 클릭하고 Code Block에 100;
을 입력합니다.
Code Block에
0..1..#50
을 입력하여 0과 1 사이에 50개 분할 영역으로 구분된 범위를 정의합니다.범위를 Surface.PointAtParameter에 연결합니다. 이 노드에서는 표면 전체에서 0과 1 사이의 u 및 v 값을 사용합니다. Surface.PointAtParameter 노드를 마우스 오른쪽 버튼으로 클릭하여 레이싱을 외적으로 변경해야 합니다.
이 단계에서는 첫 번째 함수를 사용하여 Z에서 위쪽으로 점 그리드를 이동합니다. 이 그리드는 기본 함수를 기준으로 생성된 표면을 구동합니다. 아래 이미지에 표시된 대로 새 노드를 추가합니다.
수식 노드를 사용하는 대신,
(0..Math.Sin(x*360)..#50)*5;
줄이 있는 Code Block을 사용합니다. 빠른 분석을 위해 내부에 수식을 사용하여 범위를 정의합니다. 이 수식은 사인 함수입니다. 사인 함수에는 Dynamo에서 각도 입력이 수신되므로 전체 사인파를 가져오려면 x 값(0에서 1 범위의 입력)에 360을 곱합니다. 다음으로, 각 행의 제어 그리드 점과 동일한 수의 분할을 원하므로 #50을 사용하여 50개의 재분할 영역을 정의합니다. 마지막으로 승수 5는 변환의 진폭을 늘리므로 Dynamo 미리보기에서 결과를 확인할 수 있습니다.
이전 Code Block이 제대로 작동했지만 완전한 파라메트릭은 아니었습니다. 매개변수를 동적으로 구동하려고 하므로, 이전 단계의 줄을
(0..Math.Sin(x*360*cycles)..#List.Count(x))*amp;
로 대치하겠습니다. 이렇게 하면 입력을 기준으로 이러한 값을 정의할 수 있습니다.
0부터 10 사이에서 슬라이더를 변경하면 몇 가지 흥미로운 결과를 얻을 수 있습니다.
숫자 범위에서 행과 열을 바꾸어 커튼 파형의 방향을 반대로 바꿉니다.
transposeList = List.Transpose(sineList);
다음과 같이 sineList 및 tranposeList를 추가하면 왜곡된 달걀 껍질형 표면이 표시됩니다.
eggShellList = sineList+transposeList;
아래에 지정된 슬라이더 값을 변경하여 이 알고리즘의 '파형을 진정'시켜 보겠습니다.
마지막으로, 이 Code Block을 사용하여 분리된 데이터 부분을 조회해 보겠습니다. 특정 점 범위를 사용해서 표면을 재생성하려면 위 code block을 Geometry.Translate와 NurbsSurface.ByPoints 노드 사이에 추가합니다. 여기에는 sineStrips[0..15..1];
텍스트 줄이 있습니다. 이는 50개 중에서 처음 16개의 점 행을 선택합니다. 표면을 재작성하면 점 그리드의 분리된 부분이 생성된 것을 볼 수 있습니다.
마지막 단계에서 이 Code Block을 좀 더 파라메트릭하게 만들기 위해 0에서 1 사이의 슬라이더를 사용하여 조회를 실행합니다.
sineStrips[0..((List.Count(sineStrips)-1)*u)];
코드 줄을 사용하여 이 작업을 수행합니다. 혼란스러워 보일 수 있지만, 이 코드 줄을 사용하면 리스트 길이를 0에서 1 사이의 승수로 빠르게 축척할 수 있습니다.
슬라이더에서 0.53
값을 사용하면 표면이 그리드의 중간점을 지나 작성됩니다.
또한 예상대로 슬라이더에서 1
을 사용하면 표면이 전체 점 그리드에서 작성됩니다.
시각적 그래프를 보면 Code Block을 강조 표시하고 해당 기능을 확인할 수 있습니다.
1. 첫 번째 Code Block은 Number 노드를 대치합니다.
2. 두 번째 Code Block은 Number Range 노드를 대치합니다.
3. 세 번째 Code Block은 Formula 노드(List.Transpose, List.Count 및 Number Range)를 대치합니다.
4. 네 번째 Code Block은 리스트의 리스트를 조회하고 List.GetItemAtIndex 노드를 대치합니다.
이 섹션에서는 DesignScript를 사용하여 형상을 작성하는 방법에 대한 일련의 학습 내용을 찾을 수 있습니다. 예제 DesignScript를 Dynamo 코드 블록으로 복사하여 후속 작업을 수행합니다.
3D 공간에서 x, y, z 좌표를 명시적으로 지정하여 특정 형상 객체를 작성할 수 있습니다. 그러나 형상은 객체 자체 또는 기본 CoordinateSystem에서 기하학적 변환을 사용하여 최종 위치로 이동되는 경우가 더 많습니다.
가장 간단한 기하학적 변환은 x, y, z 방향으로 지정된 단위 수만큼 객체를 이동하는 전환입니다.
Dynamo의 모든 객체는 .Translate 메서드를 객체 이름의 끝에 추가하여 변환할 수 있지만, 좀 더 복잡한 변환은 기본 CoordinateSystem에서 새 CoordinateSystem으로 객체를 변환해야 합니다. 예를 들어 객체를 x축을 중심으로 45도 회전하려면 객체를 회전 없는 기존 CoordinateSystem에서 .Transform 메서드를 사용하여 x축을 중심으로 45도 회전한 CoordinateSystem으로 변환해야 합니다.
CoordinateSystem은 변환 및 회전뿐 아니라 축척 또는 전단이 조정되어 작성될 수도 있습니다. CoordinateSystem은 다음과 같이 .Scale 메서드로 축척할 수 있습니다.
전단된 CoordinateSystem은 직교하지 않는 벡터를 CoordinateSystem 생성자에 입력하여 작성합니다.
축척 및 전단은 회전 및 변환보다 비교적 더 복잡한 기하학적 변환이므로 모든 Dynamo 객체가 이러한 변환을 거치는 것은 아닙니다. 다음 표는 균일하지 않게 축척이 조정된 CoordinateSystem 및 전단된 CoordinateSystem이 있을 수 있는 Dynamo 객체를 간략하게 설명합니다.
계산 방식 설계의 객체는 최종 위치와 형태로 명시적으로 작성되는 경우가 드물며, 기존 형상을 기준으로 변환하고 회전되고 배치되는 경우가 많습니다. 벡터 수학은 형상에 방향을 지정할 뿐 아니라 시각적 표현 없이 3D 공간을 통한 이동을 개념화할 수 있는 일종의 기하학적 비계 역할을 합니다.
가장 기본적인 위치에서는 벡터가 3D 공간에서의 위치를 나타내며 종종 위치(0, 0, 0)에서 해당 위치까지의 화살표 끝점으로 간주됩니다. 벡터는 ByCoordinates 생성자로 작성될 수 있으며 새로 작성된 벡터 객체의 x, y 및 z 위치를 사용합니다. 벡터 객체는 기하학적 객체가 아니므로 Dynamo 창에 나타나지 않습니다. 하지만 새로 작성하거나 수정한 벡터에 대한 정보를 콘솔 창에 출력할 수 있습니다.
일련의 수학 연산이 벡터 객체에 대해 정의되어 있으므로, 1D 공간의 숫자 행에서 실수를 이동하는 것처럼 3D 공간에서 객체에 대해 추가, 빼기, 곱하기 또는 이동을 수행할 수 있습니다.
벡터 추가는 두 벡터의 구성요소 합계로 정의되며, 두 구성요소 벡터 화살표가 "꼬리 끝"에 배치된 경우 결과 벡터로 간주될 수 있습니다. 벡터 추가는 Add 메서드를 사용하여 수행되며 왼쪽 다이어그램으로 표시됩니다.
마찬가지로, Subtract 메서드를 사용해서 두 개의 벡터 객체를 서로에게서 뺄 수 있습니다. 벡터 빼기는 첫 번째 벡터에서 두 번째 벡터로의 방향으로 간주될 수 있습니다.
벡터 곱하기는 벡터의 끝점을 주어진 축척 비율만큼 해당 방향으로 이동하는 것으로 생각할 수 있습니다.
보통 결과 벡터의 길이가 축척된 크기와 정확히 동일해지도록 벡터의 축척을 조정하는 것이 좋습니다. 이는 먼저 벡터를 정규화하여, 즉 벡터의 길이를 정확히 1로 설정할 수 있습니다.
c는 여전히 (1, 2, 3)과 동일한 방향을 가리키지만, 길이는 정확히 5가 되었습니다.
벡터 수학에는 두 가지 추가 메서드가 있는데, 이러한 메서드는 1D 수학과 명확히 평행은 아닌 외적 및 내적입니다. 외적은 두 개의 기존 벡터에 대해 90도로 직교하는 벡터를 생성하는 방법입니다. 예를 들어, x축과 y축의 외적은 z축이지만 두 입력 벡터가 서로 직교할 필요는 없습니다. 외적 벡터는 Cross 메서드로 계산합니다.
벡터 수학의 추가적인 고급 함수는 내적입니다. 두 벡터 사이의 내적은 두 벡터 사이의 각도와 정확하지는 않지만 관련이 있는 실수(Vector 객체가 아님)입니다. 내적의 유용한 특성 중 하나는 두 벡터가 수직인 경우에만 두 벡터 사이의 내적이 0이 된다는 것입니다. 내적은 Dot 메서드로 계산합니다.
Dynamo에는 자유형 곡선을 만드는 두 가지 기본적인 방법이 있습니다. 점 모음을 지정하고 Dynamo에서 점 간에 부드러운 곡선을 보간하도록 하거나, 특정 차수 곡선의 기본 제어점을 지정하는 보다 쉬운 방법을 사용할 수 있습니다. 보간된 곡선은 설계자가 필요한 선의 형태를 정확히 알고 있거나 설계에 곡선이 통과할 수 있는 경우와 통과할 수 없는 경우에 대한 특정 구속조건이 있을 때 유용합니다. 제어점을 통해 지정된 곡선은 본질적으로 알고리즘이 최종 곡선 형태로 부드럽게 연결되는 일련의 직선 세그먼트입니다. 제어점을 통해 곡선을 지정하면 다듬기 차수가 다양한 곡선 형태를 살펴보거나, 곡선 세그먼트 간에 매끄럽게 연결되어야 하는 경우에 유용할 수 있습니다.
보간된 곡선을 작성하려면 점 모음을 NurbsCurve.ByPoints 메서드에 전달하기만 하면 됩니다.
생성된 곡선은 각각 모음의 첫 번째 점과 마지막 점에서 시작하고 끝나는 각 입력 점과 교차합니다. 선택적 주기 매개변수를 사용하여 닫힌 주기 곡선을 작성할 수 있습니다. Dynamo가 누락된 세그먼트를 자동으로 채우므로 중복된 끝점(시작점과 동일)은 필요하지 않습니다.
NurbsCurve는 많은 부분 동일한 방식으로 생성됩니다. 입력 점이 직선 세그먼트의 끝점을 나타내고, 두 번째 매개변수가 차수*라고 하는 곡선에 적용되는 다듬기의 정도와 유형을 지정합니다. 차수가 1인 곡선은 다듬기가 없고 폴리선이 됩니다.
차수가 2인 곡선은 폴리선 세그먼트의 중간점과 교차하고 접하도록 매끄럽게 표시됩니다.
Dynamo는 차수 20까지 NURBS(비균일 유리 B-스플라인) 곡선을 지원하며, 다음 스크립트는 다듬기 수준을 늘릴 경우 곡선 모양에 미치는 영향을 보여줍니다.
곡선의 차수보다 적어도 하나 더 많은 제어점이 있어야 합니다.
제어 정점으로 곡선을 생성할 때의 또 다른 이점은 개별 곡선 세그먼트 간에 접선을 유지할 수 있다는 것입니다. 마지막 두 제어점 사이의 방향을 추출하고, 다음 곡선의 처음 두 제어점으로 이 방향을 계속 진행하는 방식으로 이 작업을 수행할 수 있습니다. 다음 예에서는 곡선을 부드럽게 하여 별도의 NURBS 곡선을 두 개 작성합니다.
*위 내용은 NURBS 곡선 형상에 대한 매우 간단한 설명입니다. 더 정확하고 자세한 내용은 참고 문헌에서 Potmann, et al, 2007을 참고하십시오.
Dynamo 표준 형상 라이브러리의 가장 단순한 기하학적 객체는 점입니다. 모든 형상은 생성자라는 특수 함수를 사용하여 작성되며, 생성자는 각각 해당 특정 형상 유형의 새 인스턴스를 반환합니다. Dynamo에서 생성자는 객체 유형의 이름(이 경우 Point)으로 시작되며 뒤에 생성 메서드가 옵니다. x, y 및 z 데카르트 좌표로 지정한 3D 점을 작성하기 위해 ByCoordinates 생성자를 사용합니다.
Dynamo의 생성자는 일반적으로 "By" 접두어로 지정되고, 이러한 함수를 호출하면 새로 작성된 해당 유형의 객체가 반환됩니다. 새로 작성된 이 객체는 등호 기호의 왼쪽에 명명된 변수에 저장됩니다.
대부분의 객체에는 여러 다른 생성자가 있으며 BySphericalCoordinates 생성자를 사용하여 구의 반지름, 첫 번째 회전 각도 및 두 번째 회전 각도(도 단위로 지정됨)로 지정된 구에 있는 점을 작성할 수 있습니다.
선처럼 더 높은 차원의 형상을 생성하는 데 점을 사용할 수 있으며, ByStartPointEndPoint 생성자를 사용하여 두 점 간에 선 객체를 작성할 수 있습니다.
마찬가지로 일련의 선 또는 곡선을 가져와 그 사이의 표면을 보간하는 Loft 생성자를 사용하는 경우처럼 선을 사용하여 더 높은 차원의 표면 형상을 만들 수 있습니다.
표면 역시 더 높은 차원의 솔리드 형상을 작성하는 데 사용할 수 있는데, 예를 들어 지정된 거리만큼 표면을 두껍게 할 수 있습니다. 많은 객체에는 프로그래머가 해당 객체에 대해 명령을 수행할 수 있도록 하는 메서드라고 하는 함수가 연결되어 있습니다. 모든 형상 조각에 공통적으로 적용되는 메서드에는 각각 지정된 양만큼 형상을 변환(이동) 및 회전하는 Translate 및 Rotate 가 포함됩니다. 표면에는 표면의 새 두께를 지정하는 숫자인 단일 입력을 사용하는 Thicken 메서드가 있습니다.
Intersection 명령은 더 높은 차원 객체에서 더 낮은 차원 형상을 추출할 수 있습니다. 이렇게 추출한 낮은 차원 형상은 형상 작성, 추출, 재작성으로 연결되는 일련의 프로세스에서 더 높은 차원 형상의 기준을 형성할 수 있습니다. 이 예에서는 생성된 솔리드를 사용하여 표면을 작성하고 표면을 사용하여 곡선을 작성합니다.
Dynamo가 다양한 복합 형상 형태를 작성할 수 있지만, 간단한 기하학적 원형은 모든 계산 방식 설계의 토대를 형성합니다. 이는 최종 설계 형태로 직접 표현되거나 보다 복잡한 형상이 생성되는 비계로 사용됩니다.
CoordinateSystem은 반드시 형상의 일부는 아니지만 형상을 생성하기 위한 중요한 도구입니다. CoordinateSystem 객체는 회전, 방향 및 축척 등의 위치 및 형상 변환을 모두 추적합니다.
회전, 축척 또는 방향 전환 없이 한 점(x = 0, y = 0, z = 0)을 중심으로 CoordinateSystem을 작성하려면 ID 생성자를 호출하기만 하면 됩니다.
형상 변환이 있는 CoordinateSystem은 이 장의 범위를 벗어나지만 다른 생성자를 사용하여 특정 지점에서 CoordinateSystem.ByOriginVectors 라는 좌표계를 작성할 수 있습니다.
가장 간단한 기하학적 원형은 3D 공간에서 0차원 위치를 나타내는 점입니다. 앞에서 설명한 것처럼 특정 좌표계에서 점을 작성하는 여러 가지 방법이 있습니다. Point.ByCoordinates 는 지정된 X, Y 및 Z 좌표를 사용하여 점을 작성하고 Point.ByCartesianCoordinates 는 특정 좌표계에서 지정된 X, Y 및 Z 좌표를 사용하여 점을 작성합니다. Point.ByCylindricalCoordinates 는 반지름, 회전 각도 및 높이를 갖는 원통에 놓여 있는 점을 작성하고, Point.BySphericalCoordinates 는 반지름 및 2개의 회전 각도가 있는 구에 놓여 있는 점을 작성합니다.
이 예는 다양한 좌표계에서 작성된 점을 보여줍니다.
그 다음으로 높은 차원의 Dynamo 원형은 두 끝점 사이의 무한한 수의 점을 나타내는 선 세그먼트입니다. 생성자 Line.ByStartPointEndPoint 로 두 개의 경계점을 명시적으로 지정하거나 해당 방향에서 시작점, 방향 및 길이(Line.ByStartPointDirectionLength)를 지정하여 선을 작성할 수 있습니다.
Dynamo에는 3D로 만든 기하학적 원형의 가장 기본적인 유형을 나타내는 객체가 있습니다. 예를 들어 직육면체는 Cuboid.ByLengths 로 작성되고, 원추는 Cone.ByPointsRadius 및 Cone.ByPointsRadii 로 작성됩니다. 원통은 Cylinder.ByRadiusHeight 로 작성되고, 구는 Sphere.ByCenterPointRadius 로 작성됩니다.
클래스 | 균일하지 않게 축척이 조정된 CoordinateSystem | 전단 CoordinateSystem |
---|
호 | 아니요 | 아니오 |
NurbsCurve | 예 | 예 |
NurbsSurface | 아니요 | 아니오 |
원 | 아니요 | 아니오 |
선 | 예 | 예 |
평면 | 아니요 | 아니오 |
점 | 예 | 예 |
폴리곤 | 아니요 | 아니오 |
솔리드 | 아니요 | 아니오 |
표면 | 아니요 | 아니오 |
문자 | 아니요 | 아니요 |
데이터 유형
표준 Dynamo
해당하는 Code Block 항목
숫자
문자열
시퀀스
범위
색인의 항목 가져오기
리스트 작성
문자열 연결
조건문
노드
해당하는 Code Block 항목
주
모든 연산자(+, &&, >=, Not 등)
+, &&, >=, ! 등
“Not”은 “!”가 되지만 "Factorial"과 구분하기 위해 노드를 "Not"으로 지칭합니다.
Boolean True
true;
소문자입니다.
Boolean False
false;
소문자입니다.
사과가 무슨 색인가?
Apple.color
빨간색
사과가 잘 익었는가?
Apple.isRipe
true
사과 무게는 어떻게 되는가?
Apple.weight
6oz
사과가 어디에서 왔는가?
Apple.parent
트리
사과에서 만들어지는 것은 무엇인가?
Apple.children
seeds
이 사과는 현지에서 키운 것인가?
Apple.distanceFromOrchard
60mi.
Python은 널리 사용되는 프로그래밍 언어로, 구문 스타일 때문에 인기가 높습니다. 판독 가능성이 뛰어나므로 다른 여러 언어보다 쉽게 배울 수 있습니다. Python은 모듈 및 패키지를 지원하며 기존 응용프로그램에 포함될 수 있습니다. Python을 시작하고 실행하는 방법에 대한 자세한 내용은 Python.org의 "시작하기" 페이지에서 확인할 수 있습니다.
Intersect, Trim 및 _SelectTrim_은 주로 점, 곡선 및 표면과 같은 낮은 차원의 형상에서 사용됩니다. 반면에 솔리드 형상에는 구성 후 형태를 수정하는 추가 메서드 세트가 있습니다. 이러한 메서드는 Trim 과 비슷한 방식으로 재료를 빼고 요소를 함께 결합하여 더 큰 전체 구조를 형성합니다.
Union 메서드는 두 개의 솔리드 객체를 사용하고 두 객체가 차지하는 공간 외부에 단일 솔리드 객체를 작성합니다. 객체 사이의 겹치는 공간은 최종 형태로 결합됩니다. 이 예에서는 구와 직육면체를 단일 솔리드 구-정육면체 모양으로 결합합니다.
Trim 과 같은 Difference 메서드는 기준 솔리드에서 입력 도구 솔리드의 콘텐츠를 뺍니다. 이 예에서는 구가 약간 안으로 잘립니다.
Intersect 메서드는 두 개의 솔리드 입력 사이에서 겹치는 솔리드를 반환합니다. 다음 예에서는 Difference 가 Intersect 로 변경되었으며 결과 솔리드는 처음에 잘린 누락된 보이드입니다.
NurbsCurve의 2D 아날로그는 NurbsSurface입니다. 자유형 NurbsCurve와 마찬가지로 NurbsSurface는 두 가지 기본 방법으로 생성할 수 있습니다. 기준점 세트를 입력하고 Dynamo에서 사이를 보간하도록 하거나, 표면의 제어점을 명시적으로 지정할 수 있습니다. 또한 자유형 곡선과 마찬가지로, 보간된 표면은 설계자가 표면에 필요한 모양을 정확하게 파악하고 있거나 설계에서 표면이 제약 조건 점을 통과해야 하는 경우에 유용합니다. 반면에 제어점으로 작성된 표면은 예비 설계의 다양한 다듬기 수준에서 더 유용할 수 있습니다.
보간된 표면을 작성하려면 표면의 모양을 대략적으로 나타내는 2D 점 모음을 생성하기만 하면 됩니다. 이 모음은 톱니 모양이 아닌 직사각형이어야 합니다. NurbsSurface.ByPoints 메서드는 이러한 점에서 표면을 생성합니다.
표면의 기본 제어점을 지정하여 자유형 NurbsSurface를 작성할 수도 있습니다. NurbsCurve와 마찬가지로, 제어점은 표면의 차수에 따라 최종 표면 형태로 완화되는 직선 세그먼트로 사각형 메쉬를 나타내는 것으로 간주할 수 있습니다. 제어점으로 NurbsSurface를 작성하려면 표면의 양방향에서 기본 곡선의 각도를 나타내는 두 개의 추가 매개변수를 NurbsSurface.ByPoints 에 포함합니다.
다음과 같이 NurbsSurface의 각도를 늘려 결과 표면 형상을 변경할 수 있습니다.
입력 점 세트 간을 보간하여 표면을 작성할 수 있는 것처럼 기준 곡선 세트 간에 보간하여 표면을 작성할 수 있는데, 이를 로프트라고 합니다. 로프트된 곡선은 입력 곡선의 모음을 유일한 매개변수로 사용하여 Surface.ByLoft 생성자를 통해 작성됩니다.
회전 표면은 중심 축 주위로 기준 곡선을 스윕하여 작성된 추가적인 표면 유형입니다. 보간된 표면이 보간된 곡선의 2D 아날로그라면 회전 표면은 원 및 호의 2D 아날로그입니다.
회전 표면은 기준 곡선(표면의 "모서리"를 나타냄), 축 원점(표면의 기준점), 축 방향(중심 "코어" 방향), 스윕 시작 각도와 끝 각도에 의해 지정됩니다. 이러한 항목은 Surface.Revolve 생성자의 입력으로 사용됩니다.
계산 방식 설계에서 곡선과 표면은 후속 형상을 구성하기 위한 기본 비계로 자주 사용됩니다. 이러한 초기 형상을 이후 형상의 기반으로 사용하려면 스크립트는 객체의 전체 영역에서 위치 및 방향 등의 품질을 추출할 수 있어야 합니다. 곡선과 표면 모두 이러한 추출을 지원하는데, 이를 매개변수화라고 합니다.
곡선의 모든 점은 0에서 1 사이의 고유한 매개변수를 갖는 것으로 간주될 수 있습니다. 여러 제어점이나 보간된 점을 기준으로 NurbsCurve를 작성하려는 경우 첫 번째 점은 매개변수 0이 되고 마지막 점은 매개변수 1이 됩니다. 정확히 어떤 매개변수가 중간점인지 미리 알 수는 없습니다. 이러한 상황은 심각한 제한 사항처럼 들릴 수 있지만, 이는 일련의 유틸리티 함수를 통해 완화될 수 있습니다. 표면의 매개변수화는 곡선과 유사하지만, 표면에는 하나의 매개변수 대신 u 및 v라는 두 개의 매개변수개가 있습니다. 다음 점을 사용하여 표면을 작성하려는 경우:
p1에는 매개변수 u = 0 v = 0을 지정하고, p9에는 매개변수u = 1 v = 1을 지정할 수 있습니다.
매개변수화는 곡선을 생성하는 데 사용되는 점을 결정할 때는 별로 유용하지 않습니다. 매개변수화의 주요 용도는 중간점이 NurbsCurve 및 NurbsSurface 생성자로 생성된 경우 위치를 결정하는 것입니다.
곡선에는 0에서 1 사이의 단일 실수 인수를 사용하여 해당 매개변수에서 Point 객체를 반환하는 PointAtParameter 메서드가 있습니다. 예를 들어 이 스크립트는 매개변수 0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1에서 점을 찾습니다.
마찬가지로 표면에는 생성된 점의 u 및 v 매개변수인 두 개의 인수를 사용하는 PointAtParameter 메서드가 있습니다.
곡선과 표면의 개별 점을 추출하는 것이 유용할 수 있지만, 스크립트에서는 곡선 또는 표면이 향하는 방향과 같은 매개변수의 특정 기하학적 특성을 지정해야 하는 경우가 많습니다. CoordinateSystemAtParameter 메서드는 해당 위치 뿐만 아니라 곡선이나 표면의 매개변수에서 방향이 지정된 CoordinateSystem을 찾습니다. 예를 들어 다음 스크립트는 회전된 표면을 따라 방향이 지정된 CoordinateSystem을 추출하고, CoordinateSystems의 방향을 사용하여 표면에 수직으로 진행되는 선을 생성합니다.
앞서 설명한 대로 매개변수화가 곡선이나 표면의 길이를 따라 항상 균일한 것은 아닙니다. 즉, 매개변수 0.5가 항상 중간점에 해당하지는 않으며 0.25가 항상 곡선 또는 표면에서 1/4 위치에 있는 점에 해당하는 것은 아닙니다. 이러한 제한을 해결할 수 있도록 곡선에는 곡선을 따라 특정 길이의 점을 찾을 수 있는 추가 매개변수화 명령 세트가 있습니다.
다음 Python 스크립트는 몇 가지 예에서 점 배열을 생성합니다. 이러한 스크립트는 다음과 같이 Python 스크립트 노드에 붙여 넣어야 합니다.
python_points_1
python_points_2
python_points_3
python_points_4
python_points_5
지금까지 많은 예는 더 낮은 차원의 객체에서 더 높은 차원의 형상을 생성하는 데 초점을 맞추었습니다. 교차 메서드를 사용하면 더 높은 차원의 형상에서 더 낮은 차원의 객체를 생성할 수 있으며, 자르기 및 선택 자르기 명령을 사용하면 기하학적 형태가 작성된 후에 스크립트를 통해 세밀하게 수정할 수 있습니다.
Intersect 메서드는 Dynamo의 모든 형상 조각에 대해 정의됩니다. 즉, 이론상 모든 형상 조각은 다른 형상 조각과 교차할 수 있습니다. 물론 결과 객체가 항상 입력 점 자체가 되는 점 관련 교차처럼, 일부 교차의 경우에는 의미가 없을 수 있습니다. 객체 간의 가능한 다른 교차 조합은 다음 차트에 설명되어 있습니다. 또한 이 차트에는 다양한 교차 작업의 결과도 나와 있습니다.
다음의 간단한 예는 평면과 NurbsSurface의 교차점을 보여줍니다. 교차는 다른 모든 NurbsCurve처럼 사용할 수 있는 NurbsCurve 배열을 생성합니다.
Trim 메서드는 거의 모든 형상 조각에 정의된다는 점에서 Intersect 메서드와 매우 유사합니다. 그러나 _Intersect_보다 _Trim_에 훨씬 더 많은 제한이 있습니다.
Trim 메서드에서 유의할 사항은 삭제할 형상 및 유지할 조각을 결정하는 "선택" 점이 필요하다는 것입니다. Dynamo는 선택 점에서 가장 가까운 잘린 형상을 찾아서 이를 버립니다.
Dynamo 2.0을 사용하면 Python 창을 처음 열 때 사용할 기본 템플릿 (.py extension)
을 지정할 수 있습니다. 이 기능은 Dynamo 내에서 Python 사용을 촉진하기 위해 오랫동안 요청되어 왔습니다. 템플릿을 사용할 수 있는 경우 사용자 Python 스크립트를 개발할 때 기본 가져오기를 바로 사용할 수 있게 됩니다.
이 템플릿의 위치는 Dynamo 설치의 APPDATA
위치에 있습니다.
이는 일반적으로 ( %appdata%\Dynamo\Dynamo Core\{version}\ )
과 같습니다.
이 기능을 사용하려면 DynamoSettings.xml
파일에 다음 행을 추가해야 합니다. (메모장에서 편집)
여기에서 <PythonTemplateFilePath />
를 간단히 다음으로 대치할 수 있습니다.
참고: CURRENTUSER를 사용자 이름으로 대치하십시오.
다음으로, 내장 항목으로 사용하려는 기능이 포함된 템플릿을 작성해야 합니다. 이 예에서는 Revit 관련 가져오기와 Revit으로 작업할 때의 다른 일반적인 항목을 포함할 수 있습니다.
빈 메모장 문서를 시작하고 다음 코드를 그 안에 붙여 넣습니다.
완료되면 APPDATA
위치에 이 파일을 PythonTemplate.py
로 저장합니다.
Python 템플릿을 정의했으므로 Dynamo는 Python 노드가 배치될 때마다 이 템플릿을 찾습니다. 이 템플릿을 찾을 수 없는 경우 기본 Python 창과 유사한 항목이 표시됩니다.
Python 템플릿을 찾은 경우(이 예의 Revit 템플릿처럼) 작성한 기본 항목을 볼 수 있습니다.
이러한 유용한 추가 기능에 대한 자세한 정보(Radu Gidei 작성)를 다음에서 확인할 수 있습니다. https://github.com/DynamoDS/Dynamo/pull/8122
Dynamo에서 Python 스크립트를 사용하는 방법에 대해 설명했으므로 이제 Revit 라이브러리를 스크립팅 환경에 연결하는 방법을 살펴보겠습니다. 아래의 code block에서 처음 네 줄을 포함하는 Python Standard 및 Dynamo 코어 노드를 가져왔습니다. Revit 노드, Revit 요소 및 Revit 문서 관리자를 가져오려는 경우 다음과 같은 일부 코드 줄만 추가하면 됩니다.
이렇게 하면 Revit API에 액세스할 수 있으며 모든 Revit 작업에 대한 사용자 스크립트가 제공됩니다. 시각적 프로그래밍 프로세스와 Revit API 스크립팅을 결합하면 공동 작업 및 도구 개발이 크게 개선됩니다. 예를 들어 BIM 관리자와 구조도 설계자는 동일한 그래프에서 함께 작업할 수 있습니다. 이러한 공동 작업을 통해 모델의 설계 및 실행을 개선할 수 있습니다.
새로운 Revit 프로젝트를 작성합니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습에서는 Dynamo for Revit의 기본적인 Python 스크립트를 살펴볼 것입니다. 이 연습은 Revit 파일 및 요소 처리, Revit과 Dynamo 간의 커뮤니케이션 등에 중점을 둡니다.
이는 Dynamo 세션에 링크된 Revit 파일의 doc, uiapp 및 _app_을 검색하기 위해 미리 마련된 메서드입니다. 이전에 Revit API에서 작업해본 적이 있는 프로그래머는 감시 리스트의 항목을 알아차릴 수도 있습니다. 이러한 항목이 익숙하지 않더라도 아래의 연습에서 다른 예시를 사용하므로 괜찮습니다.
Dynamo에서 Revit 서비스를 가져오고 문서 데이터를 검색하는 방법은 다음과 같습니다.
Dynamo의 Python 노드를 살펴봅니다. 아래에서 코드를 찾을 수도 있습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습에서는 Dynamo Python 노드를 사용하여 Revit에서 간단한 모델 곡선을 작성하겠습니다.
Revit에서 새로운 개념 매스 패밀리를 작성하여 시작합니다.
개념 매스 폴더 를 열고 Metric Mass.rft 템플릿 파일을 사용합니다.
Revit에서 키보드 단축키 un
을 사용하여 프로젝트 단위 설정을 표시하고 길이 단위를 미터로 변경합니다.
Dynamo를 시작하고 아래 이미지의 노드 세트를 작성합니다. 먼저 Dynamo 노드에서 Revit에 두 개의 참조점을 작성합니다.
Code Block을 작성하고 값을
"0;"
으로 지정합니다.이 값을 X, Y 및 Z 입력에 대한 ReferencePoint.ByCoordinates 노드에 연결합니다.
단계 크기가 1인 -100에서 100 사이의 슬라이더를 3개 작성합니다.
각 슬라이더를 ReferencePoint.ByCoordinates 노드에 연결합니다.
Python 노드를 작업공간에 추가하고, 노드에서 "+" 버튼을 클릭하여 다른 입력을 추가한 후 두 참조점을 각 입력에 연결합니다. Python 노드를 엽니다.
Dynamo의 Python 노드를 살펴봅니다. 아래에서 전체 코드를 찾습니다.
System.Array: Revit에는 입력으로 Python 리스트가 아닌 시스템 배열이 필요합니다. 이 경우 코드 줄이 1개 더 추가될 뿐이지만 인수 유형에 신경 쓰면 Revit에서 Python 프로그래밍을 쉽게 처리할 수 있습니다.
Dynamo에서 Python을 사용하여 하나의 선으로 연결된 참조점 두 개를 작성했습니다. 다음 연습에서 좀 더 자세히 살펴보겠습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 연습은 간단하지만, Revit에서 Dynamo로, 그리고 그 반대로 데이터와 형상을 연결하는 항목을 이해하는 데 도움이 됩니다. 먼저 Revit-StructuralFraming.rvt를 열어 보겠습니다. 이 파일이 열리면 Dynamo를 시작하고 Revit-StructuralFraming.dyn 파일을 엽니다.
이 Revit 파일에는 기본적인 내용이 포함됩니다. 2개의 참조 곡선(레벨 1에 1개, 레벨 2에 1개)이 그려집니다. 이러한 곡선을 Dynamo로 가져와 라이브 링크를 유지하려고 합니다.
이 파일에는 Python 노드의 5개 입력에 연결된 노드 세트가 있습니다.
Select Model Element Nodes: 각각에 대해 선택 버튼을 누르고 Revit에서 해당 곡선을 선택합니다.
Code Block:
0..1..#x;
, 구문을 사용하여 0에서 20 사이의 정수 슬라이더를 x 입력에 연결합니다. 이렇게 하면 두 곡선 사이에 그릴 빔 수가 지정됩니다.Structural Framing Types: 드롭다운 메뉴에서 기본 W12x26 빔을 선택합니다.
Levels: "레벨 1"을 선택합니다.
Python의 이 코드는 약간 더 조밀하지만, 코드 내의 해설에 프로세스에서 발생하는 상황이 설명되어 있습니다.
Revit에는 두 곡선을 구조적 요소로 스패닝하는 빔 배열이 있습니다. 참고: 이는 실제 예가 아닙니다. 해당 구조적 요소는 Dynamo에서 작성된 기본 Revit 인스턴스의 예로 사용됩니다.
Dynamo에서는 결과도 볼 수 있습니다. Watch3D 노드의 빔은 Revit 요소에서 조회된 형상을 나타냅니다.
Revit 환경에서 Dynamo 환경으로 데이터를 변환하는 프로세스가 지속됩니다. 요약하면 프로세스가 진행되는 방식은 다음과 같습니다.
Revit 요소 선택
Revit 요소를 Dynamo 곡선으로 변환
Dynamo 곡선을 일련의 Dynamo 점으로 분할
두 곡선 사이의 Dynamo 점을 사용하여 Dynamo 선 작성
Dynamo 선을 참조하여 Revit 빔 작성
Revit 빔의 형상을 조회하여 Dynamo 표면 출력
이 작업은 약간 까다로워 보일 수 있지만 스크립트를 사용하면 Revit에서 곡선을 편집하고 솔버를 다시 실행하는 것만큼 간단해집니다(단, 이렇게 하는 경우 이전 빔을 삭제해야 할 수도 있음). 이는 Python에서 빔을 배치하여 OOTB 노드에 있는 연결이 끊어지기 때문입니다.
Revit에서 참조 곡선을 업데이트하여 새로운 빔 배열을 얻게 됩니다.
Dynamo의 시각적 프로그래밍 환경에서 텍스트 프로그래밍을 사용하는 이유는 무엇입니까? 은 장점이 많습니다. 직관적인 시각적 인터페이스에서 특수 구문을 학습하지 않고도 프로그램을 작성할 수 있습니다. 그러나 시각적 프로그램은 다소 복잡해 보일 수 있으며, 경우에 따라 기능이 부족할 수 있습니다. 예를 들어, Python에서는 조건문(if/then)을 작성하고 순환하기 위한 보다 효율적인 메서드를 제공합니다. Python은 Dynamo의 기능을 확장하고 여러 노드를 간단한 몇 개의 코드 줄로 바꿀 수 있게 해주는 강력한 도구입니다.
시각적 프로그램:
텍스트 프로그램:
code block과 마찬가지로 Python 노드는 시각적 프로그래밍 환경 내의 스크립팅 인터페이스입니다. Python 노드는 라이브러리의 스크립트>편집기>Python 스크립트에서 찾을 수 있습니다.
노드를 두 번 클릭하면 Python 스크립트 편집기가 열립니다. 노드를 마우스 오른쪽 버튼으로 클릭하고 편집... 을 선택할 수도 있습니다. 상단에 상용구가 몇 가지 있습니다. 이 텍스트는 필요한 라이브러리를 참조하는 데 유용합니다. 입력 내용은 IN 배열에 저장됩니다. 값을 OUT 변수에 지정하면 Dynamo로 반환됩니다.
메서드로는 ByCoordinates 와 같은 구성자, Add 와 같은 동작, X, Y 및 Z 좌표와 같은 조회 등이 있습니다.
아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.
이 예에서는 솔리드 모듈에서 패턴을 작성하는 Python 스크립트를 작성한 후, 사용자 노드로 변환하겠습니다. 먼저, Dynamo 노드를 사용하여 솔리드 모듈을 작성해 보겠습니다.
Rectangle.ByWidthLength: 솔리드의 기반이 될 직사각형을 작성합니다.
Surface.ByPatch: 직사각형을 ‘closedCurve’ 입력에 연결하여 하단 표면을 작성합니다.
Geometry.Translate: code block을 사용해 솔리드의 베이스 두께를 지정하고 직사각형을 ‘geometry’ 입력에 연결하여 위로 이동합니다.
Polygon.Points: 변환된 직사각형을 조회하여 코너 점을 추출합니다.
Geometry.Translate: code block을 사용하여 4개의 점에 해당하는 4개의 값 리스트를 작성하고 솔리드의 한쪽 코너를 위로 변환합니다.
Polygon.ByPoints: 변환된 점을 사용하여 상단 사각형을 다시 구성합니다.
Surface.ByPatch: 다각형을 연결하여 상단 표면을 작성합니다.
상단 표면과 하단 표면이 생겼으므로 두 프로파일 간을 로프트하여 솔리드의 측면을 작성해 보겠습니다.
List.Create: 하단 직사각형 및 상단 다각형을 색인 입력에 연결합니다.
Surface.ByLoft: 두 프로파일을 로프트하여 솔리드의 측면을 작성합니다.
List.Create: 상단, 측면, 하단 표면을 색인 입력에 연결하여 표면 리스트를 작성합니다.
Solid.ByJoinedSurfaces: 표면을 결합하여 솔리드 모듈을 작성합니다.
솔리드가 생겼으므로 Python 스크립트 노드를 작업공간에 배치해 보겠습니다.
노드에 입력을 추가하려면 노드에서 + 아이콘을 클릭합니다. 입력은 리스트의 항목임을 나타낼 수 있도록 IN[0], IN[1] 등으로 이름이 지정됩니다.
먼저 입력과 출력을 정의해 보겠습니다. 노드를 두 번 클릭하여 Python 편집기를 엽니다. 아래 코드에 따라 편집기에서 코드를 수정합니다.
이 코드는 연습을 진행하는 동안 좀 더 적절하게 수정됩니다. 다음으로, 솔리드 모듈을 배열하기 위해 필요한 정보를 고려해야 합니다. 먼저, 변환 거리를 결정하기 위해 솔리드의 치수를 알아야 합니다. 경계 상자 버그 때문에 모서리 곡선 형상을 사용하여 경계 상자를 작성해야 합니다.
Dynamo의 Python 노드를 살펴봅니다. Dynamo의 노드 제목에 표시되는 것과 동일한 구문을 사용하고 있습니다. 아래에서 주석 처리된 코드를 확인하십시오.
솔리드 모듈을 변환 및 회전하는 작업을 둘 다 수행할 예정이므로 Geometry.Transform 작업을 사용해 보겠습니다. Geometry.Transform 노드를 보면 솔리드를 변환하기 위해 소스 좌표계와 대상 좌표계가 필요하다는 사실을 알게 됩니다. 소스는 솔리드의 컨텍스트 좌표계인 한편, 대상은 배열된 각 모듈의 다른 좌표계가 됩니다. 즉, 매번 좌표계를 다르게 변환하려면 x 및 y 값으로 순환해야 합니다.
실행을 클릭한 다음, 코드를 저장합니다. 다음과 같이 Python 노드를 기존 스크립트와 연결합니다.
Python 노드의 첫 번째 입력으로 Solid.ByJoinedSurfaces의 출력을 연결하고 Code Block을 사용하여 다른 입력을 정의합니다.
Topology.Edges 노드를 작성하고 Python 노드의 출력을 입력으로 사용합니다.
마지막으로 Edge.CurveGeometry 노드를 작성하고 Topology.Edges의 출력을 입력으로 사용합니다.
시드 값을 변경하여 다른 패턴을 작성해 보십시오. 다양한 효과를 위해 솔리드 모듈 자체의 매개변수를 변경할 수도 있습니다.
유용한 Python 스크립트를 작성했으므로 이를 사용자 노드로 저장해 보겠습니다. Python 스크립트 노드를 선택하고 작업공간을 마우스 오른쪽 버튼으로 클릭한 다음, '사용자 노드 작성'을 선택합니다.
이름, 설명 및 카테고리를 지정합니다.
그러면 사용자 노드를 편집할 새 작업공간이 열립니다.
Inputs: 입력 이름을 좀 더 알아보기 쉽게 변경하고 데이터 유형 및 기본값을 추가합니다.
Output: 출력 이름 변경
노드를 .dyf 파일로 저장하면 방금 변경한 사항이 사용자 노드에 반영되는 것을 확인할 수 있습니다.
Dynamo Project 이면의 계획은 플랫폼 구현 범위를 넓히는 것입니다. Dynamo에서 일람표에 프로그램을 추가하면 사용자는 Python 스크립팅 환경에서 플랫폼별 API에 액세스할 수 있습니다. Revit이 이 섹션의 성공 사례에 해당하지만, 앞으로는 다른 플랫폼의 스크립팅에 대한 포괄적인 튜토리얼을 제공하는 더 많은 장이 제공될 예정입니다. 또한 이제 Dynamo로 가져올 수 있는 많은 라이브러리에 액세스할 수 있습니다.
아래의 예는 Python을 사용하여 Dynamo에서 Revit 관련 작업을 구현하는 방법을 보여 줍니다. Dynamo 및 Revit과의 Python 관계에 대한 자세한 검토가 필요한 경우 를 참고하십시오. Python 및 Revit의 또 다른 유용한 리소스는 프로젝트입니다.
Autodesk.DesignScript.Geometry 라이브러리를 사용하면 Code Block과 유사한 점 표기법을 사용할 수 있습니다. Dynamo 구문에 대한 자세한 내용은 뿐만 아니라 를 참조하십시오. 이 PDF 문서를 다운로드하려면 링크를 마우스 오른쪽 버튼으로 클릭하고 "다른 이름으로 링크 저장..."을 선택하십시오. ‘점’과 같은 형상 유형을 입력하면 점을 작성하고 조회하기 위한 메서드 리스트가 표시됩니다.
사용: 점
곡선
평면
표면
솔리드
위치: 곡선
예
아니오
아니오
아니오
아니오
폴리곤
-
아니오
예
아니오
아니오
표면
-
예
예
예
예
솔리드
-
-
예
예
예
포함:
표면
곡선
평면
솔리드
표면
곡선
점
점, 곡선
표면
곡선
점
점
점
곡선
평면
곡선
점
곡선
곡선
솔리드
표면
곡선
곡선
솔리드