EPLAN

Script Debugging

Da schreibt man ein Buch… denkt man kennt sich einigermaßen aus mit dem Thema…
Und fast eineinhalb Jahre später, kann man Scripte debuggen und ich weiß von nichts… keiner schreibt was in dieses Internet. Dann mach ich das mal.

Seit EPLAN 2.4 ist es möglich Scripte zu debuggen. Es gibt kleine Einschränkungen aber man kann sich endlich die unendlichen MessageBoxen und Scripte Neulad-Szenarien sparen.

Es gibt, wie so oft, eine versteckte Einstellung welche gesetzt werden muss, damit das Debuggen funktioniert.
Ich habe es mal in das kostenlose Script ExtendedSettings gepackt.

Der Einstellungspfad ist folgender:
USER.EplanEplApiScriptLog.DebugScripts

 

In Visual Studio dann einfach:

  • Debug > Attach to Process…
  • EPLAN.exe auswählen
  • Attach

In EPLAN:

  • Script laden/ausführen

 

EPLAN kopiert beim Laden/Ausführen eines Scriptes das Script in den Temp-Ordner.
Der Dateiname ist wie folgt aufgebaut:
Debug_[Scriptname]

Leider können dadurch keine Haltepunkte in EPLAN gesetzt werden. Dies muss per Code geschehen:

System.Diagnostics.Debugger.Break();

Aber: Ist einmal ein Breakpoint gesetzt worden, kann auch wie gewohnt in Visual Studio ein Haltepunkt gesetzt werden.

Wichtig: Wenn die EPLAN-Einstellung bzgl. Script Debugging nicht gesetzt ist, müssen diese Haltepunkte entfernt werden.

Als Workaround habe ich folgendes herausgefunden:
Mit der Compiler-Abfrage auf #if DEBUG kann dieses Problem umgangen werden.

#if DEBUG
	System.Diagnostics.Debugger.Break(); 
#endif

 

Hier noch ein kleines Demo Video:

 

Ich bin ziemlich traurig darüber dass ich das jetzt erst erfahren habe. Ich sollte mal die Emails zählen welche ich die letzten 1,5 Jahre beantwortet habe mit der Frage “ist debugging bei Scripten nicht möglich?”.
Vielleicht denkt jeder der diesen Weg schon kannte einfach dass ich das schon wüsste…
Naja, ich bin einfach nur froh um diese Funktion!

Anbei noch mein Beispiel:

using System;
using System.Linq;
using System.Windows.Forms;
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;
using System.Windows.Forms;
using Eplan.EplApi.Scripting;

namespace ibKastl.Scripts.Test
{
    public class Test
    {
        [Start]
        public void Action()
        {
#if DEBUG
			System.Diagnostics.Debugger.Break();
#endif
			MessageBox.Show("Start walking...");

#if DEBUG
	        System.Diagnostics.Debug.WriteLine("Walk 500 miles...");
#endif
	        for (int i = 1; i <= 500; i++)
	        {
#if DEBUG
				System.Diagnostics.Debug.WriteLine("Mile {0}: still walking...", i); 
#endif
			}

	        MessageBox.Show("End");
        }
    }
}
Von |2017-11-09T11:22:18+01:002015-12-04|EPLAN, EPLAN-Scripts|

XEsSetProjectPropertyAction PropertyIdentName

EPLAN hat ja die Handhabung mit benutzerdefinierten Eigenschaften geändert.
Diese können nun über Optionen > Eigenschaften konfigurieren… geändert werden.

Leider hat EPLAN nicht gesagt wie man diese Eigenschaften dann auch Schreiben kann.
In der Action XEsSetProjectPropertyAction ist nur dokumentiert wie man die ID-bezogenen Eigenschaften setzt.

Es gibt, wie so oft, einen nicht dokumentierten Parameter namens PropertyIdentName mit dem man die Eigenschaften ansprechen kann.

Beispiel:

  • Projekt
  • Seite
  • Funktion
  • Artikelreferenz
XEsSetProjectPropertyAction /PropertyIdentName:"EPLAN.Project.UserSupplementaryField1" /PropertyIndex:0 /PropertyValue:"My project property"

XEsSetPagePropertyAction /PropertyIdentName:"EPLAN.Page.UserSupplementaryField1" /PropertyIndex:0 /PropertyValue:"My page property"

XEsSetPropertyAction /PropertyIdentName:"EPLAN.Function.UserSupplementaryField1" /PropertyIndex:0 /PropertyValue:"My function property"

XEsSetPropertyAction /PropertyIdentName:"EPLAN.ArticleRef.EPLAN.PartRef.UserSupplementaryField1" /PropertyIndex:1 /PropertyValue:"My articlereference property"
Von |2017-11-09T11:22:18+01:002015-12-02|EPLAN, EPLAN-Scripts|

ToggleLayers

Ich habe im letzten Jahr, seit Veröffentlichung von EPLAN 2.4, viele Anfragen bzgl. der EPLAN API Erweiterung ToggleLayers erhalten.

Mit diesem API Addin das von allen EPLAN Anwendern, auch ohne API genutzt werden kann, ist es möglich Ebenen per Scripting zu steuern.

