EPLAN-API

>>EPLAN-API

Alles rund um die API in EPLAN

SVGExportAction

Es handelt sich um eine interne Action von EPLAN, welche offiziell nicht supported wird!

SVG ist ein tolles Format… Hab den Anwendungsfall dass ich SVG aus EPLAN brauche. Darum habe ich mir mal einen Helfer-Klasse geschrieben, damit der Zugriff einfacher ist:

public class SvgExportUtility
{
  public static void ExportProject(Project project, string exportPath, bool isFrameVisible = true)
  {
    if (Directory.Exists(exportPath))
    {
      Directory.Delete(exportPath);
    }

    ActionCallingContext acc = new ActionCallingContext();
    acc.AddParameter("DatabaseId", project.DatabaseIdentifier.ToString());
    acc.AddParameter("ExportPath", exportPath);
    acc.AddParameter("DrawFrame", isFrameVisible.ToString());
    acc.AddParameter("WriteGroupIds", false.ToString());
    new CommandLineInterpreter().Execute("SVGExportAction", acc);
  }

  public static void ExportPage(Page page, string fullFilename, bool isFrameVisible = true)
  {
    if (File.Exists(fullFilename))
    {
      File.Delete(fullFilename);
    }

    ActionCallingContext acc = new ActionCallingContext();
    acc.AddParameter("ExportPath", Path.GetDirectoryName(fullFilename));
    acc.AddParameter("PageObjId", page.ToStringIdentifier());
    acc.AddParameter("Filename", Path.GetFileNameWithoutExtension(fullFilename)); // only name needed
    acc.AddParameter("DrawFrame", isFrameVisible.ToString());
    acc.AddParameter("WriteGroupIds", false.ToString());
    new CommandLineInterpreter().Execute("SVGExportAction", acc);
  }

  public static void ExportPageMacro(Project project, string pageMacroFile, string fullFilename, bool isFrameVisible = true)
  {
    using (PageMacro pageMacro = new PageMacro())
    {
      // Have to insert pages into project because its not working with pageMacro.Pages.First()
      pageMacro.Open(pageMacroFile, project);

      // Set temp structure
      for (var index = 0; index < pageMacro.Pages.Length; index++)
      {
        var pageMacroPage = pageMacro.Pages[index];
        pageMacroPage.NameParts[Properties.Page.PAGE_COUNTER] = "SvgExportUtility" + index;
      }

      var storableObjects = new Insert().PageMacro(pageMacro, project, null, PageMacro.Enums.NumerationMode.None);
      var newPages = storableObjects.OfType().ToList();

      for (var index = 0; index < newPages.Count; index++)
      {
        var newPage = newPages[index];
        var path = Path.GetDirectoryName(fullFilename);
        var filename = Path.GetFileNameWithoutExtension(fullFilename) + "_" + (index + 1) + ".svg";

        // ReSharper disable once AssignNullToNotNullAttribute
        filename = Path.Combine(path, filename);

        if (File.Exists(fullFilename))
        {
          File.Delete(fullFilename);
        }

        ExportPage(newPage, filename, isFrameVisible);

        // Remove pages after export
        newPage.Remove();
      }
    }
  }

  public static void ExportMacro(string macroFile, string fullFilename, int variant, WindowMacro.Enums.RepresentationType representationType)
  {
    if (File.Exists(fullFilename))
    {
      File.Delete(fullFilename);
    }

    ActionCallingContext acc = new ActionCallingContext();
    acc.AddParameter("MacroFile", macroFile);
    acc.AddParameter("Filename1", fullFilename); // Full path needed
    acc.AddParameter("Variant1", variant.ToString());
    acc.AddParameter("RepType1", ((int)representationType).ToString());
    acc.AddParameter("WriteGroupIds", false.ToString());
    new CommandLineInterpreter().Execute("SVGExportAction", acc);
  }
}

Das exportieren von Symbol- & Fenstermakros funktioniert auch im Scripting!

Ich habe auch mal ein kleines Beispiel-Addin geschrieben um die Funktionalitäten zu testen.

