Blog

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|

Rückblick 2015

Es stimmt wohl was die Leute immer sagen: “Mit dem Alter vergeht die Zeit schneller

Jedes Jahr verzieht spürbar schneller und ich bin schon der Typ Mensch, der sich am Ende des Jahres fragt, was denn alles passiert ist.

Privat ist das heuer ziemlich einfach: Habe im Sommer geheiratet, was einem natürlich am besten in Erinnerung bleibt.

Beruflich ist es eigentlich eine Kombination aus unterschiedlichen Eindrücken & Erlebnissen.
Was mich das ganze Jahr über bewegt hat, war der Release unseres ShopForProcess.com, der mich sehr positiv überrascht hat.

Mir war klar dass die Tools viele EPLAN Anwender benötigen, aber die Schwierigkeit ist die Anwender zu erreichen dass es solche Lösungen gibt. Die Rückmeldungen der Kunden waren sehr positiv. Darüber sind wir sehr glücklich, denn Qualität und die Leistung liegt uns sehr am Herzen.
In diesem Zusammenhang war es auch das 2. Jahr bei Firma ibKastl und ich bin sehr glücklich und dankbar über den tollen Arbeitsplatz.

Auch die neuen Kontakte und Kunden die man über das Jahr kennengelernt hat, haben mir sehr viel Freude bereitet. Viele Eindrücke erhalten und vielen EPLAN Anwendern helfen können. Diese Kombination macht einen als Consultant glücklich.

Freue mich sehr auf nächstes Jahr, beruflich wie privat. Aber das ist eh nicht so klar zu unterscheiden bzw. will ich nicht unterscheiden. Irgendwie ist es eigentlich ein Hobby für das man Geld bekommt, denn es macht so viel Spaß dass man sich gerne auch am Wochenende / Abend damit beschäftigt. Meiner Meinung nach ist das auch die beste Kombination aus persönlicher Sicht bzw. der Sicht der Kunden. Denn ich hoffe man bemerkt das Herzblut dass in unserer Arbeit, Leistungen und Produkten steckt.

Bin dankbar über jeden Menschen der mich dieses Jahr unterstützt, gefördert & geholfen hat, allem voran Michael Kastl, der Chef  und Freund meines Vertrauens.

Auch danke an die EPLAN Community, die immer wieder neue Ideen und Lösungen entwickelt.

In diesem Sinne einfach Danke!

Von |2015-12-19T21:47:15+01:002015-12-19|Allgemein|

XPrjActionProjectCreateBaseProject

Mit dieser inoffiziellen Action ist es möglich per Script aus einem Projekt ein Basisprojekt zu erstellen:

XPrjActionProjectCreateBaseProject

Parameter:

  • PROJECTfull name of the project
  • TARGETfull name of the target file
Von |2017-11-09T11:22:18+01:002015-12-15|EPLAN, EPLAN-Scripts|
Nach oben