Macro pour supprimer tous les calques sauf certains

Bonjour à tous,

Je cherche a automatiser le nommage de mes calques sous solidworks.

Dans mon exemple nous avons un certain nombre de calques que nous n'utilisons plus mais qui existe dans des vieux plans.

Quand je veux retoucher les vieux plans, je souhaiterais  supprimer tous les calques sauf certains calques  (cotations, annotations, dessin , IndiceA, Indice B Indice ....)

Je sais comment supprimer tous les calques mais pas exclure certains.

ci joint ma macro

Merci d'avance de votre aide.

 


supprimer_tous_les_calques.swp

Bonjour Yannick. Essaye ca:

Option Explicit
    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swLayerMgr                  As SldWorks.LayerMgr
    Dim swLayer                     As SldWorks.Layer
    Dim vLayerArr                   As Variant
    Dim vLayer                      As Variant
Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    If swModel Is Nothing Then
        swApp.SendMsgToUser2 "pas de documents ouvert", swMbWarning, swMbOk
        Exit Sub
    End If
    
    If swModel.GetType <> 3 Then
        swApp.SendMsgToUser2 "Ouvrir une mise en plan", swMbWarning, swMbOk
        Exit Sub
    End If
    swModel.ViewZoomtofit2
    
    Set swLayerMgr = swModel.GetLayerManager
    vLayerArr = swLayerMgr.GetLayerList

    Dim LayerList As Object
    Set LayerList = CreateObject("Scripting.Dictionary")
    LayerList.Add "cotations", 0
    LayerList.Add "Annotations", 0
    LayerList.Add "dessin", 0
    LayerList.Add "IndiceA", 0
    LayerList.Add "IndiceB", 0

    For Each vLayer In vLayerArr
        Set swLayer = swLayerMgr.GetLayer(vLayer)
        If Not LayerList.Exists(swLayer.Name) Then
            Debug.Print "Supprime " & swLayer.Name
            swLayerMgr.DeleteLayer swLayer.Name
        ElseIf swLayer.Name = "cotations" Then
            swLayer.Color = 0
        ElseIf InStr(swLayer.Name, "Indice") > 0 Then
            swLayer.Color = 255
        End If
    Next
End Sub

 

3 « J'aime »

bonjour,

Merci pour le retour rapide Jérôme, je teste demain .

Petite question supplémentaire, est t'il possible d'ajouter des couleur aux calques?

Calques cotations annotation en noir

Calques indice en rouge

  yannick

 

J'ai mis à jour le code pour les couleurs.

1 « J'aime »

Bonjour Jérome,

La macro ne créé pas les calques.

J'ai exécuté la macro pas à pas, la macro passe de For each à end sub sans prendre en compte  ce qu'il y a entre  (souligné ci dessous.

  For Each vLayer In vLayerArr
        Set swLayer = swLayerMgr.GetLayer(vLayer)
        If Not LayerList.Exists(swLayer.Name) Then
            Debug.Print "Supprime " & swLayer.Name
            swLayerMgr.DeleteLayer swLayer.Name
        ElseIf swLayer.Name = "cotations" Then
            swLayer.Color = 0
        ElseIf InStr(swLayer.Name, "Indice") > 0 Then
            swLayer.Color = 255
        End If
    Next
End Sub

Ca peut arriver si il n'y a aucun calque

Tu peux vérifier en mettant 'debug.print vLayer ' après le for

Est ce que tu peux joindre un dessin + 3D pour test, ainsi que le fichier swp.

1 « J'aime »

voici le type de fichier que je dois retoucher avec la macro

il arrive que l'on ai aucun calque sur des vieux plan voir fichier sans calques.

sur le fichier sans calque , la macro ne fait rien .

Sur le fichier avec calques, la macro supprime tous les calques sauf cotations, indice n'est pas pris en compte

 


calques.zip

Voici le type de fichier que je dois retoucher avec la macro

il arrive que l'on ai aucun calque sur des vieux plan voir fichier sans calques.

c'est sur le fichier sans calque que  la macro ne fait rien .

Sur le fichier avec calques, la macro supprime tous les calques sauf cotations, par contre suppression des calques indices.


calques.zip

Supprimer  tous les calques sauf cotation indice .... , la macro fonctionne si un calque existe.

Pour le moment Indice A , Indice B , sont supprimés, cette ligne de commande n'est pas prise en compte

 ElseIf InStr(swLayer.Name, "Indice") > 0 Then
            swLayer.Color = 255

 

J'ai remplacé par ces commandes, ca fonctionne.

ElseIf swLayer.Name = "IndiceA" Then
            swLayer.Color = 255
ElseIf swLayer.Name = "IndiceB" Then
            swLayer.Color = 255

     

         

Merci pour les retours d'hier Jérome,

Par contre une information que je n'avais pas pris en compte 

  1. créer les Calques Cotation, IndiceA,IndiceB ...... s'ils ne sont pas présent.

Est ce possible?

ajoute un calque avec:

swLayerMgr.AddLayer("cotation", "", 0, swLayerMgr.swLineCONTINUOUS, swLineWeights_e.swLW_THIN)

1 « J'aime »

Bonjour Jérome,

La ligne : cot = swLayerMgr.AddLayer("cotation", "", 0, swLayerMgr.swLineCONTINUOUS, swLineWeights_e.swLW_THIN)

que tu m'as fournis hier m'affiche une erreur

 

j'ai remplacé par cette ligne

cot = swLayerMgr.AddLayer("Cotation", "", RGB(0, 0, 0), 0, 0)

 

est ce qu'il y a un paramètre pour activer un calque précis s'il n'existe pas de calque dans le fond de plan a traiter?


 

voici la macro


maj_calques.swp

autant pour moi j'ai fais une erreur lors du copier-coller c'est:

cot = swLayerMgr.AddLayer("cotation", "", 0, swLineStyles_e.swLineCONTINUOUS, swLineWeights_e.swLW_THIN)

 

Peux tu éclaircir la question : "est ce qu'il y a un paramètre pour activer un calque précis s'il n'existe pas de calque dans le fond de plan a traiter?"

1 « J'aime »

Lors de l'exécution de la macro, les calques sont bien créés

S'il n'y a pas de calque présent sur le plan traité, il n y aura aucun calque actif à la fin du traitement de la macro 

 Calque actif c'est le calque avec   une flèche  (voir PJ)

Je souhaite définir un calque actif lors de la création des calques avec la macro. 

Par exemple  calque dessin actif

 

 


download.jpeg.jpg

Il faut mettre:

swLayerMgr.SetCurrentLayer "Nom_du_calque"

Pour le rendre actif

1 « J'aime »