Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  EPLAN Electric P8
  API Platzhalterobjekt Wertesatz auswählen Dialog

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für EPLAN
Autor Thema:  API Platzhalterobjekt Wertesatz auswählen Dialog (510 / mal gelesen)
Götschma
Mitglied
Automatiker


Sehen Sie sich das Profil von Götschma an!   Senden Sie eine Private Message an Götschma  Schreiben Sie einen Gästebucheintrag für Götschma

Beiträge: 15
Registriert: 29.05.2015

EPLAN Electric P8 - Select
Version: 2023 Update 4
Expertenmenü

erstellt am: 09. Feb. 2024 09:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen
Ich hab mal wieder eine Frage zur Eplan API.

Ich erstelle gerade ein Add-in mit einer Aktion die ein Seitenmakro direkt im Projekt einfügen soll.
Besitzt das Seitenmakro aber Platzhalterobjekte, wird der "Wertesatz auswählen" Dialog nicht aufgerufen.
Auch wenn in den Benutzereinstellungen eingestellt wurde, dass dieser beim Einfügen von Seitenmakros angezeigt werden soll.

Wie kann ich jetzt den "Wertesatz auswählen" Dialog über die API ausführen?
In der API-Hilfe habe ich die ExecuteAction Methode gefunden, verstehe aber nicht wie ich diese anwenden kann.

Hier ist der aktuelle Code für die Eplan Action:
public class ActionInsertPageMacroDefaultPlacement : IEplAction
{
    internal const string ACTION = "InsertPageMacroDefaultPlacement";

    public bool Execute(ActionCallingContext ctx)
    {
        //Eingabedialog für den Pfad zum gewünschten Seitenmakro
        string value = "Eingabefeld";
        PageMacroInputBox pageMacroInputBox = new PageMacroInputBox();

        //Wurde ein gültiger Pfad angageben, soll das Makro im aktuellen Projekt eignefügt werden
        if (pageMacroInputBox.Show("Seitenmakro einfügen...", "Makroname (inkl. Pfad):", ref value) == DialogResult.OK)
        {
            //Projekt
            SelectionSet selectionSet = new SelectionSet();
            Project MyProject = selectionSet.GetCurrentProject(false);

            //Seitenmakro
            PageMacro pageMacro = new PageMacro();
            pageMacro.Open(value, MyProject);
            Page[] macroPages = pageMacro.Pages;

            //Platzhalterobjekte im Seitenmakro
            List<PlaceHolder> placeHolders = new List<PlaceHolder>();
            foreach (Page macroPage in macroPages)
            {
                //Platzhalterobjekte nur auf den Makroseiten ermitteln, die noch nicht im Projekt vorhanden sind
                if (!MyProject.Pages.Contains(macroPage))
                {
                    foreach(Placement placement in macroPage.AllPlacements)
                    {
                        if (placement is PlaceHolder)
                        {
                            //Platzierung in Platzhalterobjekt konvertieren und in Liste ergänzen
                            placeHolders.Add((PlaceHolder)placement);
                        }
                    }
                }
            }

            //bestehende Seiten im Projekt nicht überschreiben
            uint pages = pageMacro.CountOfPages;
            bool[] overwrite = new bool[pages];

            //Seitenmakro einfügen
            Insert insert = new Insert();
            insert.PageMacro(pageMacro, MyProject, overwrite, PageMacro.Enums.NumerationMode.NumberPreferPrefix);

            //Wenn Platzhalterobjekte mit den Seiten eingefügt wurden, Wertesätze zuweisen
            if (placeHolders.Count > 0)
            {
                foreach (PlaceHolder placeHolder in placeHolders)
                {
                    //Hier möchte ich die Aktion "XMPlaceHolderAssignRecordAction" ausführen für placeHolder:
                   
                }
            }
        }
        return true;
    }
   
    public bool OnRegister(ref string Name, ref int Ordinal)
    {
        Name = ACTION;
        Ordinal = 20;
        return true;
    }

