Création de Macro pour calques

Bonjour à tous
Je n’ai jamais encodé de macro et j’aimerais apprendre car je bute sur une problématique:

Actuellement je cherche une solution « simple » afin de placer des pièces solidworks dans un calque lors de la mise en plan (Pour le moment dans le logiciel, le seul moyen c’est de cacher les pièces que je ne souhaite pas, puis celles qui restent, les sélectionner une à une puis les attribuer à un calque. Autant vous dire que c’est fastidieux).
L’autre moyen c’est l’export du plan avec des couleurs puis dans le logiciel 2D comme Autocad, attribuer les calques selon les couleurs.
Bref un enfer… je parcours en long en large et en travers tous les forums et les sites anglophones et francophone mais je ne trouve rien… pourtant il me semble que je ne dois pas être le seul dans cette impasse.

Donc, connaissez vous, s’il vous plait, une macro capable de lier des pièces directement à des calques ? (a savoir que mes assemblages sont les mêmes possédants tous les mêmes pièces, et peu de pièces. Mais dans un lancement de 200 assemblages, ça peut prendre du temps de trier chaque pièce).

Sinon, savez-vous où je peux apprendre sur le net, les bases pour encoder en VBA ? Car je pense que ça va être la seule solution possible.

Je vous remercie d’avance
Cordialement
Axel

Bonjour;

Attention, Solidworks ne gère pas les calques comme le ferait Autocad…
Il est possible de créer un fichier de Projection pour les enregistrement des mises en plan en DWG et DXF (fichier-> enregistrer sous DWG/DXF puis « Option »)

image

→ décocher l’option « Ne pas montrer la projection à chaque enregistrement » pour accéder aux réglages à personnaliser: (Exemple)


https://help.solidworks.com/2022/french/Solidworks/slddxf/t_map_entities_on_export_to_dwg.htm?rid=131218

Mais globalement Solidworks ne gère que les types de traits (et quelques couleurs de traits) mais pas les composants 3D…

Concernant les macro, voici quelques sites pour commencer à vous familiariser avec la programmation VB…

et plus généralement (VBA orienté Excel mais toujours utile):

et les aides API Solidworks.

Nota: pour débuter je dé-conseil l’enregistrement de macro automatique et l’intelligence artificielle générative (bien que certain progrès soient notables sur certaines « AI »…)

Et bien entendu ce Forum…

Cordialement.

3 « J'aime »

Merci pour la réponse :slight_smile:
effectivement je connais aussi la méthode d’export, mais ce n’est pas exactement ce que je cherche.
J’ai réussi manuellement à mettre un calque à une pièce ou un composant entier, donc je me dis que ça peut s’automatiser, c’est plus dans ce sens là que je bloque.
Merci pour les liens :slight_smile: je sens que le cerveau va fumer un peu

Dans quelle mesure l’ « automatisation » du changement de calque d’un composant serait plus simple avec une macro ?
Sauf si le ou les composants en question sont toujours les mêmes (Composants de bibliothèque?) il faudra toujours passer par la phase « Sélection » de la pièce ou de l’assemblage, puis ,probablement, par le choix du calque vers lequel les exporter…
nota: Attention à ne pas confondre style de traits,police de lignes et calques…

2 « J'aime »

Voici un exemple donné par l’aide des API Solidworks:
https://help.solidworks.com/2022/english/api/sldworksapi/Put_Assembly_Components_in_Drawing_View_on_Different_Layers_Example_VB.htm?verRedirect=1

… Le code de l’aide API avec quelques commentaires supplementaires:

Option Explicit

' Cette sous-procédure modifie le calque d'un composant dans un document de dessin SolidWorks
Private Sub ChangeComponentLayer(swApp As SldWorks.SldWorks, swDraw As SldWorks.DrawingDoc, swDrawComp As SldWorks.DrawingComponent, sLayerName As String)

    Dim bRet As Boolean

    ' Former un nom de calque valide en remplaçant les symboles 
    ' barre oblique (/) et arobase (@) par des traits de soulignement (_)
    sLayerName = Replace(sLayerName, "/", "_")
    sLayerName = Replace(sLayerName, "@", "_")

    ' Créer un calque avec le nom formé et ajouter une assertion de débogage
    bRet = swDraw.CreateLayer(sLayerName, "layer for " & sLayerName, 0, swLineCONTINUOUS, swLW_NORMAL, True): Debug.Assert bRet
    
    ' Définir le calque du composant de dessin sur le nouveau calque
    swDrawComp.Layer = sLayerName

End Sub

