Macro API - DXF Export van Volume Onderdelen (zonder Flat-Patern)

Hallo

Ik gebruik veel de methode: ExportFlatPatternView Method (IPartDoc)

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

om plaatwerk te exporteren dat is ontwikkeld om naar plasma/laser/waterstraal te worden gestuurd...

 

Aan de andere kant tekenen we soms eenvoudige onderdelen (laten we ons een eenvoudige ring voorstellen) in volume en niet in plaatwerk.

Deze methode die op een massief onderdeel wordt gebruikt, exporteert het onderdeel goed zoals verwacht, maar neemt altijd het originele vooraanzicht van het onderdeel mee.

Dus als we de ring op het vooraanzicht tekenen, is het OK als we deze op het zijaanzicht tekenen, we hebben een DXF van de rand van de ring (een lange rechthoek en niet twee concentrische cirkels).

Als we de weergave bijwerken om te zeggen dat dit "dit" het vooraanzicht is, wordt er rekening mee gehouden in SW (we klikken op vooraanzicht hebben we de juiste weergave) maar voor de export verandert het niets.

 

Heeft u een idee om elke keer het juiste zicht te kunnen exporteren?

Of een andere techniek waarmee u DXF-onderdelen voor NC-snijden kunt exporteren zonder dat u een tekening hoeft te doorlopen.

(inderdaad, de methode die we tot nu toe gebruiken is om een tekening te maken op een schaal van 1:1 zonder cartridge en deze vervolgens in DXF te exporteren, maar het is helemaal niet efficiënt).

Bij voorbaat dank voor uw advies over dit onderwerp.

Rafael

Haaa ik zag net dat er in feite:

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

en dat annotatieweergaven kunnen worden geëxporteerd.

Ik ben aan het kijken wat we ermee kunnen doen en ik zal de resultaten hier posten.

1 like

Hallo

Ja, het is de ExportToDWG2-functie die u moet gebruiken voor wat u wilt doen, deze functie vervangt de ExportFlatPatternView-functie sinds de 2017-versie van SW.

Vriendelijke groeten

Hallo

Hier is mijn code:

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

en output:

Twee problemen dus:

1- Als ik geen weergave definieer in dataView(0), werkt de volume-export, als ik er een op de volgende manier definieer:

    '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

 

Dus mijn export werkt niet meer...

 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 --> geeft als resultaat ONWAAR

Al zet ik alleen een vooraanzicht...

Mijn doel is om een annotatieweergave te maken met de naam "DXF" in de volumedelen die we willen verzenden om te knippen. Sommige zijn inderdaad getekend in de context van de montage en zijn daarom niet gericht op de oorsprong, noch op de basisplannen en in dit geval is het gepast voor de tekenaar om het uitzicht te kiezen dat hij gebruikt voor het snijden. Een beetje zoals wanneer je "Gezicht exporteren" doet in DXF.

Ik kan niet gebruiken: swExportToDWG_ExportSelectedFacesOrLoops  omdat ik denk dat ik niet automatisch het juiste gezicht kan vinden.

(tenzij ik automatisch het gezicht kan selecteren dat het grootste oppervlak heeft.... maar hey, het is niet geweldig en het kan tijdrovend zijn)

 

2- Voor plaatwerkonderdelen exporteer ik elke configuratie goed, het werkt cool. Aan de andere kant wil ik er zeker van zijn dat het de geometrie van het onderdeel in zijn ontwikkelde staat gebruikt met de functies die we hebben geassocieerd met de ontwikkelde staat (in de map met uitgevouwen toestand). Omdat kleine aanpassingen vaak alleen worden gedaan voor het snijden, bijvoorbeeld:

- Aan het einde van de vouwen worden kleine vouwmarkeringen toegevoegd

- We verbergen sommige gezichten, zoals de verzinkingen die we bij herbewerking doen, anders krijgen we een dxf met twee concentrische cirkels, en het doel is om alleen gesloten contouren te hebben.

In mijn hierboven geposte code ging ik door de configuraties om de FLAT's te vinden, maar de plaatwerkonderdelen hebben geen FLAT-configuratie totdat je de tekening maakt. Het gebruik van swExportToDWG past goed bij mij, want zelfs als het onderdeel geen platte patroonconfiguratie heeft, wordt de export goed gedaan.

 

Daar heb je het, je advies is ook welkom over de andere delen van de code.

Hartelijk dank!

Hier is een codefragment dat volledig is afgekapt/ontvet omdat we minder dan 600 tekens moeten hebben:

Ik heb alleen de delen die ons interesseren voor dit onderwerp achtergelaten:

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
                        

            

 

Hallo

Punt 1: Ja, het is niet duidelijk op de voorbeelden die in de help te vinden zijn, maar om de weergaven te exporteren, moet je ze precies zo benoemen als ze zijn in het palet met tekeningen, dus bijvoorbeeld:

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

We kunnen zien dat de weergave met de naam dxf geen *-teken voor zijn naam heeft en dat de andere weergaven in het Frans zijn.

Punt 2: Ik heb niet gekeken ... [EDIT] je kunt proberen door gewoon de export van een weergave met de naam "Unfolded State" toe te voegen, dus door een regel toe te voegen dataViews(11) = "Unfolded State" zonder te vergeten de regel "Dim dataViews(11) As String" te wijzigen [EINDE EDIT]

Vriendelijke groeten