Support Forum

[Frage] Verwendung der Allplanfunktion zum Selektieren von Elementen; AllplanIFW.InputFunctionStarter.StartElementSelect(...)

Schlagworte:
  • Elemente
  • Selektieren
  • StartElementSelect
  • Pythonpart

Guten Tag,

Ich muss für ein PythonPart in der Lage sein mehrere Elemente zu selektieren, dazu verwende ich im Moment die Methode AllplanIFW.InputFunctionStarter.StartElementSelect(…).
Normalerweise ist es möglich bei gedrückter Ctrl-Taste mehrere Dinge zu selektieren. Was diese Methode aber standardmässig nicht zu tun scheint. Muss diese Funktionalität selbst Programmiert werden?

Freundliche Grüsse

Hilfreichste Antwort anzeigen Hilfreichste Antwort verbergen

Mit STRG+Klick kann man nur Elemente selektieren, wenn man die Input-Function noch nicht gestartet hat!

Wenn man die Input-Function schon gestartet hat, geht Gleichartiges nur mit der Verwendung der Summentaste!

1 - 10 (12)

Mit STRG+Klick kann man nur Elemente selektieren, wenn man die Input-Function noch nicht gestartet hat!

Wenn man die Input-Function schon gestartet hat, geht Gleichartiges nur mit der Verwendung der Summentaste!

Die Funktion wird mehr als einmal im Programmablauf des Pythonparts aufgerufen.
Da es nicht über die STRG-Taste möglich ist Elemente hinzuzufügen habe ich muss ich also eine andere Variante finden.

Ich habe es also über die HighlightElements mit der man so wie es aussieht teile hervorhebt, über die man Hovert. Sobald ich aber die StartElementSelect() Funktion erneut aufrufe wird von dieser CancelAllHighlightedElements aufgerufen auf das hin alle meine ausgewählten Elemente nicht mehr angezeigt werden. Das ich auch verstehe da ich die HighlightElements zweckentfremdet habe.

Gibt es eine Möglichkeit die Ausgewählten Linien hervorzuheben?
Oder muss ich mir selbst eine StartElementSelect Funktion schreiben?

Auch auf die Gefahr hin, daß ich mich wiederhole: Die Verwendung der Summentaste durch den Anwender nach dem Starten der Funktion
ist das, wonach Du fragst. Nach Abschluss der Selektion (mit Summentaste oder ohne) kann man mit den Elementen etwas veranstalten, und diese in die Datenbank zurückschreiben! Erst danach macht es Sinn, erneut eine Element-Selection zu starten...

Eine Input-Function wirst Du mit Python nicht selber schreiben können. Da (glaube ich) fehlen einige Python-Wrapper.
Kannst es natürlich probieren, ich sehe aber die Notwendigkeit nicht.
Schau Dir die InteractorExamples an. Es ist alles da, was Du brauchst...

Hallo

ich versuche auch mehrere Elemente (Auswahl über Bereich oder Summenfunktion) aus Allplan auszulesen.
Die Beispiele in InteractorExamples verwenden alle CoordinateInput.SelectElement um jeweils ein Element auszuwählen.
Die Methode InputFunctionStarter.StartElementSelect wird leider in keinem der Beispiele verwendet. Und leider schaffe
ich es auch nicht diese korrekt aufzurufen.

Gibt es ein Pythonpart-Beispiel mit der Auswahl von mehreren Elementen?
Mein Ziel ist, Linien und Polygone in Allplan auszuwählen und z.B. an den jeweiligen Start- und Endpunkten einen Kreis zu erstellen.

Gruss und Dank
Hansruedi

Hallo Hansruedi

Das ist der Code den ich verwende.
Wenn man die Summentaste verwendet funktioniert das ganze ganz gut.
Allerdings habe ich schon bemerkt, dass in der PostElementSelection manchmal auch das PythonPart und ein weiteres Element enthalten ist. Man muss also das Resultat selbst nochmals filtern.

line_query = AllplanIFW.QueryTypeID(AllplanElementAdapter.Line3D_TypeUUID)
polyline_query = AllplanIFW.QueryTypeID(AllplanElementAdapter.Polyline3D_TypeUUID)

selection_query = AllplanIFW.SelectionQuery([line_query, polyline_query])
self.selection = AllplanIFW.PostElementSelection()

self.selectionSettings = AllplanIFW.ElementSelectFilterSetting(selection_query, False)
AllplanIFW.InputFunctionStarter.StartElementSelect("Test", self.selectionSettings , self.selection, False)

result = self.selection.GetSelectedElements(coord_input.GetInputViewDocument())

Ich bin jetzt dabei eine Variante zu programmieren die mit STRG funktioniert. Diese ruft einfach StartElementSelect immer wieder auf so lange STRG gedrückt wird und die Resultate zusammenfügt, was auch schon gut funktioniert.
Mein einziges Problem ist noch das ich visuell noch nicht in der Lage bin die Selektierten Elemente darzustellen.

Ich habe dazu mit
AllplanIFW.HighlightService.HighlightElements(result)
gearbeitet, wenn aber in der StartElementSelect mit der Maus über eine Linie Gefahren wird, sind alle meine Resultate nicht mehr hervorgehoben.

Ich hoffe diese Antwort ist hilfreich.
Gruss
Yannic

Hallo Yannic

