Support Forum

Eigener Layer des Pythonpart [Gelöst]

Schlagworte:
  • Pythonpart
  • Layer

Hallo zusammen

Ich möchte in einem Pythonpart eine Füllung erstellen (lassen), deren Farbe abhängig ist vom Layer.
Beim erstellen erhält man mit GetGlobalProperties() den gerade eingestellten Layer, ebenso Farbe etc. So weit so gut.
Nach dem absetzen kann man den Layer des Pythonparts ändern.

Kann man den Layer des abgesetzten Pythonparts mittels Code irgendwo auslesen?

Lösung anzeigen Lösung verbergen

Zitiert von: Nemo
Nein, ich fürchte auch das tangiert nicht das Ziel der Fragestellung.
Die Aufgabe ist: Während der Ausführung eines schon abgesetzten PythonParts (Doppelklick links) soll dessen Layer abgefragt werden, um dann eine entspr. eingefärbte Füllfläche zu erzeugen.

Ah, na dann muss man zwischen CreationMode und ModificationMode unterscheiden:
  • im ersten Fall nehmen wir das gerade eingestellte LayerID
  • im zweiten Fall das LayerID von der PythonPart, die wir modifizieren

Im Standard PythonPart kann man das mit dem DocumentManager erreichen, und zwar so:

  • erst mal den importieren
    from DocumentManager import DocumentManager

  • in create_element() das gerade über doppelclick modifizierte PythonPart holen
    python_part = DocumentManager.get_instance().pythonpart_element

  • ist der pythonpart ein null-element, dann handelt es sich um Creation Mode - dann nehmen wir das gerade eingestellte LayerID
        if python_part.IsNull():
            pyp_layer_id = AllplanSettings.AllplanGlobalSettings.GetCurrentCommonProperties().Layer
    

  • Ansonsten, lesen wir das LayerID aus dem PythonPart:
        else:
            pyp_layer_id = python_part.GetCommonProperties().Layer
    

Mehr infos zum Creation/Modification mode gibt es hier

VG,
Bart

Hi,

Zitiert von: User425
...deren Farbe abhängig ist vom Layer.
Wie ist das zu verstehen? Dass der Haken bei "Farbe vom Layer" gesetzt werden soll? Dafür ist die Property ColorByLayer des Objektes CommonProperties verantwortlich. Setzt man sie auf True, wird die Farbe vom Layerdefinition übernommen.

Zitiert von: User425
Kann man den Layer des abgesetzten Pythonparts mittels Code irgendwo auslesen?
Also Programmatisch alle abgesetzten PythonParts selektieren und deren Layer auslesen? Das kann man ohne probleme machen.
  • Alle elemente selektieren
    elements = AllplanBaseElements.ElementsSelectService.SelectAllElements(doc)

  • Nur PythonParts filtern
    python_parts = filter(AllplanBaseElements.PythonPartService.IsPythonPartElement, elements)

  • Für jeden gefundenen PythonPart das Layer ID lesen und die Layer-Name drucken
    for pythonpart in python_parts:
        layer_id = pythonpart.GetCommonProperties().Layer
        print(f"{pythonpart}:\t{AllplanBaseElements.LayerService.GetNameByID(layer_id,doc.GetDocumentID())}")
    

Ich bin mir aber nicht sicher, ob es das ist, was Sie gemeint haben.

VG,
Bart

Ich vermute mal, es war gemeint, den Layer des aktuellen PythonParts (also des Macroplacements, welches gerade ausgeführt wird) im Python-Code zu ermitteln.

User 425 hat offensichtlich vor, eine Art "Layer-Signalisierung" einzubauen.
Wozu ist mir aber auch nicht ganz klar, da die erzeugten Elemente des PythonParts ja wieder auf anderen Layern liegen können/sollen.

Erschwerend kommt hinzu, daß man den Layer des (PythonPart-)MacroPlacements in Allplan nur ändern kann, wenn die Eigenschaft "Format = Verlegung" am PythonPart-MacroPlacement aktiviert.

