icon

Support Forum

[Frage] Pythonpart - PDFExport Layouts als Stapellauf ohne Exchange

Schlagworte:
  • Pythonpart
  • ExportPDF
  • LayoutService
  • AttributService

Hallo,
ich habe ein Pythonpart gebaut, bei dem ich für Pläne Dateinamen hinterlegen kann, diese werden in Benutzerattributen gespeichert, um diese in den Planlayouts (Planköpfen) zu nutzen.
Hintergrund: In der Niedersächsischen LBO ist seit dem 1.1.2025 die digitale Bauakte zwingend festgeschrieben. Es muss aber beim Einreichen der Pläne der Dateiname im Plankopf aufgeführt sein. Da diese Namen sich aber von unserer "normalen" Plan-Benamung unterscheiden, möcte ich hier nicht den Layout-Namen benutzen.

Das war erstmal einfach, gleichzeitig möchte ich die Pläne auch exportieren mit der ExportPDF-Funktion (Beispiel PythonPartsExamples/PythonPartsExampleScripts/InteractorExamples/ExportImportInteractor.py).
Hier wird am Ende auch ein PDF exportiert

Jetzt zu meinen Fragen:
1. Kann man die belegten Pläne auslesen und eine Combobox dynamisch mit den Plannamen befüllen, um dann den Plan entsprechend als Nutzer zu wählen, oder muss der Nutzer immer die Plannummer wissen und diese fix eingeben?

Mit fixer Eingabe habe ich bereits das Python Part soweit lauffähig, was mir dabei aufgefallen ist, dass beim Export die Layouts aufgerufen werden und nach dem letzten Export man als Nutzer im Bereich Planlayout auf dem letzten Exportierten Layout in Allplan "hängen" bleibt. Man muss dann als Nutzer selbst wieder in den TB-Modus aus dem Planlayout zurück wechseln.

2. Gibt es einen Befehl, den man nach dem Export aufrufen kann, damit der Nutzer wieder in sein Teilbild automatisch zurückkommt?

Anbei noch zwei Screenshots mit den statischen Eingaben bzw. lauffähigem PP.

Anhänge (2)

Typ: image/png
79-mal heruntergeladen
Größe: 15,30 KiB
Typ: image/png
47-mal heruntergeladen
Größe: 15,07 KiB

Hallo Niedersachse,

ich kann zwar keinen Beitrag zum PythonPart leisten, aber mal schreiben, wie ich das mit dem Dateinamen gem. NBauVorlVO und Exchange organisiere.

Zur Zeit belege ich in den Eigenschaften der Pläne das "Plan-Benutzeratribut 1" mit dem Dateinamen gem. NBauVorlVO. Dieses Atribut habe ich bereits in meinen Beschriftungsbilder bzw. Vorlagen für Planköpfe/-rahmen von Bauanträgen eingefügt.

Für Allplan Exchange habe ich verschiedene Favoriten vorbereitet (unter anderem einen Favoriten für die Ausgabe der Pläne zum Bauantrag, in dem das "Plan-Benutzeratribut 1" als Dateinname übernommen wird), die ich je nach gewünschter Ausgabe importiere.

Zur Zeit wandele ich die PDFs mit einem externen Programm in PDF/A um, da aus meiner Sicht die PDF/A-Ergebnisse aus Allplan insbesondere bei Transparenzen nicht so toll sind. Ansonsten würde ich mir dafür in Allplan Exchange auch verschiedene Format-Favoriten vorbereiten.

So, und wenn ich mal Zeit habe, dann bastele ich mir ein Beschriftungsbild, mit dem ich den NBauVorlVO-Name automatisch aus meinen anderern Atributen generiere, so dass ich diesen nicht erste in den Benutzeratributen eintragen muss. Analog dazu würde ich mir dann auch einen Exchange-Favoriten erstellen.

Viele Grüße aus BS...

Viele Grüße
Michael Busch

Hallo,