vielen Dank für deine Antwort.
Ich glaube ich mache etwas grundsätzlich falsch.

Ich rufe in "create_interactor" die selbst erstellte Klasse "Auswahl_Polygon" auf.
Innerhalb der Initialisierung rufe ich dann deinen Code auf. Dies funktionier aber nicht.

Gruss und Dank
Hansruedi

Ich habe gesehen das ich in der Zeile
AllplanIFW.InputFunctionStarter.StartElementSelect("Test", self.selectionSettings , self.selection, False)
den Letzten Parameter auf False gesetzt habe, da ich die selection selbst markieren will.
Wenn du willst, dass die Funktion selbst die Teile Markiert, musst du dort True verwenden.

Es ist aber für mich schwirig dir zu helfen, da ich nicht genau weiss was bei dir das Problem ist.
Gibt Allplan eine irgendeine Fehlermeldung aus?

Naja, ein funktionierendes Beispiel als ganzes Pythonpart würde sicher helfen. ;)

Ich habe das Problem, dass ich nicht verstehe wann das PP "create_element" ignoriert und stattdessen "create_interactor" aufruft.
In meinem aktuellen Code wir zwar "create_interactor" aufgerufen. Aber ich weiss nicht wieso dies in anderen Test-Pythonparts nicht funktioniert. Beide PP sind im PYP als Interactor definiert.

Welche Methoden benötigt die Interactor-Klasse? Welcher Teil des Codes für die Auswahl kommt in die Initialisieren der Klasse?
Welcher in die Methode "process_mouse_msg"? Wird "process_mouse_msg" überhaupt benötigt?

Mit deinem Code kann zwar eine Auswahl in Allplan gemacht werden. "result" bekommt aber keine Elemente zugeordnet.

Allplan gibt leider auch keine Fehlermeldung aus.

Gruss und Dank
Hansruedi

Ich arbeite auch noch nicht anzulangen mit den PythonParts also ist es durchaus möglich, dass ich nicht überall ganz genau Bescheid weiss, ich werde aber trotzdem versuchen dir möglichst gut zu erklären, was ich weiss:

Sobald im pyp File Interactor auf True gesetzt ist, sollte create_interactor aufgerufen werden. Mehr weiss ich dazu leider nicht.
Create Element wird, wenn ein Interactor verwendet wird, nur aufgerufen, um die Vorschau zu generieren.
Ich weiss nicht genau welche Methoden der Interactor zur Verfügung stellen muss und welche Optional sind, hier aber eine kleine Übersicht:

Bei der Initialisierung muss die Palette dargestellt werden, wie das z.B. im InteactorExamples/Polyline3DInteractor gemacht wird.

def check_allplan_version(build_ele, version):
Sollte selbsterklärend sein.

def on_control_event(self, event_id):
Wenn in der Palette auf einen Button gedrückt wird, wird diese Methode aufgerufen.
Z.B. in den Examples: InteactorExamples/Elements3DInteractor

def on_mouse_leave(self):
Wenn der Zeichenbereich verlassen wird, also z.B. der Mauszeiger auf der Palette ist.
Ich rufe hier nur on_preview_draw auf, da sonst das PythonPart nicht mehr sichtbar ist, was unter Umständen aber gewünscht sein kann.

def on_cancel_function(self):
Wird aufgerufen, wenn das PythonPart mit ESC oder über das Schliessen der Palette beendet wird. Wie im Beispiel InteactorExamples/Elements3DInteractor hier self.palette_service.close_palette() aufrufen
Hier wird auch häufig das Pythonpart endgültig gezeichnet (AllplanBaseElements.CreateElements), sofern du das nicht über einen Knopfdruck machen willst, oder etwas ähnliches.

def process_mouse_msg(self, mouse_msg, pnt, msg_info):
wird immer aufgerufen, wenn sich die Maus bewegt oder man einen Klick macht hier wird normalerweise on_preview_draw aufgerufen

def on_preview_draw(self):
Das Preview muss jedes Mal gezeichnet werden wenn die Methode process_mouse_msg aufgerufen wird, sonst wird das Part nicht mehr angezeigt.
Allerdings haben hier PythonParts die bereits gezeichnet wurden und neu verändert werden leicht unterschiedliche Verhaltensweisen.
Wenn ein bestehendes PythonPart verändert wird, also per Doppelklick im Zeichenbereich, kann AllplanBaseElements.CreateElements aufgerufen werden ohne dass es mehrere PythonParts gezeichnet werden.
Wird das PythonPart aus der Bibliothek geöffnet wird bei jedem Aufruf von AllplanBaseElements.CreateElements ein PythonPart hergestellt.

def modify_element_property(self, page, name, value):
hier einfach wie in den Beispielen self.palette_service.modify_element_property(page, name, value) aufrufen.

Ich weiss leider nicht wieso mein Code bei dir nicht funktioniert, ich weiss nur, dass er für mich funktioniert. Da ich zuerst eine Methode selbst geschrieben habe die mit SelectElementsService. SelectByRect die Teile markiert hat habe ich die Funktion in process_mouse_msg. Ich rufe sie also immer wird auf bis ich die Funktion manuell mit InputFunctionStarter.RemoveFunction() schliesse und dann ein erneutes starten über ein Flag verhindere. Was über einen Button geschiet.

Freundliche Grüsse
Yannic

1 - 10 (12)