Macro solidworks pour générer des conxtructions soudées

Bonjour à tous

Je suis à le recherche d’un bout de code qui permette de générer une construction soudée.
j’ai des structures tubulaire a créer qui sont très similaire les une des autres.

Les structure tubulaires sont toujours un assemblage de tube dans le même plan, cette structure est toujours rectangulaire et comporte un nombre de tube horizontal et vertical espacé de moins de 500mm obligatoirement.

Je souhaiterais avoir un code pour une base de travail qui généré l’esquisse de base est applique les tube sur cette esquisse.

Voici un exemple de ce que je veux créer par macro :

Je pense qu’une base avec un cadre est une croix au milieu devrait suffire pour que je puisse automatiser le reste, mais je prend tout ce que vous pourriez me proposer.
Car je n’ai jamais créer de construction soudée par macro.

Je pense passer par un UserForm pour rentrer mes données de base, puis ensuite générer la structure.

J’espère que j’ai été assez clair, sinon n’hésitez pas a me questionner.

J’ai recupéré ce code qui permet de créer une construction soudée grace a une esquisse existente.

L e soucis est que quand je lance le code avec une esquisse qui a 6 segments , il n’y en a que 5 qui passe en construction soudée.
Ce qui parait evident car « i=1 ».
Cependant quand je mets i=0, le code ne fonctionne plus, n’y a plus de construction soudée qui se crée.

Code avec i=1 :

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 1 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2("Line" & i & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i-1).GetName
        Debug.Print "  Sketch = " & vSkSegments(i-1).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i-1) = Group
    Next i

    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

Code avec i=0 :

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 0 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2("Line" & i & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i).GetName
        Debug.Print "  Sketch = " & vSkSegments(i).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i) = Group
    Next i

    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

Voici le fichier utilisé pour les tests :
NdM 3D.SLDPRT (42,5 Ko)

Pour le problème de code ci dessus j’ai trouvé une solution, problème de nom des segments :

Dim swApp As SldWorks.SldWorks
Dim Part As ModelDoc2
Dim boolstatus As Boolean
Dim FeatMgr As FeatureManager
Dim SelMgr As SelectionMgr
Dim mySketch As SldWorks.Sketch
Dim swWeldFeat As SldWorks.Feature
Dim swWeldFeatData As SldWorks.StructuralMemberFeatureData
Dim skSegCount As Long
Dim vSkSegments As Variant
Dim skSegment As SldWorks.SketchSegment
Dim i As Integer

Option Explicit

Public Sub Main()

    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    Set FeatMgr = Part.FeatureManager
    Set SelMgr = Part.SelectionManager

    Dim myFeature2 As Object
    Set myFeature2 = Part.FeatureByName("NdM 3D")
    Set mySketch = myFeature2.GetSpecificFeature2()
    vSkSegments = mySketch.GetSketchSegments()
    skSegCount = UBound(vSkSegments)
    Debug.Print "    nombre de segments dans l'esquisse = " & skSegCount
    
    Dim myFeature As Object
    Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
    Dim GroupArray() As Object
    ReDim GroupArray(0 To 100) As Object
    
    For i = 0 To UBound(vSkSegments)
        Dim Group As StructuralMemberGroup
        Set Group = FeatMgr.CreateStructuralMemberGroup
        Dim Segments(0) As Object
        boolstatus = Part.Extension.SelectByID2(vSkSegments(i).GetName & "@NdM 3D", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
        Set Segments(0) = SelMgr.GetSelectedObject6(1, 0)
        Debug.Print "  Sketch = " & vSkSegments(i ).GetName
        Debug.Print "  Sketch = " & vSkSegments(i).GetLength
        Group.Segments = (Segments)
        Set GroupArray(i) = Group
        Stop
    Next i
Debug.Print "  Nb in group = " & UBound(GroupArray)
    Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp 2022\SOLIDWORKS\lang\french\weldment profiles\ISO\Tube (square)\40 x 40 x 3.2.sldlfp", 1, False, (GroupArray))
    Part.ClearSelection2 True

End Sub

J’ai commencé par la fin, maintenant il faut que je trouve comment créer une esquisse par VBA !!!

Sans parler code, tu as testé avec des répétitions de corps + petites équations ?

1 « J'aime »

Bonjour,

Ne pas sous-estimer l’utilité de l’enregistrement de macro.

Voici une macro que j’ai enregistré et qui répond à cette demande :

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
boolstatus = Part.Extension.SelectByID2("Plan de dessus", "PLANE", 0, 0, 0, False, 0, Nothing, 0)
Part.SketchManager.InsertSketch True
Part.ClearSelection2 True
boolstatus = Part.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swSketchAddConstToRectEntity, swUserPreferenceOption_e.swDetailingNoOptionSpecified, True)
boolstatus = Part.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swSketchAddConstLineDiagonalType, swUserPreferenceOption_e.swDetailingNoOptionSpecified, True)
Dim vSkLines As Variant
vSkLines = Part.SketchManager.CreateCenterRectangle(0, 0, 0, 0.222, 0.1665, 0)

