Schemata (erzwungen) laden

Problemstellung

Regelmäßig wird nach der Projektbearbeitung vergessen auch noch die Fertigungsdaten oder Stücklisten neu auszuschreiben, oder es wird als „nerviges Übel“ empfunden und nur ungern gemacht. Manchmal gibt es auch Updates des Exportschemata und das Add-On zur Verteilung von Einstellungen etc. ist noch nicht bekannt oder wird schlicht nicht genutzt.

Problemlösung

Der Import des Schemata wurde schon behandelt, nun geht es an den Export. Über Label lassen sich alle Art von Fertigungsunterlagen und Listen ausschreiben, sofern diese nur vorher mal als Schemata angelegt wurden:

Weiterlesen

Script dynamisch nachladen

Problemstellung

Vielleicht schon bekanntes Problem: Es lassen Klassen bei EPlan nicht auf verschiedene C#-Dateien aufteilen und EPlan lädt dann einfach munter beim ersten Benutzen der Klasse die passende Datei nach. So bin ich es zumindest schon früher in ANSI C, C#, Java und anderen Sprachen gewohnt. Meist muss man eine gewisse Konvention beim Dateinamen berücksichtigen, aber dann kann man sich munter austoben.

Problemlösung

Dafür kann man das hinten herum mit etwas Selbstmanagement auch hin bekommen, mit RegisterScript und Rückwärts auch mit UnregisterScript. Ich habe mir da noch eine Extramethode gegönnt um nur mit der Angabe des Scripts einfach dieses Still zu laden. Dann wird der Nutzer nicht mit der Meldung behelligt, die beim Laden eines Scriptes kommt. Kann es nicht geladen werden, passiert halt nichts, oder schon aufgebaute Menüs bleiben eben ausgegraut.

Weiterlesen

Projektsprachen per Script manipulieren

Problemstellung

Der Export von PDFs wurde schon hier: pdfs-exportieren erklärt, nun soll aber nicht nur die deutschsprachige PDF erzeugt werden, sondern auch die englische oder sonst eine andere? Das Wörterbuch ist korrekt vervollständigt? Und das sollte auch nicht manuell umgestellt werden müssen..

Problemlösung

Man muss dazu zwischen Display-Sprache und Variable-Sprache unterscheiden. Beim ersten sind alle einsprachigen Texte gemeint, beim zweiten ließen sich auch mehrere Sprachen nacheinander definieren. Genutzt wird in jedem Fall die Funktion SetProjectLanguage, die die drei Parameter aufweist.

Weiterlesen

Mal eben nen Backup vom Projekt in zwei klicks

Problemstellung

Während der Projektbearbeitung möchte man grundlegende, strukturelle Änderungen machen, aber das Projekt nicht ggf. riskieren. Oder es geht auf die Baustelle und das komplette Projekt soll mit, damit Änderungen direkt umgesetzt werden können. Beides Beispiele für die Action backup. Das eine als einfache Sicherung, das andere als Backup zur externen Bearbeitung.

Problemlösung

Nehmen wir erst einmal nur den ersten Fall an: Das Projekt soll zur Sicherheit des Standes eben gesichert werden. Man könnte nun das komplette Projekt über den Kopierdialog als vollwertiges Projekt wegspeichern. Oder über fast den gleichen Weg das Projekt sichern. Beides über ein bisschen Navigation durch die Menüs möglich und bei beiden ist die Versuchung groß es einfach zu unterlassen. Deswegen meine Devise: Mach so etwas so schlicht und einfach, dass es entweder im Hintergrund geschieht oder es mit Minimalaufwand umsetzbar ist.

Weiterlesen

Mehr als nur eine DynDNS-Adresse?

Problemstellung

Das Netzwerk soll von außen erreichbar sein, aber aus Gründen, nicht nur über eine Subdomain. Das könnte zB. dann der Fall sein, wenn man privat einige Seiten hosten möchte. Oder wenn nach einer Umstellung nicht gleich alle alten Installationen abgehangen werden dürfen.

Das eigentliche Problem ist dabei meist die beschränkte Einstellmöglichkeit des Routers. Zwar ließe sich theoretisch auch bei der Fritzbox mit einer Manipulation des Configfiles noch etwas mehr raus holen, doch ist das auch Updatesicher? Nicht nur das es ein Update überlebt, sondern sich dann auch noch editieren lässt… Zu viel Unsicherheit für einen Service, der ggf. dann ausfällt, wenn man ihn gerade dringend braucht, oder am wenigstens dran kommt ums zu fixen (meist eher zum Urlaubsbeginn als wenn man eh gerade dran arbeitet).

Problemlösung

Das ganze habe ich bei mir über ein Docker mit dem Image qmcgaw/ddns-updater gelöst:

  • Image auf die SD-Karte (Raspberry Pi Imager, etwas ohne Desktop)
  • Raspberry Pi damit hochfahren (reicht schon ab 2B)
  • Folgendes Script ablegen und ausführen:
