Ich hatte ja hier vorgestellt wie man eigene Tabs zum Ribbon hinzufügen kann. Nicolas hat in den Kommentaren ein tolles Beispiel gepostet wie man ein Icon umschalten kann. Habe das mal in ein Script gepackt und noch eine Farbumschaltung eingebaut.
Vielen Dank Nicolas für das Beispiel und die Idee 💡!
Um das Script nutzen zu können muss unter EPLAN/Data/Bilder ein Bild mit dem Dateinamen Icon_template.svg liegen. In der SVG kann anstatt einer Farbe der Platzhalter icon_color
eingetragen werden und die Farbe wechselt dann von rot auf grün. Das Beispiel findet Ihr hier Icon_template.svg.
using System.Drawing; using System.IO; using System.Text; using Eplan.EplApi.Base; using Eplan.EplApi.Gui; using Eplan.EplApi.Scripting; public class ChangeRibbonState { private const string TAB_NAME = "ToogleTab"; private const string GROUP_NAME = "Group"; private const string ACTION_NAME = "ToogleAction"; private static bool _state; [DeclareAction(ACTION_NAME)] public void Action() { // Here you can get the state from somewhere else (like settings etc.) Set(!_state); } private static void Set(bool state) { _state = state; Set(); } [DeclareUnregister] public void Unregister() { RemoveRibbonTab(); } [DeclareEventHandler("Eplan.EplApi.OnMainEnd")] public void OnMainEnd() { RemoveRibbonTab(); } private void RemoveRibbonTab() { RibbonBar ribbonBar = new RibbonBar(); RibbonTab ribbonTab = ribbonBar.GetTab(TAB_NAME); if (ribbonTab != null) { ribbonTab.Remove(); } } [DeclareRegister] public void Register() { Set(); } [DeclareEventHandler("Eplan.EplApi.OnMainStart")] public void OnMainStart() { Set(); } private static void Set() { var ribbonBar = SetupRibbonBar(); // Icon string imagePath = Path.Combine(PathMap.SubstitutePath("$(MD_IMG)"), "Icon.svg"); string imageTemplatePath = Path.Combine(PathMap.SubstitutePath("$(MD_IMG)"), "Icon_template.svg"); string color = Color.Red.Name; if (_state) { color = Color.DarkGreen.Name; } string content = File.ReadAllText(imageTemplatePath, Encoding.UTF8); content = content.Replace("icon_color", color); if (File.Exists(imagePath)) { File.Delete(imagePath); } File.WriteAllText(imagePath, content, Encoding.UTF8); RibbonIcon ribbonIcon = ribbonBar.AddIcon(imagePath); // Command string commandName = ACTION_NAME; var ribbonCommandInfo = new RibbonCommandInfo(commandName, ACTION_NAME); ribbonBar.UnregisterCommand(ACTION_NAME, TAB_NAME, GROUP_NAME); ribbonBar.RegisterCommand(ribbonCommandInfo, ribbonIcon, TAB_NAME, GROUP_NAME); } private static RibbonBar SetupRibbonBar() { var ribbonBar = new RibbonBar(); // Tab var ribbonTab = ribbonBar.GetTab(TAB_NAME); if (ribbonTab == null) { ribbonTab = ribbonBar.AddTab(TAB_NAME); } // Group var ribbonCommandGroup = ribbonTab.GetCommandGroup(GROUP_NAME); if (ribbonCommandGroup == null) { ribbonTab.AddCommandGroup(GROUP_NAME); } return ribbonBar; } }
Hi Johann,
danke fürs teilen des Scripts :)
Mir fällt allerdings auf anhieb kein konkreter Anwendungsfall ein. Hast du da einen? Bin neugierig :)
Schöne Grüße aus Australien
Denke primäre Aufgabe wäre die Anzeige eines Status / Zustandes. Beispiel “Einstellungen”, so könnte man visualisieren ob eine Einstellung aktiv ist oder nicht. Über die Farbe oder auch über z.B. ein Checkbox Icon.
Viele Grüße über den Teich!
Moin Moin,
@ Johann:
Im Kern benutzt du so auch das, was ich in meinem Beispiel unter dem anderen Blogpost auch gemacht habe, Richtig? Also Button löschen und mit geänderten Daten neu einfügen
ribbonBar.UnregisterCommand(ACTION_NAME, TAB_NAME, GROUP_NAME); //Button Löschen
ribbonBar.RegisterCommand(ribbonCommandInfo, ribbonIcon, TAB_NAME, GROUP_NAME); // Button hinzufügen mit geändertem Icon
Ist es irgendwie möglich, von bereits bestehenden Buttons nur das Icon zu tauschen ohne die Knöpfe neu zu generieren?
@Patrick
Wir schalten über zwei Buttons die Standard-Artikeldatenbank und Standard-Verzeichnisse auf Temporär um. Um jetzt immer zu sehen, was eingestellt ist, ohne die Schaltfläche nochmal zu betätigen oder in den Einstellungen zu schauen, was eingestellt ist, soll der Button, der zuletzt angewählt wurde, seine Icon-Farbe z.B. auf Grün ändern.
@Nicolas:
Jo, im Kern ist es das gleiche.
Nur das Icon tauschen geht leider nicht da das Property am Command (SvgIcon) readonly ist.
@Patrick noch ein Anwendungsfall:
Abhängig von der Einstellung vom Theme (Darkmode/Lightmode) andere Icons laden.
Moin Moin,
es geht weiter mit meiner Fragerei :)
Ich habe jetzt eine Art Multilanguagetool-Skript programmiert, dass Buttons mit Länderflaggen als Icons hinzufügt. Über die Buttons wird dann die Projekt-Anzeigesprache auf die jeweilige Sprache über den Befehl “SetProjectLanguage” geändert. Hier ein Beispiel:
/* Deutsch */
RibbonBar ribbonBar = new Eplan.EplApi.Gui.RibbonBar();
string CommandAction = “SetProjectLanguage /display:de_DE /variable:de_DE”;
CommandIcon ButtonIcon = CommandIcon.Flag_DE;
RibbonIcon icon = new Eplan.EplApi.Gui.RibbonIcon(ButtonIcon);
RibbonCommandInfo ribbonCommandInfo = new Eplan.EplApi.Gui.RibbonCommandInfo(CommandName, CommandAction);
ribbonCommandInfo.Tooltip = “Deutsch”;
ribbonCommandInfo.Description = “Einstellung der Projektsprache auf Deutsch”;
ribbonBar.RegisterCommand(ribbonCommandInfo,icon,TabName,CommandGroupName);
Da wir sehr viele Sprache in der Datenbank haben, aber einige eher selten gebraucht werden, wollte ich diese nicht als eigenen Button einfügen.
Stattdessen wollte ich ein Button einfügen, der das Menü “Einstellungen > Projekte > “Projektname” > Übersetzung” öffnet, damit jeder darüber direkt manuell eine Einstellung für die eher seltenen Projektsprachen treffen kann.
Leider finde ich keine Möglichkeit bzw. keinen Befehl, mit dem man das Einstellungsfenster unter einem gegebenen Pfad öffnen kann. Gehen müsste das eigentlich, da EPlan sich merkt, welcher Einstellungspfad zuletzt offen war.
Der Befehl “XEsSettingsMasterDlgAction” scheint mir im Bezug auf die Befehlszeile in die richtige Richtung zu gehen.
Mein Gedanke war, dass der Befehl erweitert werden könnte: XEsSettingsMasterDlgAction /TranslateGui o.Ä. (Funktioniert natürlich nicht). Es gibt aber kaum bis keine Unterlagen zu dem Befehl.
Für das Scripting habe ich leider garkeinen Befehl gefunden, um das Einstellungsfenster zu öffnen.
Hat hier jemand einen Tipp wie man das umsetzen kann?
MfG Nicolas
Die Einstellungen mit “Pfad” aufzurufen ist mir leider nicht bekannt.
Aber hätte einen möglichen Workaround:
Du hast eine Action im Ribbon “SelectLanguageAction”. Diese Action öffnet ein Menü (Windows.Forms) welches dir alle möglichen Sprachen im Projekt anzeigt.
Hallo Johann,
wie kann ich ein dropMenu erstellen für ein Command?
Mit Windows.Forms.ContextMenu sollte es gehen.
Hallo,
Da ich noch ziemlich am Anfang von Scripting/API stehe, hab ich vermutlich noch viele Fragen.
Eine funktionsfähige Ribbon-Leiste mit eigenen SVGs und Actions hab ich zum laufen bekommen.
Mir ist aufgefallen, dass alles was mit der Farbe #464646 im hellen Design als Anthrazit und im dunklen Design als Hellgrau dargestellt wird.
Somit lassen sich gut eigene Icons für beide Designs erstellen.
Was mich jetzt interessieren würde, wie kann ich ein Windows.Forms.ContextMenu erstellen/einbinden?
(verwendete Eplan-Version: Eplan Electrical P8 Platform 2022 Update 4)
Hallo zusammen,
ich habe mir die Toolbar bisher über “Menüband anpassen” erstellt, da das für mich deutlich einfacher ist.
Eine Funktion, die dort liegt ist es, die unsichtbaren Texte beim Druck mit auszugeben:
XAfActionSetting /set:USER.GedViewer.Print.PrintInvisibleObjects /value:0
Gibt es auch die Möglichkeit, die Befehlszeile dort so anzupassen, dass ich da das Icon ändern kann? Beim Rasterfang z.B. wird das dann weiß hinterlegt.
Ich versuche mal ein Beispiel mit dem Contextmenü zu machen.
Du müsstest das Script von oben kopieren und die Befehlszeile dort mit einfügen, siehe meinen Kommentar im Code.