eplan

ConnectionPointDesignationReverse

Frank Schöneck hat wieder ein super Script geschrieben um Anschlussbezeichnungen zu drehen.
Das Script ist im Kontextmenü ausführbar. Vielen Dank!

P8_20151001_01 P8_20151001_02

Download auf GitHub

// ConnectionPointDesignationReverse.cs
//
// Erweitert das Kontextmenü von 'Anschlussbezeichnungen',
// im Dialog 'Eigenschaften (Schaltzeichen): Allgemeines Betriebsmittel',
// um den Menüpunkt 'Reihenfolge drehen'.
// Es wird die Eingabe im Feld 'Anschlussbezeichnungen' automatisch gedreht.
//
// Copyright by Frank Schöneck, 2015
// letzte Änderung:
// V1.0.0, 04.03.2015, Frank Schöneck, Projektbeginn
//
// für Eplan Electric P8, ab V2.3

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

public class ConnectionPointDesignationReverse
{

	[DeclareMenu]
	public void ProjectCopyContextMenu()
	{
		//Context-Menüeintrag
		string menuText = getMenuText();
		Eplan.EplApi.Gui.ContextMenu oContextMenu = new Eplan.EplApi.Gui.ContextMenu();
		Eplan.EplApi.Gui.ContextMenuLocation oContextMenuLocation = new Eplan.EplApi.Gui.ContextMenuLocation("XDTDataDialog", "4006");
		oContextMenu.AddMenuItem(oContextMenuLocation, menuText, "ConnectionPointDesignationReverse", true, false);
	}

