Support Forum

[Frage] Datensätze fest im Skript integrieren [Gelöst]

Schlagworte:
  • Daten
  • Norm
  • Varianten

Ich möchte ein Bauteil als PythonPart erstellen mit der Möglichkeit, die Geometrie nach fest definierten Normgrößen umzuschalten.
Zum Beispiel eine Sechskantschraube. Die gibt es in den Normgrößen M12 bis M36 und aus jeder Varianten ergeben sich die Abmessung. Die Schraubenlänge kann aber unabhängig von der Normgröße gewählt werden.

Anstatt für jede Normgröße ein eigenes PythonPart zu erstellen, wäre es besser, nur ein PythonPart zu haben, bei dem ich die Normgröße über eine Dropdownliste auswähle und nur noch Eingabefelder für die variablen Parameter einrichte.

Wie kann ich so einen Datensatz (Tabelle) fest im Skript integrieren?

Liebe Grüße
Felix

Gruß Felix
Allplan 2024-0-1

Anhänge (2)

Typ: image/png
92-mal heruntergeladen
Größe: 8,46 KiB
Typ: application/zip
974-mal heruntergeladen
Größe: 8,23 KiB

Lösung anzeigen Lösung verbergen

Habe jetzt meine Lösung gefunden:
Marcus hat das Dictionary bereits genannt, welches man in das Node ExecPythonScript schreiben kann. Man muss es halt dort nur in die "function_to_execute" integrieren. Ich habe das für Datensätze zu Stahlträgerprofilen gemacht. Im Pythonpart kann ich dann einfach des Profil wählen und der Träger ändert sich entsprechend. Will ich weitere Profile haben, muss ich nur das Dictionary und die Auswahlliste ergänzen. Die Einzelwerte gibt es bei bauforumstahl.de.

So kann das aussehen:

def function_to_execute(typ):
    # typ: h[mm], b[mm], tw[mm], tf[mm], r[mm]
    values = {
        "HEA_100": [96, 100, 5, 8, 12],
        "HEA_120": [114, 120, 5, 8, 12],
        "HEA_140": [133, 140, 5.5, 8.5, 12],
        "HEA_160": [152, 160, 6, 9, 15],
        "HEA_180": [171, 180, 6, 9.5, 15],
        "HEA_200": [190, 200, 6.5, 10, 18],
        "HEA_220": [210, 220, 7, 11, 18],
        "HEA_240": [230, 240, 7.5, 12, 21],
        "HEA_260": [250, 260, 7.5, 12.5, 24],
        "HEA_280": [270, 280, 8, 13, 24],
        "HEA_300": [290, 300, 8.5, 14, 27],
        "HEA_320": [310, 300, 9, 15.5, 27],
        "HEA_340": [330, 300, 9.5, 16.5, 27],
        "HEA_360": [350, 300, 10, 17.5, 27],
        "HEA_400": [390, 300, 11, 19, 27],
        "HEA_450": [440, 300, 11.5, 21, 27],
        "HEA_500": [490, 300, 12, 23, 27],
        "HEA_550": [540, 300, 12.5, 24, 27],
        "HEA_600": [590, 300, 13, 25, 27],
        "HEA_650": [640, 300, 13.5, 26, 27],
        "HEA_700": [690, 300, 14.5, 27, 27],
        "HEA_800": [790, 300, 15, 28, 30],
        "HEA_900": [890, 300, 16, 30, 30],
        "HEA_1000": [990, 300, 16.5, 31, 30],
        }
    return values[typ]

Danke Marcus und Xinling für die Hinweis und Danke auch an Nemo für deine Lösungsvorschläge.
Nr 1 habe ich versucht, war mir dann aber nicht praktisch/kompakt genug. Bin auch wieder an den CAV-Nodes gescheitert. Nr 2 und 3 kann ich leider nicht, aber andere können das sicher schon. Nr 4 wäre wirklich super.

Gruß Felix
Allplan 2024-0-1

Anhänge (3)

Typ: image/png
212-mal heruntergeladen
Größe: 185,89 KiB
Typ: text/plain
932-mal heruntergeladen
Größe: 1,67 KiB
Typ: video/mp4
917-mal heruntergeladen
Größe: 1,46 MiB
1 - 10 (13)

Kauf dir das Profilbauteile Addon von CDS. Das Geld in Stunden gerechnet, verbrennst du alleine bei der Erstellung des Smartpart für die Schrauben.

Mit besten Grüßen!
Jürgen

Allplan Ingenieurbau V10 bis V2025

Nur um das klar zu stellen: Ich will überhaupt keine Schrauben erstellen, das ist nur ein Beispiel. Es geht darum, dass ich bei VS keine Möglichkeit sehe, wie ich Objektgeometrien direkt im Skript vorhalten kann.

