AutoSyncNavis

Mit diesem Script werden Navigatoren automatisch mit der aktuellen Selektion synchronisiert.
Vielen Dank an FrankS für das Erstellen 💖

Achtung: Je nachdem wie viele Navigatoren geöffnet sind und wie groß das Projekt ist, kann sich das Script negativ auf die Perfomance auswirken.

// AutoSyncNavis.cs
//
// Nachdem das Script geladen wurde kann das Synchronisieren aller Navigatoren mit dem
// ausgewählten Element im GED aktiviert werden.
//
// Es wird ein neuer Menüpunkt "AutoSync Navigatoren" in der Gruppe "Erweiterung" im Tab "Ansicht" angelegt,
// außerdem wird die aktuelle Einstellung gespeichert.
//
// Copyright by Frank Schöneck, 2024
//
// letzte Änderung:
// V1.0.0, 23.07.2024, Frank Schöneck, Projektbeginn

using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Gui;
using Eplan.EplApi.Scripting;
using System.Linq;

public class AutoSyncNavis
{
    private string sSettingName = "USER.SCRIPTS.AutoSyncNavis.AutoSyncState";

    //RibbonBar Einträge definieren
    string m_TabName = "Ansicht";
    string m_commandGroupName = "Erweiterungen";
    string m_commandName = "AutoSync";
    string m_SVGstringIconNavigator = @"<svg fill='#464646' height='800px' width='800px' version='1.1' id='XMLID_85_' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 24 24' enable-background='new 0 0 24 24' xml:space='preserve'>
        <path d='M21,24h-6v-6h6V24z M17,22h2v-2h-2V22z M15,22H6V8H3V0h8v8H8v4h7v2H8v6h7V22z M5,6h4V2H5V6z M21,16h-6v-6h6V16z M17,14h2 v-2h-2V14z'/>
        </svg>";


    [DeclareRegister]
    public void registerRibbonItems()
    {
        RibbonBar ribbonBar = new RibbonBar();
        var newTab = new Eplan.EplApi.Gui.RibbonBar().Tabs.FirstOrDefault(item => item.Name == m_TabName);
        if (newTab == null) //Tab noch nicht vorhanden, dann neu erzeugen
        {
            newTab = new Eplan.EplApi.Gui.RibbonBar().AddTab(m_TabName);
        }
        var commandGroup = newTab.CommandGroups.FirstOrDefault(item => item.Name == m_commandGroupName);
        if (commandGroup == null) //CommandGroup noch nicht vorhanden, dann neu erzeugen
        {
            commandGroup = newTab.AddCommandGroup(m_commandGroupName);
        }
        RibbonIcon ribbonIconNavigator = ribbonBar.AddIcon(m_SVGstringIconNavigator); //Icon festlegen
        commandGroup.AddCommand(m_commandName, "AutoSyncNavis", m_commandName, "AutoSync der Navigatoren ein- / ausschalten", ribbonIconNavigator);
    }

    [DeclareUnregister]
    public void unRegisterRibbonItems()
    {
        //Command entfernen
        var vTab = new Eplan.EplApi.Gui.RibbonBar().Tabs.FirstOrDefault(item => item.Name == m_TabName);
        if (vTab != null)
        {
            var commandGroup = vTab.CommandGroups.FirstOrDefault(item => item.Name == m_commandGroupName);
            if (commandGroup != null)
            {
                var command = commandGroup.Commands.Values.FirstOrDefault(item => item.Text == m_commandName);
                if (command != null)
                {
                    command.Remove();
                }
                //Wenn CommandGroup leer ist diese auch entfernen
                if (commandGroup.Commands.Count == 0)
                {
                    commandGroup.Remove();
                }
            }
            //Wenn Tab leer ist dieses auch entfernen
            if (vTab.Commands.Count == 0)
            {
                vTab.Remove();
            }
        }
        //Einstellungen löschen
        DeleteSettings();

    }