' Cette sous-procédure traite un composant de dessin, modifie son calque, 
' et traite récursivement tous ses composants enfants
Sub ProcessDrawingComponent(swApp As SldWorks.SldWorks, swDraw As SldWorks.DrawingDoc, swDrawComp As SldWorks.DrawingComponent, sPadStr As String)

    Dim vDrawCompChildArr As Variant
    Dim vDrawCompChild As Variant
    Dim swDrawCompChild As SldWorks.DrawingComponent

    ' Afficher le nom du composant dans la fenêtre de débogage
    Debug.Print sPadStr & swDrawComp.Name
    
    ' Changer le calque du composant actuel
    ChangeComponentLayer swApp, swDraw, swDrawComp, swDrawComp.Name

    ' Obtenir tous les composants enfants du composant actuel
    vDrawCompChildArr = swDrawComp.GetChildren
    
    ' Vérifier s'il y a des enfants et les traiter récursivement
    If Not IsEmpty(vDrawCompChildArr) Then
        For Each vDrawCompChild In vDrawCompChildArr
            Set swDrawCompChild = vDrawCompChild
            ' Appel récursif pour traiter chaque composant enfant
            ProcessDrawingComponent swApp, swDraw, swDrawCompChild, sPadStr + "  "
        Next
    End If

End Sub

' Cette procédure principale initialise les objets SolidWorks nécessaires 
' et commence à traiter les composants de dessin sélectionnés
Sub main()

    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSelMgr As SldWorks.SelectionMgr
    Dim swView As SldWorks.View
    Dim swDrawComp As SldWorks.DrawingComponent
    Dim bRet As Boolean

    ' Obtenir l'instance active de SolidWorks
    Set swApp = Application.SldWorks
    
    ' Obtenir le document actif (qui devrait être un dessin)
    Set swModel = swApp.ActiveDoc
    Set swDraw = swModel
    
    ' Obtenir le gestionnaire de sélection et la vue sélectionnée
    Set swSelMgr = swModel.SelectionManager
    Set swView = swSelMgr.GetSelectedObject6(1, -1)
    
    ' Obtenir le composant de dessin racine de la vue sélectionnée
    Set swDrawComp = swView.RootDrawingComponent

    ' Afficher le nom du fichier et la vue sélectionnée dans la fenêtre de débogage
    Debug.Print "File = " & swModel.GetPathName
    Debug.Print "  " & swView.Name & "  [" & swView.Type & "]"

    ' Commencer le traitement du composant de dessin racine
    ProcessDrawingComponent swApp, swDraw, swDrawComp, "    "

End Sub

Et quelques explications des différentes procédures:

  • Sous-procédure ChangeComponentLayer :
  • Transformation du nom de calque pour éviter les caractères non valides et la création du calque dans le document de dessin.
  • Sous-procédure ProcessDrawingComponent :
  • Ttraitement récursif des composants de dessin et le changement de calque pour chaque composant, ainsi que l’affichage des informations de débogage.
  • Procédure principale main :
  • Initialisation des objets SolidWorks nécessaires, la sélection de la vue et des composants, et le lancement du processus de traitement des composants.
3 « J'aime »

… et un petit tuto pour l’exécution de cette macro sur une mise en plan de Solidworks …
Attention, sur une copie d’une MEP… on ne teste jamais une macro sur les fichiers originaux au risque de tout perdre…(il est rare que l’on puisse revenir en arriere avec une MAcro).

Étape 1 : Préparer l’Environnement

  1. Ouvrir SolidWorks
    Lancez SolidWorks et ouvrez un document de dessin (Drawing) que vous souhaitez traiter avec la macro.
  2. Vérifier les Composants et Vues
    Assurez-vous que le dessin contient des composants et des vues que vous souhaitez manipuler. La macro agit sur les composants de dessin et leurs couches (layers).

Étape 2 : Accéder à l’Éditeur de Macros VBA

  1. Ouvrir l’Éditeur de Macros
    Dans SolidWorks, allez dans le menu Outils (Tools) > Macro > Nouveau (New) pour créer une nouvelle macro, ou Exécuter (Run) pour ouvrir une macro existante.
  2. Créer une Nouvelle Macro
  • Si vous choisissez de créer une nouvelle macro, SolidWorks vous demandera de sauvegarder le fichier avec une extension .swp.
  • Donnez un nom à votre macro, comme ChangeLayerMacro.swp, et enregistrez-le à un endroit facile d’accès.

Étape 3 : Copier le Code VBA dans l’Éditeur

  1. Ouvrir l’Éditeur de Visual Basic pour Applications (VBA)
    Une fois le fichier de macro créé, SolidWorks ouvrira l’éditeur VBA.
  2. Coller le Code VBA
  • Copiez le code VBA (fourni ci-dessus) dans l’éditeur VBA.
  • Collez-le dans le module de macro vide qui a été créé automatiquement.
  • Assurez-vous que tout le code est collé correctement, y compris les déclarations Option Explicit et toutes les sous-procédures.

