Toegang tot multibody plaatwerkinstellingen met VBA

Goedemorgen

Ik ben op zoek naar toegang tot de vouwparameters van plaatwerk op een onderdeel met meerdere lichamen, ik heb deze code waarvan ik dacht dat deze mijn problemen zou kunnen oplossen.
Maar als ik het start, geeft het me waarden die overal identiek zijn en niet de juiste straal en dikte hebben.

Code:

Dim swApp As SldWorks.SldWorks
Dim myModel As SldWorks.ModelDoc2
Dim featureMgr As SldWorks.FeatureManager
Dim feat As SldWorks.Feature
Dim sheetMetalFolder As SldWorks.sheetMetalFolder
Dim featArray As Variant
Dim i As Long
Dim swBaseFlangeFeat As SldWorks.BaseFlangeFeatureData
Option Explicit

Sub main()

    Set swApp = Application.SldWorks
    Set myModel = swApp.ActiveDoc
    Set featureMgr = myModel.FeatureManager
   

    Set sheetMetalFolder = featureMgr.GetSheetMetalFolder
    Set feat = sheetMetalFolder.GetFeature
    Debug.Print "Sheet metal folder name: " & feat.Name
    Debug.Print "  Number of sheet metal features in the folder: " & sheetMetalFolder.GetSheetMetalCount
    featArray = sheetMetalFolder.GetSheetMetals
    For i = LBound(featArray) To UBound(featArray)
        Set feat = featArray(i)
        Debug.Print "    " & feat.Name
        Set swBaseFlangeFeat = myModel.FeatureManager.CreateDefinition(swFmBaseFlange)
        swBaseFlangeFeat.OverrideDefaultSheetMetalParameters = True
    'swBaseFlangeFeat.Thickness = 0.065
    'swBaseFlangeFeat.OverrideRadius = False
    
    'swBaseFlangeFeat.BendRadius = 1
    Debug.Print swBaseFlangeFeat.BendRadius
    Debug.Print swBaseFlangeFeat.Thickness
    Next i

End Sub

Hier is een van mijn plaatwerk instellingen:
Screenshot_54

En hier is het resultaat van de bovenstaande code:

Sheet metal folder name: Tôlerie
  Number of sheet metal features in the folder: 4
    Tôlerie3
 0.00015 
 0.0005 
    Tôlerie12
 0.00015 
 0.0005 
    Tôlerie14
 0.00015 
 0.0005 
    Tôlerie34
 0.00015 
 0.0005 

Kun je me vertellen waarom ik niet de juiste waarden heb?
Ik begrijp niet waarom ik altijd 0,00015 heb, wat overeenkomt met 0,15 mm
en 0,0005, wat overeenkomt met 0,5 mm.

Goedenavond @treza88

De fout komt van de functies van deze twee regels:

Set swBaseFlangeFeat = myModel.FeatureManager.CreateDefinition(swFmBaseFlange)
        swBaseFlangeFeat.OverrideDefaultSheetMetalParameters = True

De eerste maakt een gegevensstructuur voor plaatwerk met standaardinstellingen.
De tweede vereist de vervanging van de huidige plaatwerkstructuur in de structuur.
Dat verklaart waarom ze allemaal identiek zijn...

De bijgevoegde macro gebruikt de methode Set swSheetMetalData = swFeat.GetDefinition om gegevens van de plaatwerkbehuizing op te halen en weer te geven.

InstellingenTolerie.swp (51.5 KB)

1 like

Grote dank @m_blt voor de code, het werkt perfect.

Als ik het aandurfde om misbruik te maken, zou je me dan kunnen vertellen hoe ik deze code in een assembly kon gebruiken en op alle onderdelen van dezelfde assembly kon lussen?

Goedenavond

De onderstaande macro zou deze " beledigende " vraag moeten beantwoorden. :wink:
Het scant de hele assemblageboom om de onderdelen te vinden, identificeert voor elk onderdeel of het een plaatwerkonderdeel is en zo ja, geeft de eigenschappen ervan weer.
De andere onderdelen (niet-plaatwerk) worden genegeerd.

De macro beweert ook aan een deeldocument te werken.

InstellingenSheet MetalAssemb.swp (64.5 KB)

Hartelijk dank, het is super aardig van je, de code werkt perfect in een assembly en in een onderdeelbestand. Ik wil graag net zo comfortabel zijn met de VBA Solidworks als jij.

Ik ga deze code analyseren en ik zou proberen deze aan te passen zodat deze kan detecteren of er in de hoofdassemblage onderliggende assemblages zijn.