Weiterlesen

Dateien mit Messdaten zu groß

Problemstellung

Je größer die Datei mit den Daten, desto länger braucht sie auch zum laden. Zerlegt man diese in mehrere, kleinere Fragmente, wächst mitunter die Datenmenge (die referenzierende Größe, meistens ein Timestamp, muss ja in jeder Datei vorhanden sein). Unterm Strich sind die einzelnen Dateien schneller geladen, da nicht immer die kompletten Messdaten geladen werden, sondern nur die, die gerade verarbeitet werden sollen. Doch wie zerlegt man „mal eben“ so eine Tabelle?

Problemlösung

In Excel? Wäre möglich, doch birgt das immer die Gefahr, dass man in Excel beim bearbeiten mit etwas Pech auch die Daten manipuliert (Thema Formatierung). Besser wäre da die Trennung der Daten so RAW wie möglich: Also direkt in txt-Form. Gehen wir mal davon aus, dass diese Daten im CSV-Format wie:

Time;Value1;Value2;Value3;Value4;Value5;...;ValueN
xxxx.xx.xx xx:xx:xx.xxx;0.000;0.000;0.000;0.000;0.000;...;0.000

vorliegen. Am Ende sollen mehrere Dateien entstehen, in denen immer die logischen Gruppen von Messwerten zusammen gefasst werden (zB. alle Spannungen, alle Ströme, alle Temperaturen, oder jeweils die Prüflinge mit allen Kenndaten).

Weiterlesen

Farbnamen aus dem RAL-Code ermitteln

Problemstellung

Wie war denn noch der Name für RAL3000? Oh, auch noch den englischen? Kurz in der Tabelle gesucht, oder auf Seiten wie ral-farben.de geschaut: Feuerrot / Flame red. Ok, aber das für jedes Projekt? Die gebräuchlichsten sind schnell im Kopf oder auf dem Spicker und der englische Farbname lässt sich ja in der Übersetzungsdatenbank ablegen. Aber das muss doch einfacher gehen, oder?

Problemlösung

Ok, die Frage ist hier schon etwas plakativ. Daher einfach kurz zur möglichen Ausgangslage: Im Projekt sind zB. die benutzerdefinierten Felder 90/91 für den RAL-Code und den Farbnamen der Schaltschränke, die Felder 92/93 entsprechend für die Klemmkästen. Erstmal angenommen, alle Felder sind Multilang, es kommt also ein ??_??@.. beim auslesen zurück. Daher kommt einfach die Lösung aus Multilang-Strings einfach auslesen zum Einsatz. Das Auslesen an sich ist recht einfach (Ähnlich zu Erstelldatum in Seiten manipulieren, nur über XEsGetProjectPropertyAction), wie auch das neu einschreiben (XEsSetProjectPropertyAction). Fehlt nur noch eine Liste, gegen die geprüft und aus der dann die Daten gezogen werden. Da bieten sich zwei Typen gut an:

Weiterlesen

Erstelldatum in Seiten manipulieren

Problemstellung

Erstmal: Warum sollte man das machen wollen? Nunja: Im Basisprojekt sind gewisse Seiten schon vorab erstellt worden. Wird das Basisprojekt kopiert, wird auch das Erstellungsdatum der Seiten (egal ob nun vollkommen leer als Vorlage, oder gefüllt als Legende etc.) mit kopiert. Damit ergibt sich zwangsweise ein älteres Datum in den Seiten als im Projekt selbst. Das sieht etwas uncool aus, oder bringt nur sehr viele Fragen mit sich (besonders in gewissen Kundenkreisen). Und dann ist das nicht einfach nur eine Zeichenfolge, sondern ein Zahlenwert..

Problemlösung

Das Schreiben von Seiteneigenschaften mit XEsSetPagePropertyAction hatte ich ja schon beschrieben, nun muss nur noch geklärt werden, was geschrieben werden soll. Der Zahlenwert sind die Sekunden, die seit dem 1.1.1970 vergangen sind, in Unix die Sekunde 0. Es lässt sich auch einfach selbst heraus finden: Nach dem Anpassen eines Formulars einfach mal in das passende Feld für den Timestamp der letzten Änderung schauen!

Weiterlesen

Funktionen im Wandel der Versionen

Problemstellung