Étape 4 : Sauvegarder et Fermer l’Éditeur de VBA

  • Cliquez sur Fichier (File) > Enregistrer (Save) ou utilisez le raccourci Ctrl + S pour enregistrer la macro.
  • Fermez l’éditeur VBA une fois que la macro est enregistrée.

Étape 5 : Exécuter la Macro dans SolidWorks

  1. Sélectionner une Vue dans le Dessin
    Avant d’exécuter la macro, assurez-vous de sélectionner une vue de dessin dans le document actif, car la macro s’attend à ce que vous ayez une vue sélectionnée pour traiter ses composants.
  2. Exécuter la Macro
    Retournez dans le menu Outils (Tools) > Macro > Exécuter (Run).
  • Parcourez vos fichiers et sélectionnez la macro .swp que vous avez enregistrée précédemment.
  • Cliquez sur Ouvrir (Open) pour exécuter la macro.

nota : perso, je préféré lancer la macro directement depuis l’éditeur VBA en utilisant le mode pas-à-pas (F8) et analyser les actions et résultats dans la fenêtre d’exécution de l’éditeur en gardant un œil sur la fenêtre des variables locales

Étape 6 : Vérifier les Résultats

  • Une fois la macro exécutée, la fenêtre Immediate (fenêtre de débogage) dans l’éditeur VBA (si elle est ouverte) ou la console de sortie de SolidWorks affichera les résultats de la macro, y compris les noms des composants traités et leurs nouveaux calques.
  • Vérifiez dans le dessin de SolidWorks que les composants ont bien été déplacés vers les nouveaux calques comme prévu.

Points à Vérifier et Dépanner

  • Compatibilité des Versions : Assurez-vous que votre version de SolidWorks prend en charge l’exécution de macros VBA. Certaines restrictions peuvent s’appliquer en fonction de la version.
  • Sécurité des Macros : Si SolidWorks affiche un avertissement de sécurité concernant les macros, assurez-vous que vous avez défini les paramètres de sécurité des macros pour permettre l’exécution.
  • Messages d’Erreur : Si vous rencontrez des erreurs, vérifiez que vous avez bien sélectionné une vue valide et que le dessin est configuré correctement avec des composants.

Résumé

En suivant ces étapes, vous pouvez utiliser la macro VBA pour changer les calques des composants dans un dessin SolidWorks de manière automatisée et efficace. Cette macro est particulièrement utile pour organiser des dessins complexes avec de multiples composants en créant et en attribuant des calques automatiquement en fonction des noms des composants.

4 « J'aime »

Merci beaucoup pour ces éléments, c’est très gentil.
Alors j’ai effectivement essayé cette macro (l’initiale sur le site, pas celle que vous avez copié). Le fait est qu’elle créé une ligne de calque par pièce. Donc je me retrouve avec énormément de calques ce qui est du coup inconfortable et inutilisable mais c’est déjà un début.

Dans votre question précédente sur qu’est-ce qui serait plus simple avec l’automatisation, c’est qu’effectivement je me retrouve avec les mêmes pièces répétées x fois. Donc autant tout grouper avec une macro, plutôt que de faire manuellement la sélection de ces éléments puis de les placer dans les calques respectifs.

En fait je dois mettre en place une GPAO mais en gardant cette pratique actuelle de l’entreprise de l’utilisation des calques en 2D pour les exports clients (archi, ou BE). Et le but c’est d’éviter de perdre un temps inutile qui va rebuter mes collègues lorsque je vais livrer le projet à tout le monde.
Actuellement j’utilise le logiciel Swood sur Solidworks, et il n’y a aucun soucis pour l’encodage c’est très facile, même avec des composants complexe.
Seulement il faut que la mise en plan soit facile d’accès aussi pour mes collègues.

Je vais continuer de plancher sur la question avec vos éléments !!!
Encore merci pour votre temps, c’est super agréable
Bonne journée

Sinon il y a cet utilitaire dans la suite MyCADTools chez Visiativ si tu galères à développer ta macro:

Eventuellement tu peux le tester en version d’essai pour voir si tu arrives à obtenir ce que tu veux.
Avec notamment possibilité de déplacer une pièce vers un certain calque en fonction d’une propriété:
image

3 « J'aime »

Bonjour :slight_smile: Merci beaucoup, je vais essayer voir ce que ça donne !!! Ca a l’air d’être l’idée. Merci pour le tuyau :wink:

1 « J'aime »