Uw code lijkt duidelijk genoeg voor mij om daar te komen, en voor het geval ik terug te keren naar het forum.
Ik zal je antwoord valideren en ik zal het annuleren als ik terug moet komen om vragen te stellen

In principe reageert de macro al op de diepe verkenning van de assemblageboom.
Het doorkruist het eerste niveau van de hoofdassemblage in de " main " -procedure, maar ook subassemblages, ongeacht hun niveau, in de " BrowseComponents " -procedure, die recursief werkt.

De laatste functie " SheetPart " is bijna identiek aan die in mijn vorige zending, om de plaatwerkinstellingen van het onderdeel weer te geven.

Bedankt @m_blt ik het heb getest en het werkt perfect.

Aan de andere kant heb ik geprobeerd de buigradius aan te passen door toe te voegen:

swSheetMetalData.BendRadius = 2.06 / 1000

Maar het werkt niet, hoe verander ik de straalwaarde?

Hallo

In de functie " SheetPart " van mijn macro bevat de variabele " swSheetMetalData " van het type " SheetMetalFeatureData " de parameters van de functie "swSheetFeatureData  ").
De " AccessSelections " methode van deze klasse stelt u in staat om toegang te krijgen tot de parameters van deze gegevensstructuur en om de waarden ervan te wijzigen.
Vervolgens zorgt de " ModifyDefinition " methode van het plaatwerkkenmerk (" swFeat ") voor de wijziging.

