Info: Es gibt eine neue Version von diesem Script.

Mit diesem kleinen Script ist es möglich eine beliebige Projekteigenschaft auszulesen. Es wird direkt auf die ProjectInfo.xml zugegriffen (ohne Umwege von Beschriftungen).

Anbei ein Beispielscript um die EPLAN-Version auszulesen.

Beispieltoolbar einfach importieren (Script davor laden).

 

GetProjectProperty (1047 Downloads)

Update 2015-02-10
Thomas Bald war so nett und hat ein Update geschrieben um die Eigenschaften in einer angegebenen Sprache zu erhalten.
Zusätzlich ist es möglich den Projektnamen bzw. Projektpfad zu erhalten.

ProjectInfo_V1.1

 

// Name                     : ProjectInfo.cs
// Version                  : V1.1
// Datum                    : 29.01.2015
// Autor                    : Thomas Bald
//                          :
// Thema                    : Liefert Informationen über das ausgewählte Eplan-Projekt
//                          :
// Letzte Änderung          : Multilanguage-Unterstützung in "ActGetProjectProperty"
//                          :
// ToDo                     : -
//                          :
// Benötigte Actions        : -
//                          :
// Bereitgestellte Actions  : ActGetProjectProperty
//                          :   Übergabeparameter ACC:  integer intPropertyID (die ID der gewünschten Projekteinstellung)
//                          :                           string strLanguage (Sprachkennung, wie z.B. "en_US" oder "all")
//                          :   Rückgabewert:           bool (true=OK / false=Fehler)
//                          :   Rückgabe ACC:           string strProjectProperty
//                          :
//                          : ActGetProject
//                          :   Übergabeparameter:      -
//                          :   Rückgabewert:           bool (true=OK / false=Fehler)
//                          :   Rückgabe ACC:           string strProject
//                          :
//                          : ActGetProjectName
//                          :   Übergabeparameter:      -
//                          :   Rückgabewert:           bool (true=OK / false=Fehler)
//                          :   Rückgabe ACC:           string strProjectName
//                          :


using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;
using System;
using System.IO;
using System.Xml;
using System.Windows.Forms;
using System.Text.RegularExpressions;


public class ProjectInfo
{
    // ------------------------- //
    // Aufrufbare Eplan-Actions: //
    // ------------------------- //
        
    [DeclareAction("ActGetProjectProperty")]
    // Ermitteln einer Projekteinstellung anhand seiner ID und Rückgabe über einen ActionCallingContext
    // Der Quellcode basiert teilweise auf dem Script "GetProjectProperty" von Johann Weiher.
    // Als Parameter "intPropertyID" muß die ID der gesuchten Projekteigenschaft übergeben werden.
    // Die gesuchte Sprache wird als weiterer Parameter "strLanguage" übergeben (z.B. en_US oder zh_CN...).
    // Soll der komplette MultiLanguageString zurückgegeben werden, muss "all" übergeben werden.
    // Rückgabewerte: true bei Erfolg, false bei Fehler
    // Rückgabe als ActionCallingContext: strProjectproperty (enthält die gesuchte Projekteigenschaft)
    // Bei auftretenden Fehlern werden Meldungs-Dialoge angezeigt.
    //
    // Beispielaufruf als Eplan-Action:     
    // ActionCallingContext objACC = new ActionCallingContext();
    // objACC.AddParameter("intPropertyID", "10011");  //<=hier den integer-Wert als string übergeben
    // objACC.AddParameter("strLanguage", "de_DE");
    // bool bolException = objACC.Execute("ActGetProjectProperty", objACC);
    // objACC.GetParameter("strProjectProperty", ref strReturnedProjectProperty);

