Seiteneigenschaften manipulieren

Problemstellung

Unter gewissen Bedingungen soll das Normblatt der Seiten angepasst werden (zB. für Aufgaben jeweils ein etwas anderes, oder bei automatisierten Importen). Klar kann man das auch manuell erledigen: Alle betreffenden Seiten markieren, Normblattname anpassen und fertig. Aber das ist absolut nicht smart.

Lösungansatz

Was muss nun eigentlich passieren? Da auf die Parameter von Seiten (und auch von Bauteilen u.ä.) nicht via Array oder ähnlichem Konstrukt zugegriffen werden kann, müssen die erst selektiert werden. Das geht wie von Johann Weiher umgesetzt über edit:

// übernommen von https://suplanus.de/selectionset-pages/ Zeile 58 ff
private void SelectPage(string page) {
  ActionCallingContext actionCallingContext = new ActionCallingContext();
  actionCallingContext.AddParameter("PAGENAME", page);
  new CommandLineInterpreter().Execute("edit", actionCallingContext);
}

Alternativ könnte der Nutzer auch einzelne Seiten markieren und dann die Funktion ausführen. Das macht beispielsweise Sinn, wenn es um diverse Einstellungen geht. Nun aber noch eben das neue Normblatt definieren. Dafür gibt es die XEsSetPagePropertyAction, die noch die Eigenschaft und den Wert braucht. Es macht hier Sinn es sich an zu gewöhnen ein Try-Catch-Block um den Aufruf zu setzen, damit der Nutzer nicht nachher kryptische Fehlermeldungen bekommt und das ganze mit unter direkt abbricht.

Weiterlesen

Aktionen auf Projektordner anwenden

Problemstellung

Es gibt da noch Altbestände diverser Projekte, oder es soll einfach der aktuelle Stand jedes Projektes als PDF ausgeschrieben werden. Manuell geht das bei wenigen Projekten, bei einigen hundert Projekten aber nicht mehr.

Problemlösung

Das lässt sich zum einen über das Projektmanagement lösen, aus meiner geht das allerdings etwas schöner und unabhängiger direkt über ein Script. Für den Einstieg lässt sich gut der FolderBrowserDialog nutzen, über den der Stammordner ausgewählt wird. Danach geht’s weiter mit GetFiles und ein Loop über alle Funde (ggf. auch Rekursiv über alle Unterverzeichnisse).

public void doOverProjectFolder() {
  FolderBrowsingDialog srcFolder = new FolderBrowsingDialog();
  srcFolder.Description  = "Projektordner der bearbeitet werden soll"; // Beschreibung
  srcFolder.SelectedPath = PathMap.SubstitutePath("$(MD_PROJECTS)");   // Default path
  DialogResult srcFolderRes = srcFolder.ShowDialog();
  if (srcFolderRes == DialogResult.Cancel) {
    // Meldung beim Abbruch für den Nutzer
    return;
  }
  string[] files = Directory.GetFiles(srcFolder.SelectedPath, "*.el*", SearchOption.AllDirectories);
  foreach(string file in files) {
    // do something
  }
}

Projektvorlagen und Basisprojekte

Der kleine Unterschied (war einmal)

Projektvorlagen waren in EPlan bis Eplan P8 Version 2.9 nur eine Hülle eines Projektes, welches keine Stammdaten eingelagert, sondern nur referenziert hatte. Übrigens ähnlich zu den Projekten damals in Eplan5 und der Grund bei Problemen der Migration alter Projekte.

Basisprojekte hingegen haben alles direkt an Bord, was man eben braucht (oder eben auch nicht mehr braucht, aber nicht bereinigt wurde).

Projektvorlagen ade – noch schnell umsteigen

