DXF-Makro-Export Blatt für Blatt

Hallo

Wenn das verwendete Makro verwendet wird, müssen Sie die Exportoptionen der dxf/dwg-Formate in den SOLIDWORKS Optionen ändern:

Herzliche Grüße

Hallo

Das Ergebnis ist das gleiche, ich habe immer noch 4 Dateien bei 2

Im Gegensatz zu PDFs

Hallo

Ich für meinen Teil bin auf "Alle Blätter in einer Datei exportieren" eingestellt und habe kein Problem.

Nur wenn die Einstellung "Alle Blätter in separaten Dateien exportieren" ist, erzeugt der Export 4 Dateien.

Was mir auch aufgefallen ist, ist, dass man die Änderung der Einstellungen zweimal erzwingen muss, damit sie korrekt berücksichtigt wird (wahrscheinlich SW2020-Fehler).

SW hatte die Einstellung "Alle Blätter in eine Datei exportieren" nicht berücksichtigt

Ich habe 2 Dateien mit der richtigen Syntax , aber es ist das gleiche Blatt in den 2, das auf dem Bildschirm "aktiv" ist.

Wenn man sich das Makro ansieht, gibt es mehrmals "swExpPdfData" und "SldWorks.ExportPdfData"

und eine Zeile  outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".dxf" oder es ist ".pdf" im PDF-Makro, die funktioniert

Ist es die  ..... ExpPdfData, die durch das Äquivalent für DXFs ersetzt werden sollten?

Hoppla, ich schaue mir das genauer an, ich habe die Dateien nicht geöffnet.

Re

Normalerweise erfüllt der folgende Code die Anforderungen

Option Explicit
Dim swApp       As SldWorks.SldWorks
Dim swModel     As SldWorks.ModelDoc2
Dim swDraw      As SldWorks.DrawingDoc
Dim sPathname   As String
Dim vSheetName  As Variant
Dim nErrors     As Long
Dim nWarnings   As Long
Dim i           As Long
Dim bRet        As Boolean
Dim lParam      As Long

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    lParam = swApp.GetUserPreferenceIntegerValue(swDxfMultiSheetOption)
    
    'Changement paramétrage export dxf si différent de feuille active
    If lParam <> 0 Then
        bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfMultisheet_e.swDxfActiveSheetOnly)
    End If
    
    sPathname = swModel.GetPathName
    sPathname = Left(sPathname, Len(sPathname) - 7)
    vSheetName = swDraw.GetSheetNames
    For i = 0 To UBound(vSheetName)
        bRet = swDraw.ActivateSheet(vSheetName(i))
        bRet = swModel.SaveAs4(sPathname & "_" & vSheetName(i) & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)
    Next i
    ' Retour à la Feuille 1
    bRet = swDraw.ActivateSheet(vSheetName(0))
    ' Remise en place du paramétrage initial
    bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, lParam)
End Sub

 

3 „Gefällt mir“

Vielen Dank
Es funktioniert perfekt ;-)

Hallo
Es tut mir leid, das Thema zu entstauben, aber ich habe dieses Makro auf SW2025 ausprobiert und es funktioniert nicht.
Das ist genau das, was ich auch tun möchte, ich zeichne Teile mit mehreren geschweißten Körpern.
Vielen Dank
Manu

Hallo @Emmanuel_SERVEL und herzlich willkommen.

Um Ihnen helfen zu können, benötigen wir weitere Informationen:

Du sagst, dass das Makro unter Sw2025 nicht funktioniert, was und die Fehlermeldung?
Handelt es sich bei Ihrer Version von Solidworks um eine lokale oder 3Dexperience Version?
Haben Sie schon einmal darüber nachgedacht, Solidworks Referenzen in Ihren VBA-Editor zu laden?
image

Anmerkung:
Die Funktion " SaveAs4 " gilt in der Solidworks API-Hilfe als veraltet.
seltsamerweise wird es durch " SaveAs3 " ersetzt.
und ihre Aussagen sind etwas anders:
Wert = Instanz. SaveAs4(Name, Version, Optionen, Fehler, Warnungen)
und
Wert = Instanz. SaveAs3(Name, Version, Optionen, ExportData, AdvancedSaveAsOptions, Fehler, Warnungen)

Allerdings ist eine " veraltete " Funktion nicht unbedingt unbrauchbar...

Aber hier greifen wir ein Thema an, das von Ihrem Niveau in der VBA-Programmierung abhängt.
In Ihrem Fall denke ich eher an die VBA-Referenzen, die hinzugefügt werden sollen...

Herzliche Grüße.

2 „Gefällt mir“

