| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | SolidCAM im Einsatz bei der August Weckermann KG |
Autor
|
Thema: Makro in Ordner als PDF speichern (5705 mal gelesen)
|
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 18. Mrz. 2010 15:30 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich habe ein Problem mit einem Makro. Folgendes will ich machen: 1.)Das Makro soll einen Unterordner mit dem Dateinamen erzeugen. (funktioniert) Z.B. SW Datei liegt unter C:\123\ ab, das Teil heißt xy --> Ordner C:\123\xy\ wird erzeugt. 2.) Das PDF soll in diesem Unterordner abgespeichert werden. (funktioniert nicht). Ich kann in einem vorgegebenen (festen Verzeichnis) speichern, will aber, dass das Verzeichnis von oben genommen wird (\xy\ ist variabel, weil Dateiname)... Kann mir beim 2. Punkt jemand helfen? Ich komme da irgendwie nicht weiter! Hier der Code: Option Explicit Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim pdfoptions As Long Dim sPathName As String Dim nErrors As Long Dim nWarnings As Long Dim nRetval As Long Dim bShowMap As Boolean Dim bRet As Boolean Dim sFileName As String Dim ConfName As String Dim Index As String Sub main() ' Punkt 1 ' Ordner erzeugen Dim Ord As String Dim Antwort As Integer Ord = "C:\123\" & sFileName If Dir(Ord, vbDirectory) <> "" Then MsgBox "Ordner ist schon vorhanden" Else Antwort = MsgBox("Der Ordner " & Ord & " ist nicht vorhanden." _ & vbNewLine _ & "soll der Ordner angelegt werden?!", vbYesNo) If Antwort = vbYes Then MkDir Ord MsgBox "Ordner " & Ord & " angelegt" Else MsgBox "Es wurden keine Änderungen vorgenommen" Exit Sub End If End If ' (bis hier hin alles klar)
' Punkt 2 Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc sPathName = swModel.GetPathName sPathName = Left(sPathName, Len(sPathName) - 7) sFileName = ohnePfad(sPathName) ConfName = swModel.GetConfigurationNames Index = swModel.CustomInfo2(ConfName, "Revision") If Len(Index) = 3 Then Index = Left(Index, 2) End If ' hier müsste der variable Pfad rein?! sPathName = "C:\123\" & sFileName & Index & ".pdf" Debug.Print sFileName swApp.SetUserPreferenceToggle swPDFExportInColor, False swApp.SetUserPreferenceToggle swPDFExportEmbedFonts, True swApp.SetUserPreferenceToggle swPDFExportHighQuality, True swApp.SetUserPreferenceToggle swPDFExportPrintHeaderFooter, False swApp.SetUserPreferenceToggle swPDFExportUseCurrentPrintLineWeights, True bRet = swModel.SaveAs4(sPathName, _ swSaveAsCurrentVersion, _ swSaveAsOptions_Silent, _ nErrors, _ nWarnings) If bRet = False Then nRetval = swApp.SendMsgToUser2("Probleme mit dem Speichern des PDFs", swMbWarning, swMbOk) End If MsgBox "Ordner " & sPathName End Sub Private Function ohnePfad(mitPfad As String) As String Dim intCounter As Integer For intCounter = Len(mitPfad) To 1 Step -1 If Mid(mitPfad, intCounter, 1) = "\" Then Exit For End If Next intCounter ' Return the value ohnePfad = Right(mitPfad, Len(mitPfad) - intCounter) End Function
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 18. Mrz. 2010 17:01 <-- editieren / zitieren --> Unities abgeben: Nur für funker
so gehts besser: Code: Option Explicit Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim pdfoptions As Long Dim sPathName As String Dim nErrors As Long Dim nWarnings As Long Dim nRetval As Long Dim bShowMap As Boolean Dim bRet As Boolean Dim sFileName As String Dim oConfig As SldWorks.Configuration Dim ConfName As String Dim Index As String Sub main()' Punkt 1 ' Ordner erzeugen Dim Ord As String Dim Antwort As Integer 'Ord = "C:\123\" & sFileName 'sFilename gibts doch noch gar nicht!! Ord = "C:\123\" If Dir(Ord, vbDirectory) <> "" Then MsgBox "Ordner ist schon vorhanden" Else Antwort = MsgBox("Der Ordner " & Ord & " ist nicht vorhanden." _ & vbNewLine _ & "soll der Ordner angelegt werden?!", vbYesNo) If Antwort = vbYes Then MkDir Ord MsgBox "Ordner " & Ord & " angelegt" Else MsgBox "Es wurden keine Änderungen vorgenommen" Exit Sub End If End If ' (bis hier hin alles klar)
' Punkt 2 Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel Is Nothing Then MsgBox "Nix geöffnet, Ciao!" Exit Sub End If 'Die extra-Funktion ohnePfad ist unnötig, sPathname wird hier noch nicht gebraucht 'sPathName = swModel.GetPathName 'sPathName = Left(sPathName, Len(sPathName) - 7) 'sFileName = ohnePfad(sPathName) sFileName = Left(swModel.GetTitle, Len(swModel.GetTitle) - 7) ' ConfName = swModel.GetConfigurationNames 'geht so nicht, GetConfigurationName gibt eine Liste aller Konfigs zurück 'nicht nur eine einzelne 'So kommst du zum Configurationsname: Set oConfig = swModel.GetActiveConfiguration ConfName = oConfig.Name Index = swModel.CustomInfo2(ConfName, "Revision") If Len(Index) = 3 Then Index = Left(Index, 2) End If ' hier müsste der variable Pfad rein?! 'sPathName = "C:\123\" & sFileName & Index & ".pdf" 'die oben definierte Variable mt dem Ordnernamen verwenden!! sPathName = Ord & sFileName & Index & ".pdf" Debug.Print sPathName swApp.SetUserPreferenceToggle swPDFExportInColor, False swApp.SetUserPreferenceToggle swPDFExportEmbedFonts, True swApp.SetUserPreferenceToggle swPDFExportHighQuality, True swApp.SetUserPreferenceToggle swPDFExportPrintHeaderFooter, False swApp.SetUserPreferenceToggle swPDFExportUseCurrentPrintLineWeights, True bRet = swModel.SaveAs4(sPathName, _ swSaveAsCurrentVersion, _ swSaveAsOptions_Silent, _ nErrors, _ nWarnings) If bRet = False Then nRetval = swApp.SendMsgToUser2("Probleme mit dem Speichern des PDFs", swMbWarning, swMbOk) End If MsgBox "Ordner " & sPathName End Sub
Ein paar Kleinigkeiten:
- Am Anfang hast du zur Definition des Ordnernamens die Variable sFilename benutzt...die ist zu diesem Zeitpunkt noch undefiniert, also sinnlos.
- Die extra-Funktion ohnePfad ist unnötig, mit Gettitle und dann hinten abbschneiden gehts auch.
- mit GetConfigurationNames bekommst du nicht den aktuellen Konfigurationsnamen, sondern eine Liste aller vorhandenen Konfigurationen als Array (Typ Variant).
- Dazu brauchst du noch erst mal ne Variable vom Typ SldWorks.Configuration, hier oConfig. Mit GetActiveConfiguration kriegst du hier die aktuelle Konfiguration rein (Set nicht vergessen).
- oConfig.Name ist der Name dieser Konfiguration
- Beim eigentlichen Speichervorgang hast du nicht die oben gefüllte Variable mit dem Ordnernamen verwendet, sondern den Ordnernamen nochmal explizit angegeben...böses Fowl..zumindest unschön.
------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 18. Mrz. 2010 17:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, danke für deine super und schnelle Antwort. Du scheinst dich sehr gut mit der Makrogeschichte auszukennen - ich bin da noch im Anfangsstadium. Bei dem bearbeiteten Code erhalte ich die Fehlermeldung: Laufzeitfehler 91. Objektvariable oder With-Blockvariable nicht festgelegt. Es geht unter ' Punkt 2 'So kommst du zum Configurationsname: Set oConfig = swModel.GetActiveConfiguration ConfName = oConfig.Name um die untere Zeile. Da meckert er irgendwie. Ist doch eigentlich oben definiert?! Bei Punkt 1 habe ich meine Schwierigkeiten den sFileName wegzulassen. Dann definiere ich ja ein Verzeichnis (feststehend) welches er anlegen soll. Er soll aber hier den Unterordner mit Dateinamen anlegen (am besten nur die ersten 10 Stellen des Dateinamens). Das lief aber soweit auch...
'Ord = "P:\ME\3D CAD Zeichnungen\z.Z. in Bearbeitung\Philipp Werb\Test" & sFileName 'sFilename gibts doch noch gar nicht!! Vielen Dank und Grüße
Philipp 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: 19. Mrz. 2010 08:05 <-- editieren / zitieren --> Unities abgeben: Nur für funker
Hallo Philipp, Zitat: Original erstellt von funker: Bei dem bearbeiteten Code erhalte ich die Fehlermeldung: Laufzeitfehler 91. Objektvariable oder With-Blockvariable nicht festgelegt.Es geht unter ' Punkt 2 'So kommst du zum Configurationsname: Set oConfig = swModel.GetActiveConfiguration ConfName = oConfig.Name um die untere Zeile. Da meckert er irgendwie. Ist doch eigentlich oben definiert?!
Die Fehlermeldung bedeutet nicht, dass die Variable nicht deklariert ist (das machst du "oben" mit der DIM Anweisung) sondern nicht definiert ist, sprich, sie hat keinen Inhalt und ist Nothing. Das passiert dann, wenn du entweder kein Dokument aktiv hast (das wird aber ja weiter oben im Bereich If swModel Is Nothing Then ... abgefangen, oder was hier wahrscheinlich ist, weil du kein Modell, sondern eine Zeichnung aktiv hast - Zeichnungen haben keine Konfiguration. Ohne auf deinen Bildschirm zu schauen und deinen kompletten Code zu sehen ist das aber nur eine Vermutung. Zitat: Original erstellt von funker: Bei Punkt 1 habe ich meine Schwierigkeiten den sFileName wegzulassen. Dann definiere ich ja ein Verzeichnis (feststehend) welches er anlegen soll.
Das möchtest du vielleicht, aber wie Klaus schon gesagt hast, tun tust du das nicht. Du deklarierst Dim sFileName As String, dadurch wird die angelegt und ist: leer. Also nicht mal ein Leerzeichen, sondern "". Dann weiter unten setzt du damit die neue Variable zu Ord = "C:\123\" & sFileName zusammen. Jetzt hat Ord den Inhalt "C:\123\". Du überprüfst, ob dieses Verzeichnis existiert, was es wohl tut, als übergeordnetes Verzeichnis, also braucht auch nichts Neues angelegt werden. Wenn du einen Unterordner in Abhängigkeit vo Dateinamen überprüfen und anlegen willst musst du dir logischerweise vorher den Namen des Dokumentes holen und der ganze Bereich unter Punkt 1 danach erst kommen. Ich argwöhne, dass du dir das aus einer anderen Prozedur geklaut hast und oben in die Main reinkopiert hast und hoffst, dass VBA das schon irgendwie versteht, was du möchtest ;) Code:
[...] ' Punkt 2 Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc sPathName = swModel.GetPathName sPathName = Left(sPathName, Len(sPathName) - 7) sFileName = ohnePfad(sPathName) 'hier jetzt den Bereich ausführen, der unter Punkt 1 steht ' sFileName ist definiert, Name des aktiven Dokumentes ohne ' Pfad und Extension, sollte also tauflich für Verzeichnisnamen sein. [...]
BTW, wo ist deine Funktion "ohnePfad"? Ich persönlich bevorzuge auch diese Methode um einen Dokumentennamen zu ermitteln und nicht GetTitle, aber wenn man die Feinheiten kennt ist das wirklich nur Geschmackssache. Ich hoffe, damit kommst du wieder ein Stück weiter. Programmieren ist keine Hexerei, aber da merkt man erst richtig, wie blöde so eine Blechbüchse eigentlich ist und man wirklich alles vorkauen muss und selbst daran denken muss, was wohl alles schief gehen kann. Da nimmt einem kein netter, anderer Programmierer diese ganze Fehlerbehandlung ab und denkt auch an die unmöglichsten (oder offensichtlichen) Kombinationen, was ein Anwender wohl alles anstellen könnte Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Stefans SolidWorks Blog
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 19. Mrz. 2010 08:32 <-- editieren / zitieren --> Unities abgeben: Nur für funker
|
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 19. Mrz. 2010 11:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, erst mal vielen Dank für Deine Antwort. Stimmt schon, ich verstehe nicht jeden Befehl von VBA und habe mich bis jetzt an kleineren Makros probiert, das auch mehr im Excel Bereich. Deswegen muss ich sagen, Hut ab vor Leuten wie Euch, die hier den VBALaien Nachhilfe geben :-) Zwei Probleme gibt es noch: a) Jetzt kann ich nur von einem Part ein PDF erstellen, weil Zeichnungen ja keine Konfigurationen haben und der Befehl oConfig.Name dann nicht funktioniert. Ziel ist aber von einer Zeichnung ein PDF zu erstellen (bestenfalls im gleichen Schritt ein STEP vom Modell, aber das ist die Kür) b) Das Makro speichert das PDF nicht in den vorher angelgten Unterordner ab, sondern direkt in das Verzeichnis, wo auch das SWTeil abliegt. Die Variable Ord wird als Text und nicht als Dateipfad erkannt!! Hab schon einige Varianten davon durchgespielt, aber das erwünschte Ergebnis ist ausgeblieben. Wenn ihr mir da noch mal helfen könntet wäre ich euch wirklich dankbar :-) Gruß, Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 19. Mrz. 2010 17:59 <-- editieren / zitieren --> Unities abgeben: Nur für funker
Ich bin jetzt zu hause und hab kein SolidWorks da. Aber zu deinem Problem gibts noch ein paar Fragen zu klären.
- Sollen Zeichnung UND Modell als PDF gespeichert werden?
- Wenn ja, beide im gleichen Verzeichnis?
- Du willst den "Index" (bei uns heißt das "Revisionsstand") als Teil des Dateinamens. Wo kommt der her, ist der als Eigenschaft im Modell oder in der Zeichnung abgelegt?
Du musst am Anfang erst mal feststellen, um was es sich bei der aktuellen SolidWorksdatei handelt: Modell oder Zeichnung Das geht mit swModel.GetType, das Ergebnis wäre swDocPart, swDocDrawing oder swDocAssembly (wenn ichs richtig im Kopf hab). Wenn es sich um eine Zeichnung handelt und du das Modell dazu brauchst (zum Speichern oder wegen des Revisionsstandes), dann kriegst du das über die Zeichenansichten raus. Dann würde ich auch eine weitere Objektvariable für die Zeichnung und auch für die Views definieren, z,b. Dim swDrawing as As SldWorks.Drawing Dim swView as SldWorks.View ... set swDrawing = swModel set swmodel = Nothing 'Damit ist das swModel wieder frei um das Model-Objekt aufzunehmen, das du ja noch finden musst set view=swDrawing.GetFirstView 'Damit hast du die erste View: das ist das Blatt! set view = view.GetNextView ' Damit hast du die erste _richtige_ View. Da sollte dein Modell drin sein. sModelname = view.GetReferencedModelname 'sModelname muss natürlich oben noch als String deklariert sein 'oder so ähnlich. Könnte auch GetReferencedFilename heißen, bin mir da nicht sicher. Damit hast du den Dateinamen (incl. Pfad) vom Modell. ... Jetzt noch das Modell öffnen und wieder swModel zuweisen, dann hast du das Modell und die Zeichnung und kannst damit machen was du willst. Probiers mal aus, hast ja jetzt ein Wochenende zum Tüfteln Viel Erfolg ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 19. Mrz. 2010 20:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für deine Infos. Ich werde mich am Wochenende mal dran machen - mal schaun ob etwas verwertbares dabei rauskommt :-) Im Grunde will ich folgendes machen (vereinfacht): SW Zeichnung und Modell liegen unter C:\xy ab. Z.B. "12345678 Name.sldrw" und 12345678 Name.slpart Befehl 1: Lege (Unter)Ordner an: C:\xy\12345678 Name [am besten nach der 8. Stelle abschneiden] Befehl 2: Exportiere die Dateiformate .pdf (und .step das wäre die Kür) in den eben angelegten Unterordner. (vor allem da lag das Problem, er speichert das PDF immer in den Ausgangsordner und bezieht den Pfad in den Dateinamen mit ein. Z.B. C:\xy\12345678 Name12345678 Name.pdf) Viele Grüße und ein schönes Wochenende Philipp
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 19. Mrz. 2010 20:37 <-- editieren / zitieren --> Unities abgeben:
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 22. Mrz. 2010 08:10 <-- editieren / zitieren --> Unities abgeben: Nur für funker
Zitat: Original erstellt von funker: Befehl 2: Exportiere die Dateiformate .pdf (und .step das wäre die Kür) in den eben angelegten Unterordner. (vor allem da lag das Problem, er speichert das PDF immer in den Ausgangsordner und bezieht den Pfad in den Dateinamen mit ein. Z.B. C:\xy\12345678 Name12345678 Name.pdf)
Das ist ja nun eine ganz neue Information-oder ich habs bisher überlesen. Wenn der gewünschte Pfadname in den Dateinamen mit einbezogen wird, tippe ich - ohne den Code nochmal genauer zu analysieren- einfach darauf, dass du beim Zusammensetzen ein "\" vergessen hast. Ein ganz typisches Missgeschick, das wohl jedem Programmierer immer wieder passiert. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 22. Mrz. 2010 10:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, hab mich am Wochenende mal "kurz" darüber gemacht... Mein Verständnis für das Programmieren ist wieder mal ein bisschen größer geworden. Den Fehler mit dem \ habe ich auch irgendwann gefunden, war nur etwas kniffelig herauszubekommen wo genau er hin soll und ob er in "" muss. Ich steuere den Code jetzt über eine UserForm an, bei der es die beiden CommandButtons als PDF und als STEP speichern gibt. Je nach SolidWorks Format (Zeichnung oder Baugruppe oder Teil) muss sich der Anwender den richtigen Knopf selbst raussuchen. Die Endung der SolidWorks Datei (sldprt, sldasm und slddrw) auszulesen und mit einer If Bedingung das richtige Ausgabeformat anzusteuern habe ich nicht geschafft - kann aber auch ohne diese Funktion leben :-) Aktuelles Problem:
Aufgabe Makro: Zeichnung und Modell liegen unter C:\xy\ ab. Z.B. "11-2222333344 Name.sldrw" und "11-2222333344 Name.slpart". Das Makro soll unter D:\123\ den Unterordner mit den ersten 13 Stellen des aktuellen Dokuments erstellen (D:\123\11-2222333344\). Es kommt manchmal (ca. 10% der Fälle) vor, dass das Makro denkt der Unterordner sei bereits angelegt und die MsgBox "Ordner ist schon vorhanden" ausgibt. Der Unterordner ist aber zu diesem Zeitpunkt nicht angelegt und er speichert das PDF direkt unter D:\123\ ab. Kannst du da eine mögliche Ursache im Code entdecken?? Eine andere denkbare Möglichkeit wäre den Speicherort des Dokuments D:\123\ explizit als Speicherort auszuschließen (damit nur ein anderer Speicherort, also der neue D:\123\11-2222333344\ zugelassen ist) Hier der Code:
Private Sub cmdSpeichernPDF_Click()
Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel Is Nothing Then MsgBox "- Kein SolidWorks Dokument geöffnet -" SWDokumenteExportierenFrm.Hide Exit Sub End If sPathName = swModel.GetPathName sPathName = Left(sFileName, 13) 'sPathName = Left(sPathName, Len(sPathName) - 7) [alte Anweisung] sFileName = ohnePfad(sPathName) ' Punkt 1: Ordner erzeugen Ord = "D:\123\" & sFileName 'hier muss der oben genannte Fehler liegen?! If Dir(Ord, vbDirectory) <> "" Then MsgBox "Ordner ist schon vorhanden" Else MkDir Ord MsgBox "Ordner " & Ord & " angelegt" End If ' Punkt 2 sFileName = Left(swModel.GetTitle, Len(swModel.GetTitle) - 9) ' Set oConfig = swModel.GetActiveConfiguration ' ConfName = oConfig.Name ' MsgBox (ConfName) & " ConfName" 'ConfName ist immer "Standard" sPathName = Ord & "\" & sFileName & ".pdf" Debug.Print sPathName swApp.SetUserPreferenceToggle swPDFExportEmbedFonts, True swApp.SetUserPreferenceToggle swPDFExportHighQuality, True swApp.SetUserPreferenceToggle swPDFExportPrintHeaderFooter, False swApp.SetUserPreferenceToggle swPDFExportUseCurrentPrintLineWeights, True bRet = swModel.SaveAs4(sPathName, _ swSaveAsCurrentVersion, _ swSaveAsOptions_Silent, _ nErrors, _ nWarnings) If bRet = False Then nRetval = swApp.SendMsgToUser2("Probleme mit dem Speichern des PDFs", swMbWarning, swMbOk) End If SWDokumenteExportierenFrm.Hide Viele Grüße
Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 22. Mrz. 2010 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für funker
- Wo wird deine Form aufgerufen?
Mit der Zeile "SWDokumenteExportierenFrm.Hide" wird deine Form nicht geschlossen, sondern nur versteckt! Wie willst du die je wieder schließen, wenn du die nicht siehst? Wenn in dem Fall eines falschen oder keines geöffneten Doks in SWX nichts mehr passieren soll, dann beende das komplette Makro doch an dieser Stelle einfach mit "End" - Du solltest immer abfangen, ob du das passende Dokument offen hast.
Das kannst du- wie schon mal beschrieben- per swModel.GetType abfragen, da brauchst du keinen Dateinamen dazu: If swModel.GetType <> swDocDRAWING Then MsgBox "- Keine SolidWorks Zeichnung geöffnet" End End If - Bitte auf die Reihenfolge achten: Programme gehen (i.d.R.) stur von oben nach unten
die Stelle, wo du deine 13 Zeichen abschneidest, kommt zu früh. Hier besteht der Dateiname ja noch aus dem kompletten Pfadnamen: FALSCH: sPathName = swModel.GetPathName sPathName = Left(sFileName, 13) sFileName = ohnePfad(sPathName) RICHTIG: sPathName = swModel.GetPathName sFileName = ohnePfad(sPathName) sPathName = Left(sFileName, 13) - Beim Zuweisen des Ordnernamens verwendest du den kompletten Dateinamen- incl. Erweiterung!
Du musst natürlich den abgeschnittenen Namen nehmen! FALSCH: Ord = "D:\123\" & sFileName RICHTIG: Ord = "D:\123\" & sPathName Oder spar die extra Zuweisung zu sPathName und schreibe gleich Ord = "D:\123\" & Left(sFileName, 13) - Vorschlag, muss aber nicht sein: Ersetze
sFileName = Left(swModel.GetTitle, Len(swModel.GetTitle) - 9) durch sFilename = left(sFilename, Len(sFilename) - 7)
Damit funktioniert's bei mir. Und wie gesagt: Wenn du per swModel.GetType die Dateiart abfragst, kannst du direkt zu deinen unterschiedlichen Vorgängen verzweigen und musst nicht den Anwender entscheiden lassen- ist besser, der klickt bestimmt daneben. du könntest beispielsweise alles ab dem Anlegen des Ordners, also ab Punkt 2 in eine extra Prozedur packen, z.B. "Sub SaveDrawingAsPDF". Und für die Step entsprechend eine Prozedur machen "Sub SaveModelAsStep". Und dann dieser Stelle sowas schreiben wie If swModel.GetType = swDocDRAWING Then 'verzweigen SaveDrawingAsPDF Else SaveModelAsStep End If (Die Abfrage nach keiner Zeichnung entfällt dann natürlich) So wird langsam ein Schuh draus. Das Ganze hat dann aber noch den Nachteil, dass du Zeichnung und Modell extra bearbeiten musst. Um das zusammen zu fassen, musst du nochmal weiter oben nachlesen Viel Erfolg ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 22. Mrz. 2010 14:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, danke für deine schnelle Antwort. Deine Anmerkungen sind sehr gut - ich gewöhne mir langsam deine logische Durchgehensweise an Die Form rue ich per MakroSchaltfläche direkt in SW aus (SWDokumenteExportierenFrm.Show). Den richtigen Dokumenttyp frage ich jetzt am Anfang ab und habe das ganze zu einem kombinierten Code aus PDF (aus Zeichnung) und STEP (aus Baugruppe oder Part) erstellen gemacht. Der vollständigkeit halber hier noch einmal der kombinierte Code: Private Sub SpeichernKombi_Click() 'Funktion PDF und STEP soll verknüpft werden Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel.GetType <> swDocDRAWING Then ElseIf swModel.GetType <> swDocPART Then ElseIf swModel.GetType <> swDocASSEMBLY Then MsgBox "- SolidWorks Baugruppe, Teil oder Zeichnung öffnen -" End End If sPathName = swModel.GetPathName sFileName = ohnePfad(sPathName) sPathName = Left(sFileName, 13) ' Punkt 1: Ordner erzeugen Ord = "D:\123\" & Left(sFileName, 13) If Dir(Ord, vbDirectory) <> "" Then MsgBox "Ordner ist schon vorhanden" Else MkDir Ord MsgBox "Ordner " & Ord & " angelegt" End If ' Punkt 2 If swModel.GetType = swDocDRAWING Then sFileName = Left(swModel.GetTitle, Len(swModel.GetTitle) - 9) sPathName = Ord & "\" & sFileName & ".pdf" Debug.Print sPathName swApp.SetUserPreferenceToggle swPDFExportEmbedFonts, True swApp.SetUserPreferenceToggle swPDFExportHighQuality, True swApp.SetUserPreferenceToggle swPDFExportPrintHeaderFooter, False swApp.SetUserPreferenceToggle swPDFExportUseCurrentPrintLineWeights, True bRet = swModel.SaveAs4(sPathName, _ swSaveAsCurrentVersion, _ swSaveAsOptions_Silent, _ nErrors, _ nWarnings) If bRet = False Then nRetval = swApp.SendMsgToUser2("Probleme mit dem Speichern des PDFs", swMbWarning, swMbOk) End If End Else sFileName = Left(swModel.GetTitle, Len(swModel.GetTitle) - 7) sPathName = Ord & "\" & sFileName & ".step" Debug.Print sPathName swApp.SetUserPreferenceToggle swPDFExportEmbedFonts, True swApp.SetUserPreferenceToggle swPDFExportHighQuality, True swApp.SetUserPreferenceToggle swPDFExportPrintHeaderFooter, False swApp.SetUserPreferenceToggle swPDFExportUseCurrentPrintLineWeights, True bRet = swModel.SaveAs4(sPathName, _ swSaveAsCurrentVersion, _ swSaveAsOptions_Silent, _ nErrors, _ nWarnings) If bRet = False Then nRetval = swApp.SendMsgToUser2("Probleme mit dem Speichern des PDFs", swMbWarning, swMbOk) End If End End If
End Sub Gruß und vielen Dank Philipp Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 22. Mrz. 2010 14:52 <-- editieren / zitieren --> Unities abgeben: Nur für funker
Zitat: Original erstellt von funker: Hallo Klaus,danke für deine schnelle Antwort. Deine Anmerkungen sind sehr gut - ich gewöhne mir langsam deine logische Durchgehensweise an Die Form rue ich per MakroSchaltfläche direkt in SW aus (SWDokumenteExportierenFrm.Show). ...
Freut mich :) obwohl man bestimmt auch einiges anders lösen kann. Immer daran denken: Computer sind saublöd und tun nix von selber (zumindest nicht das, was du willst). Zitat: Original erstellt von funker: ... Den richtigen Dokumenttyp frage ich jetzt am Anfang ab und habe das ganze zu einem kombinierten Code aus PDF (aus Zeichnung) und STEP (aus Baugruppe oder Part) erstellen gemacht...
Nö, den richtigen Dokumenttyp fragst du am Anfang nicht ab, du testest nur, ob überhaupt was geöffnet ist. Und das noch sehr umständlich. Mach das einfach, wie es war: If swModel Is Nothing Then MsgBox "- Kein SolidWorks Dokument geöffnet -" end End If Die eigentliche Unterscheidung nach Dateityp passiert ja erst weiter unten. Zitat: Original erstellt von funker: ... sPathName = Left(sFileName, 13) ...
Die Zeile ist überflüssig geworden, da du ja gleich darauf 13 Zeichen von sFilename direkt dem Ordnernamen zuweist. Hat aber keine Auswirkung. Was machst du eigentlich, wenn der eigentliche Dateinamen kürzer als 13 Zeichen ist? Dann rutscht die Dateierweiterung wieder in den Verzeichnisnamen rein. Wenn solche Fälle vorkommen können, muss du das noch abfangen. Also den sFilename vorher von seiner Erweiterung befreien. Das Setzen der PDF-Optionen im Step-Zweig ist überflüssig und der Text der Warnmeldung im Step-Zweig ist noch falsch. Der Rest wird wohl funktionieren, ich habs jetzt nicht mehr getestet. Ich persönlich hätte für die beiden Speichern-Wege 2 Subs geschrieben statt das hier auszucodieren, das ist aber Geschmackssache. Ansonsten: herzlichen Glückwunsch ------------------ Klaus
www.al-ko.com | mein Gästebuch | privat... | Nasenheim [Diese Nachricht wurde von KMassler am 22. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
funker Mitglied Dipl.-Ing Maschinenbau
Beiträge: 8 Registriert: 18.03.2010
|
erstellt am: 22. Mrz. 2010 15:14 <-- editieren / zitieren --> Unities abgeben:
Wir haben immer eine 13-stellige Zeichnungsnummer, danach kommt der Dateiname. Für den Ordner soll immer nur die Zeichnungsnummer verwendet werden - das mit den 13 Stellen klappt also immer. An dieser Stelle noch mal vielen Dank für deine Unterstützung! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Premium 2020-Sp5
|
erstellt am: 22. Mrz. 2010 15:37 <-- editieren / zitieren --> Unities abgeben: Nur für funker
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 22. Mrz. 2010 16:48 <-- editieren / zitieren --> Unities abgeben: Nur für funker
Mit "die hab ich geklaut" meinte ich, dass ich die Sub aus Funkers Code gestrichen hab, weil ich sie durch einen Einzeiler ersetzt habe. Hat mir persönlich mehr zugesagt, zumindest in diesem Fall, wo das ganze nur 1x benötigt wurde. Ist aber Geschmackssache, jetzt ist sie ja wieder drin. Wenn ich Code woanders klau (mach ich, wie alle Programmierer, aber nur wo es erlaubt ist. ) dann geb ich das auch gerne zu. Und wenn ichs noch weiß- und es nicht allzu eilig hab- schreib ich das auch als Kommentar dazu. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|