Bearbeiten von PDF/DWG-STEP Makro-Code

Ich trockne auch! :crazy_face:
Können Sie das Makro bearbeiten, die Fenster "Ausführung" und "Lokale Variablen" hinzufügen (siehe Bild), dann direkt nach Sub main() klicken und F8 drücken, damit es Fehler macht?
image

Grundsätzlich wird das Makro Schritt für Schritt zerrissen. Und überprüfen Sie im lokalen Variablenfenster den Wert von sModelName, wenn es abstürzt:


Und auch, wenn swModel leer bleibt.

1 „Gefällt mir“

Ich habe den Test gemacht und hier ist, was ich bekommen habe

Und ich habe den Eindruck, dass nach der Zeile, die gelb ist, direkt zu
" Funktion GetFilename(strPath als Zeichenfolge) als Zeichenkette "

Ich habe gerade Tests wiederholt, indem ich den Basiscode kopiert habe, und es funktioniert nicht jedes Mal ...
Ich habe 5 Tests gemacht und ich hatte 2 Male, in denen es gut funktioniert, andere, bei denen ich das PDF / DWG nicht habe, oder es einfach nicht startet!

Ich verstehe nicht, warum es nicht jedes Mal funktioniert!

Ansonsten brauche ich theoretisch den Dateipfad nicht mehr zu ändern

Hallo;
@Antoine_Ruelle ,
Wenn Sie sich Ihr MEP genauer ansehen, sieht es so aus, als würden Sie die Eigenschaft " Revision  " nicht verwenden. Dies erklärt den folgenden Fehler:

Der " A " -Index in Ihrem MEP scheint nur Text zu sein...