Zum Beispiel brauche ich einen fixen 3D-Polygonzug zur weiteren Verarbeitung im Skript. Ich will diesen Polygonzug weder durch Anklicken im 3D-Fenster auswählen (SelectGeometryObject) noch will ich eine CSV-Datei mit Koordinaten einlesen. Wären ja jedesmal die selben Koordinaten bzw. das selbe Objekte.

Um einen 3D-Polygonzug im VS zu erzeugen kann ich das Node Polyline3D benutzen, brauche dafür aber die Liste mit den Punkten. Wenn das Polygon zehn Punkte hat, soll ich dann zehnmal das Node Point3D einfügen und dort jeweils die Koordinaten für einen Punkt eingeben? Das ist doch schwachsinnig. Vor allem wenn ich gerne mehrere Polygone hätte, zwischen denen ich umschalten kann.

Es gibt diverse Nodes mit denen man Punktlisten generieren kann, aber immer nur auf Basis von Ausgangswert und Berechnung. Ein simples ListPoint3D zum Vorbelegen von Koordinaten finde ich nicht.

Ich hatte auch schon die Idee das Polygon im Node ExecPythonScript zu integrieren und daraus abzurufen, hat aber nicht funktioniert.

Gruß Felix
Allplan 2024-0-1

Hallo Felix,

bin mir jetzt nicht sicher wo du da was hinterlegen willst, aber so generell in Python sollte folgendes klappen.
Als Liste mit Dictionaries für die Eigenschaften:
[{mg:"12",d:"13",...},{mg:"16",d:"17",...},...]
Oder als verschachtelte Dicts:
{"12":{d:"13"}...,"16":{d:"17"}...,...}

Gruß
Marcus

VG
Marcus

Danke für die Antwort.

Jetzt müsste ich nur noch herausfinden, in welches Node ich das Dictionary schreibe und wie ich die einzelnen Werte (bzw. Zeilen) in die anderen Nodes übertrage.

Was ich hinterlegen will?
Beispielsweise möchte ich ein PytonPart erstellen, welches die Modellierung von Fugenausbildungen an Betonbauteilen erleichtern soll.

Der Anwender kann dann einfach die Fugenkante anwählen und im Skript einstellen, welcher Fugenbahntyp verlegt werden soll. Zusätzlich kann die Verlegung von Schubdornen zugeschaltet werden. Auch hier wieder verschiedene Typen.

Da wäre es doch praktisch, wenn man die Querschnitte der Fugenbänder und die Körper der Schubdorne nicht im Projekt vorhalten müsste, um sie dann über einen Button ins PytonPart zu laden, sondern einfach per Dropdown-Liste in der Partpalette auswählen könnte. Dann würde auch das fehlerfreie Setzen der Referenzpunkte am Querschnitt/Körper durch den Anwender wegfallen.

Das Node Print zeigt mir die Struktur einer 3D-Polyline so an:

Polyline3D(
Count(9)
Points(
(0, 7, 0)
(10, 7, 0)
(10, 5, 0)
(7, 5, 0)
(7, 0, 0)
(3, 0, 0)
(3, 5, 0)
(0, 5, 0)
(0, 7, 0)))

Kann ich solche vordefinierten Polylinien im Skript fest vorhalten?

Gruß Felix
Allplan 2024-0-1

Bei VS bin ich raus

VG
Marcus

Zitiert von: f_hoeser
Wie kann ich so einen Datensatz (Tabelle) fest im Skript integrieren?

Es gibt momentan keine generelle Methode, um Datensätze im Skript fest zu speichern. Insbesondere, wenn es um multi-dimensionalen Dateien geht, wird es noch schwieriger... Was für einen Datensatz, das du gerne speichern möchtest? Nur eine Tabelle?

Product Owner API, Allplan GmbH

Danke für die Information.

"Was für einen Datensatz, das du gerne speichern möchtest? Nur eine Tabelle?"

Ja eine Tabelle wäre hilfreich. Der Inhalt der Tabelle muss aber an die andern Nodes übergeben werden. Wenn der Benutzer in einem Auswahlfeld Variante 1 wählt, wird der Inhalt aus Zeile 1 den Variablen zugeordnet. Wählt der Benutzer später Variante 2 aus, wird der Inhalt aus Zeile 2 den Variablen zugeordnet.

Der Teil des Skripts der das endgültige Objekt erzeugt, wird nur einmal geschrieben, die zugrunde liegenden Daten können ausgetauscht werden. Das Skript kann dann auch leichter erweitert werden.

Das scheint im VS so nicht zu funktionieren.

Ich habe mein Beispiel mit der Polyline3D vom 16.11.21 angehangen. Vielleicht hat jemand eine Idee, wie ich die Koordinatenliste für die Polyline3D vereinfacht im Skript integrieren kann?

Gruß Felix
Allplan 2024-0-1

Anhänge (3)

