[Question] Handles per Schleife erstellen [Solved]

Tags:
  • 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.

Show solution Hide solution

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))