PDF Publisher – Teil 1

Guten Abend Zusammen,

Ich habe mir überlegt, das wir zusammen eine kleine Software entwickeln die PDF-Dateien für Idws/Dwgs nach dem Freigabeprozess erzeugt.

Ich würde mich freuen, wenn ihr euch durch Kommentare, Ideen am Projekt beteiligt. Das Projekt kann Live auf Github verfolgt werden.

Programm-Ablauf

Meine persönliche Meinung ist, das es besser wäre, wenn der PDF-Erstellungsprozess nicht direkt über den Autodesk Jobserver läuft, sondern in einer separaten Anwendung abgearbeitet wird. Dies hätte z.B. den Vorteil, das wir den Autodesk JobServer nicht durch den PDF-Erstellungsprozess blockieren und keine langwierigen Wartezeiten für die Konstrukteure generieren.

Der praktische Ablauf sollte dann wie folgt aussehen:

  • Änderung des Zeichnungsstatus auf Freigegeben
  • Job-Addin (Autodesk Jobserver) schreibt einen Eintrag in unsere Datenbank
  • Unser Job-Server sieht Intervall bezogen nach, ob neue Jobs vorhanden sind
  • Abarbeitung unserer Jobs (PDF-Generierung)

Folgende Jobs werden wir erstmal schreiben:

  • PDF-Generierung für Autodesk Inventor
  • Hinterlegen, der PDF-Dateien als Anhang der jeweiligen Datei in Vault
  • Ablage der PDF-Datei in einem Vault-Spiegelverzeichnis

Mal sehen, was uns da noch so alles im Laufe der Entwicklung einfällt🙂

Architektur

Vorerst, dachte ich an folgende Technologien.

  • WPF/PRISM/MVVM für die Jobserver Applikation
  • SQL-Compact DB für den Job-Table und Einstellungen
  • EntityFramework für den Zugriff auf die Datenbank
  • Die Jobs als separate Module, die von PRISM geladen werden
  • Eventuell Job-Sheduler  z.B. „Quartz.NET“ [noch offen]

Vielleicht ist eine 3-Schichtige Backend Architektur auch übertrieben für unseren Anwendungsfall, aber das gibt uns Spielraum für eventuelle spätere Erweiterungen, z.B. könnte dies ein Service sein, damit Konstrukteure selber bestimmte Jobs auslösen können.

architektur
Architektur

Was das Projekt noch so alles mit sich bringt, werden wir dann ja sehen. Ich würde mich sehr über Kommentare freuen, was ihr davon haltet.

Gruß Ralph

VAULT Benutzer-Rollen

Hallo Zusammen,

heute gibt es nur einen sehr kurzen Post. Neulich habe ich eine ERP-Schnittstelle entwickelt. Darunter gab es auch einen Dialog für administrative Einstellungen. Dieser Dialog sollte natürlich auch nur für einen Administrator erreichbar sein.

Ich habe einen kleine Funktion geschrieben, mit der sich überprüfen lässt, ob einem angemeldeten Benutzer eine bestimmte Rolle (z.B. Administrator) zugeordnet ist.

checkrole

Ich wünsche euch ein schönes langes Wochenende.

Gruß Ralph

 

VolumeCalculator

Hallo Zusammen,

für den heutigen Post, habe ich das Projekt aus dem letzten Post um eine Schleifenberechnung ergänzt. Diese Schleife längt den Quader solange, bis das gewünschte Zielvolumen erreicht ist.

Bei einem so einfachen Modell wie diesem Quader könnte man natürlich die Länge sehr viel einfacher errechnen, aber stellen wir uns einfach vor, es handelt sich hier um ein hoch kompliziertes Volumen Modell.

Wie immer, könnt ihr das Projekt von Github laden.

Calculation Klasse

Für die Berechnung habe ich das Projekt um eine Klasse namens Calculation ergänzt. Diese Klasse enthält einen BackgroundWorker, der nach dem Start, das aktuelle Volumen mithilfe der InventorService Methode GetiPropertyVolume ausliest und die Länge der Extrusion solange um 1 erhöht, bis das Zielvolumen größer gleich dem aktuellen Volumen ist.

 

backgroundworker
Berechnungslogik

 

Gruß Ralph

Cube-Builder

Hallo Zusammen

Heute zeige ich euch, wie man mithilfe der Autodesk Inventor-API automatisiert ein Bauteil erstellen kann. Ich demonstriere euch dies anhand eines simplen Quaders. In der Beispielsoftware wird Länge, Breite und Tiefe eingegeben. Beim Klick auf Erstellen wird dann im aktuell geöffneten Inventor Bauteil (*.ipt) ein Quader erstellt. Nach Erstellung wird das Volumen des Bauteils ausgelesen und im Beispielprogramm angezeigt.

Das Beispiel kann unter Github geladen werden.

cubebuilder

Erklärung

Kommen wir zur  Beschreibung der wichtigsten Bestandteile. Die Anwendung ist mit dem MVVM Pattern entwickelt. Sie besteht aus zwei Projekten. Zum ersten aus der WPF-Anwendung und zum zweiten aus einer Klassenbibliothek in der sich der InventorService befindet.