Als u de SolidWorks API Help opent (onderaan pagina https://help.solidworks.com/) en zoekt naar de klasse " ISheetMetalFeatureData ", vindt u het voorgestelde voorbeeld " Change Bend Radius of Sheet Metal Part (VBA) " dat uw vraag precies beantwoordt.

Over het algemeen is de hulp van de API's onverteerbaar maar zeer compleet, en biedt het veel voorbeelden om inspiratie uit te putten.
Goedemiddag...

Sorry dat ik onhandig ben, maar ik heb de code als volgt gewijzigd:

Ik heb toegevoegd, wat blijkbaar toegang geeft tot " BendRadius ":

 bRet = swSheetMetalData.AccessSelections(swModel, Nothing): Debug.Assert bRet

Verwijzend naar het voorbeeld, maar het werkt nog steeds niet:
" swSheetMetalData " is inderdaad gedefinieerd als het object van " swFeat.GetDefinition ", zoals in het voorbeeld?

Function SheetPart(swModel As ModelDoc2) As Boolean

    Dim swFeat              As Feature
    Dim vFeatArray          As Variant
    Dim sheetMetalFolder    As sheetMetalFolder
    Dim swSheetMetalData    As SheetMetalFeatureData
    Dim gaugeTableFile      As String
    Dim swCustBend          As CustomBendAllowance
    Dim i                   As Long
    Dim bRet                As Boolean
    Dim lRet                As Long
    

    Set sheetMetalFolder = swModel.FeatureManager.GetSheetMetalFolder
    If sheetMetalFolder Is Nothing Then
        Exit Function
    End If
    
    Set swFeat = sheetMetalFolder.GetFeature
    Debug.Print "-------------------------------------------------"
    Debug.Print "Composant : " & swModel.GetPathName
    Debug.Print "  Nom du dossier de tôlerie : " & swFeat.Name
    Debug.Print "  Nombre de fonctions de tôlerie dans le dossier : " & sheetMetalFolder.GetSheetMetalCount
    Debug.Print ""
    vFeatArray = sheetMetalFolder.GetSheetMetals
    For i = LBound(vFeatArray) To UBound(vFeatArray)
        Set swFeat = vFeatArray(i)
        Set swSheetMetalData = swFeat.GetDefinition
        Set swCustBend = swSheetMetalData.GetCustomBendAllowance
        nbTotal = nbTotal + 1
        bRet = swSheetMetalData.AccessSelections(swModel, Nothing): Debug.Assert bRet
        If swSheetMetalData.Thickness * 1000 = 1.5 And swSheetMetalData.BendRadius * 1000 <> 1.025 Then
            swSheetMetalData.BendRadius = 1.025 / 1000
            swCustBend.Type = 1
            nbModif = nbModif + 1
            Stop
        ElseIf swSheetMetalData.Thickness * 1000 = 2 And swSheetMetalData.BendRadius * 1000 <> 1.5 Then
            swSheetMetalData.BendRadius = 1.5 / 1000
            swCustBend.Type = 1
            nbModif = nbModif + 1
            Stop
        ElseIf (swSheetMetalData.Thickness = 0.003 And swSheetMetalData.BendRadius <> 0.00206) Then
            swSheetMetalData.BendRadius = 2.06 / 1000
            swCustBend.Type = 1
            nbModif = nbModif + 1
            Stop
        ElseIf swSheetMetalData.Thickness * 1000 = 4 And swSheetMetalData.BendRadius * 1000 <> 5.4 Then
            swSheetMetalData.BendRadius = 5.4 / 1000
            swCustBend.Type = 1
            nbModif = nbModif + 1
            Stop
        ElseIf swSheetMetalData.Thickness * 1000 = 5 And swSheetMetalData.BendRadius * 1000 <> 5 Then
            swSheetMetalData.BendRadius = 5 / 1000
            swCustBend.Type = 1
            nbModif = nbModif + 1
            Stop
        End If
        
        Debug.Print "  " & swFeat.Name
        Debug.Print "      Tolérance de pliage        = " & swSheetMetalData.BendAllowance * 1000# & " mm"
        Debug.Print "      Fichier de table de pliage = " & swSheetMetalData.BendTableFile
        Debug.Print "      Epaisseur                  = " & swSheetMetalData.Thickness * 1000# & " mm"
        Debug.Print "      Rayon                      = " & swSheetMetalData.BendRadius * 1000# & " mm"
        Debug.Print "      Perte au pli               = " & swCustBend.BendDeduction * 1000# & " mm"
        Debug.Print "      KFactor                    = " & swSheetMetalData.KFactor
        Debug.Print "      Type de pli                = " & swCustBend.Type
        Debug.Print ""
        
    Next i

End Function

Om de wijzigingen te valideren, moet deze instructie worden toegevoegd nadat de waarden zijn gedefinieerd en voordat de reeks weergaven...

     bRet = swFeat.ModifyDefinition(swSheetMetalData, swModel, Nothing)

Tenzij ik me vergis, is de wijziging aangebracht in de standaard radiuswaarde van de functie " Plaatwerk ".
Het lijkt erop dat het ook nodig is om het vakje " Instellingen overschrijven..."  om ervoor te zorgen dat de verandering effectief is.

image

De verandering heeft geen invloed op de stralen van de vouwen die door de opeenvolgende functies zijn gemaakt, als ze zijn gedefinieerd met specifieke stralen (overgangsvouw, geschetste vouw, randgevouwen plaat, enz.). In dit geval is het noodzakelijk om toegang te krijgen tot elk van deze specifieke functies. Galei...
Zie dit voorbeeld in de Help van de API:
Krijg alle voorbeelden van plaatwerkfunctiegegevens (VBA)

Echt bedankt voor je uitleg die voor mij als gedeeltelijk neofiet betaalbaar blijft.

Dat is ook de reden waarom ik blijkbaar ten onrechte dacht dat ik de volgende eigenschap (in post # 1) moest valideren om de standaard buigradius te kunnen overschrijven:

swBaseFlangeFeat.OverrideDefaultSheetMetalParameters = True

Het kan dus niet eenvoudiger zijn om toegang te krijgen tot de wijziging van deze buigradii.

Maar als je al deze "Get All Sheet Metal Feature Data Example (VBA)"-code moet doorlopen, is het ongelooflijk complex om alleen al een buigradius op alle componenten of lichamen te wijzigen.


EDIT: "Get All Sheet Metal Feature Data Example (VBA)" staat geen wijziging toe, maar dient alleen om de gegevens te verkrijgen. Er bestaat niet zoiets als een " Set Sheet Metal Feature Data "?


Je zou kunnen denken dat zolang men toegang heeft tot het onderdeel of lichaam, dat een object is met eigenschappen waarvan de buigradius er deel van uitmaakt.
U kunt de basisstraal van de bocht wijzigen die deel uitmaakt van de eigenschappen van hetzelfde object.

Maar blijkbaar is dit niet het geval?

Ik hoop dat je mijn redenering (niet per se logisch) kunt volgen, die gebaseerd is op objecten en hun eigenschappen.

De instructie waarmee u het vakje " Parameters vervangen..." kunt aan- of uitvinken, is deze, geplaatst voordat de wijzigingen worden gevalideerd. Om getest te worden.

swSheetMetalData.SetOverrideDefaultParameter2 swSheetMetalOverrideDefaultParameters_BendParameters, True

Wat betreft functies die bepaalde stralen gebruiken, zie ik geen andere oplossing dan de betreffende functies in de boom één voor één te zoeken.

Niet monsterlijk in zoverre dat het erg repetitief is, de sleutel is om de namen te kennen die door Solidworks worden gebruikt. Vandaar het belang van het voorbeeld " Get All Sheet Metal..." »

Hallo en bedankt @m_blt voor de bovenstaande instructie waardoor ik goede vooruitgang kon boeken en ik zou zeggen dat ik mijn code (die in feite van jou is) bijna moet voltooien.

Ik heb echter nog steeds een probleem, alles werkt zoals ik wil, dus ik kan de standaard plaatwerkinstellingen wijzigen, maar ook de vervangingsinstellingen in het geval van een multibody-onderdeel.
Als ik de macro draai met een enkel of multibody plaatwerkonderdeel, werkt alles perfect.
Aan de andere kant, toen ik het met een assembly liet werken, werkt het hele verwerkingsproces blijkbaar prima, maar als de macro klaar is met draaien, blijft het bestand semi-geblokkeerd.
Ik kan niet meer met een rechtermuisklik bijvoorbeeld de contextmenu's weergeven, en ik ben genoodzaakt het bestand te sluiten en opnieuw te openen, zodat het weer werkt.

Ik begrijp niet waarom het dat met de assemblages doet.
Alle hulp zal voor mij kostbaar zijn om te begrijpen, bij voorbaat dank.

Hier is de code:

Dim nbTotalCorps             As Integer
Dim nbTotalDossier          As Integer
Dim nbModifCorps            As Integer
Dim nbModifDossier          As Integer
Dim pieceCorps              As Boolean

Option Explicit


Sub main()
    Dim swApp           As SldWorks.SldWorks
    Dim swModel         As ModelDoc2
    Dim swAssemb        As AssemblyDoc
    Dim swComp          As Component2
    Dim vComponents     As Variant
    Dim i               As Integer
    Dim OK              As Boolean
    
    nbTotalCorps = 0
    nbTotalDossier = 0
    nbModifCorps = 0
    nbModifDossier = 0

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then                      ' Si aucun document n'est ouvert
        MsgBox "Un document de pièce ou d'assemblage doit être ouvert.", vbExclamation
        Exit Sub
    
    ElseIf swModel.GetType = swDocPART Then         ' Si c'est une pièce...
        OK = SheetPart(swModel)
        MsgBox nbModifDossier & " rayon de pliage modifier sur " & nbTotalDossier & " de dossier par défaut de tolerie" & vbCrLf & _
        nbModifCorps & " rayon de pliage modifier sur " & nbTotalCorps & " corps de tolerie"
        Exit Sub
    
    ElseIf swModel.GetType = swDocASSEMBLY Then     ' Si c'est un assemblage...
        Set swAssemb = swModel
        vComponents = swAssemb.GetComponents(True)  ' Tableau des composants de niveau 1 de l'assemblage
        For i = 0 To UBound(vComponents)
            Set swComp = vComponents(i)
            ParcourirComposants swComp              ' Parcours des composants (récursif)
        Next i
        MsgBox nbModifDossier & " rayon de pliage modifier sur " & nbTotalDossier & " de dossier par défaut de tolerie" & vbCrLf & _
        nbModifCorps & " rayon de pliage modifier sur " & nbTotalCorps & " corps de tolerie"
        
    End If

End Sub

Sub ParcourirComposants(swComp As SldWorks.Component2)
    
    Dim vChildComponents    As Variant
    Dim swModel             As ModelDoc2
    Dim swChildComp         As SldWorks.Component2
    Dim i                   As Integer
    Dim OK                  As Boolean
    
    Set swModel = swComp.GetModelDoc2                   ' Modèle associé au composant
    If Not swModel Is Nothing Then
        If swModel.GetType = swDocPART Then             ' Si c'est une pièce...
            OK = SheetPart(swModel)
            
        ElseIf swModel.GetType = swDocASSEMBLY Then     ' Si c'est un assemblage...
            vChildComponents = swComp.GetChildren       ' Liste des composants enfants
            For i = 0 To UBound(vChildComponents)
                Set swChildComp = vChildComponents(i)
                ParcourirComposants swChildComp         ' Parcours du composant enfant (récursif)
            Next i
        End If
        
    End If
End Sub


Function SheetPart(swModel As ModelDoc2) As Boolean

    Dim swFeat                  As Feature
    Dim vFeatArray              As Variant
    Dim sheetMetalFolder        As sheetMetalFolder
    Dim swSelMgr                As SldWorks.SelectionMgr
    Dim swSheetMetal            As SldWorks.SheetMetalFeatureData
    Dim swSheetMetalData        As SheetMetalFeatureData
    Dim gaugeTableFile          As String
    Dim swCustBend              As CustomBendAllowance
    Dim i                       As Long
    Dim bRet                    As Boolean
    Dim lRet                    As Long
    Dim errors                  As Long
    Dim overrideParameters      As Boolean
    Dim swFeature               As SldWorks.Feature
    Dim swSheetMetalFeatureData As SldWorks.SheetMetalFeatureData

    
    Set sheetMetalFolder = swModel.FeatureManager.GetSheetMetalFolder
    If sheetMetalFolder Is Nothing Then
        Exit Function
    End If
    
    Set swFeat = sheetMetalFolder.GetFeature
    Debug.Print "-------------------------------------------------"
    Debug.Print "Composant : " & swModel.GetPathName
    Debug.Print "  Nom du dossier de tôlerie : " & swFeat.Name
    Debug.Print "  Nombre de fonctions de tôlerie dans le dossier : " & sheetMetalFolder.GetSheetMetalCount
    Debug.Print ""
    
    'Création du tableau comportant chaque element de tolerie contenu dans le dossier de tolerie
    vFeatArray = sheetMetalFolder.GetSheetMetals
    'Stop
    Debug.Print "  Nom du dossier de tôlerie : " & vFeatArray(0).Name
    
    '
    Set swSheetMetal = swFeat.GetDefinition
    Set swCustBend = swSheetMetal.GetCustomBendAllowance

    'Accession au parametres de tolerie par défaut
    bRet = swSheetMetal.IAccessSelections2(swModel, Nothing): Debug.Assert bRet
    
    pieceCorps = True
    nbTotalDossier = nbTotalDossier + 1
    'Appel de la fonction choixRayonPliageParEpaisseur
    choixRayonPliageParEpaisseur swCustBend, swSheetMetal, pieceCorps
        
    'On valide les modifications des parametres de tolerie par défaut
    bRet = swFeat.ModifyDefinition(swSheetMetal, swModel, Nothing): Debug.Assert bRet
    
    Debug.Print "  Modified bend radius = " & swSheetMetal.BendRadius * 1000# & " mm"
    
    'Boucle sur les elements de tolerie contenu dans le dossier
    For i = LBound(vFeatArray) To UBound(vFeatArray)
        Set swFeat = vFeatArray(i)
        Set swSheetMetalData = swFeat.GetDefinition
        Set swCustBend = swSheetMetalData.GetCustomBendAllowance
        pieceCorps = False
        nbTotalCorps = nbTotalCorps + 1
        
        'verification de l'état "Remplacer les parametres de pliage"
        errors = swSheetMetalData.GetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_e.swSheetMetalOverrideDefaultParameters_BendParameters, overrideParameters)
            Debug.Print ("  Bend parameters: " & overrideParameters)
        
        'Si "remplacer les parametres de pliage" est coché
        If overrideParameters Then
            'On accede au parametres de pliage et à la zone de pliage
            errors = swSheetMetalData.SetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_e.swSheetMetalOverrideDefaultParameters_BendParameters, True)
            errors = swSheetMetalData.SetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_e.swSheetMetalOverrideDefaultParameters_BendAllowance, True)
            
            'Appel de la fonction choixRayonPliageParEpaisseur
            choixRayonPliageParEpaisseur swCustBend, swSheetMetalData, pieceCorps

            'On valide les modifications des parametres de tolerie
            bRet = swFeat.ModifyDefinition(swSheetMetalData, swModel, Nothing): Debug.Assert bRet
            'Stop
            Debug.Print "  Modified bend radius = " & swSheetMetalData.BendRadius * 1000# & " mm"
        End If
        
        Debug.Print "  " & swFeat.Name
        Debug.Print "      Tolérance de pliage        = " & swSheetMetalData.BendAllowance * 1000# & " mm"
        Debug.Print "      Fichier de table de pliage = " & swSheetMetalData.BendTableFile
        Debug.Print "      Epaisseur                  = " & swSheetMetalData.Thickness * 1000# & " mm"
        Debug.Print "      Rayon                      = " & swSheetMetalData.BendRadius * 1000# & " mm"
        Debug.Print "      Perte au pli               = " & swCustBend.BendDeduction * 1000# & " mm"
        Debug.Print "      KFactor                    = " & swSheetMetalData.KFactor
        Debug.Print "      Type de pli                = " & swCustBend.Type
        Debug.Print ""
        
    Next i

