Solidworks Macro : copier propriétés onglet "Récapitulatif" vers "Spécifique à la configuration"

Bonjour à tous,

Comme décrit dans le titre de ma question, lors de l'import d'un fichier au format STEP que je récupère sur CADENAS (partcommunity) et disposant d'une liste de propriétés bien définie (puisque je ne l'utiliserai que pour la bibliothèque Bossard), je souhaiterais pouvoir exécuter une macro qui copierait certaines propriétés (par exemple "BOMINFO" -> "DESIGNATION 1") de l'onglet "Récapitulatif" vers l'onglet "Spécifiques à la configuration" dont la liste de propriétés provient d'un fichier de propriétés personnalisées standard dans mon entreprise.

J'ai déjà beaucoup cherché sur le forum sans trouver une méthode à adapter à mon cas d'utilisation. Sauriez-vous donc me donner quelques conseils, voire même me communiquer la syntaxe de macro à utiliser dans ce cas ?

En vous remerciant par avance et en vous souhaitant une bonne journée.

Cordialement,
Yann


2022-04-05_10_08_16-proprietes-recapitulatif.png
2022-04-05_10_09_32-proprietes-specifiques-configuration.png

Pour lire les propriété d'une configuration:

https://help.solidworks.com/2018/English/api/sldworksapi/Get_Custom_Properties_for_Configuration_Example_VB.htm

Pour lire écrie les propriété du document:

https://help.solidworks.com/2016/English/api/sldworksapi/Add_and_Get_Custom_Properties_Example_VB.htm

 

Un exemple de bout de code que j'ai retrouvé dans une de mes macros, la première partie regarde si la propriété de la configuration est vide et si c'est le cas elle lit celle du document.

En espérant que cela t'aide:

 

Dim swCustPropMgr As SldWorks.CustomPropertyManager

'Récupère la catégorie de la configuration active
            Set swCustPropMgr = swPart.Extension.CustomPropertyManager(ActiveConfig) 'get properties
            categorie = swCustPropMgr.Get("Categorie") 'get categorie
            designation = swCustPropMgr.Get("Designation")


            'Si la catégorie de la config active est vide on récupère celle du document
            If categorie = "" Then
                Set swCustPropMgr = swPart.Extension.CustomPropertyManager("") 'get properties
                categorie = swCustPropMgr.Get("Categorie") 'get categorie
                If designation = "" Then
                    designation = swCustPropMgr.Get("Designation") 'get categorie
                End If
            End If
            
            Debug.Print "Catégorie: " & categorie

 

 

Sinon voici un cours sur les macros SW pour les propriétés (en anglais):

https://www.codestack.net/solidworks-api/data-storage/custom-properties/

https://blog.codestack.net/custom-properties-automation

 

Bonjour, 

Pour information j'ai déjà réussi à écrire ce code qui me crée les propriétés si inexistantes dans l'onglet "Récapitulatif" :

Dim swApp           As SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Dim Value           As String

Sub main()

    Set swApp = CreateObject("SldWorks.Application")
    Set swModel = swApp.ActiveDoc
    Value = swModel.CustomInfo("DESIGNATION 1")
    
    If Value <> "" Then
        swModel.CustomInfo("DESIGNATION 1") = swModel.CustomInfo("BOMINFO")
    Else
        swModel.AddCustomInfo3 "", "DESIGNATION 1", swCustomInfoText, swModel.CustomInfo("BOMINFO")
    End If

    swModel.ForceRebuild3 (False)
    swModel.Save

End Sub

Comment le modifier pour que les propriétés soient copiées / créées dans l'onglet "Spécifiques à la configuration" ?

Merci d'avance,
Yann

 

Je viens de voir que tu as accès aux outils MyCADservice (gratuitement), utilise Batchproperties ou Intégration, ce sera peut être plus simple pour toi et au pire tu peux faire un ticket auprès de Visiativ si tu n'y arrive pas.

Ou redemander de l'aide

https://help.visiativ.com/mycadtools/2020/fr/BatchProperties.html

