using Eplan.EplApi.Scripting; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace EplanScripting.Scripts.Numbering { class NumberConnections { [Start] public void Do() { string value = "1"; Utils.InputBox("Eingabe", "Startwert", ref value); int startNumber = value.ToInteger(); var selection = GetSelection(); var connectors = GetStrandConnectors(selection).OrderBy(c => c.LocationX); var busbars = GetBusConnectors(selection).OrderBy(p => p.PageNumber).ThenBy(c => c.LocationX); foreach (var connector in connectors) { connector.Designation = startNumber.ToString(); ++startNumber; } foreach (var busbar in busbars) { System.Diagnostics.Debugger.Break(); busbar.Designation = startNumber.ToString(); ++startNumber; } } private IEnumerable GetSelection() { var _HEServicesAssembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(a => a.FullName.StartsWith("Eplan.EplApi.HEServices")); var typeSelectionSet = _HEServicesAssembly.ExportedTypes.FirstOrDefault(t => t.Name == "SelectionSet"); object selectionSet = Activator.CreateInstance(typeSelectionSet); selectionSet.SetProp("LockSelectionByDefault", false); IEnumerable selection = (IEnumerable)selectionSet.GetProp("Selection"); return selection; } private List GetStrandConnectors(IEnumerable selection) { List connectorsList = new List(); var connectors = selection.Where(s => s.GetType().ToString() == "Eplan.EplApi.DataModel.StrandConnector"); foreach (var connector in connectors) { var strandConnectorWrapper = new StrandConnectorWrapper(connector); connectorsList.Add(strandConnectorWrapper); } return connectorsList; } private List GetBusConnectors(IEnumerable selection) { var busbarConnectorsList = new List(); var functions = selection.Where(s => s.GetType().ToString() == "Eplan.EplApi.DataModel.Function"); var busbars = functions.Where(s => s.GetProp("Category").ToString() == "Busbar"); foreach (var busbar in busbars) { BusbarConnectorWrapper busbarConnectorWrapper = new BusbarConnectorWrapper(busbar); busbarConnectorsList.Add(busbarConnectorWrapper); } return busbarConnectorsList; } } public class StrandConnectorWrapper { public object StrandConnectorObj { get; set; } public string Designation { get { return StrandConnectorObj.GetProp("Properties").GetProp("STRANDCONNECTOR_DESIGNATION").ToString(); } set { StrandConnectorObj.GetProp("Properties").SetProp("STRANDCONNECTOR_DESIGNATION", Utils.GetPropertyValue(value)); } } public double LocationX { get { return (double)StrandConnectorObj.GetProp("Location").GetProp("X"); } set { } } public double LocationY { get { return (double)StrandConnectorObj.GetProp("Location").GetProp("Y"); } set { } } public StrandConnectorWrapper(object obj) { StrandConnectorObj = obj; } } public class BusbarConnectorWrapper { public object BusConnectorObj { get; set; } public string Designation { get { return BusConnectorObj.GetProp("Properties").GetProp("FUNC_CONNECTIONDESIGNATION", 1).ToString(); } set { BusConnectorObj.GetProp("Properties").SetProp("FUNC_CONNECTIONDESIGNATION", Utils.GetPropertyValue(value), 1); } } public int PageNumber { get { return BusConnectorObj.GetProp("Properties").GetProp("INSTANCE_PAGENAME").ToString().ToInteger(); } set { } } public double LocationX { get { return (double)BusConnectorObj.GetProp("Location").GetProp("X"); } set { } } public double LocationY { get { return (double)BusConnectorObj.GetProp("Location").GetProp("Y"); } set { } } public BusbarConnectorWrapper(object obj) { BusConnectorObj = obj; } } public static class Utils { public static object GetPropertyValue(string txt) { var _dataModelAssembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(a => a.FullName.StartsWith("Eplan.EplApi.DataModelu")); var typePropertyValue = _dataModelAssembly.ExportedTypes.FirstOrDefault(t => t.Name == "PropertyValue"); object propValue = Activator.CreateInstance(typePropertyValue); MethodInfo setValue = typePropertyValue.GetMethod("Set", new[] { typeof(string) }); var args = new object[] { txt }; setValue.Invoke(propValue, args); return propValue; } public static object GetProp(this object obj, string name) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); PropertyDescriptor prop = properties.Find(name, false); return prop.GetValue(obj); } public static object GetProp(this object obj, string name, int index) { Type type = obj.GetType(); var info = type.GetProperties().FirstOrDefault(p => p.ToString().Contains(name + " [Int32]")); if (info == null) { return null; } return info.GetValue(obj, new object[] { index }); } public static void SetProp(this object obj, string name, object value) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj); PropertyDescriptor prop = properties.Find(name, false); prop.SetValue(obj, value); } public static void SetProp(this object obj, string name, object value, int index) { Type type = obj.GetType(); var info = type.GetProperties().FirstOrDefault(p => p.ToString().Contains(name + " [Int32]")); info.SetValue(obj, value, new object[] { index }); } public static DialogResult InputBox(string title, string promptText, ref string value) { Form form = new System.Windows.Forms.Form(); Label label = new System.Windows.Forms.Label(); TextBox textBox = new System.Windows.Forms.TextBox(); Button buttonOk = new System.Windows.Forms.Button(); form.Text = title; label.Text = promptText; textBox.Text = value; buttonOk.Text = "OK"; buttonOk.DialogResult = System.Windows.Forms.DialogResult.OK; label.SetBounds(9, 10, 225, 13); textBox.SetBounds(12, 36, 225, 20); buttonOk.SetBounds(110, 72, 75, 23); label.AutoSize = true; textBox.Anchor = textBox.Anchor | System.Windows.Forms.AnchorStyles.Right; buttonOk.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; form.ClientSize = new System.Drawing.Size(250, 107); form.Controls.AddRange(new System.Windows.Forms.Control[] { label, textBox, buttonOk }); form.ClientSize = new System.Drawing.Size(System.Math.Max(200, label.Right + 10), form.ClientSize.Height); form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; form.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; form.MinimizeBox = false; form.MaximizeBox = false; form.AcceptButton = buttonOk; System.Windows.Forms.DialogResult dialogResult = form.ShowDialog(); value = textBox.Text; return dialogResult; } public static int ToInteger(this string txt) { int value = 0; if (int.TryParse(txt, out value)) { return value; } else { return 1; } } } }