End Function

Function choixRayonPliageParEpaisseur(swCustBend As CustomBendAllowance, swSheetMetal As SldWorks.SheetMetalFeatureData, _
pieceCorps As Boolean)

'Test si epaisseur 1.5mm, rayon de pliage 1.5 et utilisation d'une table de pliage
If swSheetMetal.Thickness * 1000 = 1.5 And swSheetMetal.BendRadius * 1000 <> 1.5 _
Or swCustBend.Type <> 1 Then
            swSheetMetal.BendRadius = 1.5 / 1000
            swCustBend.Type = 1
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
                nbModifCorps = nbModifCorps + 1
            End If

'Test si epaisseur 2mm, rayon de pliage 2 et utilisation d'une table de pliage
ElseIf swSheetMetal.Thickness * 1000 = 2 And swSheetMetal.BendRadius * 1000 <> 2 _
Or swCustBend.Type <> 1 Then
            swSheetMetal.BendRadius = 2 / 1000
            swCustBend.Type = 1
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
                nbModifCorps = nbModifCorps + 1
            End If

'Test si epaisseur 3mm, rayon de pliage 3 et utilisation d'une table de pliage
ElseIf (swSheetMetal.Thickness * 1000 = 3 And swSheetMetal.BendRadius * 1000 <> 36) _
Or swCustBend.Type <> 1 Then
            swSheetMetal.BendRadius = 3 / 1000
            swCustBend.Type = 1
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
                nbModifCorps = nbModifCorps + 1
            End If