' Named View
Part.ShowNamedView2 "*Isométrique", 7
Part.ViewZoomtofit2
Part.ClearSelection2 True
Dim skSegment As Object
Set skSegment = Part.SketchManager.CreateLine(-0#, -0.1665, 0#, 0#, 0.1665, 0#)
Part.ClearSelection2 True
Set skSegment = Part.SketchManager.CreateLine(-0.222, 0#, 0#, 0.222, 0#, 0#)
Part.ClearSelection2 True
Part.SketchManager.InsertSketch True
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Esquisse1", "SKETCH", 0, 0, 0, False, 0, Nothing, 0)
Dim myFeature As Object
Set myFeature = Part.FeatureManager.InsertWeldmentFeature()
boolstatus = Part.Extension.SelectByID2("Line2@Esquisse1", "EXTSKETCHSEGMENT", -0.222, -8.77585521755009E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3@Esquisse1", "EXTSKETCHSEGMENT", -0.14708588433075, 0.1665, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4@Esquisse1", "EXTSKETCHSEGMENT", 0.222, 7.22480810802039E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1@Esquisse1", "EXTSKETCHSEGMENT", 7.30118244492815E-02, -0.1665, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line7@Esquisse1", "EXTSKETCHSEGMENT", 0, -6.42442245170969E-02, 0, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line8@Esquisse1", "EXTSKETCHSEGMENT", -0.148081910198584, 0, 0, True, 0, Nothing, 0)
Dim vGroups As Variant
Dim GroupArray() As Object
ReDim GroupArray(0 To 2) As Object
Dim Group1 As Object
Set Group1 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement1 As Variant
Dim SegementArray1() As Object
ReDim SegementArray1(0 To 3) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line2@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line3@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line4@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Line1@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Dim Segment As Object
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray1(0) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(2)
Set SegementArray1(1) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(3)
Set SegementArray1(2) = Segment
Set Segment = Part.SelectionManager.GetSelectedObject5(4)
Set SegementArray1(3) = Segment
vSegement1 = SegementArray1
Group1.Segments = (vSegement1)
Group1.ApplyCornerTreatment = True
Group1.CornerTreatmentType = 1
Group1.GapWithinGroup = 0
Group1.GapForOtherGroups = 0
Group1.Angle = 0
Set GroupArray(0) = Group1
Dim Group2 As Object
Set Group2 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement2 As Variant
Dim SegementArray2() As Object
ReDim SegementArray2(0 To 0) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line7@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray2(0) = Segment
vSegement2 = SegementArray2
Group2.Segments = (vSegement2)
Group2.ApplyCornerTreatment = True
Group2.CornerTreatmentType = 1
Group2.GapWithinGroup = 0
Group2.GapForOtherGroups = 0
Group2.Angle = 0
Set GroupArray(1) = Group2
Dim Group3 As Object
Set Group3 = Part.FeatureManager.CreateStructuralMemberGroup()
Dim vSegement3 As Variant
Dim SegementArray3() As Object
ReDim SegementArray3(0 To 0) As Object
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Line8@Esquisse1", "EXTSKETCHSEGMENT", -0.716861233578527, 0, 7.41652842845042E-02, True, 0, Nothing, 0)
Set Segment = Part.SelectionManager.GetSelectedObject5(1)
Set SegementArray3(0) = Segment
vSegement3 = SegementArray3
Group3.Segments = (vSegement3)
Group3.ApplyCornerTreatment = True
Group3.CornerTreatmentType = 1
Group3.GapWithinGroup = 0
Group3.GapForOtherGroups = 0
Group3.Angle = 0
Set GroupArray(2) = Group3
vGroups = GroupArray
Set myFeature = Part.FeatureManager.InsertStructuralWeldment4("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\lang\french\weldment profiles\iso\pipe.sldlfp", 1, True, (vGroups))
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Pipe - configured 21.3 X 2.3(1)", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0)
Part.ClearSelection2 True
End Sub

Mecanauto_3.swp (42,5 Ko)

Macro qui génère ceci :

Merci @Sylk, c’est vrai que ça peux aider a connaitre les fonction a utiliser, mais il faudra toujours retravailler le code.

Oui c’est une question tout a fait pertinente, et tu as tout a fait raison, et gérer l’importation dans un assemblage avec un userform pour modifier les variables globales.

Car cette pièce mécano soudée, je voudrais après avoir importé la première dans l’assemblage en faire soit un symétrie soit une répétition et automatisé l’import de tôle qui vont être appliqué sur les châssis mécano soudées.

Du coup auriez vous un exemple de l’importation d’une pièce dans un assemblage avec modification des variables globales ?

Une question au niveau des équation, est il possible d’afficher ou non un segment d’esquisse par équation ?

Par contre j’étais sur ce code pour créer mon esquisse et je n’arrive pas à faire fonctionner la répétition de segments, quelqu’un pourrait il me dire ce qui ne va pas dans mon code ?

Option Explicit

' Creating variable for Solidworks application
Dim swApp As SldWorks.SldWorks
' Creating variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
' Boolean Variable
Dim Part As Object
Dim BoolStatus As Boolean
' Creating variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension

Dim hauteur As Double
Dim largeur As Double
Dim separation As Double
Dim nbSep As Integer

' Main function of our VBA program
Sub main()


hauteur = 3
largeur = 1.5
separation = 0.5
nbSep = (largeur / separation) - 1
    ' Setting Solidworks variable to Solidworks application
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    
    ' Creating string type variable for storing default part location
    Dim defaultTemplate As String
    ' Setting value of this string type variable to "Default part template"
    defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

    ' Setting Solidworks document to new part document
    Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
    Set swModelDocExt = swDoc.Extension
    ' Selecting Front Plane
    BoolStatus = Part.Extension.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Setting Sketch manager for our sketch
    Set swSketchManager = swDoc.SketchManager
    
    ' Creating Variable for Solidworks Sketch segment
    Dim mySketchSegment As SketchSegment
    
    ' Inserting a sketch into selected plane
    swSketchManager.InsertSketch True
    
    ' Creating an horizontal line
    Set mySketchSegment = swSketchManager.CreateLine(0, 0, 0, largeur, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, 0, 0, largeur, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, hauteur, 0, 0, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(0, hauteur, 0, 0, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(separation, 0, 0, separation, hauteur, 0)
    BoolStatus = swModelDocExt.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, separation, 0, False, 0, Nothing, 0)
    BoolStatus = swSketchManager.CreateLinearSketchStepAndRepeat(nbSep, 1, separation, 0.1, 0, 0, "", True, False, False, True, False)
    'Stop
    ' De-select the line after creation
    swDoc.ClearSelection2 True


    Set Part = swApp.ActiveDoc

    ' Zoom To Fit
    swDoc.ViewZoomtofit2
    Part.SketchManager.InsertSketch True
End Sub

Au niveau de la répétition, c’est bon j’ai trouvé :

Option Explicit

' Creating variable for Solidworks application
Dim swApp As SldWorks.SldWorks
' Creating variable for Solidworks document
Dim swDoc As SldWorks.ModelDoc2
' Boolean Variable
Dim Part As Object
Dim BoolStatus As Boolean
' Creating variable for Solidworks Sketch Manager
Dim swSketchManager As SldWorks.SketchManager
Dim swModelDocExt As SldWorks.ModelDocExtension

Dim hauteur As Double
Dim largeur As Double
Dim separationVerticale As Double
Dim separationHorizontale As Double
Dim nbSepVert As Integer
Dim nbSepHor As Integer

' Main function of our VBA program
Sub main()


hauteur = 3
largeur = 1.5
separationVerticale = 0.5
nbSepVert = (largeur / separationVerticale) - 1
nbSepHor = hauteur / 500
If nbSepVert - Fix(nbSepVert) <> 0 Then nbSepVert = nbSepVert + 1
separationHorizontale = hauteur / nbSepVert

    ' Setting Solidworks variable to Solidworks application
    Set swApp = Application.SldWorks
    Set Part = swApp.ActiveDoc
    
    
    ' Creating string type variable for storing default part location
    Dim defaultTemplate As String
    ' Setting value of this string type variable to "Default part template"
    defaultTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplatePart)

    ' Setting Solidworks document to new part document
    Set swDoc = swApp.NewDocument(defaultTemplate, 0, 0, 0)
    Set swModelDocExt = swDoc.Extension
    ' Selecting Front Plane
    BoolStatus = Part.Extension.SelectByID2("Line5@Esquisse1", "EXTSKETCHSEGMENT", 0, 0, 0, False, 0, Nothing, 0)
    
    ' Setting Sketch manager for our sketch
    Set swSketchManager = swDoc.SketchManager
    
    ' Creating Variable for Solidworks Sketch segment
    Dim mySketchSegment As SketchSegment
    
    ' Inserting a sketch into selected plane
    swSketchManager.InsertSketch True
    
    ' Creating an horizontal line
    Set mySketchSegment = swSketchManager.CreateLine(0, 0, 0, largeur, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, 0, 0, largeur, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(largeur, hauteur, 0, 0, hauteur, 0)
    Set mySketchSegment = swSketchManager.CreateLine(0, hauteur, 0, 0, 0, 0)
    Set mySketchSegment = swSketchManager.CreateLine(separationVerticale, 0, 0, separationVerticale, hauteur, 0)
    BoolStatus = swModelDocExt.SelectByID2("Ligne5", "EXTSKETCHSEGMENT", 0, separationVerticale, 0, False, 0, Nothing, 0)
    'Stop
    BoolStatus = swSketchManager.CreateLinearSketchStepAndRepeat(nbSepVert, 1, separationVerticale, 1, 0, 1.57, "", True, False, False, True, False)
    'Stop
    ' De-select the line after creation
    swDoc.ClearSelection2 True


    Set Part = swApp.ActiveDoc

    ' Zoom To Fit
    swDoc.ViewZoomtofit2
    Part.SketchManager.InsertSketch True
End Sub

Reste ces deux questions :

Bonjour,

L’intérêt d’un âge avancé, c’est que l’on dispose d’une bibliothèque riche en macros. En piochant des morceaux ici et là et en adaptant au besoin, une macro est assez vite réalisée (cf. fichier Zip joint).
A tester sans modération.

GrilleSoudee.zip (455,1 Ko)

Pour répondre à vos questions sur « l’importation d’une pièce dans un assemblage avec modification des variables globales » et s’il possible « d’afficher ou non un segment d’esquisse par équation », je suis tenté de répondre OUI…
La majeure partie des constructions et des méthodes dans Solidworks sont réalisables par macros.
Ceci étant, une macro se justifie surtout pour réaliser des tâches répétitives et chronophages. Est-ce le cas de votre projet ?

Cordialement.

1 « J'aime »

Merci @m_blt,

Pour cette superbe macro bien documentée, qui va me permettre de compléter certaines fonction de la mienne qui a un besoin légèrement différent.

Quand au gain de temps, je peux te répondre que oui, car déjà l’automatisation de la construction soudée, va me faire gagné un peu de temps, mais au final c’est avec la suite que je vais en gagner encore plus
.
Car je veux sur cette construction soudée dans un assemblage importer des tôle de largeur défini par la grille soudée (d’où l’importance de l’importation dans un assemblage et la modification de variables globales) et gérer leurs configuration en fonction de leur position sur cette grille soudée.

Cette macro va me faire gagner du temps sur la construction de ces éléments, mais aussi sur le calcule de la dimension de chaque éléments par rapport aux dimensions globales.

Donc si tu as quelque chose qui traite de ces deux points je suis preneur.

Un petit soucis en faisant des essais avec ta macro, elle ne génère pas la structure et je pense que certaines combobox n’ont pas les bonnes valeurs.
Car dans normes je devrais trouver ISO et non pas le type de profils, mon dossier n’est peut etre pas constitué comme le tien.
Je suis obligé de sélectionner dans le chemin la norme pour remplir les combobox…

Je devrais arriver a le modifier pour que ça fonctionne, mais si d’autres en la téléchargeant se trouve bloquer, je préférais te prévenir que je n’avais pas le résultat attendu.

Je pense plutôt que tu dois régler le dossier des profils sur « weldment profiles », non l’un de ses sous dossiers.

Vu que la taille est un dossier du type qui est un dossier de la norme qui est un dossier des profils, si tu sélectionnes le dossier norme à la place du dossier profiles, toute la cascade est décalée.

1 « J'aime »

Pour appuyer le message pertinent de @Sylk
Les esquisses de profils sont organisées de la façon suivante :

1- Le dossier général des profils, dans lequel se trouvent…
2- Les sous-dossiers de normes (ISO, ANSI, etc), dans lesquels se trouvent…
3- Les fichiers définissant les types de profils (*.sldlfp), dans lesquels
se trouvent…
4- Les esquisses des profils dont les configurations correspondent à leurs différentes tailles.

C’est le Dossier n°1 qui doit être renseigné dans la boite de saisie supérieure. En sont déduites les liste déroulantes de sélection des normes, types et tailles.
En principe, ce dossier n°1 est celui figurant dans les « Emplacements de fichiers » des « Options > Système » de Solidworks, récupéré en principe dans la boite de saisie au lancement de la macro.

La macro ne comporte évidemment pas tous les garde-fous nécessaires.
Et en écrivant ces lignes, je me dis que si le fichier de profil est enregistré dans un dossier perso ne respectant pas cette organisation, la macro ne permet pas de le trouver. Grrr! :face_with_symbols_over_mouth:

1 « J'aime »

Je pensais qu’on pouvait lancer une macro 2022 sur un SW 2020 mais non… apparemment il faut les librairies 2022. J’imagine qu’il doit y avoir une commande dans le code qui le nécessite.

Edit:

Cette variable (swFileLocationsWeldmentProfiles) pour l’initialisation du contenu de la textbox ne doit pas exister dans le 2020 :

UserForm1.TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles)

Alors je l’ai remplacé par une chaîne vide en dur

UserForm1.TextBoxProfil.Text = ""

Ah, et ici aussi du coup :

With folderDialog
        .InitialFileName = ""

Un garde-fou pourrait être de tester si la commande n’est pas valide, d’initialiser la racine ou une chaîne vide. Pour la retro-compatibilité.

EDIT:
Bon beh la variable swDocPART me pose aussi problème…

Set swDoc = swApp.OpenDoc6(filePath, swDocPART, swOpenDocOptions_Silent, "", 0, 0)    ' Ouvre le fichier en arrière-plan

Bonjour @Sylk,

En principe, les macros ne sont pas liées aux versions de SW comme le sont les fichiers d’assemblages ou de pièces.
Une seule restriction : certaines propriétés ou méthodes des API évoluent au fil du temps et une version ancienne de SW peut ne pas les reconnaître.
Il suffit souvent de remonter d’une ou deux unités le chiffre final pour trouver la fonction antérieure (OpenDoc4 est la version précédant OpenDoc6).

Pour la constante swDocPart :

  • Si la bibliothèque SolidWorks API Type Library est référencée dans Outils > Références, VBA importe automatiquement les constantes de l’API, qu’il est possible d’utiliser par leurs noms abrégés (swDocPart seul).
  • Si la bibliothèque n’est pas référencée, il faut utiliser le nom qualifié : swDocumentTypes_e.swDocPart

Quant à tester les lignes utilisant des fonctions de l’API, ce serait lourd à gérer, ça prendrait un temps fou et ça rendrait le code moins lisible.
Et que faire en cas d’erreur, sinon sortir de la macro ?
D’accord en revanche pour tester les entrées utilisateurs, autant que faire se peut…

Pour conclure, je vais jeter un oeil à cette histoire de fichier de profils.

1 « J'aime »

Mon dossier est bien le bon :

Screenshot_57

J’ai juste rajouté manuellement ISO pour que les combobox ne reste pas vide.

Votre ensemble de profils devrait être structuré comme ci-dessous ?

Sur ma version SW 2022, le dossier est celui-ci :
C:\Program Files\SolidWorks_2022\SOLIDWORKS\data\weldment profiles
image
Le texte est affiché dans la boite de saisie au lancement de la macro, mais il faut cliquer sur le bouton et accepter le dossier pour compléter les listes de normes, types et tailles.

Il ne faut rien ajouter à la main…

J’ai compris le problème, c’est que le dossier n’est pas chargé au démarrage, il ne l’est qu’après l’avoir choisi dans la dialog.

Il faut rajouter ceci pour charger le contenu des combobox au lancement :

    UserForm1.TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles) & "\"
    UserForm1.Show
    
    If UserForm1.TextBoxProfil.Text <> "" Then
        dossierProfils = UserForm1.TextBoxProfil.Text
        UserForm1.DossiersNormesProfils
        UserForm1.ComboBoxNorme.Enabled = True
    End If

soit

    With UserForm1
      .TextBoxProfil.Text = swApp.GetUserPreferenceStringValue(swFileLocationsWeldmentProfiles) & "\"
      .Show
      If .TextBoxProfil.Text <> "" Then
          dossierProfils = .TextBoxProfil.Text
          .DossiersNormesProfils
          .ComboBoxNorme.Enabled = True
      End If
    End With

Par contre, chez moi il est très ralenti au chargement du profil, il faudrait qu’il puisse charger les tailles que sur confirmation. Peut-être un bouton « charger les tailles ». A moins qu’il y ait une méthode pour extraire les configs sans ouvrir le fichier ?

Merci, j’avais activé les librairies mais pour une raison inconnue, elles étaient décochées…

Je n’ai pas la même architecture de dossier que toi @m_blt.
Car dans le dossier DIN je n’ai pas de fichier .sldfp mais des dossier de type de profil et dans ces dossiers de type de profils j’ai les fichiers avec extension .sldfp.

Screenshot_58

Screenshot_59

J’ai recalibrer le code en fonction de mon architecture :

Screenshot_60

Par contre Auriez vous quelque chose sur le sujet ci dessous car je galère à essayer d’importer un fichier pièce dans un nouvel assemblage :