auch wenn meine Antwort etwas verspätet kommt, immernoch bleibt die Frage nicht unbeantwortet

Zitiert von: btrinkaus

1. Kann man die belegten Pläne auslesen und eine Combobox dynamisch mit den Plannamen befüllen, um dann den Plan entsprechend als Nutzer zu wählen, oder muss der Nutzer immer die Plannummer wissen und diese fix eingeben?

Möglich, aber nicht so direkt.

Erstmal, herausfinden welche PrintLayout "belegt" sind. Das ist der Fall, wenn im PRJ-Folder eine pbXXXXXX.npl datei vorhanden ist, wobei die XXXXXX die Planalyoutnummer ist. PRJ-Pfad für das aktuelle Projekt würde ich mit diesem Snippet herausfinden:

from pathlib import Path
from FileNameService import FileNameService
...
cur_project_path = Path(FileNameService.get_global_standard_path("prj\\"))

Jetzt kann man die "belegten" Pläne herausfinden. Wenn ein Plan "belegt" ist, werden wir gleich sein Namen mit GetLayoutName herausfinden (ACHTUNG: die Funktion gibt es erst seit ALLPLAN 2026! Davor ist das gar nicht möglich! Man muss dann lediglich mit Plannummern arbeiten)

import re     # wir werden mir regular expression arbeiten
...
layout_numbers_and_names: list[tuple[int, str]] = []
pattern = re.compile(r'pb(\d{6})\.npl') # mit diesem Muster finden wir nur die "pbXXXXXX.npl"-Dateien

for file in cur_project_path.iterdir():
    match = False
    if file.is_file():
        match = pattern.match(file.name)
    if match: # existiert die Datei, ist der Planlayout "belegt", dann können wir sein Namen abfragen
        layout_number = int(match.group(1))
        _, layout_name = AllplanBaseElements.LayoutFileService.GetLayoutFileName(layout_number)
        layout_numbers_and_names.append((layout_number, layout_name))

Jetzt haben wir die Liste mit Printlayouts und den Namen, mit denen wir den Combobox befüllen können (was ich hier nicht zeige, war glaube ich ein Thema in anderen Topic)

Zitiert von: btrinkaus
2. Gibt es einen Befehl, den man nach dem Export aufrufen kann, damit der Nutzer wieder in sein Teilbild automatisch zurückkommt?
Anbei noch zwei Screenshots mit den statischen Eingaben bzw. lauffähigem PP.

Ja. zuerst, den aktuellen Stand der geladenen TB merken. Den Stand mit GetFileState abfragen:

self.df_service = AllplanBaseElements.DrawingFileService()
self.load_state = self.df_service.GetFileState()

am Ende, wenn man durch ist, die TB wieder laden:

df_service.UnloadAll(self.document)

for file_index, load_state in self.load_state:
    self.df_service.LoadFile(self.document, file_index, AllplanBaseElements.DrawingFileLoadState(load_state))
    
AllplanBaseElements.DrawingService.RedrawAll(self.document) # am Ende den Viewport aktualisieren

Ich hoffe, das hilft

Viele Grüße,
Bart

Hallo,

danke für die Hilfestellung. Das klappt jetzt. Manchmal muss man dann doch Umwege gehen, um ans Ziel zu kommen. Und out-of-the-Box Denken

Gibt es eigentlich eine Möglichkeit, ähnlich wie beim Exchange, an die Planattribute zu kommen oder diese zu beschreiben. Bisher finde ich nur den ProjectAttributeService. Kann man das Ganze nicht für Layouts auch in die API aufnehmen? als LayoutAttributesService?

Grüße aus NRW,
B.Trinkaus

Hallo,

Auf die Planattribute kann man über Python API noch nicht zugreifen. Das wollen wir in ALLPLAN 2027 ändern.

Wie immer: bitte verstehen Sie diese Aussage nicht als Zusage und insbesondere treffen Sie aufgrunddessen keine geschäftliche Entscheidungen! In R&D PLäne können sich schnell ändern.