By |2019-08-23T08:20:21+02:002019-08-23|EPLAN, EPLAN-API, EPLAN-Scripts|

API-Addins & Scripte auslesen

Im CAD.de-Forum gab es die Frage wie man auslesen kann welche API-Addins und Scripte geladen sind. Ich habe das mal ausprogrammiert:

using System.Windows.Forms;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;
using System.Collections.Generic;
using System.Collections.Specialized;

public class ReadApiAddinsAndScripts
{
  [Start]
  public void Action()
  {
    // API addins
    List<string> apiAddins = GetApiAddins();
    string apiAddinsText = string.Join("\n", apiAddins);
    MessageBox.Show(apiAddinsText, "ApiAddins", MessageBoxButtons.OK, MessageBoxIcon.Information);

    // scripts
    List<string> scripts = GetScripts();
    string scriptsText = string.Join("\n", scripts);
    MessageBox.Show(scriptsText, "Scripts", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }

  public List<string> GetApiAddins()
  {
    List<string> list = new List<string>();
    Settings settings = new Settings();
    SettingNode settingsNode = new SettingNode("STATION.EplanEplApiModule.Module");
    StringCollection nodes = new StringCollection();
    settingsNode.GetListOfNodes(ref nodes, false);
    foreach (string node in nodes)
    {
      SettingNode subNode = settingsNode.GetSubNode(node);
      string name = subNode.GetNodePath() + ".AssemblyName";
      var text = settings.GetStringSetting(name, 0);
      list.Add(text);
    }
    return list;
  }

  private List<string> GetScripts()
  {
    List<string> list = new List<string>();
    Settings settings = new Settings();
    string settingsPath = "STATION.EplanEplApiScriptGui.Scripts";
    var count = settings.GetCountOfValues(settingsPath);
    for (var index = 0; index < count; index++)
    {
      var text = settings.GetStringSetting(settingsPath, index);
      list.Add(text);
    }
    return list;
  }
}
By |2019-04-01T11:15:12+02:002019-04-01|EPLAN, EPLAN-API, EPLAN-Scripts|

API Showcase auf GitHub

Ich habe hier mal ein kleines Repo erstellt um verschiedene APIs zu zeigen.
Wie gewohnt mit fertigem Programmcode. Zusätzlich sind kleine Präsentationen enthalten um einen kleinen Überblick zu geben.

Derzeit sind enthalten:

  • EPLAN Scripting
  • EPLAN API
  • Siemens TIA Portal Openness

Also falls Jemand Interesse hat, einfach bei mir melden :^)

By |2019-03-26T13:38:17+02:002019-03-26|C#, EPLAN, EPLAN-API, TIA Portal|

Symbol per API erstellen

In einem aktuellen Kundenprojekt werden Bediensymbole (Piktogramme) per DXF-Dateien eingelesen und in einer eigenen Symbolbibliothek abgespeichert.
Generell empfehlen wir keine eigene Symbolbibliothek zu machen. Für diesen Anwendungsfall ist es aber völlig in Ordnung.

Leider ist es per API nicht ganz so einfach.

Als erstes erstellen wir mal eine neue SymbolLibrary. Achtet darauf dass der komplette Pfad übergeben werden muss:

var symbolLibrary = MDSymbolLibrary.Create(symbolLibraryPath);

Danach können wir neue Symbole hinzufügen. Sucht euch die gewünschte Funktionsdefinition und die Typen des Symbols aus der Oberfläche. Nur ein Teil ist in der Hilfe beschrieben:

MDSymbol symbol = symbolLibrary.AddSymbol(id, symbolName);
symbol.Type = MDSymbol.Enums.SymbolType.Function;
symbol.FunctionDefinitionCategory = Function.Enums.Category.Undefined;
symbol.FunctionDefinitionGroup = 98;
symbol.FunctionDefinitionId = 1;
symbol.PlacementType = DocumentTypeManager.DocumentType.Circuit;
symbol.Properties.SYMB_DESC = description;
symbol.Properties.SYMB_SYBMOLFUNCTIONTYPE = 1;