Damit die Inventor API verwendet werden kann, muss unsere Anwendung auf die Inventor.dll referenzieren. Dies ist zum Beispiel möglich durch einbinden der Autodesk.Inventor.Interop.dll. Sie ist im  Inventor Installationsverzeichnis zu finden.

  • C:\Program Files\Autodesk\Inventor 2017\Bin\Public Assemblies

Der InventorService umfasst im Großen und Ganzen 3 Methoden.

CreateRectangle

Die erste Funktion erstellt eine Skizze mit einem Rechteck im aktuell geöffneten Inventor Bauteil und gibt ein Skizzen Objekt zurück.

createrectangle

ExtrudeSketch

Die zweite Methode extrudiert eine übergebenes Skizze Objekt.

extrude

GetIPropertyVolume

Last but not Least, lesen wir dann das Volumen des Inventor Bauteils aus.

iproperty

Gruß Ralph

PRISM mit VAULT

Guten Abend liebe Autodesk-Community,

diese Woche gibt es einen Post über die Integration des Application-Frameworks PRISM in ein Autodesk Vault Addin. Ich selbst benutze PRISM sehr oft, da es viele komfortable Lösungen für alltägliche Probleme im Leben eines Programmierers bietet.

Solltet ihr diese Framework nicht kennen, hier eine kurze Zusammenfassung. Prism zerlegt die Bestandteile eines Programms in sogenannte Module. Die einzelnen Views aus diesen Modulen können dann zur Laufzeit der Software in sogenannte Regions geladen werden. Der große Vorteil daran ist, das die einzelnen Module sehr wartungsfreundlich sind und mit geringen aufwand ausgetauscht werden können. Prism ist also so eine Art Gerüst das sich um die Applikation strikt und das laden/verwalten der einzelnen Bausteine übernimmt.

Was Prism meiner Meinung nach so großartig macht ist unter anderem der Aspekt, dass man es in Verbindung mit Dependancy Injection verwendet. Bei der Dependency Injection registriert man in der Regel Interfaces in Kombination mit Klassen an einem sogenannten DependencyContainer. Dieser sorgt dann zur Laufzeit der Software für die automatische Erzeugung der Objekte.

Im Framework ist auch der sogenannte EventAggregator enthaltet. Dieser übernimmt das Event-Handling. Sehr praktisch ist, das Sender und Empfänger durch dieses Konzept nichts voneinander wissen müssen.

Prism ist OpenSourcen und kann von Github geladen werden.

Hier der noch der Github-Link zum VaultPrismAddin

Beispiel Erklärung

Nun, sprechen wir mal über das Beispiel-Programm. Ich habe ein kleines Addin für Vault geschrieben das sich beim Startup mit einem Prism Bootstrapper initialisiert. Das Addin erweitert das FileContextMenu im Vault um einen Button namens „PRISM Command“. Dieser öffnet eine Shell  in die zwei Test Views geladen werden. View A zeigt die selektierten Dateien in einer ListBox und View B, den Ordner der selektierten Datei aus View A.

Beim erstellen eines Vault Addin muss sich dieses im Order C:\ProgramData\Autodesk\Vault 2017\Extensions befinden. Beim Start von Vault wird dieses Verzeichnis und alle darin befindlichen Unterordner nach  *.vcet.config-Dateien durchsucht. Durch diese Dateien ist es dann Vault möglich die Addins zu laden.

vcet-configfile

  •  PrismVaultAddin.CmdTextExtension gibt den Namespace einschließlich der Klasse die das IExplorerExtension-Interface implementiert an
  • PrismVaultAddin“ ist der Name der Addin-.dll-Datei.

Mehr dazu könnt ihr auch in der VaultSDK lesen.

Die benötigten Prism Packages können über den Nuget-Explorer geladen werden.

Prism.JPG

Projekt Einstellungen

Nun noch ein paar kleine Einstellungen in der Klassenbibliothek anpassen und wir sind fast bereit zum programmieren.

vcet-config-postbild

  • PreBuild-Event, damit die *.vcet-Datei im Addin Ordner landet

ausgabepfad

  • Ausgabepfad der Klassenbibliothek auf den Addin Ordner umstellen

debugstartup

  • Beim Debuggen, auf externes Programm umstellen (Vault-Explorer)
    („C:\Program Files\Autodesk\Vault Workgroup 2017\Explorer\Connectivity.VaultWkg.exe“)

cmdtestextensions

Legen wir jetzt noch die CmdTestExtensions Klasse an, die das IExplorerExtension Interface implementiert.

  • ApiVersion -> ändert sich von Version zu Version.
  • ExtensionId -> wird für die Registrierung des Addins benötigt

Das Addin kann jetzt gestartet werden🙂

DebugFirst.JPG

Kommen wir nun zu den interessanten Dingen und sehen uns den Aufbau ein wenig näher an. In der Methode OnStartup(), instanziiere ich den Prism Bootstrapper und in der Methode LogOn() registriere ich den VaultService am UnityContainer.  In den VaultService wird das IApplication-Interface übergeben. Dieses bietet dann Zugriff auf die Vault Api.

