# 사용자화

앞서 기본 건물 매스 편집을 살펴보았지만 한 번에 많은 요소를 편집하면서 Dynamo/Revit 링크를 좀 더 자세히 살펴보려고 합니다. 데이터 구조에는 고급 리스트 작업이 필요하므로 대형 축척으로 사용자화하는 것이 훨씬 더 복잡해집니다. 그러나 실행 이면의 기본 원칙은 근본적으로 동일합니다. 일련의 가변 구성요소를 통해 해석할 수 있는 몇 가지 기회를 살펴보겠습니다.

### 점 위치

일련의 가변 구성요소를 작성하고 해당 점 위치를 기준으로 매개변수를 편집한다고 가정합니다. 예를 들어 점은 요소의 면적과 관련된 두께 매개변수를 구동할 수 있습니다. 또는 한 해 동안의 일조 노출과 관련된 불투명도 매개변수를 구동할 수 있습니다. Dynamo를 사용하면 몇 가지 간단한 단계를 통해 매개변수에 해석을 연결할 수 있으며, 아래 연습에서 기본 버전을 살펴보겠습니다.

!

> **AdaptiveComponent.Locations** 노드를 사용하여 선택한 가변 구성요소의 가변 점을 조회합니다. 이 도구를 사용하면 해석을 위해 Revit 요소의 추상화된 버전으로 작업할 수 있습니다.

가변 구성요소의 점 위치를 추출하여 해당 요소에 대해 특정 범위의 해석을 실행할 수 있습니다. 예를 들어, 4점 가변 구성요소를 사용하면 지정된 패널에 대해 평면에서의 편차를 연구할 수 있습니다.

### 일조 방향 해석

!

> 재매핑을 사용하여 데이터 세트를 매개변수 범위에 매핑합니다. 이는 파라메트릭 모델에 사용되는 기본적인 도구이며 아래 연습에서 이러한 기본적인 내용을 보여드리겠습니다.

Dynamo를 사용하면 가변 구성요소의 점 위치를 사용하여 각 요소에 가장 잘 맞는 평면을 작성할 수 있습니다. 또한 Revit 파일에서 태양 위치를 조회하고 다른 가변 구성요소를 기준으로 태양에 대한 평면의 상대적 방향을 연구할 수 있습니다. 알고리즘 방식의 지붕 전망을 작성하여 아래 연습에서 이 작업을 설정해 보겠습니다.

## 연습

> 아래 링크를 클릭하여 예제 파일을 다운로드하십시오.
>
> 전체 예시 파일 리스트는 부록에서 확인할 수 있습니다.

이 연습에서는 이전 섹션에서 설명한 기술을 확장합니다. 이 경우 4점 가변 구성요소를 인스턴스화한 다음, 태양에 대한 방향을 기준으로 편집하여 Revit 요소에서 파라메트릭 표면을 정의합니다.

!

> 1. 먼저 *"Select Edge"* 노드를 사용하여 두 개의 모서리를 선택합니다. 두 모서리는 아트리움의 긴 스팬입니다.
> 2. *List.Create* 노드를 사용하여 두 모서리를 하나의 리스트로 결합합니다.
> 3. *Surface.ByLoft* 로 두 모서리 사이에 표면을 작성합니다.

!

> 1. *code block* 을 사용하여 0부터 1까지 10개의 동일한 간격으로 배치된 값을 정의합니다(`0..1..#10;`).
> 2. *code block* 을 *Surface.PointAtParameter* 노드의 *u* 및 *v* 입력에 연결하고 *Surface.ByLoft* 노드를 *surface* 입력에 연결합니다. 노드를 마우스 오른쪽 버튼으로 클릭하고 *레이싱* 을 *외적* 으로 변경합니다. 그러면 표면에 점 그리드가 나타납니다.

이 점 그리드는 파라메트릭 방식으로 정의된 표면에 대한 제어점 역할을 합니다. 이러한 각 점의 u 및 v 위치를 추출하여 파라메트릭 수식에 연결하고 동일한 데이터 구조를 유지해 보겠습니다. 방금 작성한 점의 매개변수 위치를 조회하여 이를 수행할 수 있습니다.

