KroVex Geschrieben 19. Oktober 2022 Teilen Geschrieben 19. Oktober 2022 Salü Zusammen Eine Frage an die Python Anwender*Innen - ich weiss nicht einmal, wie ich das Beschreiben soll, was ich suche.. Ich habe eine Input-Liste, bei welcher jeder Eintrag mit der Geschossbezeichnung beginnt und anschliessend die dazugehörigen Referenzhöhen, Ebenen usw. beinhaltet. Nun sollte die Liste geflattet (?!) werden und zwar so, das immer zuerst der gemeinsame Nenner (Geschoss) steht und anschliessend alle dazugehörigen Werte (Wunsch-Output). Tückisch ist auch, dass nicht jedes Geschoss gleich viele Einträge enthält. Hat jemand eine Idee wie ich das sauber in Python (oder Marionette) lösen kann? Gruss KroVex CADNODE.ch Lassen Sie uns gemeinsam effiziente und innovative CAD-Lösungen für Ihr Projekt finden! Have you tried to turn it off and on again? Vectorworks | Architektur | macOS/Windows Link zu diesem Kommentar
Manuel Roth Geschrieben 19. Oktober 2022 Teilen Geschrieben 19. Oktober 2022 (bearbeitet) Bist du sicher, dass du einen solchen Output willst? Denn grundsätzlich gibtst du eine Liste an, bei der abwechselnd immer ein Geschossname und anschliessend eine Liste von allen Referenzhöhen usw. enthalten ist. Meiner Meinung nach wäre hier ein Python Dictionary um einiges effizienter. Zudem lässt du Einträge ohne schlauen Namen aus. Gibt es da einen Grund? Und könntest du deine Inputdaten als Text bereitstellen? Geht um einiges sicherer, als sie abzutippen. Bearbeitet 19. Oktober 2022 von Manuel Roth Freundliche Grüsse Manuel Roth _________________________________________________ Vectorworks 2022 SP3 | Architektur | Windows 10 Link zu diesem Kommentar
Manuel Roth Geschrieben 19. Oktober 2022 Teilen Geschrieben 19. Oktober 2022 (bearbeitet) Aber eventuell bist du ja mit dem hier zufrieden. @Marionette.NodeDefinition class Params(metaclass = Marionette.OrderedClass): #APPEARANCE #Name this = Marionette.Node( 'KroVex-Node' ) this.SetDescription( "Does a special thing that I do not understand" ) #Input Ports x = Marionette.PortIn( [], 'list' ) x.SetDescription( "input" ) #OIP Controls #Output Ports y = Marionette.PortOut('dict') y.SetDescription( "output" ) #BEHAVIOR this.SetListAbsorb() def RunNode(self): #inputs input = self.Params.x.value #script out = {} for a in input: if a[1][0] != ', ': name = a[0][0] if name in out: out[name].append( a[1] ) else: out[name] = [ a[1] ] #outputs self.Params.y.value = out Und wenn du deinen Output willst, kannst du das ganze noch durch den Konvertierungs-Node lassen. Aber wie gesagt, ich würde empfehlen, mit einem Dict zu arbeiten. Wird dir einfacher gehen. @Marionette.NodeDefinition class Params(metaclass = Marionette.OrderedClass): #APPEARANCE #Name this = Marionette.Node( 'KroVex-Konvertierung' ) this.SetDescription( "Converts a specific dict into a list." ) #Input Ports x = Marionette.PortIn( [], 'list' ) x.SetDescription( "input" ) #OIP Controls #Output Ports y = Marionette.PortOut('dict') y.SetDescription( "output" ) #BEHAVIOR def RunNode(self): #inputs input = self.Params.x.value #script out = [] for a in input: out.append([a]) out.append(input[a]) #outputs self.Params.y.value = out Bearbeitet 19. Oktober 2022 von Manuel Roth 1 Freundliche Grüsse Manuel Roth _________________________________________________ Vectorworks 2022 SP3 | Architektur | Windows 10 Link zu diesem Kommentar
KroVex Geschrieben 19. Oktober 2022 Autor Teilen Geschrieben 19. Oktober 2022 vor 13 Minuten schrieb Manuel Roth: Bist du sicher, dass du einen solchen Output willst? Ja, weil: Ich habe den Auftrag gefasst, dass mit dem Konstruktionsebenen-Generator nicht nur Ebenen angelegt werden sollen, sondern auch Geschosse, Referenzhöhen und deren Anbindung an die Ebenen. Der Standardweg über die VW Funktionen Betreff Geschosse, funktioniert aus irgend welchen unbekannten Gründen nicht. Deshalb bin ich momentan auf einem unkonventionellen Weg unterwegs und manipuliere die Datenbank, welche beim "Geschosskopierer" von @Antonio Landsberger benötigt wird, um die kopierten Geschosse / Ebenen / Referenztypen in einem neuen Dokument erzeugen zu lassen. Aber das funktioniert nur, wenn die Manipulierten Werte gleich daher kommen, wie im originalen - deshalb sieht das etwas kryptisch aus. -> Einfach das Script von Antonio anzupassen, wäre eine Idee - aber das Ding ist dermassen kompliziert, da steig ich nicht durch. [0] = (['DG06'], ['', '', 'A_116_DG06_2D.1']) [1] = (['DG06'], ['OK FB.1', 0.0, 'A_116_GrundrissDA06.1']) [2] = (['DG06'], ['OK DR.1', 150.0, 'A_116_DG06_DR.1']) [3] = (['DG06'], ['OK DA.1', -200.0, 'A_116_DG06_DA.1']) [4] = (['OG05'], ['UK RD.1', 2400.0, 'A_115_OG05_RD.1']) [5] = (['OG05'], ['UK FD.1', 2390.0, 'A_115_OG05_FD.1']) [6] = (['OG05'], ['', '', 'A_115_OG05_2D.1']) [7] = (['OG05'], ['OK FB.1', 0.0, 'A_115_GrundrissOG05.1']) [8] = (['OG05'], ['OK RB.1', -320.0, 'A_115_OG05_BA.1']) [9] = (['OG04'], ['UK RD.1', 2400.0, 'A_114_OG04_RD.1']) [10] = (['OG04'], ['UK FD.1', 2390.0, 'A_114_OG04_FD.1']) [11] = (['OG04'], ['', '', 'A_114_OG04_2D.1']) [12] = (['OG04'], ['OK FB.1', 0.0, 'A_114_GrundrissOG04.1']) [13] = (['OG04'], ['OK RB.1', -320.0, 'A_114_OG04_BA.1']) [14] = (['OG03'], ['UK RD.1', 2400.0, 'A_113_OG03_RD.1']) [15] = (['OG03'], ['UK FD.1', 2390.0, 'A_113_OG03_FD.1']) [16] = (['OG03'], ['', '', 'A_113_OG03_2D.1']) [17] = (['OG03'], ['OK FB.1', 0.0, 'A_113_GrundrissOG03.1']) [18] = (['OG03'], ['OK RB.1', -320.0, 'A_113_OG03_BA.1']) [19] = (['OG02'], ['UK RD.1', 2400.0, 'A_112_OG02_RD.1']) [20] = (['OG02'], ['UK FD.1', 2390.0, 'A_112_OG02_FD.1']) [21] = (['OG02'], ['', '', 'A_112_OG02_2D.1']) Gruss KroVex CADNODE.ch Lassen Sie uns gemeinsam effiziente und innovative CAD-Lösungen für Ihr Projekt finden! Have you tried to turn it off and on again? Vectorworks | Architektur | macOS/Windows Link zu diesem Kommentar
KroVex Geschrieben 19. Oktober 2022 Autor Teilen Geschrieben 19. Oktober 2022 vor 10 Minuten schrieb Manuel Roth: Aber wie gesagt, ich würde empfehlen, mit einem Dict zu arbeiten. Geschwungene Klammern = Dict? Werd ich mich einlesen/testen Zitat Does a special thing that I do not understand Danke dir für den Input Gruss KroVex CADNODE.ch Lassen Sie uns gemeinsam effiziente und innovative CAD-Lösungen für Ihr Projekt finden! Have you tried to turn it off and on again? Vectorworks | Architektur | macOS/Windows Link zu diesem Kommentar
Manuel Roth Geschrieben 19. Oktober 2022 Teilen Geschrieben 19. Oktober 2022 (bearbeitet) vor 9 Minuten schrieb KroVex: Geschwungene Klammern = Dict? Genau, für die Definition brauchst du geschwungene Klammern. Dictionaries haben die Eigenschaft, dass sie jeweils aus Pärchen von Bezeichnern und Werten bestehen. Mit Dict[Bezeichner] erhälst du den Wert. Dadurch lassen sich sehr einfach komplexere Datenkonstrukte hinter einprägsamen Namen verstecken. Zu beachten ist, dass es keine doppelten Bezeichner geben darf. (Eine Eigenschaft die beim Remove Duplicates-Node ausgenutzt wird.) Mehr Infos gibt es sonst hier. Leider sind sie in Marionette nur sehr spährlich bei DomCs Projekten zu finden. Bearbeitet 19. Oktober 2022 von Manuel Roth 1 Freundliche Grüsse Manuel Roth _________________________________________________ Vectorworks 2022 SP3 | Architektur | Windows 10 Link zu diesem Kommentar
KroVex Geschrieben 19. Oktober 2022 Autor Teilen Geschrieben 19. Oktober 2022 Sorry, nochmals eine Rückfrage: {['DG06': [['', '', 'A_116_DG06_2D.1'], ['OK FB.1', 0.0, 'A_116_GrundrissDA06.1'], ['OK DR.1', 150.0, 'A_116_DG06_DR.1'], ['OK DA.1', -200.0, 'A_116_DG06_DA.1']]], 'OG05': [['UK RD.1'..... Wie kann ich das Geschoss mit den dazugehörigen Ebenen nochmals in eine weitere Schachtel legen (rot)? #BEHAVIOR this.SetListAbsorb() def RunNode(self): #inputs input = self.Params.x.value #script out = {} for a in input: #für jedes Element in input if a[1][0] != ', ': #Input bestehend aus zwei Boxen: [1] und [0], ist in der Box ',' nicht enthalten.. name = a[0][0] # ist name = Box [0] if name in out: #kommt name in out vor... out[name].append( a[1] ) #...out Box[0] anschliessend alle Box [1] else: out[name] = [ a[1] ] #ansonsten k.A. [out] # ------->> Out in Klammern? #outputs self.Params.y.value = out out[name].append( a[1] ) weiter zu verschachteln mit [out[name].append( a[1] )] geht nicht, auch [out] will nicht.. Gruss KroVex CADNODE.ch Lassen Sie uns gemeinsam effiziente und innovative CAD-Lösungen für Ihr Projekt finden! Have you tried to turn it off and on again? Vectorworks | Architektur | macOS/Windows Link zu diesem Kommentar
KroVex Geschrieben 19. Oktober 2022 Autor Teilen Geschrieben 19. Oktober 2022 Hat sich erledigt CADNODE.ch Lassen Sie uns gemeinsam effiziente und innovative CAD-Lösungen für Ihr Projekt finden! Have you tried to turn it off and on again? Vectorworks | Architektur | macOS/Windows Link zu diesem Kommentar
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden