Makro zum Erstellen von PDF- und DXF-Dateien im richtigen Maßstab

Hallo
Ich bin ein Neuling im Forum und habe viele Informationen über Makros gefunden, um bestimmte Aufgaben zu automatisieren.
Allerdings habe ich eine Bitte, die meiner Meinung nach bisher von niemandem bearbeitet wurde.
Ich möchte in der Lage sein, DXF-Exporte automatisch aus einer Zeichnung zu erstellen, jedoch nach Kriterien:
1- Wenn es sich um eine aufgefaltete Ansicht handelt, sollte der DXF-Export unter Berücksichtigung des Maßstabs der aufgeklappten Ansicht für eine Konvertierung in den Maßstab 1 erfolgen
2- Wenn es keine abgefaltete Ansicht gibt (einfacher lasergeschnittener Teil), berücksichtigen wir den Maßstab des Plans und nicht eine bestimmte Ansicht.

Ich weiß nicht, ob das möglich ist.
Es wäre auch notwendig, die pdf- und dxf-Dateien mit ihrem Revisionsindex im Dateinamen speichern zu können. Und das Beste wäre auch, wenn man die Datei hätte, in der jeder Export aufgezeichnet wird.

Vielen Dank im Voraus an alle VBA-Experten in diesem Forum für Ihre Hilfe

Hallo @ediatta
Wenn Sie weitere Einzelheiten angeben können,
1 Wie viele Ansichten im Blatt
2 Manuelle (automatische) Auswahl der zu exportierenden Ansicht
3 Ansichtsexporte in derselben oder unterschiedlichen Arbeitsmappen (wenn mehrere Ansichten im Blatt vorhanden sind)
4 Wenn es sich bei der Ansicht um eine Abwicklung mit dem Maßstab 1/2 handelt (oder nicht), das Blatt mit dem Maßstab 1/5, was ist der Ausstiegsmaßstab für jeden Fall.
5 Revisionsindex ist ein PRP im Raum, im Blatt oder in einer Tabelle,

Hallo @Lynkoa15,
Vielen Dank, dass Sie mein Thema beantwortet haben.
Also für weitere Details:
1 wie viele Ansichten im Blatt = > nur 1, insgesamt wird es ein Raum ein Plan sein

2 Manuelle (automatische) Auswahl der zu exportierenden Ansicht => idealerweise automatische Auswahl der Ansicht, aber vielleicht ist es einfacher, eine manuelle Auswahl zu verwalten. In der Regel gibt es 2 Fälle, entweder handelt es sich um ein gefaltetes Blech und die abgewickelte Ansicht in einem anderen Maßstab als die Ansichten des fertigen Teils, oder es handelt sich um ein einfaches lasergeschnittenes Teil, und alle Ansichten haben den gleichen Maßstab, der mit dem des Blechs identisch sein kann oder auch nicht. In Fall 1 wäre der zu berücksichtigende Maßstab die aufgefaltete Ansicht und in Fall 2 der Maßstab einer der Ansichten. Auf der anderen Seite ist es die Zeichnung, die ich exportieren möchte, aber nicht systematisch unter Berücksichtigung des Maßstabs des Blattes, um es umzuwandeln und einen Ausgabemaßstab 1 meines DXF zu haben.

3 Ansichtsexport in derselben oder verschiedenen Arbeitsmappen (wenn mehrere Ansichten im Blatt vorhanden sind) => wir sollten in der Lage sein, die Arbeitsmappe auszuwählen, in die wir exportieren (über msgbox oder andere)

4 Wenn die Ansicht eine Abwicklung mit 1/2 Maßstab ist (oder nicht), das Blatt mit 1/5 Maßstab, was ist der Ausgabemaßstab für jeden Fall = > der Ausgabemaßstab muss immer 1/1 sein

5 Revisionsindex ist ein PRP im Raum, im Blatt oder in einer Tabelle => es handelt sich um eine Eigenschaft im Raum

Hallo;

Wäre es nicht am einfachsten, wenn alle Ihre Ansichten mit dem Maßstab Ihrer Zeichnung übereinstimmen?
Dies gilt insbesondere dann, wenn Sie nur eine Ansicht pro TGA-Blatt haben.

Auf diese Weise können alle Ihre Exporte über die Solidworks Einstellungen (Exporte) im Verhältnis 1:1 in das DXF-Format konvertiert werden.

