abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
Programmierung
Alles über Programmierung in GDL und Python

Wert aus 2D-Skript übernehmen

graber
Advocate

Hallo,

 

Vorweg, mir ist klar, dass man dies eigentlich nicht tun sollte, aber:

Gibt es eine Möglichkeit einen im 2D-Skript berechneten Wert einem Parameter zuzuweisen? (Ich möchte den Wert über Listen auslesen können)

parameter a=a im 2d-Skript bringt zwar keine Fehlermeldung, funktionert aber scheinbar auch nicht, Wert bleibt 0.

 

Danke

 

Operating system used: Windows

8 ANTWORTEN 8
archig
Expert

soweit ich weiss, geht das nicht. 

Du kannst aber die Berechnung im parameterskript erledigen, und dann mittels parameters a=a zuweisen. 

möglicherweise gehts auch im masterskript

ArchiCAD 25 / Windows 10
Ma_Scht
Advocate

Moinsen Graber,

wenn es ein KLEINES Objekt ist, mach die Berechnung des 2D-scripts im MASTER-SCRIPT. Dort klappt PARAMETERS.

Das MASTER wird immer durchlaufen bevor das 2D-, 3D-, PARAMETER- oder UI-SCRIPT durchlaufen wird.

Nachteil: Kostet etwas Rechenzeit wenn sehr viele Instanzen platziert sind. 

 

Sauberer ist es, wenn Du die Berechnung im 2D-Script UND im PARAMETER-SCRIPT machst, falls Du den Wert NICHT im 3D-Script oder einem anderen Script  brauchst. Ja, das ist x-facher Aufwand im Schreiben & ÄNDERN, aber dafür schneller in der täglichen Arbeit mit dem Objekt.

 

Habe ich ein Objekt, dass in sehr vielen Instanzen platziert sein wird, z.B. Container auf einem Container-Platz, oder Paletten, da kommen schnell mal 10'000+x Instanzen zusammen, dann gebe ich mir bzgl. Rechenzeitreduzierung viel Mühe. Ist es ein Zahnbehandlungsstuhl, von denen nur ein paar Dutzend Instanzen im Projekt sind, tippe ich das meiste ins MASTER-SCRIPT und schreibe die Ergebnisse mittels PARAMETERS in Parameter. In den Unters-Scripten greife ich dann auf die Werte zu.

PARAMETERS verlangsamt das Objekt merklich.

 

Der Nachteil am MASTER ist, dass dort TEXT oder TEXT2 NICHT funktioniert, aber mittels PRINT kann man das Ergebnis im Textfenster anzeigen lassen.

 

Wie alles im Leben - Ermessensache. :--)

Gruß

Moin @Ma_Scht 

Wär's auch möglich, aus Performancegründen die Berechnung im Masterscript als Sub zu definieren und sie vom 2D- und Parameter-Script nur aufzurufen?

Wenn ja, würde es den Aufwand nur minimal erhöhen und Performance vllt verbessern, oder?

Vllt noch das eine oder andere in eine Bedingung mit GLOB_SCRIPT_TYPE packen.

Gäbs da noch was zu berücksichtigen?

 

ArchiCAD 27 GER / Win10
Intel i9-9900K / 64GB RAM / nVidia GeForce RTX 2080 Ti
..... die Berechnung im Masterscript als Sub zu definieren und sie vom 2D- und Parameter-Script nur aufzurufen?

soweit ich weiss, kann man Schleifen nur innerhalb des jeweiligen Skripts ausführen. Hat das ArchiCAD erstmal die Bearbeitung des Masterskripts abgeschlossen, und ist im 2D Skript beschäftigt, dann kann man es nicht mehr ins Masterskript zurückschicken, um dort etwas zu berechnen, und dann wieder im 2D Skript weiterzumachen. 

 

Möglich wäre aber, die 2D Skriptdinge einfach ins Masterskript hineinzunehmen. 

Beim Parameterskript denke ich nicht, dass alle Befehle unter allen Situationen im Masterskript funktionieren. 

 

 

ArchiCAD 25 / Windows 10

Hallo Xandros,

aus meiner Sicht hat ARCHIG da Recht, man kann NICHT zwischen den SCRIPTEN schwuppen, aber da müssen die CRACKS was zu tippen.

Ich bin auch nur ein Laientippler und so tief nun auch wieder nicht im Stoff.

 