Darüber hinaus haben Ihre Eigenschaften in Ihrer SLDPRT-Datei das folgende Format:
" Text: " (Ich glaube nicht, dass die Verwendung von " : " in diesem Zusammenhang angemessen ist.

Nur Ihr SLDPRT schien eine Vorstellung von Index zu haben, verwenden Sie ein PDM?
Herzliche Grüße

Guten Abend
Ja, es geht zur Funktion, um die Dateinamensinformationen abrufen zu können, indem die Erweiterung entfernt wird.
So wie es aussieht, funktioniert der von @sbadenis angebotene Code auf SW2022.

1 „Gefällt mir“

Hallo @tous
Antoine schaut sich in der Zwischenzeit dieses Makro an,
Löscht die Zeilen 4 und 5 nach " sub main ".
Und Weist den genauen Namen der Revisionseigenschaft anstelle von " Hinweis " zu

2 „Gefällt mir“

In der Tat, @Maclane den Überarbeitungsteil betrifft, habe ich auch darüber nachgedacht, daher die Änderung, die ich mit der Entfernung dieser Eigenschaft und dem Hinzufügen von Ordnern vorgeschlagen hatte.
Bei Immobilien ist es in der Tat seltsam, " : " in den Namen der Eigenschaft aufgenommen zu haben, und dies könnte in einigen Fällen (Makro oder andere) tatsächlich ein Problem sein.
Beispielhafte Eigenschaft ohne:

Für @Antoine_Ruelle bestätige ich, dass das Makro auf SW2023 gut funktioniert (also kein Grund auf 2022), wie @Cyril.f auch sagt.
Sie können auch die Lösung von @Lynkoa15 ausprobieren und hoffen, dass das Problem dieses Mal nicht auftritt.

1 „Gefällt mir“

Hallo, vielen Dank für dieses Feedback @Maclane .
In der Tat verwende ich die Revisionseigenschaft nicht, ich habe es im Nachhinein erkannt, weil ich für das Speichern in PDF/DWG den gleichen Dateinamen wie der SW-Plan habe. Also habe ich diesen Teil entfernt. Und ich habe immer noch das gleiche Problem, ich habe kein PDF/DWG

Für den Hinweis trug er sich handschriftlich in eine Eigenschaft des Raumes ein, die auf dem Plan dargestellt ist.
Und nein, wir verwenden kein PDM

sbadenis - Für wen ist ": " Ich weiß nicht, ob das wirklich das Problem ist, denn es hat 2 Mal hintereinander gut funktioniert. Heute Morgen habe ich einen Test ohne das ":" gemacht und ich habe wieder die Meldung bekommen, dass ich in Zeile 118 einen Block habe, der nicht definiert ist. Können Sie mir bitte diesen Satz erklären?
" Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors) "

Ich habe gerade noch einmal einen Test gemacht, bevor ich Ihnen geantwortet habe, und es hat funktioniert

@Lynkoa15 Wenn ich den Ordnerpfad richtig verstanden habe, muss ich sie als Variablen bestimmen
Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepUnterordner als Zeichenfolge = "\schritt"
Um sie in den Aufzeichnungspfaden aufzurufen?

Auf jeden Fall vielen Dank für Ihre Hilfe, ich fange an, die VBA ein wenig besser zu verstehen

Hallo

Diese Zeile ermöglicht es Ihnen, eines der geöffneten Dokumente im unbeaufsichtigten Modus (für den Benutzer transparent) zu aktivieren.

Ja, es vereinfacht den Code und ruft Variablen auf, anstatt den gleichen Text n-mal einzugeben.
Und wenn Sie sich jemals entscheiden, den Pfad zu ändern, ist es einfacher, nur eine Variable zu verwalten, als den gesamten Code zu überprüfen.

1 „Gefällt mir“

Okay, warum bleibt das Makro in manchen Fällen daran hängen? Ist es möglich, dass die Datei bereits geöffnet ist? Oder dass er es nicht findet?

Auf welcher Ebene des Codes sollte ich also die Pfadvariable angeben, um ihr mitzuteilen, dass sie den Pfad der betreffenden Datei annehmen und "/pdf" hinzufügen soll, um den richtigen Datensatzordner zu haben?
Oder welchen Teil des Codes aus dem anderen Makro muss ich abrufen?

Da ich das Thema in Arbeit genommen habe, könnten Sie die neueste Version Ihres Codes teilen?

Ich habe gerade wieder einen Test gemacht und es funktioniert nicht, ich verstehe nichts mehr haha!!
Hier ist der Code

Option Explicit

Public Enum swDocumentTypes_e
    swDocNONE = 0       ' Used to be TYPE_NONE

    swDocPART = 1       ' Used to be TYPE_PART

    swDocASSEMBLY = 2   ' Used to be TYPE_ASSEMBLY

    swDocDRAWING = 3    ' Used to be TYPE_DRAWING
End Enum
 
Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swDraw                      As SldWorks.DrawingDoc
Dim swView                      As SldWorks.View
Dim swConfig                    As SldWorks.Configuration

Dim vSheetNameArr               As Variant
Dim vSheetName                  As Variant

Dim I                           As Long
Dim nDocType                    As Long
Dim op                          As Long
Dim suppr                       As Long
Dim lErrors                     As Long
Dim lWarnings                   As Long

Dim boolstatus                  As Boolean
Dim bRet                        As Boolean
Dim FileConnu                   As Boolean

Dim nbConnu                     As Integer

Dim sModelName                  As String
Dim sPathName                   As String
Dim TabConnu(10000)             As String
Dim sConfigName                 As String

Const dxfSubFolder As String = "\dwg"
Const pdfSubFolder As String = "\pdf"
Const stepSubFolder As String = "\step"


Sub Main()

Set swApp = Application.SldWorks

boolstatus = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Force la version AP214
boolstatus = swApp.SetUserPreferenceIntegerValue(swStepExportPreference, swAcisOutputGeometryPreference_e.swAcisOutputAsSolidAndSurface) 'Force l'export en format Solid/Surface Geometry

Set swModel = swApp.ActiveDoc
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en PDF
swModel.Extension.SaveAs GetFilename(swModel.GetPathName) & ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, lErrors, lWarnings 'Enregistrement en DWG


Call ExportStep ' Appelle le programe d'export STEP


End Sub

Function GetFilename(strPath As String) As String
Dim strTemp As String
strTemp = Mid$(strPath, InStrRev(strPath, "\") + 1)
GetFilename = Left$(strTemp, InStrRev(strTemp, ".") - 1)


End Function
Sub ExportStep()                ' Vérification si c'est une piece ou un assemblage
Set swDraw = swModel
vSheetName = swDraw.GetSheetNames
vSheetNameArr = swDraw.GetSheetNames

For Each vSheetName In vSheetNameArr
        
    bRet = swDraw.ActivateSheet(vSheetName): Debug.Assert bRet
    Set swView = swDraw.GetFirstView 'Sélectionne le fond de plan
    Set swView = swView.GetNextView  'Passe à la vue suivante pour exclure le fond de plan
                
    While Not swView Is Nothing
           
        ' Determine si la vue est une pieces ou un assemblage

        sModelName = swView.GetReferencedModelName

        sModelName = LCase(sModelName)
                        
        sConfigName = swView.ReferencedConfiguration
        
        FileConnu = False
        
        If InStr(sModelName, "sldprt") > 0 Then
            nDocType = swDocPART
        ElseIf InStr(sModelName, "slasm") > 0 Then
            nDocType = swDocASSEMBLY
        Else
            nDocType = swDocNONE
            Exit Sub
        End If
                       
        If nDocType = 1 Then
            For I = 1 To nbConnu
                If UCase(sModelName) & " - " & UCase(sConfigName) = TabConnu(I) Then
                    FileConnu = True
                End If
            Next
            If Not FileConnu Then
                nbConnu = nbConnu + 1
                TabConnu(nbConnu) = UCase(sModelName) & " - " & UCase(sConfigName)
                Call Export
            End If
        End If
        
        Set swView = swView.GetNextView
    Wend

Next vSheetName

End Sub
Sub Export()

Set swModel = swApp.ActivateDoc3(sModelName, True, swOpenDocOptions_Silent, lErrors)
Set swModel = swApp.ActiveDoc
boolstatus = swModel.ShowConfiguration2(sConfigName)
Set swConfig = swModel.GetActiveConfiguration
sPathName = swModel.GetPathName & ".step"
If Dir(sPathName, vbHidden) <> "" Then                                                                'Test l'existence du fichier
    suppr = MsgBox("Le fichier " & sPathName & " existe déjà, voulez vous le supprimer?", vbYesNo)    'Message utilisateur confirmation de suppression oui/non
        If suppr = vbYes Then                                                                         'Réponse Oui
            Kill (sPathName)                                                                          'Suppression du fichier existant
            swModel.SaveAs2 sPathName, 0, True, False                                                 'Enregistrement du fichier
            op = MsgBox("Le fichier a été enregistré sous " & sPathName & vbNewLine)
            Else                                                                                      'Réponse NON
        MsgBox ("Fichier conservé")                                                                   'Message utilisateur
        End If
        Else
        swModel.SaveAs2 sPathName, 0, True, False                                                     'Enregistrement du fichier
        op = MsgBox("Le fichier a été enregistré sous " & sPathName)                                  'Message utilisateur
    End If
swApp.CloseDoc (sModelName)
Set swModel = swApp.ActiveDoc
End Sub

@Antoine_Ruelle ;

Versuchen Sie, die Dateien zu identifizieren, bei denen das Makro nicht funktioniert (insbesondere wenn sie immer gleich sind):

Mehrere Wege:
Das 3D und das Layout befinden sich nicht im selben Verzeichnis.
3D und Blueprint haben nicht genau den gleichen Namen.
Eine der Eigenschaften, nach denen das Makro sucht, ist nicht vorhanden.
Die Zieldateien (pdf/dwg und/oder STEP) sind bereits geöffnet oder schreibgeschützt...
Datei- und/oder Verzeichnisnamen haben Sonderzeichen (Akzente, Punkte,...)

Seien Sie vorsichtig, auch Makros reagieren empfindlich auf BREAKS... d.h. (zusammenfassend lässt sich sagen) wird zwischen Klein- und Großbuchstaben unterschieden) dies gilt sowohl für Dateinamen als auch für Erweiterungen.

Ideal ist es, Ihr Makro Schritt für Schritt (F8) zu durchsuchen, wobei das Fenster für lokale Variablen sichtbar ist.
und fahren Sie möglicherweise mit der Maus über die Variablen in den Codezeilen, um zu überprüfen, ob sie die von ihnen angeforderten Daten abrufen.
(insbesondere im "debug"-Knoten an Haltepunkten...

Nebenfrage, wie starten Sie die Makroausführung? eine Schaltfläche in SOLIDWORKS oder über die Play-Taste direkt im VBA-Editor? Starten Sie das Makro immer mit der Routine "Main"?

Herzliche Grüße.

2 „Gefällt mir“

Nun, ich habe aber viele Dinge vermisst, um unter anderem die Unterordner zu erstellen.
@Antoine_Ruelle , Sie haben den von @sbadenis vorgeschlagenen Code (4. Antwort) getestet, der meiner Meinung nach perfekt funktionierte?

1 „Gefällt mir“

@Cyril.f

In Solidworks 2022 funktioniert das Makro @sbadenis perfekt... Heim.

Herzliche Grüße.

2 „Gefällt mir“

Ja und ich hatte eine Nachricht übersprungen, aber wenn ich Sie frage, ob es funktioniert, antworten Sie mir mit dem vorherigen Makro mit den Überarbeitungen.
Nehmen Sie die neueste Version, wie durch @Cyril.f und @Maclane angegeben, und sie sollte funktionieren.
Auf der anderen Seite, nicht sicher, ob der Code optimiert ist, wird er in Eile von dem von @Cyril.f .

Ich habe immer mit der gleichen Datei getestet. das Zeichnen einer Mütze.
Die Zeichnung befindet sich in einem anderen Ordner als die Teile, aber die Dateien haben denselben Namen.

Ich habe mir den Code bereits Schritt für Schritt angesehen, und da ich nicht allzu viel darüber weiß, weiß ich nicht, wie ich die Probleme richtig identifizieren soll.

Um das Makro zu starten, habe ich eine Schaltfläche erstellt und es auch mit der Play-Taste versucht.

Ja, für die Unterordner habe ich im Moment nichts anderes getan, als die 3 zu definierenden Variablen eingefügt zu haben.
Denn ich versuche, den Code jedes Mal zum Laufen zu bringen. Ich habe den Basiscode genommen, ohne Änderungen vorzunehmen, außer die Revision im Dateinamen zu entfernen.

Es hat einmal funktioniert, ich habe die generierten Dateien gelöscht und neu gestartet und dort hatte ich den folgenden Fehler
image

Und nein, ich habe den Code der 4. Antwort noch nicht getestet @Cyril.f

Ich habe gerade meinen Fehler gefunden, meine Schaltfläche zum Ausführen des Makros war falsch konfiguriert, dann funktioniert es gut

Gute Nachricht.
Alles, was bleibt, ist, die " Beste Antwort " zu validieren, um diese Diskussion zu schließen.
image

Und bis bald für neue Makros...
In der Zwischenzeit rate ich Ihnen, verschiedene Websites zu konsultieren (nicht immer auf Französisch -Visual Basic- verpflichtet), aber oft didaktisch, um in die Programmierung einzusteigen:


Herzliche Grüße.

2 „Gefällt mir“

Und auch, um die Makros aus dem Editor zu starten, um das richtige zu starten! :crazy_face:
Und sobald das funktioniert, können Sie eine Schaltfläche erstellen.