Solidworks exportiert Ihre Daten in den Objektbereich, der immer im Maßstab 1:1 vorliegen sollte. Die 2D-Konvention besagt, dass nur der "Papier"-Bereich einen Skalierungsfaktor akzeptiert...
Das ist umso praktischer, wenn man Quoten nimmt.

Herzliche Grüße.

Hallo @Maclane,

Ich stellte mir vor, das zu tun, was du sagst. Es gibt jedoch mehrere Ansichten auf demselben Blatt und wenn die Abmessungen des Raumes groß sind, ist es immer noch sehr praktisch, differenzierte Skalen zu haben.
Beispiel:
Ein Teil mit mehreren Lagen kann viel niedrigere Fertigseiten haben als die des abgewickelten Teils, die um den Faktor 3, 4 oder + größer sein können. Und so ist es interessant, auf der Tonleiter zu spielen.
Der Nachteil ist, dass das abgewickelte Gerät zum Laserschneiden verwendet wird und wenn es sich um einen anderen Maßstab als geplant handelt, sind die Abmessungen des DXF-Exports falsch. Mit anderen Worten, wenn die Ansichten des fertigen Teils einen Maßstab von 1/5 und die des abgewickelten Teils einen Maßstab von 1/10 haben, wird der Export in DXF vom Maßstab 1/5 = umgerechnet > die Abmessungen des abgewickelten Teils, die für das Laserschneiden verwendet werden, sind falsch.
Andernfalls wäre die einzige Möglichkeit, immer größere Planformate zu nehmen, um immer alle Ansichten im gleichen Maßstab zu haben... was eher schade ist

@ediatta, löst dieser Code den Kontaktplanteil?

