이전 블로그 게시물 중 하나에서 작성된 AutoCAD 객체를 저장하기 위해 목록과 사전을 사용하는 방법에 대해 논의했습니다. 이 게시물에서는 속성에 따라 AutoCAD 객체를 구성하는 데 사용할 수 있는 좀 더 효율적인 데이터 구조를 소개하고자 합니다. 그중 하나는 트리 데이터 구조입니다.
AutoCAD 객체 구성을 위한 트리 데이터 구조
트리 데이터 구조는 데이터를 순차적으로 저장하지 않기 때문에 비선형 데이터 구조입니다. 트리의 요소가 여러 수준으로 배열되고 노드의 형태를 취하는 계층 구조입니다. 노드는 모든 데이터 유형을 포함할 수 있습니다. pyautocad의 경우 문자열, 정수, 부동 소수점 등을 가져와야 합니다.
각 노드에는 일부 데이터와 다른 노드의 링크 또는 참조가 포함됩니다. 이러한 연결된 노드는 트리 모양의 데이터 계층 구조에서의 위치에 따라 부모 또는 자식 노드입니다.
예를 들어 위의 그림과 같이 노드 A 가 루트 노드입니다. 루트 노드는 트리의 상위 노드이며 트리의 첫 번째 노드를 나타냅니다. 이 경우 루트 노드 A 에는 3개의 자식 노드(B, F 및 J)가 있습니다. 즉, 노드 A는 이러한 노드 의 부모 노드입니다.
이러한 트리 모양의 계층적 데이터 구조로 AutoCAD 객체를 구성하면 데이터 저장, 유지 관리, 추적 및 조작에 도움이 됩니다.
Python에서 pyautocad로 작업할 때 트리 데이터 구조 적용
도면을 작성하거나 편집하는 동안 데이터를 연결해야 하는 경우가 있습니다. 예를 들어 보와 기둥이 포함된 작은 콘크리트 바닥 프레임워크를 설계하는 예를 고려해 보겠습니다.
각 개체를 별도의 노드로 저장할 수 있습니다. 아래 표시된 코딩 예제에서는 4개의 하위 항목이 있는 Column이라는 노드를 만듭니다. 이러한 하위에는 구조적 AutoCAD 요소의 데이터가 각각의 하위로 포함됩니다.
column = TreeNode("Column")
c1 = TreeNode("Column1")
c2 = TreeNode("Column2")
c3 = TreeNode("Column3")
c4 = TreeNode("Column4")
column.add_child(c1)
column.add_child(c2)
column.add_child(c3)
column.add_child(c4)
c1.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 0, 0, 100, 0, 0, 100, 100, 0, 0, 100, 0, 0, 0, 0))))
c2.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 0, 0, 600, 0, 0, 600, 100, 0, 500, 100, 0, 500, 0, 0))))
c3.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 500, 0, 600, 500, 0, 600, 600, 0, 500, 600, 0, 500, 500, 0))))
c4.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 500, 0, 100, 500, 0, 100, 600, 0, 0, 600, 0, 0, 500, 0))))
위의 데이터 트리는 생성되어 AutoCAD 드로잉에 추가된 열 요소를 구성합니다. 요소는 Python에서 AutoCAD 작업 흐름 을 스크립팅하기 위한 모듈인 pyautocad로 생성 및 추가됩니다 . 같은 방식으로 빔 요소를 구성할 수 있습니다. 그런 식으로 나는 전체 건물에 대한 데이터를 구성하고 저장하는 전체 트리 모양의 데이터 구조로 두 가지를 결합합니다.
이 예제에서는 노드와 해당 자식의 내용을 인쇄하기 위한 노드 메서드를 구현하여 진행합니다. 메서드는 루트 노드에 대해 호출할 수 있습니다. 또한 이 방법은 각 하위 노드 콘텐츠, 빔 또는 열과 관련된 표면 영역도 인쇄합니다. 이에 대한 코드는 다음과 같습니다.
def print_tree(self):
space = " " * self.get_level()
prefix = space + "|--" if self.parent else ""
print(prefix, end="")
try:
print("Area = " + str(round(self.data.Area,2)))
except:
print(self.data)
if self.children:
for child in self.children:
child.print_tree()
이 예에서는 아래 그림에 표시된 구조적 AutoCAD 프레임워크로 작업합니다.
이 예에서 “print_tree” 메서드는 다음 출력을 생성했습니다.
pyautocad로 작업하면서 트리 데이터 구조를 사용하는 이점
일부 기술적 문제 또는 구조 설계 필요성으로 인해 구조의 치수를 변경해야 할 수 있습니다. 이러한 경우 일부 연결된 구성원이 영향을 받습니다. 따라서 이러한 부재의 치수는 적절하게 조정되어야 합니다. 광범위한 수동 작업을 피하기 위해 한 멤버의 치수를 간단히 조정하면 다른 멤버가 그에 따라 변경됩니다.
이는 데이터 트리와 연결 목록의 조합을 사용하여 달성할 수 있습니다. 예를 들어 객체의 차원을 변경하면 연결된 목록에서 해당 객체의 차원 속성을 검색할 수 있습니다. 이 개체는 연결 개체와도 연결되어야 하며 연결 요소의 치수 변경 사항에 따라 자동으로 추가로 수정할 수 있습니다. 이런 식으로 개체의 계층 구조를 유지하고 함께 연결할 수도 있습니다.
또 다른 사용 사례는 블록체인 측면에서, 즉 각 노드에 저장된 데이터를 해시하면 변경된 위치를 추적할 수 있습니다. 또는 전체 문서를 해시하고 변경 사항을 추적할 수 있습니다.
산업, 도메인 또는 AutoCAD에서 수행되는 작업에 따라 이러한 사용 사례가 여러 개 있을 수 있습니다. AutoCAD에 대한 자세한 내용은 AutoCAD 공식 문서를 확인할 수도 있습니다.
Leave a Reply