'Test si epaisseur 4mm, rayon de pliage 4 et utilisation d'une table de pliage
ElseIf swSheetMetal.Thickness * 1000 = 4 And swSheetMetal.BendRadius * 1000 <> 4 _
Or swCustBend.Type <> 1 Then
            swSheetMetal.BendRadius = 4 / 1000
            swCustBend.Type = 1
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
                nbModifCorps = nbModifCorps + 1
            End If
'Test si epaisseur 5mm, rayon de pliage 5 et utilisation d'une table de pliage
ElseIf swSheetMetal.Thickness * 1000 = 5 And swSheetMetal.BendRadius * 1000 <> 5 _
Or swCustBend.Type <> 1 Then
            swSheetMetal.BendRadius = 5 / 1000
            swCustBend.Type = 1
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
                nbModifCorps = nbModifCorps + 1
            End If

        End If
End Function

Hallo

Het probleem heeft te maken met de parameters die worden doorgegeven aan de twee methoden AccessSelections() en ModifyDefinition(), die verschillen afhankelijk van of het hoofddocument een PART of een ASSEMBLY is.
API Help benadrukt dit probleem in de voetnoten en geeft aan dat verwarring de uitvoering niet blokkeert, maar kan resulteren in " onverwacht " gedrag. :laughing:

