Makro API - Eksport DXF części objętościowych (bez płaskiego wzorca)

Witam

Często korzystam z metody: ExportFlatPatternView Method (IPartDoc)

https://help.solidworks.com/2019/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.ipartdoc~exportflatpatternview.html

Aby eksportować blachę opracowaną do wysłania do plazmy / lasera / strumienia wody ...

 

Z drugiej strony zdarza się, że proste części (wyobraźmy sobie prostą podkładkę) rysujemy w objętości, a nie w blasze.

Ta metoda stosowana w przypadku części bryłowej eksportuje część zgodnie z oczekiwaniami, ale zawsze przyjmuje oryginalny widok części z przodu.

Więc jeśli narysujemy podkładkę w widoku z przodu, to w porządku, jeśli narysujemy ją w widoku z boku, będziemy mieli DXF krawędzi podkładki (długi prostokąt, a nie dwa koncentryczne koła).

Jeśli zaktualizujemy widok, aby powiedzieć, że to jest "ten" widok z przodu, uwzględnia to w SW (klikamy na widok z przodu mamy prawy widok), ale dla eksportu nic to nie zmienia.

 

Masz pomysł, aby za każdym razem móc wyeksportować odpowiedni wzrok?

Lub inna technika, która pozwala na eksport części DXF do cięcia NC bez konieczności przeglądania rysunku.

(rzeczywiście, metoda, którą stosujemy do tej pory, polega na wykonaniu rysunku w skali 1:1 bez kartridżu, a następnie wyeksportowaniu go w formacie DXF, ale wcale nie jest to wydajne).

Z góry dziękuję za rady w tym temacie.

Rafael

Haaa właśnie zobaczyłem, że są tam faktycznie:

https://help.solidworks.com/2019/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IPartDoc~ExportToDWG2.html

i że widoki adnotacji można eksportować.

Patrzę na to, co możemy z tym zrobić i opublikuję wyniki tutaj.

1 polubienie

Witam

Tak, jest to funkcja ExportToDWG2, której powinieneś używać do tego, co chcesz zrobić, ta funkcja zastępuje funkcję ExportFlatPatternView od wersji 2017 oprogramowania.

Pozdrowienia

Witam

Oto mój kod:

je le met dans un post suivant car on est limité à 6000 caractères sur le Forum

i wyjście:

A więc dwa problemy:

1- Jeśli nie zdefiniuję widoku w dataView(0), eksport woluminu zadziała, jeśli zdefiniuję go w następujący sposób:

    'Variable pour l'export DXF/DXG
    Dim varViews As Variant
    Dim dataViews(2) As String
    
    'Vues d'annotation que l'on veux exporter en DXF
    dataViews(0) = "*Current"
    dataViews(1) = "*Front"
    dataViews(2) = "*DXF"
    varViews = dataViews

 

Więc mój eksport już nie działa...

 ElseIf flagTole = 0 Then 'Si on est en volumique:
                                    'value = instance.ExportToDWG2(FilePath, ModelName, Action, ExportToSingleFile, Alignment, IsXDirFlipped, IsYDirFlipped, SheetMetalOptions, Views)
                                    varViews = dataViews
                                    swPart.ExportToDWG2 dxfFilePath, filePath, swExportToDWG_ExportAnnotationViews, False, varAlignment, False, False, 0, varViews
                                    bRet = swPart.ExportToDWG2(dxfFilePath, filePath, swExportToDWG_ExportAnnotationViews, True, varAlignment, False, False, 0, varViews)
                                    If bRet Then
                                        Debug.Print "On a exporté la pièce de volumique en DXF:  " & dxfFilePath
                                    Else
                                        Debug.Print ("Erreur enregistrement DXF: " & dxfFilePath)
                                    End If
                                End If 'Fin du If flagTole

swPart.ExportToDWG2 --> zwraca wartość FALSE

Nawet jeśli umieszczę tylko widok z przodu...

Moim celem jest stworzenie widoku adnotacji o nazwie "DXF" w częściach objętościowych, które chcemy wysłać do cięcia. Rzeczywiście, niektóre są rysowane w kontekście montażu i dlatego nie koncentrują się na początku układu współrzędnych ani na podstawowych planach i w tym przypadku rysownik powinien wybrać widok, którego używa do cięcia. Trochę tak, jak podczas wykonywania operacji "Eksportuj powierzchnię" w DXF.