Nun gehts an die Varianten. Da wird es knifflig. Variante A (Index 0) wird automatisch beim Erstellen des Symbols mit erstellt. Weitere Varianten müssen wir dann separat hinzufügen. Achja, der VariantIndex wird als sbyte übergeben :)

sbyte variantIndex = Convert.ToSByte(variantCount); // A = 0
MDSymbolVariant variant;
if (variantCount == 0) // First variant is created at Symbol.Create()
{
  variant = symbol.Variants.First();
}
else
{
  variant = symbol.AddSymbolVariant(variantIndex);
}

Nun können wir der SymbolVariant Placements hinzufügen. Kleiner Handstand um die Group von der Variant zu bekommen. Danach können wir die Platzierungen hinzufügen. Jedes Placements muss einzeln hinzugefügt werden.

Group group = variant.AsGroup;
foreach (var placement in page.AllFirstLevelPlacements)
{
  placement.CopyTo(group);
}

Mir ist aufgefallen dass hier EPLAN bzw. die API sehr empfindlich reagiert was das Locking angeht. Darum am besten das Quellprojekt exklusiv öffnen.

By |2018-09-24T12:50:00+02:002018-09-24|EPLAN, EPLAN-API|

EPLAN Version ermitteln

Vielen Dank an nairolf für die Bereitstellung der schönen Methode um die EPLAN Version zu ermitteln. Funktioniert in API & Scripting. Man kann das dann z.B. so verwenden:

if (EplanApplicationInfo.GetActiveEplanVersion() >= 270)
{
  FlyToTheRainbowIn27();
}

Die Methode:

using System;
using System.Diagnostics;
using System.IO;
using Eplan.EplApi.Base;

namespace Suplanus.Sepla.Application
{
  public class EplanApplicationInfo
  {
    public static int GetActiveEplanVersion()
    {
      string eplanVersion = "0"; //default value = 0 to ensure, that EPLAN-version is correctly recognized 

      //try new variable $(EPLAN_VERSION) first, if not valid, no possibility to get active get active EPLAN-version
      if (PathMap.SubstitutePath("$(EPLAN_VERSION)") != "$(EPLAN_VERSION)")
      {
        eplanVersion = PathMap.SubstitutePath("$(EPLAN_VERSION)");
      }
      else
      {
        //try different method to get version of executing eplan, in case the actual version doesn't support $(EPLAN_VERSION)
        string dllFilename = Path.Combine(PathMap.SubstitutePath("$(BIN)"), "Eplan.EplApi.Baseu.dll");
        FileInfo fileInfo = new FileInfo(dllFilename);
        if (fileInfo.Exists)
        {
          var versionInfo = FileVersionInfo.GetVersionInfo(dllFilename);
          //return main-version-infos (without build number)
          if (versionInfo.ProductVersion.Length >= 5)
          {
            eplanVersion = versionInfo.ProductVersion.Substring(0, 5);
          }
        }
      }

      if (eplanVersion == "0" || eplanVersion == "$(EPLAN_VERSION)")
      {
        MultiLangString multiLangErrorText = new MultiLangString();
        multiLangErrorText.AddString(ISOCode.Language.L_de_DE, "Die aktuelle EPLAN-Version konnte nicht ermittelt werden.");
        multiLangErrorText.AddString(ISOCode.Language.L_en_US, "Unable to get actual EPLAN-version.");
        ISOCode.Language guiLanguage = new Languages().GuiLanguage.GetNumber();
        string errorText = multiLangErrorText.GetStringToDisplay(guiLanguage);
        if (String.IsNullOrEmpty(errorText))
        {
          //if actual GUI-language is not defined in multi-language-string, use en_US-text-version
          errorText = multiLangErrorText.GetStringToDisplay(ISOCode.Language.L_en_US);
        }
        new BaseException(errorText, MessageLevel.Warning).FixMessage(); 
        eplanVersion = "0";
      }
      return Convert.ToInt16(eplanVersion.Replace(".", string.Empty));
    }
  }
}

Findet Ihr auch hier auf GitHub.

By |2018-09-04T11:14:10+02:002018-09-04|EPLAN, EPLAN-API, EPLAN-Scripts|