In het eerste geval moet u het ModeleDoc van het plaatwerkonderdeel passeren, in het tweede geval moet u het ModelDoc van de assemblage en het plaatwerkonderdeel dat bij de wijziging betrokken is, passeren.

De correctie moet worden aangebracht op de 3 plaatsen waar deze methoden voorkomen, door te testen of het hoofddocument een onderdeel of een assemblage is.
De bouwboom van de assemblage keert dan terug naar normaal gedrag...

Versie gecorrigeerd in het bijgevoegde document.
De geldigheid van de behandeling vanuit het oogpunt van plaatwerk moet nog worden getest.

FoldWallet2.swp (93 kB)

1 like

Heel erg bedankt @m_blt voor alle hulp die je me hebt gegeven.

Hier is mijn definitieve code (meestal die van jou @m_blt ), als het voor iemand nuttig kan zijn:

Option Explicit

Dim nbTotalCorps             As Integer
Dim nbTotalDossier          As Integer
Dim nbModifCorps            As Integer
Dim nbModifDossier          As Integer
Dim pieceCorps              As Boolean
Dim swApp           As SldWorks.SldWorks
Dim boolstatus As Boolean
Dim swCustBend2 As CustomBendAllowance
Dim swSheetMetal As SldWorks.SheetMetalFeatureData