'-------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim sPathName               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    sPathName = swModel.GetPathName
    sPathName = Left(sPathName, Len(sPathName) - 6)
    sPathName = sPathName + "dxf"
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    Dim swview As View
    Set swview = swdrawing.GetFirstView
    Set swview = swview.GetNextView
    Do While Not swview Is Nothing
        If swview.IsFlatPatternView Then
            swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, swview.ScaleRatio(1) / swview.ScaleRatio(0)
            Exit Do
        End If
        Set swview = swview.GetNextView
    Loop
    bRet = swModel.Extension.SaveAs(sPathName, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file.", swMbWarning, swMbOk
    End If

End Sub

Hallo @Lynkoa15,

Ja, ich habe es getestet und es löst das Skalenproblem.
Ich habe den Code nicht unbedingt verstanden (vor allem, warum gehen wir zu Beginn der Schleife zur nächsten Ansicht über, "solange als", riskieren wir nicht, eine Ansicht zu verpassen?), aber trotzdem funktioniert es. Vielen Dank.
Alles, was ich jetzt tun muss, ist, mit demselben Code sagen zu können, dass, wenn die entfaltete Ansicht nicht existiert, wir den Maßstab des Plans nehmen müssen. und geben Sie dann die Möglichkeit, sowohl die Teilerevision als auch die Registrierungsdatei hinzuzufügen.

Hallo @tous
In der Tat besteht kein Risiko, eine Ansicht zu überspringen, da die erste Ansicht zurückgegeben wird und das Blatt aktiv ist.
Beigefügt ist ein Code, der den Hauptzeilen entsprechen muss,
Abgewickelte Ansicht, Maßstab oder Blatt, wenn abgewickelt nicht vorhanden
Implementieren der Revision (Standardeigenschaftsname "revision"
Möglichkeit, das Repertoire zu wählen.
Beachten Sie, dass ich den Faktorparameter verwendet habe, der veraltet ist, da sw im Moment keine Option bietet

Infolgedessen ist es notwendig, tiefergehende Tests als Dab durchzuführen (auf meiner Seite funktioniert es für 2018 und 2022)


'----------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim spathname               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, getScaleFactor()
    
    Dim path As String, name As String, revision As String
    name = getPathName(swModel)(0)
    path = getPathName(swModel)(1)
    revision = getRevision()
    
    Dim newPath As String
    Select Case MsgBox("Saving folder is : " + Chr(10) + path + Chr(10) + "press yes to save , no to browse for path or cancel to abort", vbYesNoCancel)
    Case 7
        path = browseFolder(path)
    Case 2
        End
    End Select
    Dim spathname As String
    spathname = path + "\" + name + "_" + revision
    savedrawingasdxf spathname
    savedrawingaspdf spathname

End Sub

Sub savedrawingasdxf(path As String)
    bRet = swModel.Extension.SaveAs(path + ".dxf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as dxf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingaspdf(path As String)
    Dim expdata As ExportPdfData
    Set expdata = swApp.GetExportFileData(1)
    bRet = swModel.Extension.SaveAs(path + ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, expdata, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as pdf.", swMbWarning, swMbOk
    End If
End Sub

Function getScaleFactor() As Double
    Dim sview As View
    Dim scalfactor As Double
    Set sview = swdrawing.GetFirstView
    scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
    Set sview = sview.GetNextView
    Do While Not sview Is Nothing
        If sview.IsFlatPatternView Then
            scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
            Exit Do
        End If
        Set sview = sview.GetNextView
    Loop
    getScaleFactor = scalfactor
End Function

Function getPathName(model As ModelDoc2) As Variant
    Dim pathname(1) As String
    Dim spathname As String
    spathname = model.getPathName
    If spathname = "" Then
        swApp.SendMsgToUser2 "Please save file then retry.", swMbStop, swMbOk
        End
    End If
    spathname = Left(spathname, Len(spathname) - 7)
    pathname(0) = Right(spathname, Len(spathname) - InStrRev(spathname, "\", -1, vbTextCompare))
    pathname(1) = Left(spathname, InStrRev(spathname, "\", -1, vbTextCompare) - 1)
    getPathName = pathname
End Function

Function getRevision(Optional prp As String = "revision") As String
    Dim ssheet As Sheet
    Set ssheet = swdrawing.GetCurrentSheet()
    Dim prpsheet As String
    prpsheet = ssheet.CustomPropertyView
    Dim sview As View
    Set sview = swdrawing.GetFirstView
    If prpsheet = "Par défaut" Then
        Set sview = sview.GetNextView
    Else
        Set sview = sview.GetNextView
        Do While Not sview Is Nothing
            If sview.GetName2() = prpsheet Then
                Exit Do
            End If
            Set sview = sview.GetNextView
        Loop
    End If
    Dim srefmodel As ModelDoc2
    Set srefmodel = sview.ReferencedDocument
    Dim scustomprpmgr As CustomPropertyManager
    Set scustomprpmgr = srefmodel.Extension.CustomPropertyManager(sview.ReferencedConfiguration)
    Dim svOut As String
    Dim sWRout As Boolean
    Dim sLPout As Boolean
    Dim srevision As String
    scustomprpmgr.Get6 prp, False, svOut, srevision, sWRout, sLPout
    getRevision = srevision
End Function

Function browseFolder(defpath As String) As String
    browseFolder = defpath
    Dim obgShell As Object
    Dim obgFolder As Object
    Set obgShell = CreateObject("shell.application")
    Set obgFolder = obgShell.browseforfolder(0, "", 0)
    If Not obgFolder Is Nothing Then
        browseFolder = obgFolder.self.path
    End If
    Set obgShell = Nothing
End Function



1 „Gefällt mir“

Hallo @Lynkoa15 ,
Entschuldigung für die späte Antwort, die Ferien waren da...
Vielen Dank für Ihr Feedback und diesen Code.
Auf der anderen Seite funktioniert es leider nicht bei mir, ich habe einen Fehler in der folgenden Zeile:
scustomprpmgr. Get6 prp, False, svOut, srevision, sWRout, sLPout
Ich kenne die Fehlerquelle nicht...
Auf der anderen Seite eine Klarstellung, meine benutzerdefinierte Eigenschaft für die Revision heißt "Index", vielleicht kommt sie von dort? Wenn ja, wo muss ich den Code ändern?

Funktioniert dieses Makro dann, um PDF und DXF zu erstellen? Und erstellt es das pdf/dxf der verschiedenen Folios separat.
Nochmals vielen Dank im Voraus für Ihre Hilfe

Hallo
Für das Problem im Zusammenhang mit dem Namen der Eigenschaft müssen Sie hier ändern

Revision nach Index ändern

1 „Gefällt mir“

@Cyril funktioniert nicht viel besser.
Ich bekomme die gleiche Fehlermeldung in der gleichen Zeile

Hallo ediata und viel Erfolg bei der Rückkehr an den Arbeitsplatz

In Bezug auf den Export von PDF und DXF ist es ja.
In Bezug auf das Multifolio exportiert das Makro nur das aktive Blatt, füllt es jedoch auf verschiedenen Blättern und ist möglich.
Im Moment müssen wir herausfinden, was los ist.
Für die mögliche "revision"-Eigenschaft des Deklarierten, wie von cyril angegeben, durch Ändern des Standardnamens, ansonsten indie der Name hier

In Bezug auf den Fehler würde ich sagen, dass Sie eine Version niedriger als 2018 haben, ist das der Fall? (Ein Screenshot dieser Fehlermeldung ist willkommen)

1 „Gefällt mir“

Ja, ich bin tatsächlich auf SW2017.
Unten sind die Screenshots:
image

Auf den ersten Blick ist der Get6 ab SW2018 kompatibel.
Verwenden Sie diese Zeile, um die fehlerhafte Zeile zu ersetzen, wenn ich nicht falsch liege, sollte es besser sein, es sei denn, andere Funktionen befinden sich im gleichen Fall (inkompatibel mit SW2017)

scustomprpmgr.Get5 prp, False, svOut, srevision, sWRout
2 „Gefällt mir“

Vielen Dank @sbadenis , es hat super funktioniert.
Letzte Frage @Lynkoa15, wäre es möglich, das PDF und das DXF in verschiedenen Ordnern zu speichern?

Müsste eine Zeile oder ein einfacher Code hinzugefügt werden, um in einem Schritt exportieren zu können?

Unten ist ein Code, der geeignet sein sollte,
Hier werden die Unterordner dwg, pdf und step in Bezug auf den Arbeitsordner deklariert, mit prp revision
Capture08

Die prp-Revision und die Konfiguration für den Schritt kamen von dort
Capture07
So kann das Blatt mit mehreren verschiedenen Komponenten umgehen (ansonsten lade ich Sie ein, eine neue Station für den Schritt zu öffnen)

Auf meiner Seite füge ich für die Blechschnitte immer ein Maß hinzu, damit mein Nesting-Kollege jeden Skalierungsfehler überprüfen und mir melden kann (man weiß nie)

'----------------------------------------------------------------------------
Option Explicit
    Dim swApp                   As SldWorks.SldWorks
    Dim swModel                 As SldWorks.ModelDoc2
    Dim swdrawing               As DrawingDoc
    Dim spathname               As String
    Dim nErrors                 As Long
    Dim nWarnings               As Long
    Dim bRet                    As Boolean
    Const dxfSubFolder As String = "\dwg"
    Const pdfSubFolder As String = "\pdf"
    Const stepSubFolder As String = "\step"
    Const prpRevision As String = "indice"
    
Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swdrawing = swModel
    
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swDxfOutputNoScale, 1
    swApp.SetUserPreferenceDoubleValue swDxfOutputScaleFactor, getScaleFactor()
    
    Dim path As String, name As String, configuration As String, revision As String
    Dim model As ModelDoc2
    getParameters model, configuration, revision, prpRevision
    name = getPathName(swModel)(0)
    name = name + "_" + revision
    path = getPathName(swModel)(1)

    Dim newPath As String
    Select Case MsgBox("Saving folder is : " + name + Chr(10) + "Export configuration for STEP is : " + configuration + Chr(10) + "working folder is : " + path + Chr(10) + Chr(10) + "press yes to save , no to browse for path or cancel to abort", vbYesNoCancel)
    Case 7
        path = browseFolder(path)
    Case 2
        End
    End Select
    
    createpath path + dxfSubFolder
    savedrawingasdxf path + dxfSubFolder + "\" + name
    
    createpath path + pdfSubFolder
    savedrawingaspdf path + pdfSubFolder + "\" + name
    
    createpath path + stepSubFolder
    savedrawingasstep model, configuration, path + stepSubFolder + "\" + name

    swApp.SendMsgToUser2 "Finish", swMbInformation, swMbOk
End Sub

Sub createpath(path As String)
    Dim fold As Variant
    Dim cpath As String
    For Each fold In Split(path, "\", -1, vbTextCompare)
        cpath = cpath + CStr(fold) + "\"
        If Len(Dir(cpath, vbDirectory)) = 0 Then MkDir cpath
    Next fold
End Sub


Sub savedrawingasdxf(path As String)
    bRet = swModel.Extension.SaveAs(path + ".dwg", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as dxf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingaspdf(path As String)
    Dim expdata As ExportPdfData
    Set expdata = swApp.GetExportFileData(1)
    expdata.SetSheets 2, Nothing
    bRet = swModel.Extension.SaveAs(path + ".pdf", swSaveAsCurrentVersion, swSaveAsOptions_Silent, expdata, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as pdf.", swMbWarning, swMbOk
    End If
End Sub

Sub savedrawingasstep(model As ModelDoc2, conf As String, path As String)
    If model Is Nothing Then Exit Sub
    Set model = swApp.ActivateDoc3(model.getPathName, False, 1, nErrors)
    model.ShowConfiguration2 conf
    bRet = model.Extension.SaveAs(path + ".step", swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, nErrors, nWarnings)
    If bRet = False Then
        swApp.SendMsgToUser2 "Problems saving file as step.", swMbWarning, swMbOk
    End If
    swApp.CloseDoc model.GetTitle
End Sub

Function getScaleFactor() As Double
    Dim sview As View
    Dim scalfactor As Double
    Set sview = swdrawing.GetFirstView
    scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
    Set sview = sview.GetNextView
    Do While Not sview Is Nothing
        If sview.IsFlatPatternView Then
            scalfactor = sview.ScaleRatio(1) / sview.ScaleRatio(0)
            Exit Do
        End If
        Set sview = sview.GetNextView
    Loop
    getScaleFactor = scalfactor
End Function

Function getPathName(model As ModelDoc2) As Variant
    Dim pathname(1) As String
    Dim spathname As String
    spathname = model.getPathName
    If spathname = "" Then
        swApp.SendMsgToUser2 "Please save file then retry.", swMbStop, swMbOk
        End
    End If
    spathname = Left(spathname, Len(spathname) - 7)
    pathname(0) = Right(spathname, Len(spathname) - InStrRev(spathname, "\", -1, vbTextCompare))
    pathname(1) = Left(spathname, InStrRev(spathname, "\", -1, vbTextCompare) - 1)
    getPathName = pathname
End Function

Sub getParameters(ByRef model As ModelDoc2, ByRef configuration As String, ByRef revision As String, Optional prp As String = "revision")
    Dim ssheet As Sheet, csheet As Sheet
    Set csheet = swdrawing.GetCurrentSheet()
    Set ssheet = csheet
    Dim prpDoc As Boolean
    prpDoc = ssheet.GetProperties2()(7)
    If prpDoc = True Then
            swdrawing.ActivateSheet swdrawing.GetSheetNames()(0)
            Set ssheet = swdrawing.GetCurrentSheet()
    End If
    Dim prpsheet As String
    prpsheet = ssheet.CustomPropertyView
    Dim sview As View
    If prpsheet = "Par défaut" Then
        Set sview = swdrawing.GetFirstView
        Set sview = sview.GetNextView
    Else
        Dim views As Variant
        Dim found As Boolean
        found = False
        views = swdrawing.GetViews()
        Dim i As Long
        For i = 0 To UBound(views)
            If UBound(views(i)) = 0 Or found = True Then Exit For
            Dim j As Long
            For j = 1 To UBound(views(i))
                Set sview = views(i)(j)
                If sview.GetName2() = prpsheet Then
                    found = True
                    Exit For
                End If
            Next j
        Next i
    End If
    swdrawing.ActivateSheet csheet.GetName
    If sview Is Nothing Then Exit Sub
    Set model = sview.ReferencedDocument
    Dim scustomprpmgr As CustomPropertyManager
    configuration = sview.ReferencedConfiguration
    If sview.IsFlatPatternView Then
        Dim confvf As configuration
        Set confvf = model.GetConfigurationByName(configuration)
        Set confvf = confvf.GetParent()
        configuration = confvf.name
    End If
    Set scustomprpmgr = model.Extension.CustomPropertyManager(configuration)
    Dim svOut As String
    Dim sWRout As Boolean
    Dim sLPout As Boolean
    Dim srevision As String
    'scustomprpmgr.Get6 prp, False, svOut, srevision, sWRout, sLPout
    scustomprpmgr.Get5 prp, False, svOut, srevision, sWRout
    revision = srevision
End Sub

Function browseFolder(defpath As String) As String
    browseFolder = defpath
    Dim obgShell As Object
    Dim obgFolder As Object
    Set obgShell = CreateObject("shell.application")
    Set obgFolder = obgShell.browseforfolder(0, "", 0)
    If Not obgFolder Is Nothing Then
        browseFolder = obgFolder.self.path
    End If
    Set obgShell = Nothing
End Function

1 „Gefällt mir“

Vielen Dank @Lynkoa15 .
Das Makro eignet sich gut, um die verschiedenen Ordner zu erstellen. Es ist großartig!
Andererseits wird der Index (Revision) des Teils nicht an den Namen der Dateien angehängt (pdf/dxf/step). Könnte es daran liegen, dass das Makro es nicht finden kann? Normalerweise liegt der Hinweis in den benutzerdefinierten Eigenschaften des zu zeichnenden Teils (3D).