Leider habe ich keine Freigabe für den Download bekommen. Aber die Anmerkung dass User welche diese Funktion brauchen beim Support danach fragen sollen.

Somit ist geklärt: Auch mit EPLAN 64bit (2.4/2.5) ist es möglich die Ebenen umzuschalten.

Hier die Doku der Action:

Actionname
ToggleLayers

Parameter
LAYERSTATE

Werte

  • Name der Ebene zum Beispiel EPLAN491
  • Textgröße zum Beispiel 1,0
  • Sichtbar Wert y für sichtbar / n für unsichtbar
  • Drucken Wert y für Druckausgabe / n für keine Druckausgabe
  • Farbe gemäß der Farbnummern in EPLAN z.B. 102

Beispiel:

ToggleLayers /LAYERSTATE:"EPLAN491|1,0|y|y|102"
Von |2017-11-09T11:22:18+01:002015-11-24|EPLAN, EPLAN-Scripts|

Abkündigung EPLAN 5 / EPLAN 21

Irgendwie ist das total an mir vorbeigegangen und hab es zufällig im EPLAN Solution Center gelesen…

Falls es auch so geht, hier die offizielle Meldung:

2015-11-23_09-35-20

Was das für Konsequenzen für EPLAN Electric P8 hat, weiß ich leider auch nicht. Ob die Funktion EPLAN 5 / 21 Import irgendwann wegfällt oder Ähnliches.

Von |2015-11-23T09:39:46+01:002015-11-23|EPLAN|

Suplanus Eplan Api… Sepla

Da ich demnächst mehr mit der EPLAN API arbeiten darf, hab ich die Entscheidung getroffen einen Teil davon Open Source zu stellen.

Es handelt sich um eine Standard Library um gewisse Abläufe zu vereinfachen.
Der Name ist nicht gerade kreativ gewählt, aber das Kind braucht ja einen Namen :)
Würde mich freuen wenn ihr auch daran mitarbeitet! Man findet alles auf GitHub

Als erstes möchte ich gleich die Implementierung einer Offline-Application vorstellen.
Es ist nicht ganz einfach ein Programm mit EPLAN Anbindung zu schreiben. Der Aufruf mit Sepla erfolgt wie folgt:

string binPath = Starter.GetBinPath();
IntPtr handle = new WindowInteropHelper(this).Handle;
EplanOffline eplanOffline = new EplanOffline();
eplanOffline.Start(handle, binPath);
if (!eplanOffline.IsRunning)
{
    throw new NotImplementedException();
}

Geschlossen wird das ganze dann über:

eplanOffline.Close();

 

Im Hintergrund arbeiten zwei Klassen, damit eine Trennung gewährleistet ist. Denn der Resolver muss erst die Assemblies laden.

Starter.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Eplan.EplApi.Starter;

namespace Suplanus.Sepla.Application
{
    /// <summary>
    /// EPLAN Starter Helper: No other EPLAN-Namespaces are allowd
    /// </summary>
    public class Starter
    {
        public static string GetBinPath()
        {
            List<EplanData> eplanVersions = new List<EplanData>();

            List<EplanData> eplanVersions32bit = new List<EplanData>();
            new EplanFinder().GetInstalledEplanVersions(ref eplanVersions32bit);
            eplanVersions.AddRange(eplanVersions32bit);

            List<EplanData> eplanVersions64bit = new List<EplanData>();
            new EplanFinder().GetInstalledEplanVersions(ref eplanVersions64bit, true);
            eplanVersions.AddRange(eplanVersions64bit);

            eplanVersions = new List<EplanData>(eplanVersions
                .Where(obj => obj.EplanVariant.Equals("Electric P8"))
                .OrderBy(obj => obj.EplanVersion));

            EplanData eplanData = eplanVersions.LastOrDefault();

            var binPath = Path.GetDirectoryName(eplanData.EplanPath);

            AssemblyResolver resolver = new AssemblyResolver();
            resolver.SetEplanBinPath(binPath);
            resolver.PinToEplan();

            return binPath;
        }
    }
}

 

EplanOffline.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using Eplan.EplApi.Starter;
using Eplan.EplApi.System;

namespace Suplanus.Sepla.Application
{
    public class EplanOffline
    {
        public EplApplication Application;

        public bool IsRunning
        {
            get { return Application != null; }
        }

        public void Start(IntPtr handle, string binPath)
        {
            if (Application == null)
            {
                try
                {
                    EplApplication eplApplication = new EplApplication();
                    eplApplication.EplanBinFolder = binPath;
                    eplApplication.ResetQuietMode();
                    eplApplication.SetMainFrame(handle);
                    eplApplication.Init("", true, true);
                    Application = eplApplication;
                }
                catch
                {
                    Application = null;
                } 
            }
        }

        public void Close()
        {
            if (Application != null)
            {
                Application.Exit();
                Application = null;
            }
        }
    }
}

Suplanus.Sepla auf GitHub

Von |2017-11-09T11:24:05+01:002015-11-19|EPLAN, EPLAN-API|
Nach oben