Træstruktur for AutoCAD og pyautocad

I et af mine tidligere blogindlæg diskuterede jeg, hvordan vi kan bruge lister og ordbøger til at gemme oprettede AutoCAD-objekter. I dette indlæg vil jeg introducere nogle mere effektive datastrukturer, som vi kan bruge til at organisere AutoCAD-objekter i overensstemmelse med deres egenskaber. En af dem er en trædatastruktur.

Trædatastruktur til organisering af AutoCAD-objekter

En trædatastruktur er en ikke-lineær datastruktur, fordi den ikke gemmer data på en sekventiel måde. Det er en hierarkisk struktur, da elementer i et træ er arrangeret på flere niveauer og har form af noder. Noder kan indeholde enhver datatype. I tilfælde af pyautocad bliver jeg nødt til at hente strenge, heltal, flydere osv.

Hver node indeholder nogle data og linket eller referencen til andre noder. Disse tilknyttede noder er overordnede eller underordnede noder, afhængigt af deres placering i det træformede datahierarki.

Træ
Figur 1: Trædatastruktur

For eksempel, som illustreret i ovenstående figur, er knude A rodknudepunktet. Rodnoden er den øverste knude i træet og repræsenterer den første knude i træet. I dette tilfælde har rodknudepunktet A tre (3) underordnede knudepunkter: B, F og J. Med andre ord er knudepunkt A en overordnet knude til disse knudepunkter.

Organisering af AutoCAD-objekter i en sådan træformet hierarkisk datastruktur hjælper med lagring, vedligeholdelse, sporing og manipulation af data.

Anvendelse af trædatastrukturer, når du arbejder med pyautocad i Python

Nogle gange har vi brug for at sammenkæde data, mens vi opretter eller redigerer tegninger. Lad os for eksempel overveje et eksempel, hvor jeg designer en lille betongulvramme indeholdende bjælker og søjler.

Jeg kunne gemme hvert objekt som en separat node. I kodningseksemplet vist nedenfor opretter jeg en node ved navn Column, som har 4 børn. Disse børn indeholder data fra et strukturelt AutoCAD-element som deres egne respektive børn.

    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))))

Ovenstående datatræ strukturerer de kolonneelementer, der blev oprettet og tilføjet til AutoCAD-tegningen. Elementerne oprettes og tilføjes med pyautocad, et modul til scripting af AutoCAD-arbejdsgange i Python . Jeg kan strukturere bjælkeelementer på samme måde. På den måde kombinerer jeg begge dele til en overordnet træformet datastruktur, der organiserer og gemmer data for hele bygningen.

I dette eksempel fortsætter jeg med at implementere en nodemetode til at udskrive indholdet af en node og dens børn. Metoden kan kaldes for rodnoden. Metoden vil desuden også udskrive overfladearealet, der er knyttet til hvert underordnet nodeindhold, bjælke eller søjle. Her er koden til dette:

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()  

I dette eksempel arbejder jeg med den strukturelle AutoCAD-ramme, der vises i figuren nedenfor.

Figur 2.1: Strukturelle rammer ved hjælp af pyautocad

I dette eksempel skabte metoden “print_tree” følgende output:

Figur 2.2: Output for datatræet oprettet i Python ved hjælp af pyautocad

Fordele ved at bruge trædatastruktur, mens du arbejder med pyautocad

På grund af nogle tekniske problemer eller på grund af strukturel design nødvendighed kan det være nødvendigt at ændre dimensionerne af en struktur. I et sådant tilfælde vil nogle indbyrdes forbundne medlemmer blive berørt. Derfor skal dimensionerne for disse elementer justeres i overensstemmelse hermed. For at undgå omfattende manuel indsats kan jeg blot justere dimensionerne på et medlem, og andre medlemmer vil blive ændret i overensstemmelse hermed.

Dette kan opnås ved at bruge en kombination af et datatræ og en sammenkædet liste. For eksempel, hvis jeg ændrer dimensionen af ​​et objekt, kan jeg søge efter dimensionsegenskaben for det pågældende objekt i den sammenkædede liste. Dette objekt skal også forbindes med forbindelsesobjekterne, som kan ændres yderligere automatisk på basis af ændringer foretaget med forbindelseselementets dimensioner. På denne måde kan jeg vedligeholde hierarkiet af objekter samt forbinde dem sammen.

Et andet use case er i forhold til blockchain, det vil sige, at vi kan spore det sted, hvor ændringerne er foretaget, hvis vi hash de data, der er gemt i hver node. Eller vi kan hash hele dokumentet og spore ændringerne i det samme.

Der kan være flere sådanne use cases afhængigt af branchen, domænet eller det arbejde, der udføres i AutoCAD. For mere om AutoCAD, kan du også tjekke den officielle dokumentation for AutoCAD.

You May Also Like

Leave a Reply

Leave a Reply

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.