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