    public void GetActionProperties(ref ActionProperties actionProperties)
    {
       
    }
}

Kann mir da jemand weiterhelfen?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

apps4eplan
Mitglied
freier Entwickler


Sehen Sie sich das Profil von apps4eplan an!   Senden Sie eine Private Message an apps4eplan  Schreiben Sie einen Gästebucheintrag für apps4eplan

Beiträge: 110
Registriert: 26.11.2020

erstellt am: 13. Feb. 2024 17:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Götschma 10 Unities + Antwort hilfreich


Schau dir mal das Video an, ob das thematisch so in die Richtung geht?!

Video

------------------
sind doch alles nur Nuller und Einser :-) !!!

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Götschma
Mitglied
Automatiker


Sehen Sie sich das Profil von Götschma an!   Senden Sie eine Private Message an Götschma  Schreiben Sie einen Gästebucheintrag für Götschma

Beiträge: 15
Registriert: 29.05.2015

EPLAN Electric P8 - Select
Version: 2023 Update 4
Expertenmenü

erstellt am: 14. Feb. 2024 13:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo und Danke für deine Antwort.

Das geht schon in die richtige Richtung.

Ich würde es jedoch bevorzugen, den üblichen Dialog für die Wertesatz-Auswahl aufzurufen.
Darin können relativ einfach noch Variablen, welche als "veränderbar" gekennzeichnet wurden, manuell angepasst werden.
Ausserdem ist die grafische Ansicht ebenfalls ziemlich praktisch.

Ich habe meinen Code zwischenzeitlich noch etwas erweitert.
Jetzt erhalte ich die gewünschten Dialoge,
jedoch wird die Zuweisung nicht richtig vorgenommen.

Nach dem Einfügen des Seitenmakros und der Auswahl der Wertesätze,
werden die Werte scheinbar auf der Seite angepasst.
Wenn ich jedoch die betreffende seite neu lade (bzw. neu öffne),
sind die Zuweisungen wieder weg.

Woran könnte das liegen?

Hier ist die überarbeitete Execute() Methode:
public bool Execute(ActionCallingContext ctx)
        {
            //Eingabedialog für den Pfad zum gewünschten Seitenmakro
            string value = "Eingabefeld";
            PageMacroInputBox pageMacroInputBox = new PageMacroInputBox();

            //Wurde ein gültiger Pfad angageben, soll das Makro im aktuellen Projekt eignefügt werden
            if (pageMacroInputBox.Show("Seitenmakro einfügen...", "Makroname (inkl. Pfad):", ref value) == DialogResult.OK)
            {
                //Projekt
                SelectionSet selectionSet = new SelectionSet();
                Project MyProject = selectionSet.GetCurrentProject(false);

                //Seitenmakro
                PageMacro pageMacro = new PageMacro();
                pageMacro.Open(value, MyProject);
                Page[] macroPages = pageMacro.Pages;
                List<string> pages = new List<string>();

                //Platzhalterobjekte im Seitenmakro
                List<Placement> placeHolders = new List<Placement>();
               
                foreach (Page page in MyProject.Pages)
                {
                    pages.Add(page.Name.ToString());
                }

                foreach (Page macroPage in macroPages)
                {
                    //Platzhalterobjekte nur auf den Makroseiten ermitteln, die noch nicht im Projekt vorhanden sind
                    if(!pages.Contains(macroPage.Name))
                    {
                        foreach (Placement placement in macroPage.AllPlacements)
                        {
                            if (placement is PlaceHolder)
                            {
                                placeHolders.Add(placement);
                            }
                        }
                    }
                }

                //bestehende Seiten im Projekt nicht überschreiben
                bool[] overwrite = new bool[macroPages.Count()];

                //Seitenmakro einfügen
                Insert insert = new Insert();
                insert.PageMacro(pageMacro, MyProject, overwrite, PageMacro.Enums.NumerationMode.NumberPreferPrefix);
                insert.Dispose();

                //Benutzereinstellung auslesen -> Wertesätze nur zuweisen, wenn Benutzer die Einstellung aktiviert hat
                Settings settings = new Settings();
                if (settings.GetBoolSetting("USER.MacrosGui.PagePlaceholderAutoOpen", 0))
                {
                    foreach (Placement placeholder in placeHolders)
                    {
                        Edit editPlaceHolders = new Edit();
                        editPlaceHolders.BringToFront((PlaceHolder)placeholder);
                        editPlaceHolders.SetFocusToGED();

                        //Mit der Aktion "XMPlaceHolderAssignRecordAction" wird das Dialogfenster für die Wertesatz Zuweisung geöffnet
                        CommandLineInterpreter oCLI = new CommandLineInterpreter();
                        oCLI.Execute("XMPlaceHolderAssignRecordAction");
                        oCLI.Execute("ProjectOptionsGuiIGfWindOnAssignRecord");

                        //Wird die Seite mit dieser Aktion neu gezeichnet, sieht man wie sich die Werte nach der Zuweisung ändern:
                        oCLI.Execute("XGedRedrawAction");

                        //Nachdem alle Platzhalterobjekte durchlaufen wurden (bzw. die Aktion beendet ist),
                        //kann die betreffende Seite im grafischen Bereich erneut geöffnet werden und die zugewiesenen Wertesätze sind wieder weg.
                        //Als würden die Änderungen gemacht, jedoch danach nicht gespeichert werden...
                    }
                }
            }

            return true;
        }

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