Sub main()
    Dim swModel         As ModelDoc2
    Dim swAssemb        As AssemblyDoc
    Dim swComp          As Component2
    Dim vComponents     As Variant
    Dim i               As Integer
    Dim OK              As Boolean
    
    nbTotalCorps = 0
    nbTotalDossier = 0
    nbModifCorps = 0
    nbModifDossier = 0

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    If swModel Is Nothing Then                      ' Si aucun document n'est ouvert
        MsgBox "Un document de pièce ou d'assemblage doit être ouvert.", vbExclamation
        Exit Sub
    
    ElseIf swModel.GetType = swDocPART Then         ' Si c'est une pièce...
        OK = SheetPart(Nothing, swModel)
        MsgBox nbModifDossier & " rayon de pliage modifier sur " & nbTotalDossier & " de dossier par défaut de tolerie" & vbCrLf & _
        nbModifCorps & " rayon de pliage modifier sur " & nbTotalCorps & " corps de tolerie"
        Exit Sub
    
    ElseIf swModel.GetType = swDocASSEMBLY Then     ' Si c'est un assemblage...
        Set swAssemb = swModel
        vComponents = swAssemb.GetComponents(True)  ' Tableau des composants de niveau 1 de l'assemblage
        For i = 0 To UBound(vComponents)
            Set swComp = vComponents(i)
            ParcourirComposants swComp              ' Parcours des composants (récursif)
        Next i
        MsgBox nbModifDossier & " rayon de pliage modifier sur " & nbTotalDossier & " de dossier par défaut de tolerie" & vbCrLf & _
        nbModifCorps & " rayon de pliage modifier sur " & nbTotalCorps & " corps de tolerie"
        
    End If
    swModel.ForceRebuild3 (True)

End Sub

Sub ParcourirComposants(swComp As SldWorks.Component2)
    
    Dim vChildComponents    As Variant
    Dim swModel             As ModelDoc2
    Dim swChildComp         As SldWorks.Component2
    Dim i                   As Integer
    Dim OK                  As Boolean
    
    Set swModel = swComp.GetModelDoc2                   ' Modèle associé au composant
    If Not swModel Is Nothing Then
        If swModel.GetType = swDocPART Then             ' Si c'est une pièce...
            OK = SheetPart(swComp, swModel)
            
        ElseIf swModel.GetType = swDocASSEMBLY Then     ' Si c'est un assemblage...
            vChildComponents = swComp.GetChildren       ' Liste des composants enfants
            For i = 0 To UBound(vChildComponents)
                Set swChildComp = vChildComponents(i)
                ParcourirComposants swChildComp         ' Parcours du composant enfant (récursif)
            Next i
        End If
        
    End If
End Sub


Function SheetPart(swComp As Component2, swModel As ModelDoc2) As Boolean

    Dim swFeat                  As Feature
    Dim vFeatArray              As Variant
    Dim sheetMetalFolder        As sheetMetalFolder
    Dim swSelMgr                As SelectionMgr
    Dim swSheetMetalData        As SheetMetalFeatureData
    Dim swCustBend              As CustomBendAllowance
    Dim gaugeTableFile          As String
    
    Dim i                       As Long
    Dim bRet                    As Boolean
    Dim lRet                    As Long
    Dim errors                  As Long
    Dim overrideParameters      As Boolean
    Dim swFeature               As SldWorks.Feature
    
    
    Set sheetMetalFolder = swModel.FeatureManager.GetSheetMetalFolder
    If sheetMetalFolder Is Nothing Then
        Exit Function
    End If
    
    Set swFeat = sheetMetalFolder.GetFeature
    Debug.Print "-------------------------------------------------"
    Debug.Print "Composant : " & swModel.GetPathName
    Debug.Print "  Nom du dossier de tôlerie : " & swFeat.Name
    Debug.Print "  Nombre de fonctions de tôlerie dans le dossier : " & sheetMetalFolder.GetSheetMetalCount
    Debug.Print ""
    
    'Création du tableau comportant chaque element de tolerie contenu dans le dossier de tolerie
    vFeatArray = sheetMetalFolder.GetSheetMetals
    'Stop
    Debug.Print "  Nom du dossier de tôlerie : " & vFeatArray(0).Name
    
    '
    Set swSheetMetalData = swFeat.GetDefinition
    Set swCustBend = swSheetMetalData.GetCustomBendAllowance

    'Accession au parametres de tolerie par défaut
    
    If swApp.ActiveDoc.GetType = swDocPART Then                             ' Si document principal type PIECE
        bRet = swSheetMetalData.AccessSelections(swModel, Nothing)
        
    Else
        bRet = swSheetMetalData.AccessSelections(swApp.ActiveDoc, swComp)   ' ou si type ASSEMBLAGE
       
    End If
    
    pieceCorps = True
    nbTotalDossier = nbTotalDossier + 1

   'Appel de la fonction choixRayonPliageParEpaisseur
            choixRayonPliageParEpaisseur swCustBend, swSheetMetalData, swComp, swModel, swFeat
   
    Debug.Print "  Modified bend radius = " & swSheetMetalData.BendRadius * 1000# & " mm"
    
    'Boucle sur les elements de tolerie contenu dans le dossier

    For i = LBound(vFeatArray) To UBound(vFeatArray)
        Set swFeat = vFeatArray(i)
        Set swSheetMetalData = swFeat.GetDefinition
        Set swCustBend = swSheetMetalData.GetCustomBendAllowance
        pieceCorps = False
        nbTotalCorps = nbTotalCorps + 1

        'verification de l'état "Remplacer les parametres de pliage"
        errors = swSheetMetalData.GetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_BendParameters, overrideParameters)
            Debug.Print ("  Bend parameters: " & overrideParameters)

        'Si "remplacer les parametres de pliage" est coché
        If overrideParameters Then
            'On accede au parametres de pliage et à la zone de pliage
            errors = swSheetMetalData.SetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_BendParameters, True)
            errors = swSheetMetalData.SetOverrideDefaultParameter2(swSheetMetalOverrideDefaultParameters_BendAllowance, True)

            'Appel de la fonction choixRayonPliageParEpaisseur
            choixRayonPliageParEpaisseur swCustBend, swSheetMetalData, swComp, swModel, swFeat

            Debug.Print "  Modified bend radius = " & swSheetMetalData.BendRadius * 1000# & " mm"
        End If

        Debug.Print "  " & swFeat.Name
        Debug.Print "      Tolérance de pliage        = " & swSheetMetalData.BendAllowance * 1000# & " mm"
        Debug.Print "      Fichier de table de pliage = " & swSheetMetalData.bendTablefile
        Debug.Print "      Epaisseur                  = " & swSheetMetalData.Thickness * 1000# & " mm"
        Debug.Print "      Rayon                      = " & swSheetMetalData.BendRadius * 1000# & " mm"
        Debug.Print "      Perte au pli               = " & swCustBend.BendDeduction * 1000# & " mm"
        Debug.Print "      KFactor                    = " & swSheetMetalData.KFactor
        Debug.Print "      Type de pli                = " & swCustBend.Type
        Debug.Print ""

    Next i

