Archiv für den Monat: Januar 2016

EPLAN RemoteClient

Ich hatte ja schon erklärt wie man EPLAN per COM-Schnittstelle ansprechen kann.

Nachteil: Bei 32/64bit gewinnt der Server der als erstes gestartet wurde.
Aber es gibt einen Weg mit dem man sogar die Version auswählen kann (wenn z.B. mehrere EPLAN Versionen installiert bzw. geöffnet sind).

Diese Schnittstelle ist nicht offiziell dokumentiert!

 

Ihr müsst eine Referenz auf die DLL Eplan.EplApi.RemoteClientu.dll machen, welche sich im Installationsverzeichnis von EPLAN befindet, z.B.:

C:\Program Files\EPLAN\Platform\2.5.4\Bin\

 

Hier ein Beispiel wie man die aktuellen EPLAN Versionen erhält und bei der aktuellsten das Projekt schließt:

EplanRemoteClient eplanRemoteClient = new EplanRemoteClient();
List eplanServerDatas = new List();
eplanRemoteClient.GetActiveEplanServersOnLocalMachine(out eplanServerDatas);
if (eplanServerDatas.Count > 0)
{
	var eplanServerDataLast = eplanServerDatas.OrderBy(obj=>obj.EplanVersion).LastOrDefault();
	if (eplanServerDataLast != null)
	{
		eplanRemoteClient.Connect("localhost", eplanServerDataLast.ServerPort.ToString(),new TimeSpan(0,0,0,5));
		eplanRemoteClient.ExecuteAction("XPrjActionProjectClose");
		eplanRemoteClient.Disconnect();
	}
}

Localhost für den lokalen Rechner verwenden, den Timespan brauchte ich, da EPLAN zu langsam reagierte.

Von |2017-11-09T11:22:15+01:002016-01-29|EPLAN, EPLAN-Scripts|

EPLAN-API: Offline Applikation starten

Mit der Offline Applikation hat man man vielen Problemen zu kämpfen, angefangen beim Start…

Ich hab auf GitHub mal Methoden bereitgestellt um das zu vereinfach.

 

Verwendung WPF

var eplanOffline = new EplanOffline();
eplanOffline.StartWpf(this);
if (!eplanOffline.IsRunning)
{
	throw new NotImplementedException();
}
eplanOffline.Close();

Verwendung Windows Forms

var eplanOffline = new EplanOffline();
eplanOffline.StartWindowsForms(this);
if (!eplanOffline.IsRunning)
{
	throw new NotImplementedException();
}
eplanOffline.Close();

 

Ich habe bewusst darauf verzichtet dass alles im Konstruktor zu machen, da sonst WindowsForms in WPF und anders herum hinzugefügt werden muss.

Hier mal der Code dazu (Starter ist zum registrieren der Lizenz/DLLs):

using System.Collections.Generic;
using System.IO;
using System.Linq;
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 GetBinPathLastVersion()
        {
            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;
        }
    }
}

 

using System;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using Eplan.EplApi.System;
using Suplanus.Sepla.Gui;

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

	    public Preview Preview;

		/// <summary>
		/// Starts EPLAN with the last version of Electric P8 and attach to (WPF) window
		/// </summary>
		/// <param name="window"></param>
		public void StartWpf(Window window)
	    {
			IntPtr handle = new WindowInteropHelper(window).Handle;
			string binPath = Starter.GetBinPathLastVersion();
			Start(handle,binPath);
		}

		/// <summary>
		/// Starts EPLAN with the last version of Electric P8 and attach to (WF) form
		/// </summary>
		/// <param name="form"></param>
		public void StartWindowsForms(Form form)
		{
			IntPtr handle = form.Handle;
			string binPath = Starter.GetBinPathLastVersion();
			Start(handle, binPath);
		}

		/// <summary>
		/// Starts EPLAN with the given version of program variant and attach to (WPF) window
		/// </summary>
		/// <param name="window"></param>
		/// <param name="binPath"></param>
		public void StartWpf(Window window, string binPath)
		{
			IntPtr handle = new WindowInteropHelper(window).Handle;
			Start(handle, binPath);
		}

		/// <summary>
		/// Returns if the EPLAN-Application is running
		/// </summary>
		public bool IsRunning
        {
            get { return Application != null; }
        }

	    

	    /// <summary>
		/// Starts the application
		/// </summary>
		/// <param name="handle"></param>
		/// <param name="binPath"></param>
        private 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;
                } 
            }
        }

		/// <summary>
		/// Release all objects
		/// </summary>
        public void Close()
        {
            if (Application != null)
            {
                Application.Exit();
                Application = null;
            }
        }
    }
}

