Eksport makr DXF arkusz po arkuszu

Witam

Za pomocą użytego makra należy zmodyfikować opcje eksportu formatów dxf/dwg w opcjach solidworks:

Pozdrowienia

Witam

Wynik jest taki sam, nadal mam 4 pliki w kłamstwie 2

W przeciwieństwie do plików PDF

Witam

Ze swojej strony jestem ustawiony na "Eksportuj wszystkie arkusze w pliku" i nie mam problemu.

Tylko jeśli ustawienie to "Eksportuj wszystkie arkusze w osobnych plikach", eksport generuje 4 pliki.

Zauważyłem również, że trzeba dwukrotnie wymusić zmianę ustawień, aby została ona poprawnie uwzględniona (prawdopodobnie błąd SW2020).

SW nie uwzględnił ustawienia "Eksportuj wszystkie arkusze do pliku"

Mam 2 pliki z odpowiednią składnią , ale jest to ten sam arkusz w 2, ten, który jest "aktywny" na ekranie.

Patrząc na makro, kilka razy pojawiają się "swExpPdfData" i "SldWorks.ExportPdfData"

i linia  outFile = outFile & IIf(INCLUDE_DRAWING_NAME, drawName & "_", "") & sheetName & ".dxf" lub to ".pdf" w makrze PDF, które działa

Czy to .....  ExpPdfData, które powinny zostać zastąpione odpowiednikiem dla DXF-ów?

Ups, szukam bardziej szczegółowo, nie otworzyłem plików.

Ponownie

Zwykle poniższy kod spełnia potrzebę

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 polubienia

Dziękuję
Działa idealnie ;-)

Witam
Przepraszam, że odkurzam temat, ale próbowałem tego makra na SW2025 i nie działa.
To jest dokładnie to, co również chcę robić, wykonuję rysowanie części z wieloma spawanymi korpusami.
Dziękuję bardzo
Manu

Witam @Emmanuel_SERVEL i witam.

Aby móc Ci pomóc, potrzebujemy więcej informacji:

Mówisz, że makro nie działa pod Sw2025, co i komunikat o błędzie?
Czy posiadana wersja oprogramowania Solidworks jest wersją lokalną czy 3Dexperience?
Czy zastanawiałeś się nad załadowaniem odniesień Solidworks do edytora VBA?
image

Nuta:
Funkcja " SaveAs4 " jest uważana za przestarzałą w Pomocy API Solidworks.
dziwnym trafem jest on zastąpiony przez " SaveAs3 "
A ich wypowiedzi są nieco inne:
wartość = wystąpienie. SaveAs4(Nazwa, wersja, opcje, błędy, ostrzeżenia)
i
wartość = wystąpienie. SaveAs3(Nazwa, wersja, opcje, ExportData, AdvancedSaveAsOptions, błędy, ostrzeżenia)

To powiedziawszy, " przestarzała " funkcja niekoniecznie jest bezużyteczna...

Ale tutaj atakujemy temat, który zależy od twojego poziomu w programowaniu VBA.
W twoim przypadku myślę bardziej o odwołaniach VBA, aby dodać...

Pozdrowienia.

2 polubienia

Witam
Dziękuję za opinię, kiedy poszedłem sprawdzić referencje, wszystkie pola SW były już zaznaczone. Właśnie dodałem Microsoft Scripting Runtime, ponownie uruchomiłem makro, aby spróbować i wydaje się, że działa idealnie. Nie wiem, czy to był problem, ale w każdym razie jestem zadowolony.
Dziękuję bardzo
Manu

1 polubienie

Witam

Nie jest dziwnie zastąpiony przez SaveAs3, po prostu nie korzysta z tych samych metod, SaveAs4 jest częścią metod ModelDoc2 i SaveAs3 ModelDocExtension.
W odpowiedzi na @Emmanuel_SERVEL odwołanie do środowiska uruchomieniowego skryptów firmy Microsoft zwykle nie jest potrzebne dla podanego przeze mnie fragmentu kodu. Błąd może pochodzić z funkcji Left, która czasami nie jest rozpoznawana, musisz użyć VBA jako zamiennika. Lewy.

1 polubienie

Dziękuję @Cyril_f ... Wzbogacenie mojej kultury osobistej: :grinning:
(i nie ma nawet sarkazmu)

Dokument ModelDoc2 :
Reprezentuje główny dokument w SolidWorks (część, złożenie lub rysunek)

  • Umożliwia dostęp do podstawowych operacji na dokumencie: otwieranie, zapisywanie, przebudowywanie, pobieranie typu dokumentu, dostęp do konfiguracji, zarządzanie widokami itp
    So => ModelDoc2:p wszystkie podstawowe operacje na dokumencie SolidWorks*.

