Makro do tworzenia plików pdf i dxf w odpowiedniej skali

Witam
Jestem nowicjuszem na forum i znalazłem wiele informacji na temat makr do automatyzacji niektórych zadań.
Mam jednak prośbę, która moim zdaniem nie została do tej pory przez nikogo rozpatrzona.
Chciałbym mieć możliwość automatycznego tworzenia eksportów dxf z rysunku, ale według kryteriów:
1- Jeśli istnieje widok rozwinięty, eksport dxf należy wykonać z uwzględnieniem skali rozwiniętego widoku w celu konwersji do skali 1
2- Jeśli nie ma rozwiniętego widoku (prosta część wycięta laserowo), to bierzemy pod uwagę skalę planu, a nie konkretny widok.

Nie wiem, czy jest to możliwe.
Konieczna byłaby również możliwość zapisania plików pdf i dxf z ich indeksem wersji w nazwie pliku. A najlepszą rzeczą byłaby również możliwość posiadania pliku, w którym rejestrowany jest każdy eksport.

Z góry dziękuję wszystkim ekspertom VBA na tym forum za pomoc

Witam @ediatta
Jeśli możesz podać więcej szczegółów,
1 Ile widoków w arkuszu
2 Ręczny (automatyczny) wybór widoku do eksportu
3 Eksport widoków w tym samym lub różnych skoroszytach (jeśli w arkuszu istnieje wiele widoków)
4 Jeśli widok jest rozwinięty (lub nie) w skali 1/2, arkusz w skali 1/5, jaka jest skala wyjściowa dla każdego przypadku.
5 indeks rewizyjny to PRP w pokoju, w arkuszu lub w tabeli,

Witaj @Lynkoa15,
Dziękuję za odpowiedź na mój temat.
Aby uzyskać więcej informacji:
1 ile widoków w arkuszu = tylko > 1, ogólnie będzie to pokój na planie

2 ręczny (automatyczny) wybór widoku do eksportu => Idealnie automatyczny wybór widoku, ale może łatwiej będzie zarządzać ręcznym wyborem. Z reguły będą 2 przypadki, albo jest to złożona blacha i rozwinięty widok w innej skali niż widoki gotowej części, albo jest to prosta część wycięta laserowo, a wszystkie widoki mają tę samą skalę, która może, ale nie musi, być identyczna z arkuszem. W przypadku 1 skalą, którą należy wziąć pod uwagę, będzie widok rozłożony, a w przypadku 2 będzie to skala jednego z widoków. Z drugiej strony jest to rysunek, który chcę wyeksportować, ale nie biorąc systematycznie pod uwagę skali arkusza, aby go przekonwertować i mieć skalę wyjściową 1 mojego DXF.

3 Eksport widoków w tym samym lub różnych skoroszytach (jeśli w arkuszu istnieje kilka widoków) => powinniśmy być w stanie wybrać skoroszyt, do którego eksportujemy (za pomocą MSGBOX lub innego)

4 Jeśli widok jest rozwinięty (lub nie) w skali 1/2, arkusz ze skalą 1/5, jaka jest skala wyjściowa dla każdego przypadku => skala wyjściowa musi zawsze wynosić 1/1

5 indeks rewizji to PRP w pokoju, w arkuszu lub w tabeli => jest to właściwość w pomieszczeniu

Witam;

Czy nie byłoby najprościej, gdyby wszystkie twoje widoki były zgodne ze skalą twojego rysunku?
Jest to szczególnie ważne, jeśli masz tylko jeden widok na arkusz instalacji.

W ten sposób wszystkie eksporty mogą być konwertowane w formacie 1:1 do formatu DXF za pomocą ustawień Solidworks (Eksporty).

Solidworks eksportuje dane w przestrzeni "Obiekt", która zawsze powinna być w skali 1:1. Konwencja 2D jest taka, że tylko przestrzeń "Papier" akceptuje współczynnik skali...
Jest to tym bardziej praktyczne w przypadku przyjmowania kursów.

Pozdrowienia.

Witaj @Maclane,

Wyobraziłem sobie, że robię to, co mówisz. Na tym samym arkuszu znajduje się jednak kilka widoków i jeśli wymiary pomieszczenia są duże, nadal bardzo praktyczne jest posiadanie zróżnicowanych skal.
Przykład:
Część z kilkoma warstwami może mieć znacznie niższe gotowe boki niż te po rozłożeniu, które mogą być większe o współczynnik 3, 4 lub +. Ciekawie jest więc grać na skali.
Wadą jest to, że rozłożony służy do cięcia laserowego i jeśli jest w innej skali niż na planie, wymiary eksportu dxf będą błędne. Innymi słowy, jeśli widoki gotowej części są w skali 1/5, a rozwiniętej w skali 1/10, eksport w dxf zostanie przekonwertowany ze skali 1/5 => wymiary rozłożonej części użytej do cięcia laserowego będą błędne.
W przeciwnym razie jedyną opcją byłoby wybieranie coraz większych formatów planów, aby zawsze mieć wszystkie widoki w tej samej skali... A szkoda

@ediatta, czy ten kod rozwiązuje część drabiny?

