| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| myCAD 2024 Visiativ-Kundentag in Rosenheim, eine Veranstaltung am 29.10.2024
|
Autor
|
Thema: Makro für die AV (3449 mal gelesen)
|
Ein Konstrukteur Mitglied Konstrukteur
Beiträge: 5 Registriert: 24.10.2013
|
erstellt am: 25. Okt. 2013 10:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich habe eine Makro für die AV erstellt und dabei kräftig bei euch abgekupfert. Alles funktioniert wie beschrieben aber ich schaffe es nicht jedes Blatt einer Zeichnung einzeln als PDF abzuspeichern ' ********************************************************************** ' * Makro erzeugt aus dem aktiven Zeichnungsdokument für alle Blätter ' * eine DXF Datei und eine PDF Datei in einem Unterordner im Verzeichnis der Zeichnung. ' * Außerdem in einen Ordner der AV (x:\Gemeinsam\Arbeitsvorbereitung\test\) wenn gewünscht ' * und in einen eigenen Ordner wie in "C:\SolidPfad.txt" abgespeichert, wenn gewünscht ' * Außerdem wird ein Text generiert für die AV mit Stückzahl, Liefertermin, Auftrag ' * Blatt 1 einer Zeichnung erhält den Blattnamen = Dateinamen, Blatt 2 erhält den Blattnamen = Dateinamen.A1 ' * Basiert auf einer Vorlage von: ' * ' * 05.04.2001 Stefan Berlitz (stefan.berlitz@solidworks.cad.de) ' * http://solidworks.cad.de ' * http://swtools.cad.de ' ********************************************************************** Variablen deklaration Dim SwApp As Object Dim DrawingDoc As Object Dim swModelDocExt As Object Dim swExportPDFData As Object Dim Sheet As Object Dim swPs As Object
Dieser Teil funktioniert nicht
'--------------------------------------------------------------------------------------------- ' wir wollen alle Blätter als PDF mit den eingestellten Optionen abspeichern jedes Blatt einzelnd Set Sheet = DrawingDoc.GetCurrentSheet StrSheetName = Sheet.GetName PDFDateiname = "x:\Gemeinsam\Arbeitsvorbereitung\test\" & StrSheetName & "test" & ".pdf" ' dann erfolgt das Speichern als PDF mittels swModelDocExt.SaveAs ' wenn alles geklappt hat, wird TRUE zurückgeliefert, ansonsten FALSE Set swModelDocExt = DrawingDoc.Extension Set swExportPDFData = SwApp.GetExportFileData(1) bReturn = swExportPDFData.SetSheets(swExportData_ExportCurrentSheet, Nothing) bReturn = swModelDocExt.SaveAs(PDFDateiname, swSaveAsCurrentVersion, swSaveAsOptions_Copy, _ swExportPDFData, lErrors, lWarnings) ' ' If bReturn Then ' strMsgtxt = strMsgtxt & "erfolgreich gespeichert: " & strDateiname & " - " & swSheet.GetName & _ ' ".pdf" & Chr$(10) & Chr$(13) ' Else ' intReturn = SwApp.SendMsgToUser2("FEHLER BEIM SPEICHERN VON " & strDateiname & " - " & swSheet.GetName & _ ' ".pdf" & Chr$(10) & Chr$(13), swMbInformation, swMbOk) ' strMsgtxt = strMsgtxt & "*** FEHLER bei: " & strDateiname & " - " & swSheet.GetName & _ ' ".pdf" & Chr$(10) & Chr$(13) ' End If '---------------------------------------------------------------------------- Debugge ich im Einzelsatz sehe ich das swExportPDFData kein Wert zugewiesen wird bei Set swExportPDFData = SwApp.GetExportFileData(1) Diesen Teil des Quelltextes habe ich dem Makro SaveAsPDF_Single entnommen dort funktioniert der Teil die Variable ist dort allerdings so dimensioniert Dim swExportPDFData As SldWorks.ExportPdfData bei mir Dim swExportPDFData As object weil sonst habe ich einen Syntaxfehler Ich habe die Variable im Makro SaveAsPDF_Single probeweise als object dimensioniert und da funktioniert das Makro immer noch Hat jemand eine Idee ------------------ L.G. W.Wegener Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ein Konstrukteur Mitglied Konstrukteur
Beiträge: 5 Registriert: 24.10.2013
|
erstellt am: 28. Okt. 2013 09:45 <-- editieren / zitieren --> Unities abgeben:
|
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 28. Okt. 2013 11:03 <-- editieren / zitieren --> Unities abgeben: Nur für Ein Konstrukteur
Hallo so wie ich das verstehe kann man mit "swExportPDFData" nur die Blätter in eine einzige PDF Datei mit mehreren Seiten speichern, aber nicht jedes Blatt in eine einzelne Datei. Es wird Dir wohl nichts anderes übrig bleiben, als alle Blätter in einer Schleife durchlaufen und jedes einzeln ausgeben. Kann aber auch sein, dass jemand eine bessere Lösung hat und ich es doch nicht richtig verstehe.
------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ein Konstrukteur Mitglied Konstrukteur
Beiträge: 5 Registriert: 24.10.2013
|
erstellt am: 28. Okt. 2013 11:26 <-- editieren / zitieren --> Unities abgeben:
Hallo Nahe, danke für deine Mühe, aber ich habe den Quelltext so kastriert gepostet, dass man nicht sehen kann, dass sich der Teil in einer Schleife befindet. Ich kann einfach nicht nur das aktive Blatt als PDF abspeichern. Die Ausgabe als DXF in einzelne Blätter funktioniert wenn ich es unter Export Optionen passend eingestellt habe. Beim Export von PDF fehlt die Option nur das aktive Blatt exportieren. In dem Macro SaveasPDF_Single funktioniert es mit bReturn = swModelDocExt.SaveAs(strPDFDateiname, swSaveAsCurrentVersion, swSaveAsOptions_Copy, _ swExportPDFData, lErrors, lWarnings) wobei die Variable _swExportPDFData scheinbar der Parameter ist für das einzeln speichern ist. Aber in meinem Macro funktioniert es nicht Set swExportPDFData = swApp.GetExportFileData(1) Im Debugger sehe ich das swExportPDFData kein Wert zugewiesen wurde. ------------------ L.G. W.Wegener Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1764 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 28. Okt. 2013 12:06 <-- editieren / zitieren --> Unities abgeben: Nur für Ein Konstrukteur
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 28. Okt. 2013 12:18 <-- editieren / zitieren --> Unities abgeben: Nur für Ein Konstrukteur
Hallo Ein Konstrukteur, bei mir klappt es mit diesem Makroschnipsel von der aktiven Zeichnung nur das aktive Blatt als pDf zu speichern:
Code: Option ExplicitDim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swModelDocExt As SldWorks.ModelDocExtension Dim swExportPDFData As SldWorks.ExportPdfData Dim boolstatus As Boolean Dim filename As String Dim lErrors As Long Dim lWarnings As Long ' ACHTUNG: der Parameter hat als Wert eine 2, also entweder definieren oder die ' SolidWorks XXXX Constant library einbinden Const swExportData_ExportCurrentSheet = 2
Sub main() ' Path to which to save PDF file of drawing filename = "c:\temp\test.pdf" Set swApp = Application.SldWorks swApp.Visible = True ' an das aktuelle Dokument anklinken Set swModel = swApp.ActiveDoc Set swModelDocExt = swModel.Extension ' die ExportPDFData vorbereiten Set swExportPDFData = swApp.GetExportFileData(1) boolstatus = swExportPDFData.SetSheets(swExportData_ExportCurrentSheet, "") ' nur zum schnelleren Testen PDF anschlißend öffnen swExportPDFData.ViewPdfAfterSaving = True ' und PDF erzeugen boolstatus = swModelDocExt.SaveAs(filename, 0, 0, swExportPDFData, lErrors, lWarnings) End Sub
Aber du schreibst noch:
Zitat: Original erstellt von Ein Konstrukteur: die Variable ist dort allerdings so dimensioniert Dim swExportPDFData As SldWorks.ExportPdfData bei mir Dim swExportPDFData As object weil sonst habe ich einen Syntaxfehler
Damit könnte es zusammenhängen. Ich hatte mal den SPR 539515 "API issue: Late binding for SldWorks.ExportPdfData not working...", das ging zumindest bis einschließlich SW2010 nicht. In meiner SW2013 funktioniert das Makro oben auch mit Late Binding (laso Deklaration "As Object"), aber wenn du eine ältere Version benutzt musst du die Typebibliothel mit einbinden und early bindung dafür nutzen. Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ein Konstrukteur Mitglied Konstrukteur
Beiträge: 5 Registriert: 24.10.2013
|
erstellt am: 28. Okt. 2013 12:58 <-- editieren / zitieren --> Unities abgeben:
Hallo Danke für den Hinweis, nachdem ich Const swExportData_ExportCurrentSheet = 2 eingefügt habe funktioniert alles wunderprächtig. Das ist das Problem wenn man sich den Code von mehreren Stellen (ohne alles zu verstehen)zusammen kopiert. Der Tipp hat mir eine Menge Zeit gespart. Aber wo ist die SolidWorks XXXX Constant library in dem Beispiel SaveAsPDF_Single eingebunden oder die Konstante definiert. ------------------ L.G. W.Wegener Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 28. Okt. 2013 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für Ein Konstrukteur
Zitat: Original erstellt von Ein Konstrukteur: Aber wo ist die SolidWorks XXXX Constant library in dem Beispiel SaveAsPDF_Single eingebunden oder die Konstante definiert.
Wie alle Verweise im vba Editor im Menu Extras/Verweise zu finden, siehe Screenshot. Das ist wirklich ziemlich wichtig zu verstehen, was diese Verweise sollen, wie damit umzugehen ist und was die bewirken. Ich schätzen mal 80% aller Fragen hier im Brett nach irgendwelchen Problemen haben mit den Verweise zu tun. Such dazu hier im Brett mal zu den Stichworten "early binding", "late binding", "verweise" im Zusammenhang mit Makros (bzw. API Programmierung) und lies da mal ne Stunde oder zwei quer, dann wird es in Zukunft einfacher solche Fehler zu analysieren bzw. gar nicht erst zu machen Ich hab auf meiner MakroMania Seite auch die Konstantenmodule zum direkt durchsuchen und einbinden, wie z.B. auf http://solidworks.cad.de/mm_989.htm Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ein Konstrukteur Mitglied Konstrukteur
Beiträge: 5 Registriert: 24.10.2013
|
erstellt am: 30. Okt. 2013 11:26 <-- editieren / zitieren --> Unities abgeben:
|