FML
Mitglied



Sehen Sie sich das Profil von FML an!   Senden Sie eine Private Message an FML  Schreiben Sie einen Gästebucheintrag für FML

Beiträge: 492
Registriert: 11.03.2002

Aktuell:
EPLAN Electric P8 Professional
V 2.6 HF2
V 2.7
V 2.7 Education<P>Eplan Fluid Add On
Eplan ProPanel Add On
Electric P8 API
EEC
Systeme:
MS WINDOWS 10
MS WINDOWS 7
MS WINDOWS 2016 Server
MS WINDOWS SQL Server

erstellt am: 14. Feb. 2024 13:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Götschma 10 Unities + Antwort hilfreich

Hoi, habe schon lange nichts mehr mit der API gemacht aber ich meine da war was mit Transactions. Versuch mal den Aufruf der Action innerhalb einer Transaction zu machen.
Könntest evtl. ja auch die Methode ApplyRecord des Platzhalterobjektes verwenden.
Gruß fm

------------------
Um zu sehen, musst Du die Augen offen halten.
Um zu erkennen, musst Du sie schliessen und denken.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Götschma
Mitglied
Automatiker


Sehen Sie sich das Profil von Götschma an!   Senden Sie eine Private Message an Götschma  Schreiben Sie einen Gästebucheintrag für Götschma

Beiträge: 15
Registriert: 29.05.2015

EPLAN Electric P8 - Select
Version: 2023 Update 4
Expertenmenü

erstellt am: 15. Feb. 2024 14:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo fm

Danke für den Tipp.
Ich werde das mit den Transactions nächste Woche mal anschauen.
(Komme diese Woche leider nicht mehr dazu)

Wenn ich die Auswahl über den originalen Dialog (Wertesatz auswählen) haben möchte, kann ich die ApplyRecord Methode nicht einsetzen, da ich die Wertesätze vorab nicht kenne.

Gruss Götschma

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Jonny Wire
Mitglied
Script-Troll


Sehen Sie sich das Profil von Jonny Wire an!   Senden Sie eine Private Message an Jonny Wire  Schreiben Sie einen Gästebucheintrag für Jonny Wire

Beiträge: 790
Registriert: 08.12.2008

EPLAN Electric P8
... in allen Versionen/Varianten

erstellt am: 16. Feb. 2024 10:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Götschma 10 Unities + Antwort hilfreich

