Ewig steht das schon auf meiner Todo-Liste: Einen eigenen Navi per API implementieren.
Die Möglichkeit welche ich hier beschreibe ist nicht teil der offiziellen EPLAN API. Somit bekommt man auch kein Support oder Ähnliches.
Dennoch finde ich die Möglichkeit super und denke viele von Euch haben dafür auch einen Anwendungsfall.
Eigentlich braucht man nur eine DialogBarFactory und ein WPF-UserControl dazu:
using System.Reflection; using Eplan.EplApi.ApplicationFramework; using Eplan.EplSDK.WPF; namespace Suplanus.EplAddIn.NavigatorExample { class NavigatorExample : IEplAddIn { public bool OnRegister(ref bool isLoadingOnStart) { isLoadingOnStart = true; return true; } public bool OnUnregister() { return true; } public bool OnInit() { return true; } public bool OnInitGui() { // Get name from class // ReSharper disable once PossibleNullReferenceException var className = MethodBase.GetCurrentMethod().DeclaringType.Name; DialogBarFactory dialogBarFactory = new DialogBarFactory(className, typeof(NavigatorContent), DialogDockingOptions.Any, 0); return true; } public bool OnExit() { return true; } } }
Im UserControl müssen aber viele Interfaces implementiert sein :^)
using System.Reflection; using Eplan.EplSDK.WPF.Interfaces; using Eplan.EplSDK.WPF.Interfaces.DialogServices; namespace Suplanus.EplAddIn.NavigatorExample { public partial class NavigatorContent : IDialog, IDialogBar, IDialogComponentAccess, ICallingContext, IDialogState, IDialogAction, IDialogClose, IElementStateAccess { public string Caption { get; set; } public bool IsTabsheet { get; set; } public int UniqueBarID { get; set; } public IDialogComponent Component { get; set; } public object Context { get; set; } public IDialogStateManager DialogStateManager { get; set; } public IElementStateCollection ElementStateCollection { get; set; } public NavigatorContent() { // Iniit ElementStateCollection = new Eplan.EplSDK.WPF.Controls.Persistency.ElementStateCollection(); ElementStateCollection.Load(nameof(NavigatorContent)); InitializeComponent(); Caption = "NavigatorExample"; IsTabsheet = false; // Use Class name for uniqueid // ReSharper disable once PossibleNullReferenceException var className = MethodBase.GetCurrentMethod().DeclaringType.Name; UniqueBarID = (int)(uint)className.GetHashCode(); } public void init() { } public bool isValid() { return true; } public void reload() { } public void save() { } public void close() { } } }
Anbei ein Beispiel UserControl in WPF:
<UserControl x:Class="Suplanus.EplAddIn.NavigatorExample.NavigatorContent" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="300" d:DesignWidth="300" mc:Ignorable="d"> <Grid Margin="10"> <Viewbox> <TextBlock Text="Hello Navigator!" TextWrapping="Wrap" /> </Viewbox> </Grid> </UserControl>
Eine lauffähiges Beispiel findet Ihr auf GitHub…
Hallo Johann, ich hoffe es geht dir alles gut.
Danke für das Beispiel. Es lauft gut !! :-)
Tschüss
Hello Johann
Thanks for your idea of navigator
And good continuation for your blog on eplan which is really well done that I use since the eplan p8 1.9
thank you for everything
Translate Google XD
Vielen Dank für Ihre Idee von Navigator
Und gute Fortsetzung für Ihren Blog auf eplan was wirklich gut gemacht ist, dass ich seit dem eplan p8 1.9 benutze
Vielen Dank für alle
Best regards
Ronny delfosse
Sehr schön!!! Ich frage mich ob Eplan ein Navi-Addin signieren würde, welches ein Datenportal eines Drittanbieters bereitstellt :-D
Klar. Wieplan ist auch als Navigator in EPLAN verfügbar und stellt Artikel von unterschiedlichen Herstellern bereit ;)
Hi, ich bin ganz am Angang mit dem Thema “Eplan Scripting”. Kann jemand mir schreiben, wie kann ich das Script in Eplan laden?
Du kannst in meinem Buch oder hier auf der Seite nachlesen.
Ich bin noch Anfänger, daher verzeiht mir bitte die blöde Frage, aber:
Wie sieht die Action aus, mit der ich den Navigator ein und ausblenden kann?
Welchen Navigator willst du ausblenden?
Das hier könnte interessant für dich sein:
https://suplanus.de/navigatoren-einblenen-ausblenden/
Ich meinte den per API erstellten Navigator aus deinem Beispiel. Dort toggelst du ja die Sichtbarkeit per Action. Ich bekomme den Navigator leider noch nicht dazu, zu erscheinen
Müsste die Action “NavigatorContent” sein.
Irgendwie stand ich da auf dem Schlauch ;-)
Aber trotzdem vielen dank für die schnelle Hilfe.
Gibt es eigentlich ein Event das von Eplan ausgelöst wird, sobald ich im Schaltplan eine andere Funktion auswähle?
Ich würde mir gerne in einem eigenen Navigator zusätzliche Informationen zum gerade ausgewählten Schaltzeichen anzeigen lassen?
Speichere einfach die Rückgabe von SelectionSet.Selection zwischen und prüfe ob sich das Objekt bzw. Objekte geändert haben.
Die Idee hatte ich auch schon. Aber ich müsste halt in relativ kurzen Abständen pollen. Und das gefällt mir nicht so wirklich .
Wenn mir mal ganz langweilig ist,versuche ich mal das Click Event abzufangen. Dann hätte ich nen Trigger und könnte das SelectionSet nur bei Bedarf vergleichen.
Ich nutze für sowas das Event ActualiseMenuConditions.
Das funktioniert für Selektion in den Navigatoren und im GED.
Würde aber trotzdem nen double Check / Lock machen.
Hat jemand schon eine Möglichkeit gefunden die Breite bzw. Höhe der DialogBar per Code festzulegen? Diese ist ja unabhängig von der Größe des UserControls.
Oder zumindestens die eingestelle Größe zu speichern. Dies funktioniert (zu mindestest bei mir) auch nicht über die ElementStateCollection?
Hallo Johann, Bei Laden des Scripts kommt bei mir Fehlermeldung, dass Namespace Eplan keine Erweiterung EplSDK hat!? Also alle Erweiterungen Eplan.EplSDK.WPF. … funktionieren nicht …
Obwohl die Dlls liegen da, wo die andere benötigte Dlls ligen! Danke.
Hallo Wladimir,
es handelt sich hier um ein API-Addin und nicht um ein Script.
Hi Johann,
I’d like to know if the use of WPF is a requirement, or if a Windows Forms UI could be used instead.
Thank you
A navigator can only be created via WPF. But you can add Windows Forms controls via the class `WindowsFormsHost`.