https://help.visiativ.com/mycadtools/2020/fr/Integration.html

 

1 « J'aime »

Bonjour sbadenis,

Merci pour tes retours, je vais jeter un oeil aux outils MyCADservice, aux liens et à l'exemple de macro que tu m'as donné.
Je fais un retour sur ma question rapidement.

Sinon sur le même site il y a celle-ci qui copie toutes les propriétés Personnaliser vers Spécifiques à la configuration (vers la configuration active)

https://www.codestack.net/solidworks-api/data-storage/custom-properties/copy-file-specific-to-configuration/

Avec l'ajout d'une condition comme cela cela devrait fonctionner:

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPrpMgr As SldWorks.CustomPropertyManager
Dim swConfCustPrpMgr As SldWorks.CustomPropertyManager
 
Sub main()
 
    Set swApp = Application.SldWorks
 
    Set swModel = swApp.ActiveDoc

    If Not swModel Is Nothing Then
   
        Set swCustPrpMgr = swModel.Extension.CustomPropertyManager("")
       
        Dim vNames As Variant
        Dim vTypes As Variant
        Dim vValues As Variant
        swCustPrpMgr.GetAll vNames, vTypes, vValues
   
        Dim activeConfName As String
        activeConfName = swModel.ConfigurationManager.ActiveConfiguration.Name

        Set swConfCustPrpMgr = swModel.Extension.CustomPropertyManager(activeConfName)
 
        Dim i As Integer
   
        For i = 0 To UBound(vNames)
'remplacer ici "Essai" Par le nom ou les noms de propriété à récupérer
            If vNames(i) = "Essai" or vNames(i) = "Essai2" Then
                swConfCustPrpMgr.Add2 vNames(i), vTypes(i), vValues(i)
                swConfCustPrpMgr.Set vNames(i), vValues(i)
            End If
        Next

    Else

        MsgBox "Please open part or assembly"

    End If
   
End Sub

 

1 « J'aime »

sbadenis, merci beaucoup, grâce à ton dernier morceau de code, j'ai adapté et ça fait exactement ce que je cherchais :

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPrpMgr As SldWorks.CustomPropertyManager
Dim swConfCustPrpMgr As SldWorks.CustomPropertyManager
 
Sub main()
 
    Set swApp = Application.SldWorks
 
    Set swModel = swApp.ActiveDoc

    If Not swModel Is Nothing Then
   
        Set swCustPrpMgr = swModel.Extension.CustomPropertyManager("")
       
        Dim vNames As Variant
        Dim vTypes As Variant
        Dim vValues As Variant
        swCustPrpMgr.GetAll vNames, vTypes, vValues
   
        Dim activeConfName As String
        activeConfName = swModel.ConfigurationManager.ActiveConfiguration.Name

        Set swConfCustPrpMgr = swModel.Extension.CustomPropertyManager(activeConfName)
         
        Dim i As Integer
   
        For i = 0 To UBound(vNames)
'Remplacer la valeur de chaque "vNames(i)" par le nom de la propriété "Personnaliser" dont vous souhaitez récupérer la valeur.
'Pour chaque "swConfCustPrpMgr.Set" dans chaque fonction "If", remplacer le premier argument par le nom de la propriété de destination "Spécifiques à la configuration".
            If vNames(i) = "BOMINFO" Then
                swConfCustPrpMgr.Set "DESIGNATION 1", vValues(i)
            End If
            If vNames(i) = "BNARTNR" Then
                swConfCustPrpMgr.Set "ARTICLE NUMBER", vValues(i)
            End If
            If vNames(i) = "BNMAT" Then
                swConfCustPrpMgr.Set "MATERIAL", vValues(i)
            End If
            If vNames(i) = "BNSURFACE" Then
                swConfCustPrpMgr.Set "SURFACE TREATMENT", vValues(i)
            End If
            If vNames(i) = "BNNORM1" Then
                swConfCustPrpMgr.Set "SPECIFICATION", vValues(i)
            End If
            
        Next

    Else

        MsgBox "Please open part or assembly"

    End If
   
End Sub

 

1 « J'aime »