Problem z makro eksportu arkusza blachy DXF

Witam wszystkich, napisałem makro do eksportu rozwiniętych części arkusza blachy, wszystko działa dobrze, gdy jest włączone z części.

Chcę, aby działał nawet wtedy, gdy aktywny dokument jest planem (zbliżam się do etapu eksportu).

W przypadku, gdy punktem wyjścia jest plan, celem jest, aby otworzyć/aktywować część o tej samej nazwie, a następnie wyeksportować ją za pomocą ExportToDWG2.

Ale otrzymuję błąd "właściwość lub metoda nie jest obsługiwana przez ten obiekt" w tym kontekście, pomysły?

(jednak po otwarciu części, MsgBox ("Aktywny dokument to: " & swApp.ActiveDoc.GetTitle) informuje mnie, że część jest aktywna)

---------------------------------SPRAWDZENIE KONTEKSTU I URUCHOMIENIE-------------------------

Sub dxfexport()

Jeśli nie swDOC to nic to nic
Jeśli swDOC.GetType = swDocDRAWING Następnie
Jeśli fso. FileExists(PART_PATH) Następnie
Zadzwoń do openpart
Zadzwoń do dxf
Zadzwoń closepart

    Else: MsgBox ("Pièce Introuvable")
    End If
ElseIf swDOC.GetType = swDocPART Then
    'openpart
    dxf
End If

Inaczej
MsgBox "Proszę otworzyć dokument", vbExquiation + vbOKOnly
Zakończ jeżeli:

Koniec subwoofera

--------------------------------- OTWARCIU POKOJU----------------------------
Sub openpart()
Dim swApp As Object
Przyciemnij część jako obiekt
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Ustaw swApp = Application.SldWorks
Ustaw część = swApp.ActiveDoc

Robić
Jeśli fso. FileExists(PART_PATH) Następnie
Ustaw część = swApp.OpenDoc6(PART_PATH, 1, 0, "", longstatus, longwarnings)
swApp.ActivateDoc3 PART_PATH, False, swRebuildOnActivation_e.swDontRebuildActiveDoc, longstatus
'swApp.ActivateDoc2 PART_PATH, Fałsz, długi status
Ustaw część = swApp.ActiveDoc
W przeciwnym razie: MsgBox ("nie znaleziono części")

Zakończ jeżeli:
Pętla do Part.GetType = swDocPART

Part.EditRebuild3 (Edycja części)
Part.ViewZoomtofit2
MsgBox ("Aktywny dokument to: " & swApp.ActiveDoc.GetTitle)
Koniec subwoofera

-------------------------------------------EKSPORT------------------------------------
Sub dxf()

Dim modelPath As String
Dim longstatus As Long

modelPath = swDOC.GetPathName



Dim OUT_PATH As String
OUT_PATH = EXPORT_PATH & FILE_NAME & Indice + ".DXF"

Dim options As Long
options = 1 Or 2 Or 4 Or 8 Or 16 Or 32

'Codes d'options d'export:
'ExportFlatPatternGeometry = 1
'IncludeHiddenEdges = 2
'ExportBendLines = 4
'IncludeSketches = 8
'MergeCoplanarFaces = 16
'ExportLibraryFeatures = 32
'ExportFormingTools = 64
'ExportBoundingBox = 2048

If modelPath = "" Then
Err.Raise vbError, "", "Enregistrez votre pièce avant export"

Inaczej

If False = swDOC.ExportToDWG2(OUT_PATH, PART_PATH, swExportToDWG_e.swExportToDWG_ExportSheetMetal, True, Empty, False, False, options, Empty) Then
    Err.Raise vbError, "", "Erreur d'export DXF"
End If

Zakończ jeżeli:

Koniec subwoofera

Witaj @Clément_Barillot_1 ,

Błąd jest prawdopodobnie spowodowany metodą ExportToDWG2 , która jest specyficzna dla klasy IPartDoc, a nie dla ImodelDoc2.
W związku z tym dokument części aktywnej musi być przypisany do zmiennej swPart typu SldWorks.PartDoc.

 Dim swPart As SldWorks.PartDoc
        Set swPart = swApp.ActiveDoc
        If False = swPart.ExportToDWG2(OUT_PATH, PART_PATH, swExportToDWG_e.swExportToDWG_ExportSheetMetal, True, Empty, False, False, options, Empty) Then
            Err.Raise vbError, "", "Erreur d'export DXF"
        End If
1 polubienie

DZIĘKUJĘ! Męczę się od kilku dni, nawet użyłem chatGPT, aby mi pomógł... Na razie jesteś lepszy od " niego " :wink:

Jeszcze raz dziękuję

Witam
Aby to zadziałało, będziesz musiał również przenieść deklaracje do (wcześniej w global) funkcji głównej, którą jest "dxfexport()" a nie "openpart()",
Dodać odniesienie, deklarację i przypisanie "fso",
Usuń pętlę "do", która oznacza, że jeśli fso nie znajdzie pliku, spowoduje to nieskończoną pętlę,
(tak to zadziałało u mnie)

W rzeczywistości był to błąd z mojej strony w openpart:

Ustaw część = swApp.ActiveDoc
Zamiast
Ustaw swDOC = swApp.ActiveDoc

Ale dxf() eksportuje na podstawie swDOC...

Więc nieuchronnie... Zasada była dobra, ale zmienna, nie...

Interwencja pana Blita pozwoliła mi to sobie uświadomić, po prostu...

Jeśli chodzi o deklaracje, nadal mam duplikaty, ale są one typu Public, a nie Dim, podczas inicjalizacji Main()

dxfexport() nie jest moją główną funkcją, pełne makro eksportuje w DXF, STEP + PDF, niezależnie od tego, czy jesteś w pomieszczeniu, czy na jego planie.

Zobaczę co do pętli inifinie, do tej pory nie miałem żadnego problemu ale zaznaczę...

Witam
Załóżmy, że istnieje mniejsze ryzyko, ponieważ plik musi istnieć.
Z drugiej strony zastanawiam się, jaki jest sens tej kontroli istnienia pliku, skoro jeśli dobrze zrozumiałem, to albo mamy 3D bezpośrednio otwarte, albo otwieramy je z 2D, więc musi on istnieć.
Edycja: z drugiej strony, sprawdzenie, czy wyeksportowany plik jeszcze nie istnieje, byłoby znacznie bardziej przydatne (i wygenerowanie powiązanego zachowania)

Witam
Podejrzewałem, że istnieją inne funkcje, ale mogę sobie poradzić tylko z tym, co napisałeś :wink:

Witaj Cyryl
Rzeczywiście, 3d na pewno istnieje, ale niekoniecznie o tej samej nazwie, a nawet bardziej w określonym katalogu, który rozpocznie pętlę z nieskończoną wiadomością

Uh, nie, jeśli jest uzyskiwany z widoku 2D, może istnieć tylko w zdefiniowanej lokalizacji, chyba że jest to wirtualny plik asm, ale nie w tym przypadku, o ile mi wiadomo.
Jeśli dobrze zrozumiałem, to jest to SW otwarte z plikiem w wizualizacji, więc musi istnieć.

Co nie jest prawdą, ponieważ w poście podał tę samą nazwę co na rysunku

1 polubienie

Dokładny, błędnie odczytany

1 polubienie