Archiv für das Jahr: 2015

EPLAN Events

Anbei eine Auflistung von Events, auf welche man sich per API & Script aufschalten kann.

Beispiel

Beim Projekt-Schließen wird die Action ausgeführt.

using System.Windows.Forms;
using Eplan.EplApi.Scripting;

public class MyEventHandler
{
    [DeclareEventHandler("onActionStart.String.XPrjActionProjectClose")]
    public void Action()
    {
        MessageBox.Show("Ich kann Scripten!");

        return;
    }
}

 

Eplan.EplApi.OnMainEnd
Send when the Main End starts.

Eplan.EplApi.OnMainStart
Send when the Main Start is done. This is when a mainframe is available. The event is not send when the application is started in offline modus or to execute an action.

Eplan.EplApi.OnPostOpenProject
Project management: After opening a project

Eplan.EplApi.OnUserPreCloseProject
Project management: Before closing a project

Ged.Redraw
Force a Redraw for the GED

NCSettingsMachineTools.Redraw
Force a Redraw for the NC Machine Tools settings tab

onActionEnd.String.*
Send after the end of any Action.

onActionStart.String.*
Send before the start of any Action.

Page.ConnectionDirty
Event when a Page gets dirty

Project.CablingDirty
Event when cabling gets dirty

Von |2017-11-09T11:22:19+01:002015-11-19|EPLAN, EPLAN-Scripts|

Entity Framework MySql mit SSH-Tunnel in Mono

Der Titel sagt schon dass es nicht gerade das ist was man gerne programmiert…

Kurz zu meiner Anwendung:
Ich möchte gerne Werte von einem Raspberry Pi auf meinem Uberspace in einer MySql Datenbank speichern. Erst wollte ich das auf Azure tun, leider wird hier Mono noch nicht korrekt unterstützt.

Dann eben in MySql… aber Uberspace lässt Zugriff auf die Datenbank nur per SSH zu.

Gut, dann bauen wir uns mal einen SSH-Tunnel in Mono. Hier gibt es ein schönes NuGet-Packeg namens SSH.NET

Die Objekte wie folgt initialisieren:

private const string passwordSsh = "myPassword";
private const string username = "myUsername";
private const string server = "my.server.de";
static ForwardedPort port = new ForwardedPortLocal("localhost", 3306, "localhost", 3306);
private static SshClient sshClient = new SshClient(server, 22, username, passwordSsh);

Den Port benötigen wir um später die Daten durch Port 3306 zu tunneln.

 

Die Verbindung ist dann relativ einfach:

if (!sshClient.IsConnected)
{
    sshClient.Connect();

    // offline
    if (sshClient.IsConnected)
    {
        // Start port if not started
        if (!port.IsStarted)
        {
            // Add port if not added yet
            if (!sshClient.ForwardedPorts.Contains(port))
            {
                sshClient.AddForwardedPort(port);
            }
            port.Start();
        }
    }
}

Jetzt schnell noch das Entity Framework (Code First) einbinden und fertig … dachte ich.

Leider kommt mir das alle ziemlich buggy und nicht fertig vor. Drum weiß ich nicht ob ich das wirklich in einer Produktivumgebung einsetzten werde / würde.

Per NuGet gibt es MySql packages … aber welche brauche ich?
Bin selbst noch nicht durchgestiegen was für was ist, kann aber sagen, bei mir hat es nur mit folgenden geklappt:

  <package id="EntityFramework" version="6.1.3" targetFramework="net4" />
  <package id="MySql.Data" version="6.8.7" targetFramework="net4" />
  <package id="MySql.Data.Entities" version="6.8.3.0" targetFramework="net4" />

Nun gibt es aber noch einen Bug der unter einer Mono-Runtime die Version des Servers falsch parsed, somit braucht man folgenden fix (hab es bisl erweitert dass jeder Server/Version richtig gewandelt wird):

using System.Data;
using System.Data.Common;
using System.Data.Entity.Infrastructure;
using System.Text.RegularExpressions;

