Teil 8 verpasst? Dann erst mal hier weiter!
Im achten Teil haben wir uns angeschaut, wie wir mehrere Programmschritte auf einmal rückgängig machen können. Heute wollen wir was machen, was die allermeisten von euch brauchen können, dass Ausdrucken von Zeichnungen. Ein Beispiel für die Druckfunktion finden wir in der API-Hilfe in den Samples:
Den Bespielcode bitte markieren und in unser Benutzer-VBA-Projekt einfügen. Ich habe die Public Sub noch umbenannt in ZeichnungDrucken. Das Beispiel wird bei euch wahrscheinlich nicht funktionieren, weil ca. in der Mitte des Quelltextes ein Drucker Namens "HP LaserJet 4000...." als Ausgabedrucker angegeben ist.
oDrgPrintMgr.Printer = "HP LaserJet 4000 Series PCL 6"
Wenn ihr den nicht habt, dann wird es mit dem Drucken nichts werden. Hier muss also ein Druckername exakt so eingegeben werden, wie der Drucker heißt. Ich nehme zu Testzwecken den PDFCreator, damit ich beim testen nicht unnötig viele Blätter verdrucke.
Im unteren Bereich werden die Ausgabeeigenschaften angegeben ähnlich wie im Druckendialog im Inventor.
oDrgPrintMgr.ScaleMode = kPrintBestFitScale
oDrgPrintMgr.PaperSize = kPaperSizeA4
oDrgPrintMgr.PrintRange = kPrintAllSheets
oDrgPrintMgr.Orientation = kLandscapeOrientation
Wenn wir den Druckernamen angepasst haben, dann können wir einen ersten Testlauf machen, sobald eine Zeichnung geöffnet wurde.
Bei unserer Druckroutine ist fix hinterlegt, das A4 als Blattgröße und Querformat genutzt wird und alle Blätter gedruckt werden. Wir ändern nun den Quelltext das:
- Nur das aktuelle Blatt gedruckt wird
- Bei Blattgröße A4 beim Drucker auch A4 und bei A3 und größer A3 genutzt wird
- Die Blattausrichtung beim Drucken dem des Blattes in der Zeichnung entspricht.
Setzen wir zur Untersuchung des oDrgDoc-Objekts eine Haltepunkt unterhalb und schauen in das Objekt hinein.
Wir sehen im oDrgDoc-Objekt ein ActiveSheet und darin die Eigenschaft Orientation und auch Size. Damit können wir If-Abfragen machen. Zudem die PrintRange-Eigenschaft ändern (Alles bis zum = löschen das = neu tippen dann kommen die Optionen zur Auswahl):
Das ergibt in Summe folgendes Programm, das soweit alle Anforderungen erfüllt:
Public Sub ZeichnungDrucken() 'Nur weiter wenn das aktuelle Dokument eine Zeichnung ist If ThisApplication.ActiveDocument.DocumentType = kDrawingDocumentObject Then 'Verweis auf die aktuelle Zeichnung as DrawingDocument (nicht nur Document!) Dim oDrgDoc As DrawingDocument Set oDrgDoc = ThisApplication.ActiveDocument 'Ein DruckerManager-Objekt erstellen. Dieses Objekt hat Eigenschaften und Methoden 'um die Druckeigenschaften zu definieren und den Druck abzuschicken. Dim oDrgPrintMgr As DrawingPrintManager Set oDrgPrintMgr = oDrgDoc.PrintManager 'Den Drucker festlegen auf den gedruckt werden soll 'Auskommentieren für Windows Standarddrucker oDrgPrintMgr.Printer = "PDFCreator" 'Druckeigenschaften definieren oDrgPrintMgr.ScaleMode = kPrintBestFitScale 'Abhängig von der Blattgröße die Druckblattgröße A4 oder A3 wählen. If oDrgDoc.ActiveSheet.Size = kA4DrawingSheetSize Then oDrgPrintMgr.PaperSize = kPaperSizeA4 Else oDrgPrintMgr.PaperSize = kPaperSizeA3 End If oDrgPrintMgr.PrintRange = kPrintCurrentSheet 'Blattausrichtung beim Druckenr der Ausrichtung der Inventorzeichnungsseite anpassen If oDrgDoc.ActiveSheet.Orientation = kLandscapePageOrientation Then oDrgPrintMgr.Orientation = kLandscapeOrientation Else oDrgPrintMgr.Orientation = kPortraitOrientation End If 'Druck abschicken oDrgPrintMgr.SubmitPrint End If End Sub
Als kleinen Bonus nutzen wir nun eine Kopie des Public Sub Baugruppe, das ein paar Teile vorher gemacht haben, um alle Zeichnungen der Komponenten einer IAM zu finden, zu öffnen und dann die Druckfunktion zu öffnen. Also eine Kopie der Public Sub Baugruppe erstellen und die Zeile
Call oZeichDoc.SaveAs(oZeichDoc.FullFileName & ".pdf", True)
ersetzen durch den Aufruf der Druck Sub
Call ZeichnungDrucken
Dann im oberen Bereich auf alle enthaltenen Dateien zugegriffen wird (inkl. aller Unterbaugruppen!), kann es vorkommen, dass sehr viele Zeichnung gedruckt werden. Wir ändern das ganze von Set oRefDocs = oDoc.AllReferencedDocuments auf Set oRefDocs = oDoc.ReferencedDocuments.
So sieht das fertige Programm aus (Kommentare habe ich z.T. gelöscht!):
Public Sub IAMKompDrucken() 'Ruhe im Pu** :) ThisApplication.SilentOperation = True Dim oDoc As AssemblyDocument Set oDoc = ThisApplication.ActiveDocument Dim oRefDocs As DocumentsEnumerator Set oRefDocs = oDoc.ReferencedDocuments 'oDoc.AllReferencedDocuments Dim oRefDoc As Document 'Var. die den Pfad zur Zeichnung enthält Dim Zeichnungpfad As String 'Var die die die zu öffnende Zeichnung enthält Dim oZeichDoc As Document For Each oRefDoc In oRefDocs Zeichnungpfad = Left(oRefDoc.FullFileName, (Len(oRefDoc.FullFileName) - 4)) Dim objFso As Object Set objFso = CreateObject("Scripting.FileSystemObject") 'Mit dem FileSystemobject und dessen Funktion FileExists prüfen wir, ob die Datei deren Pfad sich aus 'der Var Zeichnungpfad und der Dateiendung .dwg (ODER IDW, WENN IHR IDW NUTZT. ENTSPRECHEND ANPASSEN!) If objFso.FileExists(Zeichnungpfad & ".dwg") Then Zeichnungpfad = Zeichnungpfad & ".dwg" Set oZeichDoc = ThisApplication.Documents.Open(Zeichnungpfad, True) Call ZeichnungDrucken 'Jetzt die Zeichnung speichern und schließen Call oZeichDoc.Close(False) End If Next 'Inventor darf wieder Dialoge anzeigen ThisApplication.SilentOperation = False End Sub
Jetzt haben wir zum Einen eine Druckfunktion für eine einzelne Zeichnung und zum anderen können wir alle Zeichnungen zu Komponenten in einer IAM suchen und drucken. Das kann einem das Leben schon sehr erleichtern!
Hausaufgaben bis zum nächsten mal:
- In der Public Sub IAMKompDrucken am Anfang eine Abfrage ob nur Komponenten der ersten Ebene (ReferencedDocuments) oder alle Ebenen berücksichtigt werden (AllReferencedDocuments)
- Spiele mit den Druckoptionen etwas. Wie kann ich alles als Schwarz drucken? Welche Eigenschaften hat das DrawingPrintManager Object? Schau dir das Objekt in der Inventor API-Hilfe an.
Bis zum nächsten mal!
Schöner Artikel Merci!
AntwortenLöschenHallo, danke für deine super Artikel, bin mir daraus gerade etwas am Basteln.
AntwortenLöschenNun klappt es mit dem Erzeugen der PDFs einwandfrei, wenn ich den Drucker "Adobe PDF" (so heisst er bei mir) verwende.
Verwende ich aber den Netzwerkdrucker "ps-rc-170 auf sv-rc-071", geht leider gar nichts.
Verwende ich den weiteren "Drucker" Snagit13 klappts auch wieder einwandfrei.
Ich habe nun schon rumprobiert mit dem Names des Netzwerkdruckers, kriegs aber nicht zum Laufen. Hast du mir einen Input?
Danke dir
las dir mal die Namen in einem DOS Fenster mittels net use anzeigen und nutzen den dort angezeigten. vielleicht was mit \\servername\drucker
Löschen