시간이 지나면 기본 사항을 넘어서고 Dynamo의 내부 작업을 깊이 있게 익힐 수 있습니다. 이 섹션의 페이지에서는 그래프를 한 단계 더 높은 수준으로 끌어올릴 수 있도록 Dynamo for Civil 3D의 고급 기능을 사용할 수 있는 방법을 제공합니다.
Dynamo for Civil 3D에는 각 노드에서 작성된 객체를 "기억"하는 매우 강력한 메커니즘이 포함되어 있습니다. 이 메커니즘을 객체 바인딩이라고 하며, 이를 통해 동일한 문서에서 실행될 때마다 Dynamo 그래프가 일관된 결과를 생성할 수 있습니다. 객체 바인딩은 많은 상황에서 사용하기에 매우 바람직하지만, Dynamo의 동작을 보다 잘 제어하고 싶은 다른 상황도 있을 수 있습니다. 이 섹션에서는 객체 바인딩의 작동 방식과 객체 바인딩을 활용하는 방법을 설명합니다.
현재 도면층의 모형 공간에 원을 작성하는 이 그래프를 살펴보겠습니다.
반지름이 변경되면 어떻게 되는지 확인하십시오.
이것이 바로 객체 바인딩이 작동하는 방식입니다. Dynamo의 기본 동작은 반지름 입력이 변경될 때마다 새 원을 작성하는 것이 아니라 원의 반지름을 수정 하는 것입니다. 이는 그래프가 실행될 때마다 Object.ByGeometry 노드가 이 특정 원을 작성한 것을 "기억"하기 때문입니다. 또한 Dynamo는 이 정보를 저장하여 다음번에 Civil 3D 문서를 열고 그래프를 실행할 때 정확히 동일한 동작을 수행합니다.
Dynamo의 기본 객체 바인딩 동작을 변경할 수 있는 예를 살펴보겠습니다. 문자를 원 가운데에 배치하는 그래프를 작성한다고 가정해 보겠습니다. 그러나 이 그래프의 의도는 반복해서 실행하고 선택한 원에 대해 매번 새로운 문자를 배치할 수 있다는 것입니다. 다음은 그래프의 모습입니다.
그러나 실제로는 다른 원을 선택하면 이렇게 됩니다.
그래프를 실행할 때마다 문자가 삭제되고 다시 생성되는 것처럼 보입니다. 실제로는 선택하는 원에 따라 문자의 위치가 수정 됩니다. 따라서 다른 위치에 있을 뿐 동일한 문자입니다! 매번 새로운 문자를 작성하려면 바인딩 데이터가 유지되지 않도록 Dynamo의 객체 바인딩 설정을 수정해야 합니다(아래의 #binding-settings 참조).
이렇게 변경한 후에 원하는 동작을 얻게 됩니다.
Dynamo for Civil 3D에서는 Dynamo 메뉴의 바인딩 데이터 저장소 설정을 통해 기본 객체 바인딩 동작을 수정할 수 있습니다.
바인딩 데이터 저장소 옵션은 Civil 3D 2022.1 이상 버전에서 사용할 수 있습니다.
모든 옵션은 기본적으로 사용하도록 설정되어 있습니다. 다음은 각 옵션의 기능에 대한 요약입니다.
이 옵션을 사용하면 Dynamo는 그래프를 마지막으로 실행했을 때 작성한 객체를 "잊어버립니다". 따라서 그래프는 어떤 상황의 어떤 도면에서도 실행될 수 있으며 매번 새로운 개체를 작성합니다.
사용해야 하는 경우
Dynamo가 이전 실행에서 수행한 모든 작업을 "잊어버리고" 매번 새로운 객체를 작성하도록 하려면 이 옵션을 사용합니다.
이 옵션을 사용하면 객체 바인딩 메타데이터가 저장될 때 그래프(.dyn 파일)로 직렬화됩니다. 그래프를 닫았다가 다시 열고 동일한 도면 에서 실행하면 모든 것이 그래프를 닫았을 때와 동일하게 작동합니다. 다른 도면 에서 그래프를 실행하면 바인딩 데이터가 그래프에서 제거되고 새로운 객체가 작성됩니다. 즉, 원본 도면을 열고 그래프를 다시 실행하면 이전 객체와 함께 새로운 객체가 작성됩니다.
사용해야 하는 경우
이 옵션은 Dynamo가 특정 도면 에서 마지막으로 실행될 때 작성한 객체를 "기억"하도록 하려는 경우에 사용합니다.
이 옵션은 특정 도면 과 Dynamo 그래프 간에 1:1 관계를 유지할 수 있는 상황에 가장 적합합니다. 옵션 1과 3은 여러 도면에서 실행되도록 설계된 그래프에 더 적합합니다.
이 옵션은 객체 바인딩 데이터가 그래프(.dyn 파일) 대신 도면에서 직렬화된다는 점을 제외하고 옵션 2와 유사합니다. 그래프를 닫았다가 다시 열고 동일한 도면 에서 실행하면 모든 것이 그래프를 닫았을 때와 동일하게 작동합니다. 다른 도면 에서 그래프를 실행하는 경우 그래프가 아닌 도면에 저장되기 때문에 바인딩 데이터는 원래 도면에 그대로 유지됩니다.
사용해야 하는 경우
이 옵션은 여러 도면 에서 동일한 그래프를 사용하고 Dynamo가 각 도면에서 수행한 작업을 "기억"하도록 하려는 경우에 사용합니다.
이 옵션을 사용할 때 가장 먼저 주목해야 할 점은 기본 Dynamo 인터페이스를 통해 그래프를 실행할 때 그래프가 도면과 상호 작용하는 방식에 영향을 미치지 않는다는 것입니다. 이 옵션은 Dynamo 플레이어를 사용하여 그래프를 실행할 때_만_ 적용됩니다.
Dynamo 플레이어를 처음 사용하는 경우 Dynamo 플레이어 섹션을 참조하십시오.
기본 Dynamo 인터페이스를 사용하여 그래프를 실행한 다음 닫고 Dynamo 플레이어를 사용하여 동일한 그래프를 실행하면 이전에 작성한 객체 위에 새로운 객체가 작성됩니다. 그러나 Dynamo 플레이어에서 그래프가 한 번 실행되면 도면의 객체 바인딩 데이터가 직렬화됩니다. 따라서 Dynamo 플레이어를 통해 그래프를 여러 번 실행하면 새로운 객체가 작성되지 않고 객체가 업데이트됩니다. Dynamo 플레이어를 통해 다른 도면 에서 그래프를 실행하면 바인딩 데이터는 그래프가 아닌 도면에 저장되기 때문에 원래 도면에 유지됩니다.
사용해야 하는 경우
여러 도면에서 Dynamo 플레이어를 사용하여 그래프를 실행하고 Dynamo 플레이어가 각 도면에서 수행한 작업을 "기억"하도록 하려는 경우에 이 옵션을 사용합니다.
Dynamo는 시각적 프로그래밍 도구로서 매우 강력하지만 노드 및 와이어를 넘어 문자 형식으로 코드를 작성하는 것도 가능합니다. 이 작업은 다음과 같은 두 가지 방법으로 수행할 수 있습니다.
Code Block을 사용하여 DesignScript 쓰기
Python 노드를 사용하여 Python 쓰기
이 섹션에서는 Civil 3D 환경에서 Python을 활용하여 AutoCAD 및 Civil 3D .NET API를 활용하는 방법에 대해 중점적으로 설명합니다.
Dynamo에서 Python을 사용하는 방법에 대한 보다 일반적인 정보는 Python 섹션을 참조하십시오.
AutoCAD와 Civil 3D에는 여러분과 같은 개발자가 사용자 지정 기능으로 핵심 제품을 확장할 수 있는 여러 API가 있습니다. Dynamo의 컨텍스트에서 관련성이 있는 것은 관리되는 .NET API입니다. 다음 링크는 API의 구조 및 작동 방식을 이해하는 데 필수적입니다.
이 섹션을 진행하면서 데이터베이스, 트랜잭션, 메서드, 특성 등 익숙하지 않은 개념이 접할 수 있습니다. 이러한 개념 중 대부분은 .NET API 작업의 핵심이며 Dynamo 또는 Python에만 국한되지 않습니다. 이러한 항목에 대해 자세히 설명하는 것은 이 입문서 섹션의 범위를 벗어나는 것이므로 더 자세한 내용은 위의 링크를 자주 참조하는 것이 좋습니다.
새 Python 노드를 처음 편집하면 시작할 수 있도록 템플릿 코드가 미리 채워져 있습니다. 아래에는 각 블록에 대한 설명과 함께 템플릿을 분석한 내용이 나와 있습니다.
sys
및clr
모듈을 가져옵니다. 둘 다 Python 인터프리터가 제대로 작동하는 데 필요합니다. 특히clr
모듈을 사용하면 .NET 네임스페이스를 기본적으로 Python 패키지로 처리할 수 있습니다.AutoCAD 및 Civil 3D를 위한 관리되는 .NET API로 작업하기 위한 표준 어셈블리(예: DLL)를 로드합니다.
표준 AutoCAD 및 Civil 3D 네임스페이스에 참조를 추가합니다. 이는 각각 C# 또는 VB.NET의
using
또는Imports
지시어와 동일합니다.노드의 입력 포트에는
IN
라는 사전 정의된 리스트를 사용하여 액세스할 수 있습니다. 색인 번호를 사용하여 특정 포트의 데이터에 액세스할 수 있습니다(예:dataInFirstPort = IN[0]
).활성 문서 및 편집기를 가져옵니다.
문서를 잠그고 데이터베이스 트랜잭션을 시작합니다.
여기에 스크립트 논리의 대부분을 배치해야 합니다.
주 작업이 완료된 후 이 행의 주석을 해제하여 트랜잭션을 커밋합니다.
노드에서 데이터를 출력하려면 스크립트 끝에 있는
OUT
변수에 데이터를 지정합니다.
사용자화하시겠습니까?
C:\ProgramData\Autodesk\C3D <version>\Dynamo
에 있는 PythonTemplate.py
파일을 편집하여 기본 Python 템플릿을 수정할 수 있습니다.
예제를 통해 Dynamo for Civil 3D에서 Python 스크립트를 작성하는 데 필요한 몇 가지 기본 개념을 살펴보겠습니다.
다음은 이 연습에서 참조할 수 있는 예제 파일입니다.
이 그래프의 논리에 대한 개요는 다음과 같습니다.
Civil 3D API 문서 검토
문서에서 도면층 이름별로 모든 유역 선택
Dynamo 객체를 "언래핑"하여 내부 Civil 3D API 멤버에 액세스
AutoCAD 점에서 Dynamo 점 작성
점에서 PolyCurve 작성
그럼 시작하겠습니다!
그래프 작성과 코드 작성을 시작하기 전에 Civil 3D API 문서를 살펴보고 API가 제공하는 기능을 파악하는 것이 좋습니다. 이 경우 유역의 경계 점을 반환하는 특성이 유역 클래스에 있습니다. 이 특성은 Point3dCollection
객체를 반환하는데, Dynamo에서 이 객체를 어떻게 사용할지 알 수 없습니다. 다시 말해, Point3dCollection
에서 PolyCurve를 작성할 수 없으므로, 결국 모든 항목을 Dynamo 점으로 변환해야 합니다. 이에 대해서는 나중에 더 자세히 살펴보겠습니다.
이제 그래프 논리 작성을 시작할 수 있습니다. 가장 먼저 해야 할 일은 문서에 있는 모든 유역 리스트를 가져오는 것입니다. 이를 위해 사용할 수 있는 노드가 있으므로 Python 스크립트에 포함할 필요가 없습니다. 노드를 사용하면 그래프를 읽을 수 있는 다른 사람에게 더 나은 가시성을 제공할 수 있습니다(Python 스크립트에 많은 코드를 묻어두는 것에 비해). 또한 Python 스크립트가 유역의 경계 점을 반환하는 한 가지 작업에 집중할 수 있도록 해줍니다.
여기서 All Objects on Layer 노드의 출력은 CivilObjects 목록입니다. 이는 현재 Dynamo for Civil 3D에 유역 작업을 위한 노드가 없기 때문이며, 이것이 바로 Python을 통해 API에 액세스해야 하는 이유입니다.
더 자세히 알아보기 전에 중요한 개념을 간단히 살펴봐야 합니다. 노드 라이브러리 섹션에서 객체와 CivilObjects가 어떻게 관련되어 있는지 살펴보았습니다. 이에 대해 조금 더 자세히 설명하자면, Dynamo 객체는 AutoCAD 도면요소를 감싸는 래퍼입니다. 마찬가지로, Dynamo CivilObject도 Civil 3D 도면요소를 감싸는 래퍼입니다. 해당 InternalDBObject
또는 InternalObjectId
특성에 액세스하여 객체의 "언래핑"할 수 있습니다.
객체 Autodesk.AutoCAD.DynamoNodes.Object
도면요소 Autodesk.AutoCAD.DatabaseServices.Entity
CivilObject Autodesk.Civil.DynamoNodes.CivilObject
도면요소 Autodesk.Civil.DatabaseServices.Entity
경험상 일반적으로 InternalObjectId
특성을 사용하여 객체 ID를 가져온 다음 트랜잭션에서 래핑된 객체에 액세스하는 것이 더 안전합니다. 이는 InternalDBObject
특성이 쓰기 가능 상태가 아닌 AutoCAD DBObject를 반환하기 때문입니다.
다음은 내부 유역 객체에 액세스하는 작업을 수행하는 완전한 Python 스크립트가 해당 경계 점을 가져오는 것입니다. 강조 표시된 행은 기본 템플릿 코드에서 수정/추가된 행을 나타냅니다.
각 행에 대한 설명을 보려면 스크립트에서 밑줄이 있는 문자를 클릭합니다.
경험상 스크립트 논리의 대부분은 트랜잭션 내에 포함하는 것이 가장 좋습니다. 이렇게 하면 스크립트가 읽기/쓰기 중인 객체에 안전하게 액세스할 수 있습니다. 대부분의 경우 트랜잭션을 생략하면 치명적 오류가 발생할 수 있습니다.
이 단계에서 Python 스크립트는 배경 미리보기에서 볼 수 있는 Dynamo 점 리스트를 출력해야 합니다. 마지막 단계는 점에서 PolyCurve를 만드는 것입니다. 이 작업은 Python 스크립트에서 직접 수행할 수도 있지만, 더 잘 보이도록 의도적으로 스크립트 외부의 노드에 배치했습니다. 최종 그래프의 모습은 다음과 같습니다.
최종 Dynamo 형상은 다음과 같습니다.
마무리하기 전에 간단히 한 가지 더 알려드리겠습니다. 사용 중인 Civil 3D 버전에 따라 Python 노드가 다르게 구성될 수 있습니다. Civil 3D 2020 및 2021에서 Dynamo는 IronPython이라는 도구를 사용하여 .NET 객체와 Python 스크립트 간에 데이터를 이동했습니다. 그러나 Civil 3D 2022에서는 Dynamo가 Python 3을 사용하는 대신 표준 기본 Python 인터프리터(CPython)를 사용하도록 전환되었습니다. 이러한 전환의 이점으로는 널리 사용되는 최신 라이브러리와 새로운 플랫폼 기능, 필수 유지보수 및 보안 패치에 대한 액세스가 포함됩니다.
Dynamo 블로그에서 이 전환에 대한 자세한 내용과 기존 스크립트를 업그레이드하는 방법을 확인할 수 있습니다. IronPython을 계속 사용하려면 Dynamo Package Manager를 사용하여 DynamoIronPython2.7 패키지를 설치하기만 하면 됩니다.
이 행은 Dynamo 형상 라이브러리에서 필요한 특정 클래스를 가져옵니다. import *
는 명명 충돌을 유발할 수 있으므로, 여기서는 import Point as DynPoint
를 지정합니다.
여기서는 모든 입력의 전체 리스트를 참조하는 기본 IN
대신 원하는 데이터가 포함되어 있는 입력 포트를 정확하게 지정합니다.
도면에 있는 모든 유역의 경계 형상을 가져옵니다.
작업을 완료했습니다!