namespace OpenHop.Database
{
    public class ManifestTokenResolver : IManifestTokenResolver
    {
        public string ResolveManifestToken(DbConnection connection)
        {
            try
            {
                connection.Open();
                string version = OnlyNumbers(connection.ServerVersion);
                return version;

            }
            finally
            {
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
        }

        private static readonly Regex digitsOnly = new Regex(@"[^\d]");
        public static string OnlyNumbers(string text)
        {
            return digitsOnly.Replace(text, "");
        }
    }
}

 

In der app.config dann noch die Daten eintragen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient.EF6" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider></providers>
  </entityFramework>
  <connectionStrings>
    <add name="MyContext" providerName="MySql.Data.MySqlClient.EF6" connectionString="server=localhost;database=myDatabase;uid=myUsername;pwd=myPassword" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.8.7.0" newVersion="6.8.7.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient.EF6" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data, Version=6.8.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <remove invariant="MySql.Data.MySqlClient" /><add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /></DbProviderFactories>
  </system.data>
</configuration>
Von |2015-11-02T11:14:25+01:002015-11-02|C#, Mono, Raspberry Pi|

EPLAN-API: Showcase 2015 Oktober

Hatte leider nicht viel Zeit, um was in der EPLAN API zu machen. Aber eine Sache kann ich euch zeigen…

OpenHyperlink

2015-10-29_11-32-25

Listet alle Externen Dokumente der markierten Objekte. Dies gilt für Symbole, Makros oder sogar Seiten. Selbst das ganze Projekt kann gewählt werden.

Es werden alle Artikelnummern (einmal) aufgelistet mit den jeweiligen externen Dokumenten / Bilddateien.

Von |2015-10-29T12:48:03+01:002015-10-29|EPLAN|

PlaceHolderTranslateAction

Frank hat ein super Script geschrieben, mit dem es möglich ist Platzhalter zu Übersetzen.

Vielen Dank.

// PlaceHolderTranslateAction.cs
//
// Erweitert das Kontextmenü vom Platzhalterobjekt (Reiter Werte) um den Menüpunkt "Übersetzen"
// und um den Menüpunkt "Übersetzungen entfernen"
//
// Copyright by Frank Schöneck, 2015
// letzte Änderung:
// V1.0.0, 23.10.2015, Frank Schöneck, Projektbeginn
//
// für Eplan Electric P8, ab V2.5
//

using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;

namespace EplanScriptingProjectBySuplanus.PlaceHolderTranslateAction
{
    public class PlaceHolderTranslate
    {
        [DeclareMenu]
        public void PlaceHolderTranslateContextMenu()
        {
            //Context-Menüeintrag (hier im Platzhalterobjekt)
            Eplan.EplApi.Gui.ContextMenu oContextMenu = new Eplan.EplApi.Gui.ContextMenu();
            Eplan.EplApi.Gui.ContextMenuLocation oContextMenuLocation = new Eplan.EplApi.Gui.ContextMenuLocation("PlaceHolder", "1004");
            oContextMenu.AddMenuItem(oContextMenuLocation, "Übersetzen", "PlaceHolderTranslateAction", false, false);
            oContextMenu.AddMenuItem(oContextMenuLocation, "Übersetzungen entfernen", "PlaceHolderTranslateDeleteAction", false, false);
        }

        [DeclareAction("PlaceHolderTranslateAction")]
        public void PlaceHolderTranslate_Action()
        {
            //Übersetzen
            new CommandLineInterpreter().Execute("EnfTranslateEditAction");
        }

        [DeclareAction("PlaceHolderTranslateDeleteAction")]
        public void PlaceHolderTranslateDelete_Action()
        {
            //Übersetzungen entfernen
            new CommandLineInterpreter().Execute("EnfDeleteEditTranslationsAction");
        }

    }
}

Download auf GitHub

Von |2018-08-17T12:30:17+02:002015-10-23|EPLAN, EPLAN-Scripts|

Contextmenu-Actions

Aufgrund des Scriptes ConnectionPointDesignationReverse habe ich mal die Actions im Kontextmenü getestet. Anbei meine gefunden Actions mit Beschreibung.

Diese Aktionen können in Textfeldern verwendet werden. Übersetzung nur in Multilanguage-Eigenschaften verfügbar.

Kopieren
GfDlgMgrActionIGfWind /function:Copy

Ausschneiden
GfDlgMgrActionIGfWind /function:Cut

Einfügen
GfDlgMgrActionIGfWind /function:Paste

Alles markieren
GfDlgMgrActionIGfWind /function:SelectAll

Zeilenumbruch einfügen
GfDlgMgrActionIGfWind /function:InsertLineFeed

Sonderzeichen Einfügen
GfDlgMgrActionIGfWind /function:SpecialCharacterDlg

Text Löschen
GfDlgMgrActionIGfWindDelete

Mehrzeilige Eingabe
GfDlgMgrActionIGfWind /function:MultiLineDlg

Mehrsprachige Eingabe
GfDlgMgrActionIGfWind /function:MultiLanguageDlg

Übersetzen
EnfTranslateEditAction

Übersetzung Entfernen
EnfDeleteEditTranslationsAction

Nicht zu übersetzenden Text kennzeichnen
EnfSetNotTranslateAction

Kennzeichnung entfernen („Nicht übersetzen“)
EnfDeleteNotTranslateAction

Von |2017-11-09T11:22:19+01:002015-10-02|EPLAN, EPLAN-Scripts|
Nach oben