!

> 1. 캔버스에 *Surface.ParameterAtPoint* 노드를 추가하고 위에 표시된 대로 입력을 연결합니다.
> 2. UV.U 노드를 사용하여 이러한 매개변수의 *u* 값을 조회합니다.
> 3. UV.V 노드를 사용하여 이러한 매개변수의 *v* 값을 조회합니다.
> 4. 출력은 표면의 모든 점에 대해 해당 *u* 및 *v* 값을 표시합니다. 이제 적절한 데이터 구조에 각 값의 *0*\~*1* 범위가 구성되었으므로 파라메트릭 알고리즘을 적용할 준비가 되었습니다.

!

> 1. 캔버스에 *code block* 을 추가하고 코드 `Math.Sin(u*180)*Math.Sin(v*180)*w;`를 입력합니다. 이는 평평한 표면에서 사인 마운드를 작성하는 파라메트릭 함수입니다.
> 2. *UV.U* 를 *u* 입력에 연결하고 UV.V를 *v* 입력에 연결합니다.
> 3. *w* 입력은 모양의 *진폭* 을 나타내므로 *number slider* 를 부착합니다.

!

> 1. 이제 알고리즘에 의해 정의된 값 리스트가 있습니다. 이 값 리스트를 사용하여 점을 *+Z* 방향으로 위로 이동합니다. *Geometry.Translate* 를 사용하여 *code block*을 *zTranslation* 에 연결하고 *Surface.PointAtParameter* 를 *geometry* 입력에 연결합니다. Dynamo 미리보기에 새 점이 표시됩니다.
> 2. 마지막으로 *NurbsSurface.ByPoints* 노드를 사용하여 표면을 작성하고 이전 단계의 노드를 점 입력에 연결합니다. 이제 파라메트릭 표면이 생겼습니다. 슬라이더를 자유롭게 끌어 마운드가 축소 및 확장되는 것을 확인합니다.

파라메트릭 표면을 사용하여 4점 가변 구성요소를 배열하기 위해 패널화하는 방법을 정의하려고 합니다. Dynamo에는 표면 패널화를 위한 즉시 사용 가능한 기능이 없기 때문에 커뮤니티에서 유용한 Dynamo 패키지를 찾아보겠습니다.

!

> 1. *패키지>패키지 검색...* 으로 이동합니다.
> 2. *"LunchBox"* 를 검색하고 *"LunchBox for Dynamo"* 를 설치합니다. 이는 이러한 형상 작업에 매우 유용한 도구 세트입니다.

> 1. 다운로드가 완료되면 LunchBox 제품군에 완전히 액세스할 수 있게 됩니다. *"쿼드 그리드"* 를 검색하고 *"LunchBox Quad Grid By Face"* 를 선택합니다. 파라메트릭 표면을 *surface* 입력에 연결하고 *U* 및 *V* 분할을 *15* 로 설정합니다. Dynamo 미리 보기에 쿼드 패널 표면이 표시되어야 합니다.

> 설정에 대해 궁금한 점이 있으면 *Lunch Box* 노드를 두 번 클릭하여 어떻게 만들어졌는지 확인할 수 있습니다.

> 다시 Revit으로 돌아와 여기에서 사용할 가변 구성요소를 잠시 살펴보겠습니다. 이 과정을 반드시 진행할 필요는 없지만, 이는 인스턴스화하려는 지붕 패널입니다. 이는 ETFE 시스템을 대략적으로 나타낸 4점 가변 구성요소입니다. 중심 보이드의 조리개는 *"ApertureRatio"* 라는 매개변수에 있습니다.

> 1. Revit에서 많은 형상을 인스턴스화하고자 하므로 Dynamo 솔버를 *"수동"* 으로 바꿔야 합니다.
> 2. 캔버스에 *Family Types* 노드를 추가하고 *"ROOF-PANEL-4PT"* 를 선택합니다.
> 3. 캔버스에 *AdaptiveComponent.ByPoints* 노드를 추가하고 *"LunchBox Quad Grid by Face"* 출력의 *Panel Pts* 를 *points* 입력에 연결합니다. *Family Types* 노드를 *familySymbol* 입력에 연결합니다.
> 4. *실행* 을 누릅니다. Revit은 형상이 작성되는 동안 잠깐 *멈춥니다*. 시간이 너무 오래 걸리는 경우 *code block의 '15'* 를 더 작은 숫자로 줄입니다. 그러면 지붕의 패널 수가 줄어듭니다.

*참고: Dynamo에서 노드를 계산하는 데 시간이 오래 걸리는 경우 그래프를 개발하는 동안 Revit 작업 실행을 일시 중지하기 위해 노드 "고정" 기능을 사용할 수도 있습니다. 노드 동결에 대한 자세한 내용은 솔리드 장의 "동결" 섹션을 확인하십시오.*

> 다시 Revit으로 돌아가면 지붕에 패널 배열이 표시됩니다.

> 확대하면 표면 품질을 더 자세히 확인할 수 있습니다.

### 해석

> 1. 이전 단계에서 계속 진행하면서 태양에 대한 노출을 기준으로 각 패널의 조리개를 더 많이 움직이도록 해보겠습니다. Revit으로 줌하고 패널 하나를 선택하면 특성 막대에 *"조리개 비율"* 이라는 매개변수가 표시됩니다. 조리개 범위가 대략 *0.05*\~*0.45* 가 되도록 패밀리가 설정됩니다.

> 2. 태양 경로를 켜면 Revit에서 현재 태양 위치를 볼 수 있습니다.

> 3. *SunSettings.Current* 노드를 사용하여 이 태양 위치를 참조할 수 있습니다.

1. 태양 설정을 *Sunsetting.SunDirection* 에 연결하여 일조 벡터를 가져옵니다.
2. 가변 구성요소를 작성하는 데 사용된 *패널 점* 에서 *Plane.ByBestFitThroughPoints* 를 사용하여 구성요소의 대략적인 평면을 만듭니다.
3. 이 평면의 *법선* 을 조회합니다.
4. *내적* 을 사용하여 일조 방향을 계산합니다. 내적은 두 벡터의 평행 또는 반 평행 정도를 결정하는 수식입니다. 따라서 각 가변 구성요소의 평면 법선을 선택한 다음, 일조 벡터와 비교하여 일조 방향을 대략적으로 시뮬레이션합니다.
5. 결과의 *절댓값* 을 사용합니다. 그래야 평면 법선이 반대 방향을 향하고 있는 경우 내적이 정확해집니다.
6. *실행* 을 누릅니다.

> 1) *내적* 을 보면 다양한 범위의 숫자가 표시됩니다. 상대 분산을 사용할 것이지만, 이러한 숫자를 편집하려는 *"조리개 비율"* 매개변수의 적절한 범위로 압축해야 합니다.

1. *Math.RemapRange* 는 이 작업에 유용한 도구입니다. 입력 리스트를 가져와서 해당 경계를 두 대상 값으로 다시 매핑합니다.
2. 대상 값을 *code block* 에서 *0.15* 및 *0.45* 로 정의합니다.
3. *실행* 을 누릅니다.

> 1) 다시 매핑된 값을 *Element.SetParameterByName* 노드에 연결합니다.

1. 문자열 *"조리개 비율"* 을 *parameterName* 입력에 연결합니다.
2. *가변 구성요소* 를 *element* 입력에 연결합니다.
3. *실행* 을 누릅니다.

> Revit으로 다시 돌아와, 멀리에서 ETFE 패널의 조리개에 일조 방향이 미치는 영향을 파악할 수 있습니다.

> 확대하면 ETFE 패널이 태양을 향할 때 더 많이 닫히는 것을 볼 수 있습니다. 여기서 목표는 태양 노출에 따른 과열을 줄이는 것입니다. 태양 노출을 기준으로 더 많은 빛이 들어오게 하려면 *Math.RemapRange* 에서 영역을 전환하기만 하면 됩니다.