In diesem Code wird immer die aktuellste Version von EPLAN Electric P8 verwendet. Ich bau irgendwann noch Methoden zur Auswahl von der Lizenz / Version.

Von |2017-11-09T11:23:59+01:002016-01-28|EPLAN, EPLAN-API|

Doorbell – Update: Slacker

Alle guten Dinge sind drei…
Ich war nie zufrieden mit den Pushservices Pushover und Pushbullet.

Pushbullet würde die Bilder schön darstellen, aber pushed ab und zu unzuverlässig.

Da wir bei ibKastl derzeit für die interne Kommunikation Slack testen, kam mir die Idee meine Türklingel auch dort mal an die API anzubinden.

Das schöne an Slack ist, dass es für alle Mobile-/Desktop-Betriebssysteme Apps gibt!

Die API ist auch schön einfach… Einfach ein Team + Channel erstellen und den API-Key eintragen… mit drei Zeilen im Code ist es getan.

from slacker import Slacker

# Slack
slack = Slacker('myApiKey')
slack.files.upload('/home/pi/Desktop/doorbell/web/photos/' +  filename, title=now, channels='#doorbell')

Was der Code macht: Import von Slacker (Python-Lib) und dann einfach den Upload des Fotos mit dem Titel der aktuellen Zeit in den Channel #doorbell.

Auf dem Screenshot sieht man auch dass ich noch im alten Pythoncode die falsche Uhrzeit abgefragt habe… Das könnt ihr wie folgt korrigieren:

now=strftime("%Y-%m-%d %H:%M:%S", gmtime())

 

Doorbell_Slacker

Schön sieht man auch wie die IR-Kamera des Raspberry Pi im dunklen fotografiert, sogar mit Gegenlicht :^)

Von |2016-01-27T10:14:54+01:002016-01-27|Doorbell, Projekte|

GetProjectVariableLanguage

Ich hatte mal schon geschrieben wie man die Projekt-Sprachen rausfindet

Hier noch ein Script wie man die variable Sprache herausfindet.
Einfach das Script laden und in einem anderen Script das Usage ausführen.

 

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

class GetProjectVariableLanguage
{
	/* Usage
	private static string GetProjectVariableLanguage()
	{
		string value = null;
		ActionCallingContext actionCallingContext = new ActionCallingContext();
		new CommandLineInterpreter().Execute("GetProjectVariableLanguage", actionCallingContext);
		actionCallingContext.GetParameter("value", ref value);
		return value;
	}
	*/

	private readonly string TempPath = Path.Combine(
		PathMap.SubstitutePath("$(TMP)"), "GetProjectLanguages.xml");

	[DeclareAction("GetProjectVariableLanguage")]
	public void Action(out string value)
	{
		ActionCallingContext actionCallingContext = new ActionCallingContext();
		actionCallingContext.AddParameter("prj", FullProjectPath());
		actionCallingContext.AddParameter("node", "TRANSLATEGUI");
		actionCallingContext.AddParameter("XMLFile", TempPath);
		new CommandLineInterpreter().Execute("XSettingsExport", actionCallingContext);

		if (File.Exists(TempPath))
		{
			string languagesString = GetValueSettingsXml(TempPath,
				"/Settings/CAT/MOD/Setting[@name='VAR_LANGUAGE']/Val");

			if (languagesString != null)
			{
				value = languagesString;
				return;
			}
		}

		value = null;
		return;
	}

	// Returns the EPLAN Project Path
	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;
	}

	// Read EPLAN XML-ProjectInfo and returns the value
	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)
		{
			// Get Text from MultiLanguage or not :)
			string value = rankListSchemaName[0].InnerText;
			return value;
		}
		else
		{
			return null;
		}
	}
}
Von |2017-11-09T11:22:16+01:002016-01-11|EPLAN, EPLAN-Scripts|
Nach oben