Zum Inhalt springen

How to Python


KroVex

Empfohlene Beiträge

Salü Zusammen

 

Eine Frage an die Python Anwender*Innen - ich weiss nicht einmal, wie ich das Beschreiben soll, was ich suche..
image.thumb.png.c2b03467f209fdfefc34e14f390e3c17.png

 

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

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 von Manuel Roth

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar

Aber eventuell bist du ja mit dem hier zufrieden.

1910321037_Screenshot2022-10-19130926.thumb.png.a150f2422cd01bb92f3b1ec1bd3c2425.png

 

@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 von Manuel Roth
  • Verwirrt 1

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar
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
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
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 von Manuel Roth
  • Lieben 1

Freundliche Grüsse

 

Manuel Roth

_________________________________________________
Vectorworks 2022 SP3 | Architektur | Windows 10

Link zu diesem Kommentar

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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
  • Forenstatistik

    • Themen insgesamt
      23,5Tsd
    • Beiträge insgesamt
      121Tsd
×
×
  • Neu erstellen...