Packen wir erstmal das Scheidende an. In 2022 und neuer wird das leider nicht mehr nutzbar sein. Aber es lässt sich mit der Action XPrjConvertBaseProjectsAction und dem Parameter /Folder:<Folder> einfach in ein Basisprojekt konvertieren. Entweder wie in der Beschreibung im Link, oder als kleines Script (ehrlich gesagt: Im Consulting hätte ich mir die Schweizer Taschenmesser-Ribbon-Bar gebastelt, die das direkt mit drin hätte… Als Admin reicht es auch manuell in die Menüleiste gezogen, ausgeführt und wieder gelöscht.

XPrjConvertBaseProjectsAction /Folder:$(MD_TEMPLATES) // Übernommen aus der Anleitung von EPlan

Basisprojekte und wie ich sie automatisiert ausschreibe

Weiterlesen

PDFs Exportieren

Die einfache Variante

Wenn beim Schließen des Projektes einfach nur das PDF ausgeschrieben werden soll? Kein Problem, denn das hat Johann Weiher schon als schönes Beispiel dargestellt. Nun soll das PDF nicht einfach nur den Projektordner abgelegt werden, sondern in einen bestimmten Ordner in der zentralen Datenverwaltung auf einem Netzlaufwerk. Basis ist das verlinkte Script mit ein paar kleinen Anpassungen. Die Zentrale Funktion ist die EXPORT-Funktion.

Weiterlesen

Projektnummern mit RegularExpressions finden

Problemstellung

Folgendes Szenario dürften so einige Sachbearbeiter kennen: Es gibt ein Sammelbecken mit Dateien, die unter anderem eine Projektnummer oder Auftragsnummer beinhalten. Ziel für diese Dateien sind die entsprechenden Projektordner in einer zentralen Struktur. Auch die Projektordner beinhalten die Projektnummer oder Auftragsnummer. So eine Struktur dürfte in vielen Unternehmen, ob Old School auf einem Serverlaufwerk oder etwas aktueller in der Cloud.

Lösungsansatz

Doch wie findet man nun 1. die Nummer in dem Dateinamen und 2. den korrekten Zielordner(besonders wenn der nicht direkt im Stammverzeichnis liegt)? Das Stichwort ist hier RegularExpressions oder eben Reguläre Ausdrücke. Damit lassen sich aber nicht nur Nummernfolgen finden sondern komplexe Ausdrücke, Passwörter auf Konformität prüfen (min x Stellen, Groß/Kleinbuchstaben, Sonderzeichen, etc.), oder auch ganze Formelparser bauen. Soweit soll es hier aber nicht gehen.

Ok, wir nehmen mal an, dass unsere Auftragsnummer, nach der wir suchen möchten, beispielsweise folgendes Format hat: P<Jahreszahl>-<fortlaufende Nummer, 5 Stellen>. Um mal ohne viel Aufwand RegExs zu testen, eignet sich regex101.com super und soll hier auch zum Einsatz kommen. Als Testobjekte sollen dafür mal P2023-45627, P2015-33456, P1999-11223 und P1976-00132 dienen. Damit das nun nicht zu leicht wird, könnte vor/hinter der Projektnummer nichts, Unterlagen, Rev.B, Zeichnung-12345 stehen.

Um nun den Suchbegriff abzubilden, braucht es eigentlich nur folgendes:

([pP][0-9]{4}-[0-9]{5})
(        : Öffnet die Matchgruppe
[pP]     : Ein p oder P
[0-9]{4} : 4 Zeichen, alles von 0-9 erlaubt
-        : Trennzeichen (ggf. auch [-_] möglich, wenn Fehleingaben berücksichtigt werden sollen
[0-9]{5} : 5 Zeichen, alles von 0-9 erlaubt
)        : Schließt die Matchgruppe
Weiterlesen

How to start with EPLAN Scripting

Gehen wir mal davon aus: C# ist bekannt und auch Programmabläufe müssen wir hier nicht mehr reden. Für den ersten Start, sollte man die entsprechende Hilfe-Seite von EPlan kennen. Auch die Seiten von Johann Weiher ist immer unheimlich hilfreich und sein Buch kann ich sehr empfehlen (besonders für den Einstieg). Übrigens: Die API-Hilfe von EPlan ist an einigen Stellen umfangreicher und genauer.

Zum einfachen Testen einer Funktion ist die Vorlage hier gut geeignet (direkt mit ActionCallingContext, kann weg gelassen werden, wenn es keine Parameter gibt):

// Angelehnt an https://eep8a.de/v3/scripts/02_Actions_ausfuehren/#03-action-mit-parameter
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

public class test_nuttshell {
  [Start]
  public void myfuction() {
    CommandLineInterpreter cli = new CommandLineInterpreter();
    ActionCallingContext   acc = new ActionCallingContext();

    acc.AddParameter("<Parametername #1>", "<Parameterwert #1>");
    acc.AddParameter("<Parametername #2>", "<Parameterwert #2>");
    //...
    acc.AddParameter("<Parametername #n>", "<Parameterwert #n>");
    
    cli.Execute("XGedStartInteractionAction", acc);
  }
}

Das ganze einfach in einer Textdatei mit der Endung „*.cs“ speicher und testen. Es reicht nun das Script zu starten, dann wird die Funktion nach dem Triggerwort für das Event Start ausgeführt. Das ist allerdings eher für seltener gebrauchte Tools sinnvoll. Später macht es Sinn dann die Funktionen über Menüs oder Events wie OnMainStart zu triggern:

// Angelehnt an https://eep8a.de/v3/scripts/02_Actions_ausfuehren/#03-action-mit-parameter
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

public class test_nuttshell {
  [DeclareAction(ACTION_NAME)]
  public void myfuction() {
    CommandLineInterpreter cli = new CommandLineInterpreter();
    ActionCallingContext   acc = new ActionCallingContext();

    acc.AddParameter("<Parametername #1>", "<Parameterwert #1>");
    acc.AddParameter("<Parametername #2>", "<Parameterwert #2>");
    //...
    acc.AddParameter("<Parametername #n>", "<Parameterwert #n>");
    
    cli.Execute("XGedStartInteractionAction", acc);
  }
}

Alternativ können Scripte und Funktionen auch über die Befehlszeile mit den entsprechenden Parametern ausgeführt werden. Im-/Exporte aus anderen Tools lassen sich so einfach realisieren, wenn das entsprechende Eplan installiert ist:

"<Pfad zur w3u.exe>" /NoSplash /Quiet /Auto /Variant:electric /NoLoadWorkspace ....