Nie mogę użyć: swExportToDWG_ExportSelectedFacesOrLoops  dlatego, że nie sądzę, żebym mógł automatycznie znaleźć właściwą twarz.

(chyba, że mogę automatycznie wybrać ścianę, która ma największą powierzchnię.... ale hej, to nie jest świetne i może to być czasochłonne)

 

2- W przypadku części blaszanych dobrze eksportuję każdą konfigurację, działa fajnie. Z drugiej strony chciałbym mieć pewność, że wykorzystuje geometrię części w stanie rozwiniętym z funkcjami, które mamy skojarzone ze stanem rozwiniętym (w folderze stanu rozwiniętego). Ponieważ małe modyfikacje są często dokonywane tylko do cięcia, na przykład:

- Na końcu zagięć dodawane są małe ślady zagięcia

- Ukrywamy niektóre powierzchnie, takie jak pogłębiacze, które robimy w przeróbce, w przeciwnym razie otrzymujemy dxf z dwoma koncentrycznymi okręgami, a celem jest posiadanie tylko zamkniętych konturów.

W moim kodzie zamieszczonym powyżej przechodziłem przez konfiguracje, aby znaleźć FLATs, ale części arkusza blachy nie mają konfiguracji FLAT, dopóki nie utworzysz rysunku. Użycie swExportToDWG bardzo mi odpowiada, ponieważ nawet jeśli część nie ma konfiguracji rozwinięcia blachy, eksport jest wykonany dobrze.

 

Masz to, Twoje porady są mile widziane również w innych częściach kodu.

Dziękuję bardzo!

Oto fragment kodu całkowicie obcięty/odtłuszczony, ponieważ musimy mieć mniej niż 600 znaków:

Dla tego tematu zostawiłem tylko te fragmenty, które nas interesują:

Option Explicit

Public Enum swSMBendState_e
    swSMBendStateNone = 0       '  No bend state - not a sheet metal part
    swSMBendStateSharps = 1     '  Bends are in the sharp state - bends currently not applied
    swSMBendStateFlattened = 2  '  Bends are flattened
    swSMBendStateFolded = 3     '  Bends are fully applied
End Enum

Public Enum swSMCommandStatus_e
    swSMErrorNone = 0               '  No errors
    swSMErrorUnknown = 1            '  Failed for an unknown reason
    swSMErrorNotAPart = 2           '  Sheet metal commands only apply to SolidWorks parts
    swSMErrorNotASheetMetalPart = 3 '  Part contains no sheet metal features
    swSMErrorInvalidBendState = 4   '  Invalid bend state was specified
End Enum


Sub main()

    'Objet SW
    Dim swApp               As SldWorks.SldWorks
    Dim swModel             As SldWorks.ModelDoc2
    Dim swPart              As SldWorks.PartDoc
    Dim swExportPDFData     As SldWorks.ExportPdfData
    Dim swView              As ModelView

    Dim flagTole            As Long
        
    'Bitmasq pour régler l'export DXF
    Dim exportFlatPat As Long
    Dim dataAlignment(11) As Double
    Dim varAlignment As Variant
    dataAlignment(0) = 0#
    dataAlignment(1) = 0#
    dataAlignment(2) = 0#
    dataAlignment(3) = 1#
    dataAlignment(4) = 0#
    dataAlignment(5) = 0#
    dataAlignment(6) = 0#
    dataAlignment(7) = 1#
    dataAlignment(8) = 0#
    dataAlignment(9) = 0#
    dataAlignment(10) = 0#
    dataAlignment(11) = 1#
    varAlignment = dataAlignment

    'Variable pour l'export DXF/DXG
    Dim varViews As Variant
    Dim dataViews(2) As String
    
    'Vues d'annotation que l'on veux exporter en DXF
    dataViews(0) = "*Current"
    dataViews(1) = "*Front"
    dataViews(2) = "*DXF"
    varViews = dataViews
    
    'On crée un instance de SW
    Set swApp = CreateObject("SldWorks.Application")

