Heute gibts mal wieder ein Schmankerl. Gleich am Anfang vielen Dank an Birdo für die Bereitstellung.
Die versteckte Action RegisterCustomPropertyEditorAction welche nicht dokumentiert ist, kann uns das Leben leichter machen. Mit Hilfe dieser Action könnt ihr eigene Auswahldialoge für Projekteigenschaften erstellen.
Birdo hat das ganze auch offen gehalten, um dynamisch über eine INI-Datei, diese für einzelne Property-Ids zu setzen.
Einfach die INI-Dateien mit dem Schema PropertyId.Index.Schreibgeschütz.txt erstellen. Der Inhalt ist Tab-getrennt Value[TAB]Description.
CustomPropertyEditor (2800 Downloads )
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;
public class CustomPropertyEditor : System.Windows.Forms.Form
{
public string PathIni = @"C:\Test\CustomPropertyEditor\";
public static CustomPropertyEditor frm = new CustomPropertyEditor();
public static string ValueNew = string.Empty;
// Setup on startup EPLAN
[DeclareEventHandler("onMainStart")]
public void Startup()
{
RegisterCustomPropertyEditor();
}
[DeclareRegister]
public void RegisterCustomPropertyEditor()
{
LoadScript("true");
}
[DeclareUnregister]
public void UnregisterCustomPropertyEditor()
{
LoadScript("false");
}
private void LoadScript(string register)
{
foreach (string FullFilename in Directory.GetFiles(PathIni))
{
try
{
string Filename = Path.GetFileNameWithoutExtension(FullFilename);
if (Filename != null)
{
string[] parameters = Filename.Split('.');
Eplan.EplApi.ApplicationFramework.ActionCallingContext acc =
new Eplan.EplApi.ApplicationFramework.ActionCallingContext();
acc.AddParameter("Register", register);
acc.AddParameter("Action", "CustomPropertyEditor");
acc.AddParameter("PropertyId", parameters[0]);
acc.AddParameter("PropertyIndex", parameters[1]);
acc.AddParameter("Editable", parameters[2]);
new CommandLineInterpreter().Execute("RegisterCustomPropertyEditorAction", acc);
BaseExceptionMessage("RegisterCustomPropertyEditorAction: " +
"PropertyId:" + parameters[0] +
" PropertyIndex:" + parameters[1] +
" Editable:" + parameters[2]);
}
}
catch (System.Exception ex)
{
BaseExceptionError("RegisterCustomPropertyEditorAction: " + ex.Message);
}
}
}
[DeclareAction("CustomPropertyEditor")]
public void Function(int PropertyId, int PropertyIndex, int DbObjectId, ref string Value, out int DialogModalResult, out string DialogModified)
{
// form
frm.lblPropertyId.Text = PropertyId.ToString();
frm.lblPropertyIndex.Text = PropertyIndex.ToString();
frm.lblDbObjectId.Text = DbObjectId.ToString();
frm.lblCurrentValue.Text = Value;
frm.ShowDialog();
// values
DialogModified = "1";
if (frm.DialogResult == DialogResult.OK)
{
DialogModalResult = 1;
Value = ValueNew;
}
else
{
DialogModalResult = 0;
}
}
private static void BaseExceptionMessage(string message)
{
Eplan.EplApi.Base.BaseException bexMessage = new BaseException(message, MessageLevel.Message);
bexMessage.FixMessage();
}
private static void BaseExceptionError(string error)
{
Eplan.EplApi.Base.BaseException bexMessage = new BaseException(error, MessageLevel.Error);
bexMessage.FixMessage();
}
private void CustomPropertyEditor_Load(object sender, System.EventArgs e)
{
// Search for INI-File
string FileIni = string.Empty;
foreach (string file in Directory.GetFiles(PathIni).Where(file => file.StartsWith(PathIni + lblPropertyId.Text + "." + lblPropertyIndex.Text)))
{
FileIni = file;
break;
}
// Listview
if (File.Exists(FileIni))
{
livi.Items.Clear();
string[] lines = File.ReadAllLines(FileIni, Encoding.UTF8);
foreach (string line in lines)
{
string[] items = line.Split('\t');
ListViewItem item = new ListViewItem(items[0]);
item.SubItems.Add(items[1]);
livi.Items.Add(item);
}
livi.Sorting = SortOrder.Ascending;
livi.Sort();
livi.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
else
{
MessageBox.Show("INI-File not found:\n" + FileIni, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void btnOk_Click(object sender, System.EventArgs e)
{
Ok();
}
private void Ok()
{
try
{
ValueNew = livi.SelectedItems[0].SubItems[0].Text;
this.DialogResult = DialogResult.OK;
this.Close();
}
catch (System.Exception)
{
MessageBox.Show("No value selected", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void livi_DoubleClick(object sender, System.EventArgs e)
{
Ok();
}
}
Tolle Sache, das kann ich gut gebrauchen.
Auch von mir vielen Dank an Birdo für das Script, toll gemacht. :smile:
gruß
FrankS
Vielen Dank, genau nach so etwas habe ich gesucht. Dass die Felder dadurch schreibgeschützt werden können (false), finde ich besonders toll ;)
Ein kleiner Hinweis für alle, die auch Probleme mit Sonderzeichen (Umlaute, ², Zeilenumbrüche für EPLAN) haben: Die Zeile 117 wie folgt abändern:
Vielen Dank für den Hinweis.
Generell sollte hier mit UTF8 Enconding gearbeitet werden. Habe das Script angepasst. Auf GitHub sind auch Beispieldateien mit passendem Enconding.
Hierfür ist unter Windows Notepad++ zu empfehlen. Zeigt die Kodierung / Zeichensatz an und kann diese auch konvertieren.
Ist es grundsätzlich auch möglich, dieses Tool auf die Freien Eigenschaften in der Artikelverwaltung zu übertragen? Wir nutzen hier bestimmte Felder z.B. für den Lagerstatus. Ein Auswählen wäre auch hier schöner als tippen oder copy/paste…
Leider ist es nur möglich auf folgende Eigenschaften den CustomPropertyEditor zu registrieren:
Somit leider nicht auf die Artikeldatenbank :(
Guten Tag!!! Ich benutze seit langem diese Einstellung, aber vor dem Problem: Projekteigenschaften: für das Feld 40001…40100 funktionieren nicht :(.
Was könnte der Grund sein? Eplan 2.3
Verstanden. Meine Kopie des Skripts unterscheidet sich von laid jetzt.
Wurden die änderungen. Neu installiert und alles funktionierte.
Danke!!!
Kleine Ergänzung: die Action ist seit der EPLAN Version 2022 auch dokumentiert https://eplan.help/en-us/Infoportal/Content/api/2022/RegisterCustomPropertyEditorAction.html