Das Wissen aller Anwender nutzen

Im Allplan Connect Forum tauschen sich Anwender aus, geben wertvolle Tipps oder beraten sich bei ganz konkreten Aufgabenstellungen − auch international.
Und damit wirklich keine Frage unbeantwortet bleibt, unterstützen die Mitarbeiter des Technischen Supports ebenfalls aktiv das Forum.

Es erwarten Sie:

  • Foren-Vielfalt aus CAD Architektur, CAD Ingenieurbau uvm.
  • Tipps von User für User
  • international: Deutsch, Englisch, Italienisch, Französisch und Tschechisch

Melden Sie sich jetzt an und diskutieren Sie mit!

Zur Registrierung

[Frage] Handles per Schleife erstellen [Gelöst]

Schlagworte:
  • Allplan
  • 2021
  • PythonParts
  • Handle
  • Entwicklung

Morgen zusammen,

ist es möglich Handles per Schleife erstellen zu lassen?
Ich habe eine Liste von Punkten (-> Anzahl über Dimensions bestimmt, vgl Beispiel)
<Parameter>
<Name>rp_points</Name>
<Text></Text>
<Value>[0,0,0] * 5</Value>
<ValueType>Point3D</ValueType>
<Dimensions>CountOfPoints</Dimensions>
<Visible>True</Visible>
</Parameter>

Nun möchte ich zu jedem dieser Punkte ein Handle erstellen.

Meine Idee würde folgendermaßen aussehen:
for i in range(0, len(build_ele.rp_points.value)):

handle_list.append(HandleProperties("Point-XYZ-"+str(i),
AllplanGeo.Point3D(build_ele.rp_points.value[i]),
AllplanGeo.Point3D(0, 0, 0),
[(build_ele.rp_points.value[i].X, HandleDirection.x_dir),
(build_ele.rp_points.value[i].Y, HandleDirection.y_dir),
(build_ele.rp_points.value[i].Z, HandleDirection.z_dir)],
HandleDirection.xyz_dir, False))

Hat hierzu jemand Infos für mich?
In den Beispielen finde ich zu diesem Probelm derzeit nichts Passendes.

Lösung anzeigen Lösung verbergen

Deine Tips haben gefruchtet:
for i in range(0, len(build_ele.rp_points.value)):
handle_list.append(HandleProperties("Point-XYZ-"+str(i),
AllplanGeo.Point3D(build_ele.rp_points.value[i]),
AllplanGeo.Point3D(0, 0, 0),
[("rp_points[" + str(i) + "].X", HandleDirection.x_dir),
("rp_points[" + str(i) + "].Y", HandleDirection.y_dir),
("rp_points[" + str(i) + "].Z", HandleDirection.z_dir)],
HandleDirection.xyz_dir, False))

Beispielcode:
origin = AllplanGeo.Point3D(0, 0, 0)
corner = AllplanGeo.Point3D(length, width, 0)

handle1 = HandleProperties("UpperRightCorner",
corner,
origin,
[("Length", HandleDirection.x_dir),
("Width", HandleDirection.y_dir)],

HandleDirection.xy_dir,
True)

Wie aus diesem Beispiel zu ersehen, muss zu jeder Richtung, die das Handle "messen" soll, ein zugehöriger Parameter-Namen angegeben werden.

Und da wird's kritisch? Wie soll bei einem Parameter, der als Punkt-Liste daher kommt, dieser Name aussehen? Jedenfalls nicht so:

handle_list.append(HandleProperties("Point-XYZ-"+str(i),
AllplanGeo.Point3D(build_ele.rp_points.value[i]),
AllplanGeo.Point3D(0, 0, 0),
[(build_ele.rp_points.value[i].X, HandleDirection.x_dir),
(build_ele.rp_points.value[i].Y, HandleDirection.y_dir),
(build_ele.rp_points.value[i].Z, HandleDirection.z_dir)],
HandleDirection.xyz_dir, False))

Dort wird ein Double statt eines Strings verwendet!

Möglicherweise führt "rp_points[0]" als Parametername zum Ziel, dann aber mit HandleDirection.point_dir:
(Auszug aus FlightStair.py)

handle_tmp = HandleProperties("Stair_LandingLeftLength_Handle",
AllplanGeo.Point3D(ref_point_handle_x , ref_point_handle_y, ref_point_handle_z),
AllplanGeo.Point3D(ref_point_handle_t_x, ref_point_handle_t_y, ref_point_handle_t_z),
[("LandingLeftLength", HandleDirection.point_dir)],
HandleDirection.point_dir, True, fact_handle)

Ein weiteres Beispiel findet sich in:
C:\ProgramData\Nemetschek\Allplan\2021\Etc\PythonPartsScripts\AllbauLibrary\StdReinfShapeBuilder\BarShapeHandleUtil.py

Man kann die Behandlung des Handles-Ziehens auch selbst implementieren:
Dafür gibt es die Function
def move_handle(build_ele, handle_prop, input_pnt, doc)
die immer gerufen wird, wenn ein Handle bewegt wird. (s. TurnStairs.py)

Herr Hohmann weiss es ganz bestimmt...

Super, dank dir!

Ich werde das mal prüfen.
Zur Not muss ich die Punktanzahl begrenzen und die Felder "manuell" in die pyp einbauen.

Deine Tips haben gefruchtet:
for i in range(0, len(build_ele.rp_points.value)):
handle_list.append(HandleProperties("Point-XYZ-"+str(i),
AllplanGeo.Point3D(build_ele.rp_points.value[i]),
AllplanGeo.Point3D(0, 0, 0),
[("rp_points[" + str(i) + "].X", HandleDirection.x_dir),
("rp_points[" + str(i) + "].Y", HandleDirection.y_dir),
("rp_points[" + str(i) + "].Z", HandleDirection.z_dir)],
HandleDirection.xyz_dir, False))