Viele Grüße,
Bart

Vor Version Allplan 2013 hatte ich mir ein Tool geschrieben, welches über die AllCom-Schnittstelle Namen usw. aus Plänen lesen konnte, um halbautomatisch die erzeugten PDF umzubenennen und zu verschieben.
Mit de Schnittstelle konnte auf die Plannamen und die Planattribute zugegriffen werden....
Seit Allplan 2014 hab ich das aber nicht mehr verwendet....

http://www.help4future.de

Die Planverwaltung von Alltool kann all dies schon seit Jahrzehnten.
Arbeitet übrigens auch mit der AllCom-Schnittstelle. Schade dass Allplan es bis heute nicht geschafft hat, gleichwertige Funktionalität in Exchange zu integrieren.

Das Tool von Alltool hatte ich mir schon mal im Internet angeschaut und immer gefragt, über welche Schnittstelle das realisiert wird.

Gibt es eine Dokumentation zu der Schnittstelle? In der Hilfe oder im Connect kann ich dazu nichts finden.

Ich muss einfach sagen, dass die Planverwaltung und die Planattribut-Verwaltung in Allplan einfach extrem langsam ist, vom Exchange ganz zu schweigen ..

Danke schonmal für die vorherigen Kommentare .

Grüße,
B.Trinkaus

Link zu "Allcom - Programmierschnittstelle für Allplan"

https://help.allplan.com/Allplan/2014-0/1031/Allcom/index.htm#2026.htm

Die Schnittstelle ist leider sehr langsam und wird seit langer Zeit nicht mehr weiterentwickelt.
Das ist sehr schade, denn ich nutze sie gerne, um Geometriedaten direkt aus Excel nach Allplan zu übertragen.

Gruss
Hansruedi

Hallo Bart,

ich möchte noch einmal auf das Speichern der TB und die Rückkehr aus dem Layout-Modus zurück kommen.

Quote by btrinkaus
2. Gibt es einen Befehl, den man nach dem Export aufrufen kann, damit der Nutzer wieder in sein Teilbild automatisch zurückkommt?
Anbei noch zwei Screenshots mit den statischen Eingaben bzw. lauffähigem PP.

Ja. zuerst, den aktuellen Stand der geladenen TB merken. Den Stand mit GetFileState abfragen:

self.df_service = AllplanBaseElements.DrawingFileService()
self.load_state = self.df_service.GetFileState()

am Ende, wenn man durch ist, die TB wieder laden:

df_service.UnloadAll(self.document)

for file_index, load_state in self.load_state:
self.df_service.LoadFile(self.document, file_index, AllplanBaseElements.DrawingFileLoadState(load_state))

AllplanBaseElements.DrawingService.RedrawAll(self.document) # am Ende den Viewport aktualisieren

Ich hoffe, das hilft

Viele Grüße,
Bart

Grundsätzlich funktioniert das. Allerdings habe ich jetzt festgestellt, das er bei der Rückkehr nur aktive/teilaktive TB anzeigt mit dem aktualisierten Viewport.

Wenn ich wie im Screenshot dargestellt, die TB 100 und 112 auf sichtbar, aber nicht aktiv gestezt habe, wird mir am Ende bei der Rückkehr nur das TB 102 angezeigt. Die beiden anderen werden erst wieder sichtbar, wenn ich über Projektbezogen öffnen, eines der TB auf teilaktiv setze und mit Okay aus dem Befehl herausgehe. Damit wird das Projektbezogen geöffnet ja neu ausgeführt...

Gibt es da evtl. noch etwas weiteres, was man hier beachten muss?

Das ist jetzt nicht wild, trübt aber das Anwender-Erlebnis..

Grüße aus NRW,
B.Trinkaus

Anhänge (1)

Typ: image/png
14-mal heruntergeladen
Größe: 8,23 KiB