	[DeclareAction("ConnectionPointDesignationReverse")]
	public void Action()
	{
		try
		{
			string sSourceText = string.Empty;
			string sReturnText = string.Empty;
			string EplanCRLF = "¶";

			//Zwischenablage leeren
			System.Windows.Forms.Clipboard.Clear();

			//Zwischenablage füllen
			CommandLineInterpreter oCLI = new CommandLineInterpreter();
			oCLI.Execute("GfDlgMgrActionIGfWind /function:SelectAll"); // Alles markieren
			oCLI.Execute("GfDlgMgrActionIGfWind /function:Copy"); // Kopieren

			if (System.Windows.Forms.Clipboard.ContainsText())
			{
				sSourceText = System.Windows.Forms.Clipboard.GetText();
				if (sSourceText != string.Empty)
				{
					string[] sAnschlussbezeichnungen = sSourceText.Split(new string[] { EplanCRLF }, StringSplitOptions.None);

					if (sAnschlussbezeichnungen.Length > 2) // Mehr als 2 Anschlussbezeichnungen
					{
						Decider eDecision = new Decider();
						EnumDecisionReturn eAnswer = eDecision.Decide(EnumDecisionType.eYesNoDecision,
							"Sollen die Anschlussbezeichnungen paarweise gedreht werden?",
							"Reihenfolge drehen",
							EnumDecisionReturn.eYES,
							EnumDecisionReturn.eYES,
							"ConnectionPointDesignationReverse",
							true,
							EnumDecisionIcon.eQUESTION);

						if (eAnswer == EnumDecisionReturn.eYES)
						{
							// String neu aufbauen
							for (int i = 0; i < sAnschlussbezeichnungen.Length; i = i + 2)
							{
								sReturnText += sAnschlussbezeichnungen[i + 1] + EplanCRLF + sAnschlussbezeichnungen[i] + EplanCRLF;
							}
						}
						else
						{
							// String Array drehen
							Array.Reverse(sAnschlussbezeichnungen);

							// String neu aufbauen
							foreach (string sAnschluss in sAnschlussbezeichnungen)
							{
								sReturnText += sAnschluss + EplanCRLF;
							}
						}
					}
					else // Nur 2 Anschlussbezeichnungen
					{
						// String Array drehen
						Array.Reverse(sAnschlussbezeichnungen);

						// String neu aufbauen
						foreach (string sAnschluss in sAnschlussbezeichnungen)
						{
							sReturnText += sAnschluss + EplanCRLF;
						}
					}

					// letztes Zeichen wieder entfernen
					sReturnText = sReturnText.Substring(0, sReturnText.Length - 1);

					//Zwischenablage einfügen
					System.Windows.Forms.Clipboard.SetText(sReturnText);
					oCLI.Execute("GfDlgMgrActionIGfWind /function:SelectAll"); // Alles markieren
					oCLI.Execute("GfDlgMgrActionIGfWindDelete"); // Löschen
					oCLI.Execute("GfDlgMgrActionIGfWind /function:Paste"); // Einfügen
				}
			}
		}
		catch (System.Exception ex)
		{
			MessageBox.Show(ex.Message, "Reihenfolge drehen, Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		return;
	}

	// Returns the menueitem text in the gui langueage if available.
	private string getMenuText()
	{
		MultiLangString muLangMenuText = new MultiLangString();
		muLangMenuText.SetAsString(
			"de_DE@Reihenfolge drehen;" +
			"en_US@rotate order;"
			);

		ISOCode guiLanguage = new Languages().GuiLanguage;
		return muLangMenuText.GetString((ISOCode.Language)guiLanguage.GetNumber());
	}

}

 

Von |2015-10-01T15:22:09+02:002015-10-01|EPLAN|

EplanCOMApplication 32/64bit

Ich habe ja schon beschrieben wie man die COM-Schnittstelle von EPLAN nutzen kann. Nun ist es aber wichtig zu wissen dass diese in 32bit und 64bit vorliegt.

2015-08-21_07-29-42

Die zuerst gestartete EPLAN Instanz startet auch den COM-Server in der jeweiligen Variante.

Somit ist zu beachten dass für 64bit EPLAN eure Applikation auch in 64bit kompiliert werden muss.
Ich habe mehrere EPLAN-Versionen im Einsatz somit habe ich auch verschiedene (eigene) Applikationen installiert.

 

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

EPLAN-API: Showcase 2015 Mai

Ich habe die letzten Wochen paar Kundenlösungen entwickelt. Sind alles Funktionen welche, meiner Meinung nach, in EPLAN nicht fehlen sollten…

Falls jemand auch so schöne Funktionen haben möchte, einfach melden :^)

 

CorrectLocationDescription

Mit CorrectLocationDescription können Strukturkennzeichenbeschreibungen, welche leer sind automatisch gesetzt werden. So können für unterschiedliche Maschinen die Beschreibungen vorgehalten werden.

 

ToggleVariant

Mit ToggleVariant können schnell Varianten eines Symbol durchgeschaltet werden.

 

UpdateDevice

Mit UpdateDevice werden alle Artikeldaten des ersten Artikels, an das Betriebsmittel geschrieben. Es erfolgt hier keine Abfrage mehr wie in der EPLAN Standard-Funktion.

 

ReplaceDevice

Mit ReplaceDevice können Artikelnummern automatisch ersetzt werden. Es werden alle Eigenschaften des Artikels an das Betriebsmittel geschrieben.

 

ChangeCableLength

Mit ChangeCableLength können die Längen von selektierten Kabeln mit einem Offsetwert angepasst werden. Somit können zum Beispiel alle Kabel verlängert werden, wenn die Schaltschrankposition geändert wird.

Von |2015-10-29T11:29:53+01:002015-05-28|EPLAN|

EPLAN-API: Signierung automatisieren

Ach, es ist schon anstrengend jedesmal die API-Addins zu signieren. Gerade wenn man in der Entwicklung ist.
Ich mag keine Arbeitsschritte die ich immer wieder gleich manuell machen muss, das dürfte ja bekannt sein :^)

Darum habe ich mich umgeschaut wie man denn das Signieren automatisieren kann.

Mit dem Befehlszeilentool MsBuild kann man Projekte bauen und mit Parametern auch gleich signieren:

msbuild myapplication.sln /p:SignAssembly=true /p:DelaySign=true /p:AssemblyOriginatorKeyFile=mykey.snk

Einfach die Pfade zu den Dateien (Projekt/Key-File) eintragen und fertig… Denkt man. Aber es klappt nicht, habe schon einige Zeit damit verbracht dieses Verhalten nachzuvollziehen.

Aber ich habe einen Workaround gefunden. Die Projektdatei (bei C# *.csproj) kann man so anpassen dass beim Release auch signiert wird:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  <PlatformTarget>x86</PlatformTarget>
  <OutputPath>bin\Release\</OutputPath>
  <SignAssembly>true</SignAssembly>
  <AssemblyOriginatorKeyFile>myKey.snk</AssemblyOriginatorKeyFile>
  <DelaySign>true</DelaySign>
</PropertyGroup>

Zu beachten: Bei Änderungen an den Eigenschaften im Projekt können sich diese Werte ändern.

Ich habe mir den Arbeitsablauf schon soweit automatisiert, dass bei jedem Release-Build die DLL gleich signiert wird. Alle Abhängigkeiten werden auch gleich zusammenkopiert. Für das Debuggen das gleiche, aber ohne Signing :^)

Jetzt muss ich nur noch den Upload zu EPLAN automatisieren, wenn da Jemand was für mich hat, wäre sehr dankbar!

Von |2015-05-12T14:03:21+02:002015-05-17|EPLAN|

EPLAN-API: Kabellänge in Einheit setzen

Aufgrund eines aktuellen Projektes bin ich in Berührung mit der Klasse UnitParser gekommen. Hat mir ziemlich Kopfschmerzen bereitet, aber mit Hilfe vom (super) EPLAN-Support konnte ich mein Vorhaben realisieren.

Zur Kabellänge sollte ein gewisser Wert (in Meter) addiert werden. Generell kein Problem.
Aber man kann in EPLAN die Einheit am Kabel selbst bestimmen. So kann die Projekteinstellung Meter sein, aber am Kabel kann ein Wert in Millimeter angegeben werden.

Dadurch ergibt sich folgender Workflow:

  • Konvertierung der Kabellänge zu Länge in Meter
  • Addieren des Offsets
  • Konvertierung der Kabellänge von Meter in die Quell-Einheit (z.B. Millimeter)

 

Schön ist auch dass der ParserParameter gleich ein Property für die Unterdrückung von Nullstellen mitbringt.

private void SetCableLenght(Cable cable, double offsetInMeter)
{
    // Get cable properties
    UnitParser unitParserOld = new UnitParser();
    ParserParameter parserParameterOld = new ParserParameter();
    parserParameterOld.Group = UnitGroup.Length;
    parserParameterOld.SuppressFloatingZeroes = true; // remove trailling zeros

    string oldLengthInSourceUnit = cable.Properties.FUNC_CABLELENGTH;
    unitParserOld.Set(oldLengthInSourceUnit, parserParameterOld);

    // get the right enum
    String unitString = unitParserOld.GetUnit();
    foreach (Unit unit in Enum.GetValues(typeof(Unit)))
    {
        if (unit.ToString() == "Length_" + unitString)
        {
            parserParameterOld.UnitID = unit;
            break;
        }
    }

    // calc in meter
    ParserParameter parserParameterNew = new ParserParameter();
    parserParameterNew.UnitID = Unit.Length_m;
    double oldLengthInMeter = unitParserOld.ValueToUnit(parserParameterNew);
    double newLengthInMeter = oldLengthInMeter + offsetInMeter;
    UnitParser unitParserNew = new UnitParser();
    unitParserNew.Set(newLengthInMeter, "m", parserParameterNew);

    // calc in source unit
    string newLengthInSourceUnit = unitParserNew.ToDisplay(parserParameterOld);
    cable.Properties.FUNC_CABLELENGTH = newLengthInSourceUnit;
}
Von |2015-05-06T08:44:11+02:002015-05-06|EPLAN|
Nach oben