ABER: Wenn du ein schnelles OBJEKT willst, dann berechne alles was Du brauchst im jeweiligen Script und wenig im MASTER.

 

GOTO nutze ich NIE.

GOSUB mache ich nur sehr selten, da GOSUB und GOTO grundsätzlich einen doppelten SCRIPT-Durchlauf erfordert, denn GDL muss ja erstmal wissen wo die Sprungmarke sitzt und die ist immer hinter dem ENDE des Hauptprogramms. 

Ich nehme GOSUB wärend des Programmieren und wenn das Programm läuft ersetze ich es (Philosophiefrage - ich weiheiß).

 

Habe mein Wissen aus dem GDL-Kochbuch und von selfGDL.

Das Kochbuch liefert m.E. einige Hinweise zum zügigen Programmdurchlauf, da es zu einer Zeit geschrieben wurde, als Rechenkapazität knapp war, auch wenn DNC ein Freund der Subroutine ist.

 

Ich vermeide

- GOSUB (ich weiß, jetzt atmen die Programmierer tief durch)

- CALL

- Doppelpunkte um mehrere Befehle in eine Zeile zu schreiben (Ausnahme bei HotSpots um die Nr. hochzuzählen)

 

Dann gilt noch

- x^0.5 ist schneller als SQR(x)

- 0.5 * x ist schneller als x / 2

- Addition ist schneller als Subraktion und in jedem Fall ist DIVISION die langsamste Grundrechenart

- möglichst viele Parameter mit einem PARAMETERS-Befehl in die Parameter-LISTE schreiben

 

Gruß Mario

 

jaja, die Philosophiefrage... 

Da gibts sicher verschiedene Sichtweisen und Vorlieben.

Ich verwende zum gosub sehr gerne, da ich dadurch die Skripte übersichtlich halten kann. 

Geschwindigkeit ist für mich meist auch nicht soooo wichtig. Ich hatte aber auch noch kein Projekt mit 10.000 Containern. 

 

Aber nochmal zurück zum Ausgangsproblem: @graber:

Wenn Du die Berechnung für deinen Parameter im Parameterskript machst, und die Zuweisung mit parameters a=a erledigsts, dann brauchst du den Wert im 2D skript nicht nochmal berechnen. Du kannst dann einfach a verwenden, denn der Parameter hat dann den Wert deiner Berechnung schoin zugewiesen bekommen. 

 

ArchiCAD 25 / Windows 10

Hallo archig,

 

Tatsächlich ist das 2d-Skript (es ist ein reines 2d-Objekt) natürlich voller Bedingungen und Schleifen.

Stelle dir vor (ganz so trivial ist es natürlich nicht), du hättest ein Objekt, dass von 0 bis A alle X mm eine Linie zeichnet.

Dann möchte ich die Anzahl der Linien abfragen. (Im 2d Skript wird ja brav mitgezählt.)

Um diese Abfrage machen zu können, muß ich also diese Schleifen in einem anderen Skript (z.B. Parameter) nochmals einsetzen und durchlaufen lassen.

(Klar sauberer ist es so, aber eben auch (vorallem im Nachhinein) mehr Aufwand (und zudem eine Fehlerquelle mehr).

 

 

 

Ja, in so einem Fall kann das schon sinnvoll sein, wenn man das Zählen der gezeichneten Linien nicht nochmal in einem duplizierten Schleifendurchgang extra machen muss. 

Wenn es ein reines 2D Objekt ist, kannst du es komplett im Masterskript erledigen; 2D Skript und Parameterskript bleiben leer. 

Hier ein schnelles Beispiel: 

Neue Parameter: dx (Abstand; 0,02), fx (Faktor; 1,05), nx (Anzahl; wird im Skript ermittelt und automatisch gesetzt)

 

archig_0-1713342463497.png

 Und das hier im Masterskript:

nx = 0
xtemp = 0
while xtemp <= a do
xtemp = xtemp + dx*fx^nx
line2 xtemp,0,xtemp,b
nx = nx +1
endwhile
parameters nx = nx 

 

Ich nehme nicht so gerne while/endwhile Schleifen, denn damit erzeugt man gerne auch mal Endlosschleifen, sodass man ArchiCAD stoppen und neu starten muss. Für das Beispiel mit der unbekannten Zahl an Strichen passt es aber gut. 

 

 

 

ArchiCAD 25 / Windows 10

Setup info provided by author