Hallo
Vielen Dank für Ihr Feedback, als ich die Referenzen überprüfte, waren die SW-Kästchen bereits alle angekreuzt. Ich habe gerade Microsoft Scripting Runtime hinzugefügt, das Makro erneut ausgeführt, um es zu versuchen, und es scheint perfekt zu funktionieren. Ich weiß nicht, ob das das Problem war, aber auf jeden Fall bin ich zufrieden.
Vielen Dank
Manu

1 „Gefällt mir“

Hallo

Es wird nicht seltsamerweise durch SaveAs3 ersetzt, es verwendet nur nicht die gleichen Methoden, SaveAs4 ist Teil der ModelDoc2- und SaveAs3-Methoden von ModelDocExtension.
Als Antwort @Emmanuel_SERVEL wird die Microsoft Scripting Runtime-Referenz normalerweise nicht für den Codeausschnitt benötigt, den ich angegeben habe. Der Fehler könnte von der linken Funktion kommen, die manchmal nicht erkannt wird, Sie müssen VBA als Ersatz verwenden. Links.

1 „Gefällt mir“

Vielen Dank @Cyril_f ... Bereicherung meiner persönlichen Kultur: :grinning:
(und es gibt nicht einmal Sarkasmus)

ModelDoc2 :
Stellt das Hauptdokument in SolidWorks dar (Teil, Baugruppe oder Zeichnung)

  • Ermöglicht den Zugriff auf grundlegende Vorgänge im Dokument: Öffnen, Speichern, Neuerstellen, Abrufen des Dokumenttyps, Zugriff auf Konfigurationen, Verwalten von Ansichten usw
    Also = > ModelDoc2:p alle grundlegenden Operationen am SolidWorks*-Dokument.

ModelDocExtension :

Ist eine Erweiterung von ModelDoc2, auf die über die Eigenschaft .Extension eines ModelDoc2*-Objekts zugegriffen wird.

  • Wurde erstellt, um zusätzliche Methoden und Eigenschaften hinzuzufügen, wenn ModelDoc2 seine Kapazitätsgrenze in Bezug auf die Anzahl der Methoden erreicht.

  • Bietet Zugriff auf erweiterte oder weniger gebräuchliche Funktionen, wie z. B.: benutzerdefinierte Eigenschaftsverwaltung, Masseneigenschaftsberechnungen, Verwaltung von Stücklistentabellen, Konvertierungsvorgänge, erweiterte Datensatzverwaltung (z. B. SaveAs2)
    Also: ModelDocExtension :p erweiterte oder spezialisierte Operationen, die nicht direkt in ModelDoc2 verfügbar sind und über die Eigenschaft .Extension eines ModelDoc2-Objekts zugänglich sind

Zusammenfassend lässt sich sagen, dass ModelDocExtension ModelDoc2 ergänzt und Zugriff auf zusätzliche Funktionen bietet, die für Makros oder erweiterte Automatisierungen in SolidWorks benötigt werden

.

3 „Gefällt mir“

Hallo, ich bin es wieder zu diesem Thema.

Ausgehend vom ursprünglichen MACRO und auf der Suche nach weiteren Makros im Forum habe ich es so modifiziert, dass der Index und das Datum am Ende jeder erstellten DXF-Datei integriert werden.
Angehängt ist die Datei meines Makros:

EXPORT_DXF_IND-DATE.swp (49,5 KB)

Ich habe zwei Bedenken:
Die Datei funktioniert, das erwartete Ergebnis ist gut, aber andererseits ist die Produktionszeit extrem lang. Da ich nichts über VBA weiß, habe ich offensichtlich hier und da Makro-Stücke genommen, um meine Ziele zu erreichen, ich weiß nicht, woher das kommen kann. Ich habe Plandateien mit manchmal mehr als 100 Blättern, das Makro muss 20 Minuten brauchen, um alle Blätter in DXF zu erstellen.
Und der andere Punkt ist, dass ich gerne die Seitenzahl an den Anfang jedes Dateinamens legen möchte, aber ich bin mir nicht sicher, welche Variable ich aufrufen soll.

Danke für dein Feedback
Mit freundlichen Grüßen
Manu

Hallo;

Es wäre besser gewesen, eine neue Diskussion zu eröffnen, anstatt eine alte, die bereits " gelöst " war, neu zu starten...

Ist es möglich, dass du deinen Code direkt hier bearbeiten kannst (ohne die </>-Tags zu vergessen)...
Ich bin nie besonders scharf darauf, ein Makro direkt herunterzuladen... und angesichts dessen, was für sein Design beschrieben wird ... Ich bin noch weniger geneigt, herunterzuladen :sweat_smile:

1 „Gefällt mir“

Hallo,

Danke für das Feedback, tut mir leid, ich bin kein Forenkonsument, ich kenne die Regeln nicht. :sweat_smile:

Unten ist mein Makro:

Option Explicit
Dim swApp       As SldWorks.SldWorks
Dim swModel     As SldWorks.ModelDoc2
Dim swDraw      As SldWorks.DrawingDoc
Dim swCustProp  As CustomPropertyManager
Dim valOut1     As String
Dim resolvedValOut1 As String
Dim sPathname   As String
Dim vSheetName  As Variant
Dim nErrors     As Long
Dim nWarnings   As Long
Dim i           As Long
Dim bRet        As Boolean
Dim lParam      As Long

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    lParam = swApp.GetUserPreferenceIntegerValue(swDxfMultiSheetOption)
    
    'Changement paramétrage export dxf si différent de feuille active
    If lParam <> 0 Then
        bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, swDxfMultisheet_e.swDxfActiveSheetOnly)
    End If
    
    ' On récupère la date du jour et on la met dans un format pouvant se mettre dans le nom d'un fichier
    Dim dateNow As String
    dateNow = Replace(Date, "/", ".")
    
    ' On récupère les valeurs qui nous intéresse dans les propriétés personnalisées du plan
    Set swCustProp = swModel.Extension.CustomPropertyManager("")
    swCustProp.Get2 "Révision", valOut1, resolvedValOut1

    sPathname = Replace(swModel.GetPathName, ".SLDDRW", "")
    vSheetName = swDraw.GetSheetNames
    For i = 0 To UBound(vSheetName)
        bRet = swDraw.ActivateSheet(vSheetName(i))
        bRet = swModel.SaveAs4(sPathname & " - " & resolvedValOut1 & " - " & dateNow & "_" & vSheetName(i) & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)
    Next i
    
    ' Retour à la Feuille 1
    bRet = swDraw.ActivateSheet(vSheetName(0))
    
    ' Remise en place du paramétrage initial
    bRet = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swDxfMultiSheetOption, lParam)
End Sub

Jedenfalls danke ich euch allen sehr. :grin:
Manu

Hallo;

Insgesamt sehe ich nicht allzu viele Widersprüche im Code, um zu sehen, was mehr Fachleute als ich dazu :sweat_smile: sagen.
Ich hätte einfach eine Variable für die Eigenschaft " Revision " verwendet
Stil:

Dim MyRevision as string
dann
MyRevision = swCustProp.Get2 "Révision", valOut1, resolvedValOut1

Und um die Seitenzahl hinzuzufügen, warum nicht (i+1) verwenden?
Dies ergibt:

bRet = swModel.SaveAs4(sPathname & " - " & MyRevision & " - " & dateNow & "_" & vSheetName(i) & i+1 & ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, nErrors, nWarnings)

Außerdem bin ich kein großer Fan davon, " ." Punkte im Dateinamen zu verwenden,
Also (aber es ist optional): dateNow = Ersetzen(Date, " / ", " _ ")

Und zum Schluss werde ich eine Kontrolle hinzufügen, um zu prüfen, ob MyRevision nicht " Leer" ist:

If MyRevision ="" then
 msgbox ("La propriété Révision n’existe pas.")
exit sub
end if

Um etwas Zeit zu sparen, ist es möglich, grafische Solidworks-Updates während der Verarbeitung zu deaktivieren:

swModel.FeatureManager.EnableFeatureTree = False 'Désactivation de la mise à  jour treeManager
modView.EnableGraphicsUpdate = False 'Désactivation de la mise à  jour graphique
EnableFeatureTreeWindow = False 'Désactivation de la mise à  jour de la fenetre

Aber sie müssen am Ende der Behandlung wieder aktiviert werden:

swModel.FeatureManager.EnableFeatureTree = True 'Activation de la mise à  jour treeManager
modView.EnableGraphicsUpdate = True 'Activation de la mise à  jour graphique
EnableFeatureTreeWindow = True 'Activation de la mise à  jour de la fenetre

Hallo,
Es hängt alles von der " Schwere " jedes einzelnen Blattes ab.
Es ist möglich, dass SW auf dieser Ebene laggt (ich habe bei einigen Makros, die nur einen einfachen PDF-Export durchführen, ähnliches Verhalten).

Gleichzeitig mehr als 100 Blätter, überhaupt nicht überraschend, dass es laggt!

Und das bestärkt meine Vorgehensweise:
1 Stück = eine Feile = 1 Plan, dann Montage (außer bei Mehrkörper-Rohrschweißkonstruktionen)

Okay, danke für dein Feedback.
Ich versuche, das zu modifizieren, und ich probiere meine nächste Generation von DXF aus.

Zu deiner Information: Ich bin im Bereich Schweißbau für Möbelmodellierung, daher kann es je nach Möbel viele Teile zu planen geben. Und ich werde gebeten, so viele Blätter wie möglich zu reinigen, also viele Blätter für ein und dasselbe Stück.

Jedenfalls danke ich Ihnen allen sehr für die Zeit, die Sie sich zur Verfügung genommen haben, um mir zu antworten.