'-------------------------------------------------------------------------
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

Witaj @Lynkoa15,

Tak, przetestowałem to i rozwiązuje problem z łukiem.
Niekoniecznie rozumiałem kod (zwłaszcza dlaczego przechodzimy do następnego widoku na początku pętli "tak długo, jak", czy nie ryzykujemy, że przegapimy widok?), ale i tak działa. Dziękuję bardzo.
Wszystko, co muszę teraz zrobić, to być w stanie powiedzieć na podstawie tego samego kodu, że jeśli rozwinięty widok nie istnieje, musimy wziąć skalę planu. a następnie daj możliwość dodania wersji części, a także pliku rejestracyjnego.

Witam @tous
Rzeczywiście, nie ma ryzyka pominięcia widoku, ponieważ pierwszy widok został zwrócony, a arkusz jest aktywny,
W załączeniu znajduje się kod, który musi odpowiadać głównym linię,
Skala rozwiniętego widoku lub arkusz, jeśli rozwinięty nie istnieje
Implementacja poprawki (domyślna nazwa właściwości "revision"
Możliwość wyboru repertuaru.
Zauważ, że użyłem parametru czynnika, który jest przestarzały, ponieważ sw nie oferuje w tej chwili opcji

W związku z tym konieczne jest wykonanie bardziej dogłębnych testów niż dab (z mojej strony działa to w 2018 i 2022 roku)


'----------------------------------------------------------------------------
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 polubienie

Witaj @Lynkoa15 ,
Przepraszam za spóźnioną odpowiedź, wakacje tam były...
Dziękujemy za Twoją opinię i ten kod.
Z drugiej strony niestety u mnie to nie działa, mam błąd w następującym wierszu:
scustomprpmgr. Get6 prp, False, svOut, srevision, sWRout, sLPout
Nie znam źródła błędu...
Z drugiej strony, wyjaśnienie, moja niestandardowa właściwość dla wersji nazywa się "Indeks", może stamtąd pochodzi? Jeśli tak, gdzie muszę zmodyfikować kod?

Czy to makro działa do tworzenia plików pdf i dxf? I czy tworzy plik PDF/dxf różnych folio osobno.
Jeszcze raz z góry dziękuję za pomoc

Witam
W przypadku problemu związanego z nazwą nieruchomości należy tutaj zmienić

Zmienianie wersji według indeksu

1 polubienie

@Cyril_f nie działa to dużo lepiej.
Otrzymuję ten sam komunikat o błędzie w tym samym wierszu

Witaj ediata i życzę powodzenia w powrocie do pracy

Jeśli chodzi o eksport pdf i dxf, to tak.
Jeśli chodzi o multifolio, makro eksportuje tylko aktywny arkusz, ale wypełnia go na różnych arkuszach i jest to wykonalne,
Na razie będziemy musieli dowiedzieć się, co jest nie tak.
Dla możliwej właściwości "revision" zadeklarowanej zgodnie ze wskazaniem cyryla, zmieniając domyślną nazwę, w przeciwnym razie indie nazwę tutaj

Jeśli chodzi o błąd, powiedziałbym, że masz wersję niższą niż 2018, czy tak jest? (Zrzut ekranu z tym komunikatem o błędzie będzie mile widziany)

1 polubienie

Tak, rzeczywiście jestem na SW2017.
Poniżej znajdują się zrzuty ekranu:
image

Na pierwszy rzut oka Get6 jest kompatybilny z SW2018.
Użyj tej linii, aby zamienić wiersz w błędzie, jeśli się nie mylę, powinno być lepiej, chyba że inne funkcje są w tym samym przypadku (niekompatybilne z SW2017)

scustomprpmgr.Get5 prp, False, svOut, srevision, sWRout
2 polubienia

Dziękuję @sbadenis , działało świetnie.
Ostatnie pytanie @Lynkoa15, czy byłoby możliwe zapisanie pliku PDF i DXF w różnych folderach?

Czy będzie linia lub prosty kod, który można dodać, aby móc wyeksportować jako krok?

Poniżej znajduje się kod, który powinien być odpowiedni,
Podfoldery dwg, pdf i step w odniesieniu do folderu roboczego są tutaj zadeklarowane z rewizją prp
Capture08

Stamtąd pochodziła rewizja prp i konfiguracja kroku
Capture07
Tak więc arkusz może obsłużyć kilka różnych komponentów (w przeciwnym razie zapraszam do otwarcia nowej stacji dla tego kroku)

Ze swojej strony do cięć blachy zawsze dodaję wymiar, aby mój kolega z nestingu mógł sprawdzić i zgłosić mi każdy błąd skalowania (nigdy nie wiadomo)

'----------------------------------------------------------------------------
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 polubienie

Dziękuję @Lynkoa15 .
Makro działa dobrze do tworzenia różnych folderów. To świetnie!
Z drugiej strony, indeks (rewizja) części nie jest dodawany do nazwy plików (pdf/dxf/step). Czy może to być spowodowane tym, że makro nie może go znaleźć? Zazwyczaj wskazówka znajduje się w niestandardowych właściwościach rysowanej części (3D).