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.png2022-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 »