    public bool ActGetProjectProperty(int intPropertyID, string strLanguage, out string strProjectProperty)
    {
        string strXmlFilename = PathMap.SubstitutePath("$(PROJECTPATH)" + @"\Projectinfo.xml"); // Pfad zur Infodatei des Eplan-Projektes
        string strReadProperty = String.Empty;  // Variable fürs Auslesen der Projekteigenschaft
        bool bolReadSuccessful = false;         // Variable Projekteigenschaft wurde gefunden

        // Prüfen ob Projekt ausgewählt wurde:
        if (PathMap.SubstitutePath("$(PROJECTPATH)") == "")
        {
            // Fehlermeldung
            MessageBox.Show("Fehler: Es wurde kein Eplan-Projekt ausgewählt.", 
                            "ActGetProjectProperty", MessageBoxButtons.OK, MessageBoxIcon.Error);
            
            strProjectProperty = String.Empty; //Leerstring zurückgeben
            return false; // Rückgabe Fehler
        }

        // Prüfen ob Übergabeparameter gültig (Werte zu klein oder zu groß):
        if (intPropertyID < 1 | intPropertyID > 99999)
        {
            // Fehlermeldung
            MessageBox.Show("Fehler: Übergabeparameter \"intPropertyID\" enthält ungültige Werte: " + intPropertyID,
                            "ActGetProjectProperty", MessageBoxButtons.OK, MessageBoxIcon.Error);

            strProjectProperty = String.Empty; //Leerstring zurückgeben
            return false; // Rückgabe Fehler
        }     
        
        // Die "ProjectInfo.xml" durch Schliessen und Öffnen des Projektes aktualisieren:
        string strOpenedProject; // Aktuell geöffnetes Projekt
        
        if (ActGetProject(out strOpenedProject)) // Wenn geöffnetes Projekt bekannt: Schliesen und wieder öffnen
        {
            CommandLineInterpreter objCLI = new CommandLineInterpreter(); // CLI für Aufruf von Actions bereitstellen
            
            objCLI.Execute("XPrjActionProjectClose"); // Projekt schliessen

            objCLI.Execute("ProjectOpen /Project:" + strOpenedProject); // Projekt wieder öffnen
        }

        else // Wenn Projekt nicht bekannt
        {
            strProjectProperty = String.Empty; //Leerstring zurückgeben
            return false; // Rückgabe Fehler
        }
        
        // Text aus Projectinfo.xml des Projektes auslesen
        XmlTextReader objReader = new XmlTextReader(strXmlFilename); // Diese Datei lesen
        
        while (objReader.Read()) // Nächsten Knoten lesen
        {
            if (objReader.HasAttributes) // Nur wenn Attribute vorhanden
            {
                while (objReader.MoveToNextAttribute()) // Zum nächsten Attribut wechseln
                {
                    if (objReader.Name == "id")
                    {
                        if (objReader.Value == intPropertyID.ToString())
                        {
                            strReadProperty = objReader.ReadString();
                            bolReadSuccessful = true;   // Projekteigenschaft wurde gefunden
                        }
                    }
                }
            }
        }
        objReader.Close(); // Datei wieder schließen (sonst bleibt diese gesperrt)
        
        if (!bolReadSuccessful) // Eigenschaft wurde nicht gefunden
        {
            // Fehlermeldung
            MessageBox.Show("Fehler: Die Projekteigenschaft \"" + intPropertyID + "\" wurde nicht gefunden!",
                            "ActGetProjectProperty", MessageBoxButtons.OK, MessageBoxIcon.Error);
            
            strProjectProperty = String.Empty; //Leerstring zurückgeben
            return false; // Rückgabe Fehler
        }
        
        // Gegebenenfalls Sprache aus Multilanguage-String herausfiltern...
        if (strLanguage != "all") // Nur wenn Sprachfilter gewünscht
        {
            MultiLangString objMLText = new Eplan.EplApi.Base.MultiLangString(); // Multi Language String zur Bearbeitung
            objMLText.SetAsString(strReadProperty);
            
            ISOCode.Language enuLanguage = ISOCode.Language.L___; // Variable für den ISOCode der gewählten Sprache

            if (!Enum.TryParse("L_" + strLanguage, out enuLanguage)) // Wandlung der Sprachkennung nicht erfolgreich? 
            {
                // Fehlermeldung 
                MessageBox.Show("Fehler: Übergabeparameter \"strLanguage\" enthält ungültige Werte: " + strLanguage,
                                "ActGetProjectProperty", MessageBoxButtons.OK, MessageBoxIcon.Error);

                strProjectProperty = String.Empty; //Leerstring zurückgeben
                return false; // Rückgabe Fehler
            }   
        
        strReadProperty = objMLText.GetStringToDisplay(enuLanguage); // Einzelne Sprache auslesen
        }

        // Erfolgreich gelesene Eigenschaft zurückgeben...
        strProjectProperty = strReadProperty;
        return true; // Rückgabe OK
    }

    
    [DeclareAction("ActGetProject")]
    // Ermitteln des vollen Namens inkl. Pfad des aktuell geöffneten Eplan-Projektes und Rückgabe über einen ActionCallingContext
    // Rückgabewerte: true bei Erfolg, false bei Fehler
    // Rückgabe als ActionCallingContext: strProject (enthält das aktuelle Projekt mit Pfad)
    // Bei auftretenden Fehlern werden Meldungs-Dialoge angezeigt.
    // Beispielaufruf als Eplan-Action:     
    // bool bolException = new CommandLineInterpreter().Execute("ActGetProject", objActionCallingContextProject);
    // objActionCallingContextProject.GetParameter("strProject", ref strOpenedProject);

    public bool ActGetProject(out string strProject)
    {
        string strReadProject = string.Empty; // Leerer String für das Auslesen der Eigenschaft
                        
        ActionCallingContext objACC = new ActionCallingContext();
        objACC.AddParameter("TYPE", "PROJECT");                         // ActionCallingContext zur Parameterübergabe

        try //Evtl. auftretende Exceptions abfangen
        {
        CommandLineInterpreter objCLI = new CommandLineInterpreter();
        objCLI.Execute("selectionset", objACC);                         // Eplan-Action "selectionset" ausführen
        objACC.GetParameter("PROJECT", ref strReadProject);             // Parameter lesen
        string strProjectPath = Path.GetFullPath(strReadProject);       // Wenn Pfad nicht gültig, wird eine Exception ausgelöst
        }

        catch (Exception strExeption)
        {
            // Fehlermeldung
            MessageBox.Show("Fehler: "+ strExeption.Message + "\nEs wurde evtl. kein Eplan-Projekt ausgewählt.",
                            "ActGetProject", MessageBoxButtons.OK, MessageBoxIcon.Error);

            strProject = String.Empty; // Rückgabe Leerstring
            return false; // Rückgabe Fehler
        }
        
        strProject = strReadProject; // Rückgabe ohne Dateiendung
        return true; // Rückgabe OK
    }


    [DeclareAction("ActGetProjectName")]
    // Ermitteln des Namens des aktuell geöffneten Eplan-Projektes und Rückgabe über einen ActionCallingContext
    // Rückgabewerte: true bei Erfolg, false bei Fehler
    // Rückgabe als ActionCallingContext: strProjectName (enthält den gesuchten Projektnamen ohne Dateiendung "*.elk"
    // Bei auftretenden Fehlern werden Meldungs-Dialoge angezeigt.
    // Beispielaufruf als Eplan-Action:     
    // bool bolException = new CommandLineInterpreter().Execute("ActGetProjectName", objActionCallingContextName);
    // objActionCallingContextName.GetParameter("strProjectName", ref strNameOfOpenedProject);

    public bool ActGetProjectName(out string strProjectName)
    {
        string strReadProject = string.Empty; // Leerer String für das Auslesen der Eigenschaft

        ActionCallingContext objACC = new ActionCallingContext();
        objACC.AddParameter("TYPE", "PROJECT");                         // ActionCallingContext zur Parameterübergabe

        try //Evtl. auftretende Exceptions abfangen
        {
            CommandLineInterpreter objCLI = new CommandLineInterpreter();
            objCLI.Execute("selectionset", objACC);                         // Eplan-Action "selectionset" ausführen
            objACC.GetParameter("PROJECT", ref strReadProject);             // Parameter lesen

            FileInfo objFI = new System.IO.FileInfo(strReadProject);
            strReadProject = objFI.Name;                                    // Projektname ohne Pfad
        }

        catch (Exception strExeption)
        {
            // Fehlermeldung
            MessageBox.Show("Fehler: " + strExeption.Message + "\nEs wurde evtl. kein Eplan-Projekt ausgewählt.",
                            "ActGetProjectName", MessageBoxButtons.OK, MessageBoxIcon.Error);

            strProjectName = String.Empty; // Rückgabe Leerstring
            return false; // Rückgabe Fehler
        }

        strProjectName = strReadProject.Replace(".elk", "");            // Rückgabe ohne Dateiendung
        return true;                                                    // Rückgabe OK
    }

}