Aber es könnte gehen, indem man alle PythonParts selektiert (s. oben), und dann herausfindet, welches PythonPart das gerade ausgeführte ist. Von dem könnte man dann die CommonProperties lesen, um den Layer zu erfahren. Das könnte allerdings bei großen Teilbildern auch größere Performance-Probleme bereiten, wenn man das z.B. beim Ziehen an einem Griff bei jedem MouseMove machen möchte!

Trotzdem bekommt das PythonPart-Macroplacement ja nicht mit, wenn man dessen Layer (mit Allplan-Mitteln) ändert. Erst ein "Aktualisieren" des PythonParts würde die "Signalisierung" anstoßen...

Wenn das tatsächlich gemein war, dann... Um mit Python API das PythonPart (am ende ist es ein MacroElement und MacroPlacement) zu erzeugen, würde ich vorschlagen, den PythonPartUtil zu verwenden.
So wären die Schritte:

  • die gerade eingestellten Formateigenschaften ermitteln
    common_props = AllplanSettings.AllplanGlobalSettings.GetCurrentCommonProperties()

  • Farbe aus dem Layer übernehmen
    common_props.ColorByLayer = True

  • PythonPart utility mit diesen Formateigenschaften erstellen:
    from PythonPartUtil import PythonPartUtil
    pyp_util = PythonPartUtil(common_props)

  • Elemente hinzufügen
    pyp_util.add_pythonpart_view_2d3d(...)

  • Model elemente (MacroElement und MacroPLacementElement) erzeugen
    model_ele_list = pyp_util.create(build_ele)

Natürlich "from .. import ..." am Anfang des Skriptes ausführen, nicht mitten drin.
VG,
Bart

Nein, ich fürchte auch das tangiert nicht das Ziel der Fragestellung.

Die Aufgabe ist: Während der Ausführung eines schon abgesetzten PythonParts (Doppelklick links) soll dessen Layer abgefragt werden, um dann eine entspr. eingefärbte Füllfläche zu erzeugen.

Zitiert von: Nemo
Nein, ich fürchte auch das tangiert nicht das Ziel der Fragestellung.
Die Aufgabe ist: Während der Ausführung eines schon abgesetzten PythonParts (Doppelklick links) soll dessen Layer abgefragt werden, um dann eine entspr. eingefärbte Füllfläche zu erzeugen.

Ah, na dann muss man zwischen CreationMode und ModificationMode unterscheiden:
  • im ersten Fall nehmen wir das gerade eingestellte LayerID
  • im zweiten Fall das LayerID von der PythonPart, die wir modifizieren

Im Standard PythonPart kann man das mit dem DocumentManager erreichen, und zwar so:

  • erst mal den importieren
    from DocumentManager import DocumentManager

  • in create_element() das gerade über doppelclick modifizierte PythonPart holen
    python_part = DocumentManager.get_instance().pythonpart_element

  • ist der pythonpart ein null-element, dann handelt es sich um Creation Mode - dann nehmen wir das gerade eingestellte LayerID
        if python_part.IsNull():
            pyp_layer_id = AllplanSettings.AllplanGlobalSettings.GetCurrentCommonProperties().Layer
    

  • Ansonsten, lesen wir das LayerID aus dem PythonPart:
        else:
            pyp_layer_id = python_part.GetCommonProperties().Layer
    

Mehr infos zum Creation/Modification mode gibt es hier

VG,
Bart

Hallo zusammen

Zitiert von: Nemo
Die Aufgabe ist: Während der Ausführung eines schon abgesetzten PythonParts (Doppelklick links) soll dessen Layer abgefragt werden, um dann eine entspr. eingefärbte Füllfläche zu erzeugen.

Genau das ist gesucht. Das mit Creation-Mode und Modification-Mode werde ich mal ausprobieren.
Gibt die Funktion

python_part = DocumentManager.get_instance().pythonpart_element

nur das Part zurück, welches modifiziert wird oder muss ich das noch filtern?

Zitiert von: User425
...
Gibt die Funktion
python_part = DocumentManager.get_instance().pythonpart_element

nur das Part zurück, welches modifiziert wird oder muss ich das noch filtern?


Die gibt genau ein Element zurück, und das ist das modifizierte PythonPart als BaseElementAdapter. Hier erklären wir das Konzept von ElementAdapter etwas genauer.

Grüße,
Bart