OnLogON.JPG

Bootstrapper

Die Bootstrapper Klasse erbt von der Klasse UnityBootstrapper. Durch überschreiben der einzelnen Methoden aus der Basisklasse wird Prism konfiguriert.

Wir überschreiben folgende Methoden

CreateShell

Setzt den ApplicationShutdown der Anwendung auf OnExplizitShutdown. Machen wir das nicht, wird unsere Anwendung nach schließen der BaseShell geschlossen. Ein erneutes öffnen durch den PRISM Command wäre dann nicht möglich

ConfigureContainer

In dieser Methode besteht die Möglichkeit Interfaces in Verbindung mit Klassen am DependencyContainer zu registrieren. Zudem setzten wir den ServiceLocator. Diesen verwenden wir dann im Rest der Anwendung. Der ServiceLocator bietet nur die nötigsten Dinge, wie auflösen der registrierten Typen. Ich finde der UnityContainer ist zu übertrieben um in jede Klasse injiziert zu werden. Meiner Meinung nach käme das gleich, als würde man mit einer Panzerfaust auf Spatzen schießen.

CreateModuleCatalog

Zu guter Letzt laden wir den ModuleCatalog. Dieser beschreibt, die einzelnen Module. Wichtig dabei ist das die Build Eigenschaft des ModuleCatalogs auf Resource steht.

 

bootstrapper
Bootstrapping

 

prismmodulecatalog
ModuleCatalog

 

 

ShellService

Ich habe einen kleinen ShellService geschrieben, der sich in Verbindung mit dem Interface IShellService am Dependency Container registriert. Dieser Service enthält unter anderem  die Methode ShowShellsInBaseView(). Sie öffnet die BaseShell und die beiden Views aus ModulA und ModulB werden geladen.

Der Service übergibt auch den RegionManager in die BaseShell und kümmert sich um den Dispose() beim schließen der BaseShell.

createshell

ModulViewA

Sind nun ein oder mehrere Dateien im VaultExplorer makiert wird durch drücken des ContextCommands PRISM Command der Handler TestCmdItem_Execute aufgerufen. Durch  die Prism Methode RequestNavigate(), wird ViewA geladen und die selektierten Files werden mit Hilfe der Klasse NavigationParameters in das ViewAViewModel übergeben. ViewA zeigt die Namen der Files in einer ListBox an.

TestExecute.JPG

Im ViewAViewModel ist eine Property namens SelectedFile vorhanden. Sie gibt ihren Wert an den EventAggregator aus PRISM weiter.

SelectedFile.JPG

ModulViewB

Das ViewModel von ViewB registriert sich an dem SelectedFileChanged-Event und lädt bei Empfang einer Datei den zugehörigen Ordner über die Methode GetFolderById() aus dem VaultService in die View.

Wichtig ist, dass das Event beim Schließen der View vom Event-Aggregator ab registriert wird.

onfilechangedIch finde es immer wieder absolut faszinierend, welche Möglichkeiten sich durch Programmierung ergeben. Hoffe ich konnte euch durch diesen Post wieder ein paar coole Dinge zeigen. Wenn Ihr fragen zu dem Thema habt, fühlt euch frei und hinterlasst eine Kommentar oder schreibt mir per E-Mail. Beim nächsten Post zeig ich euch etwas zur Inventor-API.😉

Gruß  Ralph

Anwendungssetup (My Best Practise)

Guten Abend zusammen,

heute gibt es nur einen kleinen Post. Ich erzähl euch ein bisschen was über das erstellen einer neuen Vault-API Anwendung. Damit diese funktioniert, müssen ein paar Punkte erfüllt sein.

Zum ersten müssen sich  folgende *.dll-Dateien  im Anwendung-Startup Ordner befinden. Ich referenziere diese immer gleich im Projekt.

references
API-Referenzen

Zu finden sind Sie unter

  • C:\Program Files (x86)\Autodesk\Autodesk Vault 2017 SDK\bin\x86
  • C:\Program Files (x86)\Autodesk\Autodesk Vault 2017 SDK\bin\x64

nach erfolgreicher Installation der Autodesk-Vault-SDK.

  • C:\Program Files\Autodesk\Vault Workgroup 2017\SDK\Setup.exe

Achtung

Bei Verwendung der x64 *.dll-Dateien, muss auch die Anwendung in x64 kompiliert werden.

Der letzte Schritt, ist das kopieren  der „clmloader.dll“-Datei in den Anwendungs-Startup Ordner. Diese befindet sich auch im jeweiligen Vault-SDK Ordner. (x86/x64)

clmloader

Und nun steht einer erfolgreichen Anmeldung an der Autodesk Vault-Api nichts mehr im Wege. :)

vaultlogin
Aufruf Login Dialog

Weitere Informationen zu den einzelnen *.dll-Dateien und der API können dem SDK-Handbuch entnommen werden.

  • C:\Program Files (x86)\Autodesk\Autodesk Vault 2017 SDK\docs\VaultSDK.chm

Gruß Ralph