PDFs Exportieren

Die einfache Variante

Wenn beim Schließen des Projektes einfach nur das PDF ausgeschrieben werden soll? Kein Problem, denn das hat Johann Weiher schon als schönes Beispiel dargestellt. Nun soll das PDF nicht einfach nur den Projektordner abgelegt werden, sondern in einen bestimmten Ordner in der zentralen Datenverwaltung auf einem Netzlaufwerk. Basis ist das verlinkte Script mit ein paar kleinen Anpassungen. Die Zentrale Funktion ist die EXPORT-Funktion.

using System;
using System.IO;
using System.Windows.Forms;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;

public class pdf_export_onclose {
  [DeclareEventHandler("Eplan.EplApi.OnUserPreCloseProject")]
  public void Function() {
    // Projektpfad nur als Backup
    string projectPath = PathMap.SubstitutePath("$(PROJECTPATH)");
    // Nehmen wir an, das Feld Projektname beinhaltet immer eine valide Projektnummer
    string projectName = PathMap.SubstitutePath("$(PROJECTNAME)");
    // Projektnummer validieren
    string komnr = getProjectNumber(projectName);
    // Der zentrale Ordner im Unternehmen für dieses Projekt
    string komfPath = getProjectPath(komnr);
    // finale Zielordner
    string dstfolder = '';
    
    // Prüfen ob der Kommissionsordner gefunden werden konnte, sonst Fallback
    if (komfPath != '') {
      dstfolder = komfPath;
    } else {
      dstfolder = projectPath;
    }
    
    DialogResult dialogResult = MessageBox.Show(
        "Soll ein PDF für das Projekt'" + "\n" + projectName + "'" + "\n" + " erzeugt werden?" +
            "\n" + "\n" + "Ziel: " + dstfolder,
        "PDF-Export", MessageBoxButtons.YesNo, MessageBoxIcon.Question
    );

    if (dialogResult == DialogResult.Yes) {
      Progress progress = new Progress("SimpleProgress");
      progress.SetAllowCancel(true);
      progress.SetAskOnCancel(true);
      progress.BeginPart(100, "");
      progress.ShowImmediately();

      CommandLineInterpreter cli = new CommandLineInterpreter();
      ActionCallingContext acc = new ActionCallingContext();

      string fullFileName = Path.Combine(dstfolder, projectName);
      acc.AddParameter("TYPE", "PDFPROJECTSCHEME");
      acc.AddParameter("EXPORTFILE", fullFileName);
      acc.AddParameter("EXPORTSCHEME", "EPLAN_default_value");
      acc.AddParameter("USEPRINTMARGINS","1");

      cli.Execute("export", acc);

      progress.EndPart(true);
    }
    return;
  }
  public string getProjectNumber (string str) {
    // RegularExpression definieren wie oben in Lösung I
    Regex obj_regex = new Regex("([pP][0-9]{4}-[0-9]{5})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
    // Pattern nun gegen den String str prüfen
    Match obj_match = obj_regex.Match(str);
    // Wenn es ein Match gibt, Projektnummer zurückgeben
    if (obj_match.Length > 0) { return obj_match.Value; }
    return "";
  }
  public string getProjectPath (string str_ProjNo) {
    string str_startpath = @"\\<Server>\<sharefolder>\<projektstammordner>"
    if (str_ProjNo != "") {
      try {
        // nur in der obersten Ebene Suchen, da auch Unterordner mit einer Projektnummer existieren könnten
        string[] str_dirs = Directory.GetDirectories(str_startpath, str_ProjNo + "*", 
                            SearchOption.TopDirectoryOnly);
        return str_dirs[0];
      } catch (Exception) {
        return "";
      }
    }
    // vielleicht hier eine Fehlermeldung, weil nicht gefunden oder Problem aufgetreten
    return "";
  }
}

Als EXPORTSCHEME kann ein definiertes Schemata genutzt werden (meine Empfehlung) oder auch als Parameter weg gelassen werden (nutzt dann immer das zuletzt genutzte Schemata -> mögliche unerwünschte Effekte). Solange es nur eine Variante des Plans gibt, ist alles tuti und soweit auch völlig ausreichend.

Weiterlesen