Rozszerzenie ModelDoc:

Jest rozszerzeniem ModelDoc2, do którego dostęp uzyskuje się za pośrednictwem właściwości .Extension obiektu ModelDoc2*.

  • Został utworzony w celu dodania dodatkowych metod i właściwości, gdy ModelDoc2 osiągnął limit pojemności pod względem liczby metod.

  • Zapewnia dostęp do zaawansowanych lub mniej popularnych funkcji, takich jak: zarządzanie właściwościami niestandardowymi, obliczenia właściwości masowych, zarządzanie tabelami zestawień materiałów (BOM), operacje konwersji, zaawansowane zarządzanie rekordami (np. SaveAs2)
    Więc: ModelDocExtension :p zaawansowane lub wyspecjalizowane operacje, które nie są dostępne bezpośrednio w ModelDoc2, dostępne za pośrednictwem właściwości .Extension obiektu ModelDoc2

Podsumowując, ModelDocExtension uzupełnia ModelDoc2 i zapewnia dostęp do dodatkowych funkcji potrzebnych do makr lub zaawansowanych automatyzacji w SolidWorks

.

3 polubienia

Cześć, to znowu ja w tej sprawie.

Zaczynając od początkowego MAKRA i szukając innych makr na forum, zmodyfikowałem go tak, aby integrował indeks i datę na końcu każdego wygenerowanego pliku DXF.
Załączam plik mojego makro:

EXPORT_DXF_IND-DATE.swp (49,5 KB)

Mam dwie obawy:
Plik działa, oczekiwany efekt jest dobry, ale z drugiej strony czas produkcji jest niezwykle długi. Nie znając się na VBA, wyraźnie brałem tu i ówdzie elementy makro, żeby osiągnąć swoje cele, nie wiem, skąd to się wzięło. Mam pliki planów czasem z ponad 100 arkuszami, makro musi potrzebować 20 minut, żeby wygenerować wszystkie arkusze w DXF.
A druga kwestia to dodanie numeru strony na początku każdej nazwy pliku, ale nie jestem pewien, którą zmienną wywołać.

Dziękuję za Twoją opinię
Pozdrowienia
Manu

Cześć;

Lepiej byłoby otworzyć nową dyskusję, niż wznowić starą, która już była " Rozwiązana "...

Czy możesz edytować swój kod bezpośrednio tutaj (nie zapominając o tagach </>)...
Nigdy nie jestem zbyt chętny do bezpośredniego pobierania makra... a w świetle opisanego projektu ... Jeszcze mniej mam ochotę pobierać :sweat_smile:

1 polubienie

Cześć,

Dziękuję za opinię, przepraszam, nie jestem użytkownikiem forum, nie znam zasad, których powinienem przestrzegać. :sweat_smile:

Poniżej przedstawiam moje 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

W każdym razie bardzo wam wszystkim dziękuję. :grin:
Manu

Cześć;

Ogólnie nie widzę zbyt wielu nieścisłości w kodzie, żeby zobaczyć, co mówi więcej profesjonalistów ode :sweat_smile: mnie.
Po prostu użyłbym zmiennej dla właściwości " Rewizja "
Styl:

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

A żeby dodać numer strony, dlaczego nie użyć (i+1)?
To da:

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

Poza tym nie jestem fanem używania "  ." kropek w nazwie pliku,
Więc (ale to opcjonalne): dateNow = Replace(Date, " / ", " _  ") 

I na koniec dodam sprawdzenie, czy MyRevision nie jest " Pusty" :

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

Aby zaoszczędzić trochę czasu, można wyłączyć aktualizacje graficzne Solidworks podczas przetwarzania:

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

Ale będą musiały zostać ponownie aktywowane po zakończeniu leczenia:

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

Cześć,
Wszystko zależy od " ciężkości " każdego liścia.
Możliwe, że SW laguje na tym poziomie (mam podobne zachowanie na niektórych makrach, które eksportują tylko prosty PDF)

Jednocześnie ponad 100 arkuszy, wcale nie dziwię, że się opóźnia!

I to tylko potwierdza mój sposób działania:
1 element = jeden plik = 1 plan, a następnie montaż (z wyjątkiem konstrukcji spawanych z rurami wielokorpusowymi)

OK, dziękuję za opinię.
Próbuję to zmodyfikować i próbuję mojej następnej generacji DXF.

Dla twojej informacji, zajmuję się spawaną konstrukcją do modelowania mebli, więc w zależności od rodzaju mebli może być wiele elementów do zaplanowania. I proszono mnie, żebym oczyścił jak najwięcej liści, czyli dużo liści na ten sam kawałek.

W każdym razie bardzo dziękuję wszystkim za czas, który poświęciliście na odpowiedź.