Scripte sollen möglichst unabhängig von Versionen laufen (und dennoch gerne alles mitnehmen, was dem Nutzer hilft) um auch nach Upgrades auf die neuere Version nicht erstmal wieder Probleme zu verursachen. Immerhin geht es bei den meisten Funktionen in den Scripten (zumindest da, wo sie regelmäßig zum Einsatz kommen) um mehr als nur seltene Sonderaufgaben etwas komfortabler zu gestalten. Nicht selten hängt indirekt mit daran, ob ein Auftragspensum überhaupt machbar, oder ein gewisser Dokumentenumfang in gegebener Zeit erstellt, oder die immer gleichen Arbeitsabläufe sichergestellt werden können. Und nein, das ist tatsächlich keine Übertreibung. Ist von jetzt auf gleich erstmal die Funktion weg und es müssen damit wieder manuell Dateien abgelegt werden…

Lösungsansatz

Die folgende Tabelle habe ich mir mal als Hilfestellung zusammen geschoben, welche Funktion in welcher Version verfügbar ist/war. Auch wenn ich beruflich eher immer auf der neuesten Produktivversion arbeite (aktuell 2023), ist es dennoch nicht verkehrt auch die ausgelaufenen Funktionen im Blick zu halten. Zum einen kann man gelegentlich auch mal den Ballast abwerfen, zum anderen findet man auch neue Funktionen, die EPlan (teilweise noch in der Beta-Version) eingeführt hat.

Achtung! Die Tabelle enthält nur die allgemein dokumentierten Funktionen. Es gibt noch einiges mehr, was EPlan nicht dokumentiert hat. An der Stelle auch immer der Tipp mal bei suplanus zu schauen. Johann Weiher sitzt einfach näher an der Quelle und hat oftmals die eine oder andere Funktion (oft in meinen Beiträgen verlinkt, sofern genutzt).

Weiterlesen

Externes Bearbeiten (lassen) von Daten

Problemstellung

Nicht immer liegen alle Unterlagen/Daten/Kennzeichnungen/.. direkt vor, nicht selten möchte der Kunde eigene Kennzeichnungen in den Plänen sehen, oder es sind schlicht Daten aus anderen Abteilungen, die das Projekt ergänzen sollen. Eplan hat hierfür das wirklich schöne Funktion „Externe Bearbeitung„. Es lassen sich schöne Vorlagen zaubern und dem Kunden oder anderen Abteilungen zur weiteren Eintragung zur Verfügung stellen.

Nun möchte ich dies aber vielleicht als Austauschformat gebrauchen, was bei jedem (ersten) Start diese Daten einließt, wenn die Datei vorhanden ist. Ebenso sollte beim Schließen des Projekts der aktuelle Stand für andere (wieder) bereit gestellt werden (nach Erweiterungen oder Änderungen). Ansich auch kein Problem, denn es gibt XMActionDCCommonExport fürs ausschreiben und XMActionDCImport für den Import. Nur schaut man sich die Beschreibung zum Import an heißt es dort: DataConfigurationFile : path of data configuration file. Also geht’s doch nicht so einfach?

Weiterlesen

Multilang-Strings einfach auslesen

Problemstellung

Beim Auslesen einer Eigenschaft in EPlan kommt ein String wie ??_??@Inhalt des Feldes; oder bei übersetzten Feldern eher de_DE@Inhalt des Feldes;en_US@Content of the field; was aber gewünscht war, war nur Inhalt des Feldes. Ursache ist in beiden fällen ein als mehrsprachig markiertes Feld, welches einen Multilang-String aufnehmen, verarbeiten und darstellen kann. Vergleiche mit anderen Strings sind so natürlich schon zum scheitern verurteilt, wenn das nicht berücksichtigt wird.

Problemlösung

Nun gibt es zwei verschiedene Ansätze, die mir direkt in den Sinn kommen:

  • Nach ; splitten, den ersten Teil bei @ splitten und schon ist der zweite Teil das Ergebnis. Das ist allerdings auch immer der hoffentlich deutsche oder allgemeine Teil, gesichert ist das nicht. Nun könnte man noch nach dem ersten Splitt alle Elemente durchsuchen und nach de_DE@ oder ??_??@ (oder eben nach der gewünschten Zielsprache) im Anfang prüfen, aber auch das ist weder schön noch performant
  • Suchen mit regulären Ausdrücken direkt nach dem richtigen Ausdruck in der passenden Sprache mit Fallback-Lösung
Weiterlesen

Externe Daten in die EPlan Artikeldatenbank einschleusen

Problemstellung

Es existieren sicherlich in einigen Unternehmen und Betrieben Listen mit speziell gepflegten eigenschaften. Das macht auch durchaus Sinn, Beispielsweise um den Typenschlüssel bestimmter Hersteller per VBA in Excel zu dekodieren. Wie bei allen Automationen: Das kann der Rechner schneller, akkurater und mit Beachtung aller Sonderfälle. Doch dann liegen die Infos in einer Exceltabelle und manuelles CopyPaste ist alles andere als Smart. Wie also überführen?

Problemlösung

Nun gibt es verschiedene Ansätze, wie die Daten nun von der Quelle in das Ziel gelangen.

Weiterlesen

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