End Function

Sub choixRayonPliageParEpaisseur(swCustBend As CustomBendAllowance, swSheetMetalData As SheetMetalFeatureData, _
 swComp As Component2, swModel As ModelDoc2, swFeat As Feature)
'Stop

    Dim bRet                    As Boolean
    Dim epaisseur As Double
    Dim rayon As Double
    Dim tabEpRayon(4, 1) As Double
    Dim j As Integer
    Dim bendTablefile As String
    
    
    tabEpRayon(0, 0) = 1.5
    tabEpRayon(0, 1) = 1.5
    tabEpRayon(1, 0) = 2
    tabEpRayon(1, 1) = 2
    tabEpRayon(2, 0) = 3
    tabEpRayon(2, 1) = 3
    tabEpRayon(3, 0) = 4
    tabEpRayon(3, 1) = 4
    tabEpRayon(4, 0) = 5
    tabEpRayon(4, 1) = 5
    
    bendTablefile = "C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\Sheetmetal Bend Tables\TABLE DE PLIAGE EN MM B.XLS"
    
    epaisseur = swSheetMetalData.Thickness * 1000
    rayon = swSheetMetalData.BendRadius * 1000
    
    For j = 0 To 4

        'Test si epaisseur 1.5mm, rayon de pliage 1.025 et utilisation d'une table de pliage
        If tabEpRayon(j, 0) = epaisseur And tabEpRayon(j, 1) <> rayon Or _
            tabEpRayon(j, 0) = epaisseur And swCustBend.Type <> 1 Or _
            tabEpRayon(j, 0) = epaisseur And swSheetMetalData.bendTablefile <> bendTablefile Then
            'Stop
            swSheetMetalData.BendRadius = tabEpRayon(j, 1) / 1000
            swCustBend.Type = 1
            swSheetMetalData.bendTablefile = bendTablefile
            If pieceCorps Then
                nbModifDossier = nbModifDossier + 1
            Else
            nbModifCorps = nbModifCorps + 1
            End If
        End If
    Next j
   
    Debug.Print swModel.GetType
    Debug.Print swModel.GetTitle
    Debug.Print swComp.GetPathName
    'On valide les modifications des parametres de tolerie
    If swApp.ActiveDoc.GetType = swDocPART Then                                     ' Si document principal type PIECE
        bRet = swFeat.ModifyDefinition(swSheetMetalData, swModel, Nothing)
        'Stop
    Else
        bRet = swFeat.ModifyDefinition(swSheetMetalData, swApp.ActiveDoc, swComp)   ' ou si type ASSEMBLAGE
        'Stop
    End If
        
End Sub


1 like