Anbei eine Möglichkeit ein Seitenmakro per Script einzufügen. Diese Action ist nicht von EPLAN dokumentiert.
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;
public class InsertPageMacro
{
[Start]
public void InsertPageMacroVoid()
{
string strFilename = @"C:\test.emp";
ActionCallingContext oAcc = new ActionCallingContext();
CommandLineInterpreter oCLI = new CommandLineInterpreter();
oAcc.AddParameter("filename", strFilename);
oCLI.Execute("XMInsertPageMacro", oAcc);
}
}

Danke.
Ich sehe eine Nutzung für.
Gr. Den
Hallo,
ich habe das Skript getestet leider mit mäßigem Erfolg.
Ich hatte es so verstanden, das ich mit dem Skript dieses Makro einfüge welches in dem Filename hinterlegt ist.
Den Pfad hatte ich natürlich auf meine Struktur angepasst sowie den Dateinamen.
Habe ich da vielleicht was falsch gemacht?:sad:
Poste doch bitte mal dein Script. Dann können wir Fehlersuche machen :silly:
Hi,
The above code works fine with me, but is it possible to pass the position coordinates (x,y) where we want to place the window macro on the page.
rgds
ist es möglich, die Seitenzahl im Makro zu bestimmen?
Was meinst du genau mit der Seitenanzahl?
Im Makro sind alle Seiten / Anzahl fest definiert.
Hallo Leute,
das Script funktioniert super, aber ist es möglich gleichzeitig mehrere Seitenmakros einzufügen?
Bekomme es zwar hin über eine for-Schleife mehrere Makros nacheinander einzufügen, aber da muss man nach jedem Makro das Einfügen per „ok“ in Eplan bestätigen, und das nervt irgendwie.
Wäre nett wenn mir da auf die schnelle jemand weiterhelfen könnte.
mfg
florian
Ist leider direkt nicht möglich.
Man müsste manuell alles Makros welche eingefügt werden sollen vorher einlesen und in ein Makro (xml) schreiben und diese Datei dann einfügen.
Könnte man das Script dahingehend erweitern, eingefügte Seitenmakros zu aktualisieren?
Durch den fehlenden MAkrokasten bietet Eplan diese Funktion nicht.
Lieder gibt es keine Möglichkeit.
What does it mean that i have to insert all page macro in a xml file?
If you want to replace them it would be the easiest way.
Gibt es eine Möglichkeit, auszuwählen, welche Variante des Seitenmakros man einfügen kann? Mit dem vorhandenen Code wird nur Variante A eingefügt.
Ich bin ein bisschen verwirrt. Ein Seitenmakro hat nur eine Variante.
Nur eine Frage.
Ist es möglich, die Bestätigung per Skript zu automatisieren?
Das geht leider nur über die API.
Servus.
Da ploppt ja ein Dialog auf, den man befüllen muss (Struktur der Seite, ==,=,++,+,&,#)
Kann man das irgendiw alles per Skript mitgeben, sodass ich maximal nur noch „OK“ klicken muss?
vG
Henrik
Hallo Henrik,
das ist leider nur via API möglich.
Hey Johann!
Okay, schnallt euch an – ich hab da einen absolut finsteren Hack für euch am Start!
Ich hab das mal in meinem Bibo-Projekt auf Herz und Nieren getestet (wo ich so ziemlich alle Strukturen gleichzeitig abfackle). Das Skript zieht sich eine komplette Pfadstruktur und zieht daraus automatisch eine neue Seite hoch – inklusive eigener Logik, welche Ordner als ==, =, ++, + etc. gemappt werden.
Dank dem guten alten Spy++ aus alten Visual Studio 6 Zeiten war das Window-Handle vom Dialog im Nu abgegriffen. Der Rest war nur noch ein bisschen Win32-API-Zauberei und Code-Hinblasen… und zack: Die Seite steht. Punktgenau nach meinen Regeln, ohne dass der Dialog rumzickt!
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;
public class AddSite
{
// Win32 API Funktionen für das Fenster-Handling
[DllImport(„user32.dll“, SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport(„user32.dll“, SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport(„user32.dll“)]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport(„user32.dll“, CharSet = CharSet.Auto)]
private static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private const uint BM_CLICK = 0x00F5;
// Schlüsselwörter, die trotz mittlerer Position im Pfad zu ‚==‘ gehören
private static readonly HashSet SpecialKeywords = new HashSet(StringComparer.OrdinalIgnoreCase)
{
„Mechanik“,
„Elektrotechnik“,
„Fluid“
};
[Start]
public void CreateStructureElement()
{
CommandLineInterpreter interpreter = new CommandLineInterpreter();
ActionCallingContext context = new ActionCallingContext();
// 1. Eingabeparameter definieren
string macroPath = @“\\edata\edata\eplan\allpolig.emp“;
string ordnerPfad = @“Artikelmakros\Mechanik\Gehaeuse\Henrik\DickeWand“;
string seitenName = „A.1“;
string seitenBeschreibung = „Deckblatt“;
// 2. Tab-getrennten String für EPLAN generieren
string clipboardData = BuildClipboardFromPath(ordnerPfad, seitenName, seitenBeschreibung);
// 3. Action Context vorbereiten
context.AddParameter(„FILENAME“, macroPath);
// // 4. Thread zur Steuerung des „Struktur anpassen“-Dialogs starten
Thread windowHandler = new Thread(() =>
{
IntPtr hwndDialog = IntPtr.Zero;
for (int i = 0; i < 25; i++)
{
Thread.Sleep(100);
hwndDialog = FindWindow("#32770", "Struktur anpassen – allpolig.emp");
if (hwndDialog != IntPtr.Zero) break;
}
if (hwndDialog != IntPtr.Zero)
{
// String in die Zwischenablage legen
Clipboard.SetText(clipboardData);
// Dialog fokussieren
SetForegroundWindow(hwndDialog);
Thread.Sleep(20);
// Cursor sicher ganz nach links in die erste Spalte bewegen (15 mal Links)
for (int l = 0; l < 15; l++)
{
SendKeys.SendWait("{LEFT}");
Thread.Sleep(10);
}
Thread.Sleep(20);
// Jetzt von der 1. Spalte aus einfügen (springt über Quelle hinweg direkt in Ziel)
SendKeys.SendWait("^v");
Thread.Sleep(20);
// OK-Button drücken
IntPtr hwndOkBtn = FindWindowEx(hwndDialog, IntPtr.Zero, "Button", "OK");
if (hwndOkBtn != IntPtr.Zero)
{
PostMessage(hwndOkBtn, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
}
});
// // ApartmentState für Clipboard-Zugriff
windowHandler.SetApartmentState(ApartmentState.STA);
windowHandler.Start();
// 5. EPLAN Action ausführen
interpreter.Execute("XMInsertPageMacro", context);
}
///
/// Analysiert den Ordnerpfad und baut die EPLAN-Zwischenablageszeile auf (kompatibel mit C# 5 / EPLAN Scripting).
///
private string BuildClipboardFromPath(string folderPath, string seitenname, string beschreibung, string zusatzfeld = „“)
{
string[] parts = folderPath.Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 0) return string.Empty;
List ueberAnlageList = new List(); // ==
List ueberEinbauortList = new List(); // ++
string aufstellungsort = parts[parts.Length – 1]; // #
ueberAnlageList.Add(parts[0]); // Erstes Element -> ==
for (int i = 1; i < parts.Length – 1; i++)
{
string current = parts[i];
if (SpecialKeywords.Contains(current))
{
ueberAnlageList.Add(current);
}
else
{
ueberEinbauortList.Add(current);
}
}
string ueberAnlage = string.Join(".", ueberAnlageList.ToArray());
string ueberEinbauort = string.Join(".", ueberEinbauortList.ToArray());
// 5 Tabulatoren am Anfang = Platzhalter für Quelle (=, +, Seitenname, Zusatzfeld, Seitenbeschreibung)
// Danach folgt Ziel: Überschreiben (FALSE) | == | = | ++ | + | & | # | Seitenname | Zusatzfeld | Seitenbeschreibung
return string.Format("\t\t\t\t\tFALSE\t{0}\t\t{1}\t\t\t{2}\t{3}\t{4}\t{5}",
ueberAnlage,
ueberEinbauort,
aufstellungsort,
seitenname,
zusatzfeld,
beschreibung
);
}
}