    [DeclareAction("AutoSyncNavis")]
    public void AutoSyncNavisAction()
    {
        Settings oSettings = new Settings();

        string sAutoSyncState = string.Empty;
        if (oSettings.ExistSetting(sSettingName))
        {
            sAutoSyncState = oSettings.GetStringSetting(sSettingName, 0);
        }

        //Prüfen ob AutoSync aktiviert ist
        if (sAutoSyncState == string.Empty | sAutoSyncState.ToUpper() != "ON")
        {
            //nicht aktiviert
            Decider eDecision = new Decider();
            EnumDecisionReturn eAnswer = eDecision.Decide(
                EnumDecisionType.eYesNoDecision,
                "Soll das Auto-Synchronisieren der Navigatoren eingeschaltet werden?",
                "AutoSyncNavis",
                EnumDecisionReturn.eYES,
                EnumDecisionReturn.eNO,
                string.Empty,
                false,
                EnumDecisionIcon.eQUESTION);
            if (eAnswer == EnumDecisionReturn.eYES)
            {
                //Einstellung speichern
                SetSettings("ON");
            }
        }
        else
        {
            Decider eDecision = new Decider();
            EnumDecisionReturn eAnswer = eDecision.Decide(
                EnumDecisionType.eYesNoDecision,
                "Soll das Auto-Synchronisieren der Navigatoren ausgeschaltet werden?",
                "AutoSyncNavis",
                EnumDecisionReturn.eYES,
                EnumDecisionReturn.eNO,
                string.Empty,
                false,
                EnumDecisionIcon.eQUESTION);
            if (eAnswer == EnumDecisionReturn.eYES)
            {
                //Einstellung speichern
                SetSettings("OFF");
            }
        }
        return;
    }

    //Einstellungen speichern
    private void SetSettings(string AutoSyncActive)
    {
        Settings oSettings = new Settings();
        if (!oSettings.ExistSetting(sSettingName))
        {
            oSettings.AddStringSetting(sSettingName,
                new string[] { },
                new string[] { },
                ISettings.CreationFlag.Insert);
        }
        oSettings.SetStringSetting(sSettingName, AutoSyncActive, 0);
    }

    //Einstellungen löschen
    public void DeleteSettings()
    {
        Settings oSettings = new Settings();
        if (oSettings.ExistSetting(sSettingName))
        {
            oSettings.DeleteSetting(sSettingName);
            new Decider().Decide(EnumDecisionType.eOkDecision,
                "Die Einstellung [" + sSettingName + "] wurde gelöscht.",
                "AutoSyncNavis",
                EnumDecisionReturn.eOK,
                EnumDecisionReturn.eOK,
                string.Empty,
                false,
                EnumDecisionIcon.eINFORMATION);
        }
        else
        {
            new Decider().Decide(EnumDecisionType.eOkDecision,
                "Die Einstellungen wurden nicht gefunden!",
                "AutoSyncNavis",
                EnumDecisionReturn.eOK,
                EnumDecisionReturn.eOK,
                string.Empty,
                false,
                EnumDecisionIcon.eFATALERROR);
        }
    }

    //Eine Element wurde markiert
    [DeclareEventHandler("onSelChanged")]
    public void MyEventOnSelChanged()
    {
        Settings oSettings = new Settings();
        string sAutoSyncState = string.Empty;
        if (oSettings.ExistSetting(sSettingName))
        {
            sAutoSyncState = oSettings.GetStringSetting(sSettingName, 0);
        }

        //Prüfen ob AutoSync aktiviert ist
        if (sAutoSyncState == string.Empty | sAutoSyncState.ToUpper() != "ON")
        {
            //Keine Aktion ausführen
            return;
        }
        else
        {
            //Setting existiert und AutoSync soll aktiviert werden
            new CommandLineInterpreter().Execute("XEsSyncPDDsAction");
        }
        return;
    }

    //Prüft ob Eplan gestartet wurde
    [DeclareEventHandler("Eplan.EplApi.OnMainStart")]
    public void MyEventEplanStart()
    {
        Settings oSettings = new Settings();
        string sAutoSyncState = string.Empty;

        //War AutoSync beim letzten mal aktiv?
        if (oSettings.ExistSetting(sSettingName))
        {
            sAutoSyncState = oSettings.GetStringSetting(sSettingName, 0);

            //wenn ja ("ON") dann AutoSync aktivieren
            if (sAutoSyncState.ToUpper() == "ON")
            {
                new CommandLineInterpreter().Execute("XEsSyncPDDsAction");
            }
        }
        return;
    }
}