Denke das beste und einfachste wäre es den Dialog nachzubauen.

Seit EPLAN 2022 gibt es auch eine fertige UI dafür:
https://suplanus.de/listselectdecisioncontext/

Es ist mühselig aber so kann man entscheiden welche Wertesätze man auswählen will und ggf. noch Infos dem User anzeigen.

------------------
ibKastl → Wir beraten, analysieren, strukturieren, programmieren, und vieles mehr
Suplanus → Scripting in EPLAN ist einfach (toll)
ShopForProcess → Scripte & Anwendungen für EPLAN

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Götschma
Mitglied
Automatiker


Sehen Sie sich das Profil von Götschma an!   Senden Sie eine Private Message an Götschma  Schreiben Sie einen Gästebucheintrag für Götschma

Beiträge: 15
Registriert: 29.05.2015

EPLAN Electric P8 - Select
Version: 2023 Update 4
Expertenmenü

erstellt am: 22. Feb. 2024 07:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


ActionInsertPageMacros.txt

 
Hallo und Danke für eure Tipps.

Das Problem dass ich mit dem speichern der Wertesätze hatte, konnte ich jetzt beheben.
Mein Fehler war dass ich die Seitenobjekte erstellt habe,
bevor das Makro eingefügt wird. Dadurch konnte ich zwar auf die Platzhalterobjekte auf den Seiten zugreiffen, jedoch sind diese Seiten nicht wirklich im Projekt enthalten.

Den Code habe ich jetzt angepasst.
Zuerst wird das Seitenmakro platziert und anschliessend werden die Seiten zurückgegeben.
Dafür habe ich den Rückgabewert der Insert.PageMacro() Methode verwendet:
private List<Page> PlacePageMacro(Project project, string path)
        {
            List<Page> pages = new List<Page>();
            try
            {
                //Makro öffnen
                PageMacro pageMacro = new PageMacro();
                pageMacro.Open(path, project);

                //Keine bestehenden Seiten im Projekt überschreiben
                bool[] overwrite = new bool[pageMacro.Pages.Count()];

                //Seiten einfügen
                Insert insert = new Insert();
                StorableObject[] storableObjects = insert.PageMacro(
                    pageMacro,
                    project,
                    overwrite,
                    PageMacro.Enums.NumerationMode.NumberPreferPrefix
                    );

                foreach (Page page in storableObjects)
                    pages.Add(page);
            }
            catch (Exception ex)
            {
                new BaseException("Fehler: " + ex.Message, MessageLevel.Error).FixMessage();
                MessageBox.Show("Das Seitenmakro konnte nicht platziert werden.", "Vorgang abgebrochen!");
            }
            return pages;
        }

Danach werden die Platzhalterobjekte auf den neuen Seiten abgefragt:
private void AssignPlaceHolderRecords(List<Page> pages)
        {
            foreach (Page page in pages)
            {
                foreach (Placement placement in page.AllPlacements)
                {
                    if (!(placement is PlaceHolder))
                        continue;

                    PlaceHolder placeHolder = (PlaceHolder)placement;

                    //Wertesätze ermitteln
                    StringCollection records = placeHolder.GetRecordNames();

                    //Wenn keine Wertesätze vorhanden, Platzhalterobjekt überspringen
                    if (records.Count == 0)
                        continue;

                    //Wertesatz auswählen
                    ListSelectDecisionContext listSelectDecisionContext = new ListSelectDecisionContext(records, records[0], placeHolder.Name);
                    listSelectDecisionContext.AllowMultiSelect = false;
                    var result = new Decider().Decide(listSelectDecisionContext);

                    //Wertesatz setzen
                    if (result == EnumDecisionReturn.eOK)
                        placeHolder.ApplyRecord(listSelectDecisionContext.SelectedEntry);
                }
            }
        }

Ich habe die komplette Action noch als txt-Datei angehängt.

Vielen Dank für eure Hilfe!

Gruss Götschma

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz