JohannWeiher

Über Johann Weiher

Der Autor hat bisher keine Details angegeben.
Bisher hat Johann Weiher, 531 Blog Beiträge geschrieben.

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.

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

Wippe selber bauen

Ich hab ja hier schon über viel geschrieben… aber dass ich mal zeige wie ich eine Wippe selber baue, hätte ich nicht gedacht.
Bei uns gibt es den Brauch, einen sogenannten Kindsbaum zur Hochzeit aufzustellen. Hier mal ein Auszug aus Wikipedia:

Vor allem in südbayerischen Raum ist es üblich, zur Hochzeit einen sogenannten Kindsbaum aufzustellen. Es handelt sich hierbei um einen 5 bis 10 m langen, weiß-blau bemalten Stamm, an dessen „Ästen“ diverse Baby-Sachen aufgehängt werden (Strampler, Schnuller, Flasche, etc.). In der Regel ist an der Spitze des Kindsbaums ein Storch montiert. Zudem befindet sich am unteren Ende des Baumes in Augenhöhe eine Tafel mit einem Gedicht, in dem das frisch vermählte Ehepaar an seine Pflicht erinnert wird, innerhalb eines Jahres Nachwuchs auf die Welt zu bringen. Gleich, ob sich Nachwuchs einstellt oder nicht, nach einem Jahr ist auf jeden Fall eine Brotzeit fällig, die nicht von den Kindsbaumaufstellern, sondern von dem Paar auszurichten ist.

Unserer war nicht ganz klassisch:

  • Anstatt 5-10m hoch, mit 18m riesig
  • Anstatt weiß blau, pink und grün, angemalt
  • Anstatt eines Storches einen Yoshi
  • LED-Solar-Lampen welche Sommer wie Winter schön geleuchtet haben

Der Kindsbaum wurde ein Jahr nach der Hochzeit umgelegt. Er hat auch gut funktioniert…
Viele wissen wohl dass ich Vater von Zwillingen geworden bin und da bietet sich eine Wippe als Spielgerät an :)
Hatte den Baum schon dafür eingelagert…

Hab mir dann bei Ebay das Gelenk und die Sitze mit Haltebügel gekauft. Sind im Internet zum Teil sehr teuer, darum vergleicht die Preise.
Das Gelenk habe ich seitlich gekürzt, da es sonst zu breit gewesen wäre. Wir mussten das Gelenk dann noch mit Eisen verstärken (seitlich angeschweißt und verschraubt). Habe dann noch Schaumstoff angebracht als Fingerschutz. Finde es auch albern dass das Gelenk für öffentlich Spielplätze gedacht ist und man sich so leicht einklemmen kann. Als Puffer, habe ich zwei alte Autoreifen eingegraben.

Meinen Mädels gefällt es sehr gut!

Von |2018-09-17T17:05:30+02:002018-09-17|Garten, Projekte|

Anzeigesprache per Script ermitteln

Wie so oft ist es in der API ganz einfach… Im Scripting muss man aber einmal einen Roundtrip machen…
Hier eine Action um die Anzeigesprache des Projektes per Script zu ermitteln.

Aufruf:

public void Function()
{
  var languages = GetDisplayLanguages();
  foreach (var language in languages)
  {
    MessageBox.Show(language);
  }
  return;
}

private static List<string> GetDisplayLanguages()
{
  string value = null;
  ActionCallingContext actionCallingContext = new ActionCallingContext();
  new CommandLineInterpreter().Execute("GetDisplayLanguages", actionCallingContext);
  actionCallingContext.GetParameter("value", ref value);
  var split = value.Split(';');
  var languages = split.Where(language => !string.IsNullOrEmpty(language)).ToList();
  return languages;
}

 

Script:

using System.IO;
using System.Xml;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;

namespace EplanScriptingProjectBySuplanus.GetDisplayLanguages
{
    public class GetDisplayLanguages
  {
        [DeclareAction("GetDisplayLanguages")]
        public void Action(out string value)
        {
            // Get language from settings
            string tempFile = Path.Combine(PathMap.SubstitutePath("$(TMP)"), "GetDisplayLanguages.xml");

            ActionCallingContext actionCallingContext = new ActionCallingContext();
            actionCallingContext.AddParameter("prj", FullProjectPath());
            actionCallingContext.AddParameter("node", "TRANSLATEGUI");
            actionCallingContext.AddParameter("XMLFile", tempFile);
            new CommandLineInterpreter().Execute("XSettingsExport", actionCallingContext);

            // Needed because there is no direct access to setting
            string language = GetValueSettingsXml(tempFile, "/Settings/CAT/MOD/Setting[@name='DISPLAYED_LANGUAGES']/Val");
            value = language;
        }

        private static string GetValueSettingsXml(string filename, string url)
        {
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(filename);
            XmlNodeList rankListSchemaName = xmlDocument.SelectNodes(url);
            if (rankListSchemaName != null && rankListSchemaName.Count > 0)
            {
                string value = rankListSchemaName[0].InnerText;
                return value;
            }
            return null;
        }

        private static string FullProjectPath()
        {
            ActionCallingContext acc = new ActionCallingContext();
            acc.AddParameter("TYPE", "PROJECT");

            string projectPath = string.Empty;
            new CommandLineInterpreter().Execute("selectionset", acc);
            acc.GetParameter("PROJECT", ref projectPath);

            return projectPath;
        }
    }
}

 

Ihr findet das wie gewohnt auf GitHub.

Von |2019-03-14T08:30:01+01:002018-09-07|EPLAN, EPLAN-Scripts|

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.ToInt32(eplanVersion.Replace(".", string.Empty));
    }
  }
}

Findet Ihr auch hier auf GitHub.

Von |2022-03-28T08:08:11+02:002018-09-04|EPLAN, EPLAN-API, EPLAN-Scripts|

iMac Lampe

Fand das Design des iMacs G3 immer sehr schön und sogar zeitlos. Durch Zufall hab ich einen alten günstig bekommen (Ebay-Preis derzeit ca. 50€).
Aber eigentlich war mir nicht klar was ich damit mache… So hab ich Ihn auf mein Sideboard im Büro gestellt.

Naja, aber da sind zwei Schränke, somit musste ein zweiter her.

Sah schon gut aus, aber irgendwie erinnerten Sie mich an eine Lampe… also machen wir eine Lampe draus.
Alle Bauteile ausgebaut, was nicht so einfach war. Fertige Plexiglasscheibe in Milch-Optik im Internet bestellt (günstiger als im Baumarkt).
Mit Sekundenkleber angeklebt. Innen drin eine E27 Fassung mit Sockel montiert. Kabel dran.

Als Lampe verwende ich eine Phillips Hue bzw. heißt jetzt Signify. Dadurch kann ich verschiedene Farben machen und sogar zur Musik animieren.
Somit können die Fische bisl Party machen.

Finde es sieht super aus (auch am Tag). Einfach und günstig selber zu bauen.

Von |2018-08-23T12:19:17+02:002018-08-24|Projekte|
Nach oben