######### TRONQUE ICI car le forum refuse quand c'est trop long ##########

                If flagAsm Or flagPart Then
                
                    'et qu'on veut un DXF
                    If flagPart And flagDXF Then
                        flagTole = swModel.GetBendState
                        If flagTole = 0 Then
                            Debug.Print "La pièce est volumique:  " & flagTole
                        Else
                            Debug.Print "La pièce est en tôlerie:  " & flagTole
                        End If
                    End If
                
                    'On récupère le nom des configs
                    vConfNameArr = swModel.GetConfigurationNames
                    
                    'Pour chaque config : ---------------------------------------------
                    For i = 0 To UBound(vConfNameArr)
                        sConfigName = vConfNameArr(i)
                        Debug.Print "On traite la config:  " + sConfigName
                        
                        
                        'Pour chaque config pas FLAT : ---------------------------------------------
                        If InStr(sConfigName, "FLAT") = 0 Then
                            bShowConfig = swModel.ShowConfiguration2(sConfigName)
                            
                            
                            'Export DXF
                            If flagPart And flagDXF Then
                                dxfFilePath = exportPathNoExtention & "-" & sConfigName & ".DXF"
                                Set swPart = swModel
                                If flagTole <> 0 Then 'Si on est en tôlerie:
                                    exportFlatPat = 1
                                    bRet = swPart.ExportToDWG2(dxfFilePath, filePath, swExportToDWG_ExportSheetMetal, True, varAlignment, False, False, exportFlatPat, Null)
                                    If bRet Then
                                        Debug.Print "On a exporté la pièce de tôlerie en DXF:  " & dxfFilePath
                                    Else
                                        Debug.Print ("Save DXF : " & bRet)
                                    End If
                            
                                ElseIf flagTole = 0 Then 'Si on est en volumique:
                                    varViews = dataViews 'ici j'ai remis ca juste pour test mais c'est déjà fait plus haut, ou est le meilleur endroit ?
                                    'Reference de la fonction pour mémoire: value = instance.ExportToDWG2(FilePath, ModelName, Action, ExportToSingleFile, Alignment, IsXDirFlipped, IsYDirFlipped, SheetMetalOptions, Views)
                                    bRet = swPart.ExportToDWG2(dxfFilePath, filePath, swExportToDWG_ExportAnnotationViews, False, varAlignment, False, False, 0, varViews)
                                    If bRet Then
                                        Debug.Print "On a exporté la pièce de volumique en DXF:  " & dxfFilePath
                                    Else
                                        Debug.Print ("Erreur enregistrement DXF: " & dxfFilePath)
                                    End If
                                End If 'Fin du If flagTole
                                
                            End If 'Fin du if flagPart et FlagDXF
                        

            

 

Witam

Punkt 1: Tak, nie jest to oczywiste na przykładach znajdujących się w pomocy, ale aby wyeksportować widoki, musisz je nazwać dokładnie tak, jak są w palecie rysunków, a więc na przykład:

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim sModelName As String
Dim sPathName As String
Dim varAlignment As Variant
Dim dataAlignment(11) As Double
Dim varViews As Variant
Dim dataViews(10) As String
Dim options As Long

Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
   

    sModelName = swModel.GetPathName
    sPathName = swModel.GetPathName
    sPathName = Left(sPathName, Len(sPathName) - 6)
    sPathName = sPathName + "dxf"

    Set swPart = swModel

    dataAlignment(0) = 0#
    dataAlignment(1) = 0#
    dataAlignment(2) = 0#
    dataAlignment(3) = 1#
    dataAlignment(4) = 0#
    dataAlignment(5) = 0#
    dataAlignment(6) = 0#
    dataAlignment(7) = 1#
    dataAlignment(8) = 0#
    dataAlignment(9) = 0#
    dataAlignment(10) = 0#
    dataAlignment(11) = 1#

    varAlignment = dataAlignment

    dataViews(0) = "*Face"
    dataViews(1) = "*Dessus"
    dataViews(2) = "*Dessous"
    dataViews(3) = "*Droite"
    dataViews(4) = "*Gauche"
    dataViews(5) = "*Arrière"
    dataViews(6) = "*Isométrique"
    dataViews(7) = "*Dimétrique"
    dataViews(8) = "*Trimétrique"
    dataViews(9) = "*En cours"
    dataViews(10) = "dxf"

    varViews = dataViews

    swPart.ExportToDWG2 sPathName, sModelName, swExportToDWG_ExportAnnotationViews, False, varAlignment, False, False, 0, varViews

End Sub

Widzimy, że widok o nazwie dxf nie ma znaku * przed swoją nazwą i że inne widoki są w języku francuskim.

Punkt 2: Nie patrzyłem... [EDIT] możesz spróbować, po prostu dodając eksport widoku o nazwie "Unfolded State", więc dodając linię dataViews(11) = "Unfolded State" nie zapominając o modyfikacji wiersza "Dim dataViews(11) As String" [END EDIT]

Pozdrowienia