Typ: image/png
123-mal heruntergeladen
Größe: 313,74 KiB
Typ: video/mp4
873-mal heruntergeladen
Größe: 742,83 KiB
Typ: text/xml
988-mal heruntergeladen
Größe: 14,26 KiB

Mögliche Lösungen:
1. Die Punkteliste in einer CSV-/Excel-Datei speichern (NodeWritePoints), und mit dem NodeReadPoints
die Punkt wieder lesen und eine Polylinie draus machen.
Dann bräuchte man mehrere CSV-Dateien für die unterschiedlichen Profilgeometrien.
Dafür wäre es natürlich nützlich, ein VS-Script zu haben, welche die Punkte einer
aus Allplan übernommenen Polylinie in eine CSV-Datei schreibt.

2. basierend auf dem Node NodeReadPoints einen eigenen Node schreiben, wo mehrere "benannte"
Punktlisten aus einer CSV-Datei gelesen werden können. (Spalte 1 könnte der Name stehen)

3. basierend auf Punkt 2. könnte man das ganze auch in einer sqlite-Datenbank ablegen.
Python bietet dafür nach "import sqlite3" sehr gute Funktionen.
Gerade bei großen Datenmengen muss dann nicht mehr die komplette CSV-Datei gelesen werden, sondern man kann sich einfach einen Datensatz holen, bzw. mit einer SQL-Abfrage generieren lassen.

4. Polylinie direkt aus Allplan übernehmen (NodePolyline3DInput), und dann den Node "backen"
"Node backen" gibt es in Allplan noch nicht, aber in Grashopper bedeutet das:
Das Datenelement wird im Node gespeichert. Danach werden alle Eingänge/Eingaben ignoriert.

@Allplan: Das wäre schön, wenn man das auch in Allplan-Visual-Scripting könnte.

Habe jetzt meine Lösung gefunden:
Marcus hat das Dictionary bereits genannt, welches man in das Node ExecPythonScript schreiben kann. Man muss es halt dort nur in die "function_to_execute" integrieren. Ich habe das für Datensätze zu Stahlträgerprofilen gemacht. Im Pythonpart kann ich dann einfach des Profil wählen und der Träger ändert sich entsprechend. Will ich weitere Profile haben, muss ich nur das Dictionary und die Auswahlliste ergänzen. Die Einzelwerte gibt es bei bauforumstahl.de.

So kann das aussehen:

def function_to_execute(typ):
    # typ: h[mm], b[mm], tw[mm], tf[mm], r[mm]
    values = {
        "HEA_100": [96, 100, 5, 8, 12],
        "HEA_120": [114, 120, 5, 8, 12],
        "HEA_140": [133, 140, 5.5, 8.5, 12],
        "HEA_160": [152, 160, 6, 9, 15],
        "HEA_180": [171, 180, 6, 9.5, 15],
        "HEA_200": [190, 200, 6.5, 10, 18],
        "HEA_220": [210, 220, 7, 11, 18],
        "HEA_240": [230, 240, 7.5, 12, 21],
        "HEA_260": [250, 260, 7.5, 12.5, 24],
        "HEA_280": [270, 280, 8, 13, 24],
        "HEA_300": [290, 300, 8.5, 14, 27],
        "HEA_320": [310, 300, 9, 15.5, 27],
        "HEA_340": [330, 300, 9.5, 16.5, 27],
        "HEA_360": [350, 300, 10, 17.5, 27],
        "HEA_400": [390, 300, 11, 19, 27],
        "HEA_450": [440, 300, 11.5, 21, 27],
        "HEA_500": [490, 300, 12, 23, 27],
        "HEA_550": [540, 300, 12.5, 24, 27],
        "HEA_600": [590, 300, 13, 25, 27],
        "HEA_650": [640, 300, 13.5, 26, 27],
        "HEA_700": [690, 300, 14.5, 27, 27],
        "HEA_800": [790, 300, 15, 28, 30],
        "HEA_900": [890, 300, 16, 30, 30],
        "HEA_1000": [990, 300, 16.5, 31, 30],
        }
    return values[typ]

Danke Marcus und Xinling für die Hinweis und Danke auch an Nemo für deine Lösungsvorschläge.
Nr 1 habe ich versucht, war mir dann aber nicht praktisch/kompakt genug. Bin auch wieder an den CAV-Nodes gescheitert. Nr 2 und 3 kann ich leider nicht, aber andere können das sicher schon. Nr 4 wäre wirklich super.

Gruß Felix
Allplan 2024-0-1

Anhänge (3)

Typ: image/png
212-mal heruntergeladen
Größe: 185,89 KiB
Typ: text/plain
932-mal heruntergeladen
Größe: 1,67 KiB
Typ: video/mp4
917-mal heruntergeladen
Größe: 1,46 MiB
1 - 10 (13)