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

Pozdrowienia
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
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?

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.
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
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.
Dziękuję @Cyril_f ... Wzbogacenie mojej kultury osobistej: ![]()
(i nie ma nawet sarkazmu)
Dokument ModelDoc2 :
Reprezentuje główny dokument w SolidWorks (część, złożenie lub rysunek)
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
.
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ć ![]()
Cześć,
Dziękuję za opinię, przepraszam, nie jestem użytkownikiem forum, nie znam zasad, których powinienem przestrzegać. ![]()
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ę. ![]()
Manu
Cześć;
Ogólnie nie widzę zbyt wielu nieścisłości w kodzie, żeby zobaczyć, co mówi więcej profesjonalistów ode
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ź.