je n'ai rien trouvé sur le forum; je me demande si quelqu'un aurait une macro qui enregistre les sous assemblages dans un dossier qui reprend le nom du sous assemblage. En fait j'ai reçu un STEP d'un client et celui-ci comporte une bonne trentaine sous assemblage et si je l'enregistre j'ai tout en bordel dans le dossier principal alors que j'aurais aimé qu'une fonction me crée les sous dossiers de chaque sous assemblage pour y ranger les pièces.
La macro jointe fait le job sur un exemple d'assemblage d'une quarantaine de pièces et de 8 sous-assemblages sur deux niveaux. La structure de l'enregistrement est une quasi-copie de l'arbre de SolidWorks: chaque assemblage est enregistré dans un dossier à son nom, ainsi que les pièces qu'il contient, et ce de façon récursive. Enregistrement vrai également pour l'assemblage racine, ce qui a pour effet d'en créer une copie.
A tester avec prudence, il n'y a pas de garde-fou...
Ci-joint le code modifié, pas sûr que ce soit ce qu'il y a de plus propre mais cela semble fonctionnel.
Si le chemin est vide, il te créer un répertoire définie dans la 3ème lignes (chemin en dur à modifier si besoin) Ici "C:\Temp\AS_STEP\"
L'ensemble des tes fichier step seront donc copier dans ce dossier et déplaçable en fermant l'assemblage. (copier coller du dossier)
Il y a un moyen de faire choisir le chemin de destination mais je ne me rappelle plus comment, donc voici la solution choisit de remplacement.
Option Explicit
'On définit la constant pour le chemin si assemblage non eregistré
Public Const CheminConstante As String = "C:\Temp\AS_STEP\"
Sub TraitementAssemblage(swComp As SldWorks.Component2, ByVal Emplacement As String, ByVal nomfichier As String)
Dim vChildComp As Variant
Dim swModelComponent As SldWorks.ModelDoc2
Dim swChildComp As SldWorks.Component2
Dim swCompConfig As SldWorks.Configuration
Dim nChild As Long
Dim longStatus As Boolean
Dim dossier As String
dossier = Emplacement & Left(nomfichier, Len(nomfichier) - 7) & "\" ' Nom de dossier: celui de l'assemblage
If Dir(dossier, vbDirectory) = "" Then
MkDir dossier ' Création du dossier de l'assemblage
Set swModelComponent = swComp.GetModelDoc2
longStatus = swModelComponent.SaveAs3(dossier & nomfichier, 0, 0) ' Enregistrement de l'assemblage dans son dossier
Else
Exit Sub
End If
vChildComp = swComp.GetChildren ' Liste des enfants de l'assemblage
For nChild = 0 To UBound(vChildComp)
Set swChildComp = vChildComp(nChild)
nomfichier = Dir$(swChildComp.GetPathName)
If UCase(Right(nomfichier, 6)) = "SLDASM" Then ' Si c'est un assemblage: traitement récursif
TraitementAssemblage swChildComp, dossier, nomfichier
ElseIf UCase(Right(nomfichier, 6)) = "SLDPRT" Then ' si c'est une pièce : enregistrement
Set swModelComponent = swChildComp.GetModelDoc2
longStatus = swModelComponent.SaveAs3(dossier & nomfichier, 0, 0)
End If
Next nChild
End Sub
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim Emplacement As String
Dim nomfichier As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Emplacement = swModel.GetPathName
'On vérifie l'extension
Dim FileTyp As Long
FileTyp = swModel.GetType
If Not FileTyp = swDocASSEMBLY Then
MsgBox ("Le document doit être un assemblage...")
Exit Sub
End If
If Emplacement = "" Then
If Not Len(Dir(CheminConstante, vbDirectory)) > 0 Then
MkDir CheminConstante
Emplacement = CheminConstante
Debug.Print swModel.GetTitle
nomfichier = swModel.GetTitle & ".sldasm"
Else
nomfichier = swModel.GetTitle & ".sldasm"
Emplacement = CheminConstante
End If
Else
nomfichier = Dir$(Emplacement) ' Nom du document d'assemblage principal
End If
Debug.Print Emplacement
'If Right(Emplacement, 1) = "\" Then Emplacement = Left(Emplacement, Len(Emplacement) - 1)
'Emplacement = Left(Emplacement, InStrRev(Emplacement, "\")) ' Nom du dossier d'origine
Set swConf = swModel.GetActiveConfiguration
Set swRootComp = swConf.GetRootComponent3(False)
TraitementAssemblage swRootComp, Emplacement, nomfichier ' Comme c'est un assemblage: traitement
swModel.Extension.SaveAs Emplacement & nomfichier, swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, 0, 0
End Sub
Attention cette macro ne fonctionne pas si import 3Dinterconnect à moins de rompre le lien.
J'ai privilégié la macro de @m.bltcar elle me crée le dossier avec les sous dossiers dans le dossier source et il ne me reste plus qu'à supprimer l'assemblage et les pièces enregistrées préalablement. La macro de @sbadenisenregistre les pièces et asm dans le dossier source et me crée un dossier dans le Temps avec les sous dossiers de sous assemblage donc je doit supprimer l'asm et les pièces comme pour celle de @m.bltmais je doit faire un couper coller en plus pour tout remettre dans le bon dossier.
PS dsl pour le retard de validation de la meilleur réponse ( beaucoup de travail) et merci à vous deux d'avoir pris le temps .