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 노드를 대치합니다.
데이터 유형
표준 Dynamo
해당하는 Code Block 항목
숫자
문자열
시퀀스
범위
색인의 항목 가져오기
리스트 작성
문자열 연결
조건문
노드
해당하는 Code Block 항목
주
모든 연산자(+, &&, >=, Not 등)
+, &&, >=, ! 등
“Not”은 “!”가 되지만 "Factorial"과 구분하기 위해 노드를 "Not"으로 지칭합니다.
Boolean True
true;
소문자입니다.
Boolean False
false;
소문자입니다.
코드 블록은 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의 노드 이름에서는 일반적인 테마를 확인할 수 있습니다. 각 노드에서는 공백 없이 "." 구문을 사용합니다. 그 이유는 각 노드의 맨 위에 있는 문자가 스크립팅의 실제 구문을 나타내고 "."(또는 점 표기법)은 호출할 수 있는 방법과 요소를 구분하기 때문입니다. 이를 통해 시각적 스크립팅에서 문자 기반 스크립팅으로 쉽게 변환할 수 있습니다.
점 표기법의 일반적인 비유로, 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의 강력한 성능을 활용해보십시오.
사과가 무슨 색인가? | Apple.color | 빨간색 |
사과가 잘 익었는가? | Apple.isRipe | true |
사과 무게는 어떻게 되는가? | Apple.weight | 6oz |
사과가 어디에서 왔는가? | Apple.parent | 트리 |
사과에서 만들어지는 것은 무엇인가? | Apple.children | seeds |
이 사과는 현지에서 키운 것인가? | Apple.distanceFromOrchard | 60mi. |
함수는 코드 블록에서 작성한 후 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의 기본적인 빌딩 블록이므로 이 장을 자세히 읽어 보십시오.