축약형
Last updated
Last updated
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;
소문자입니다.