Aller au contenu

Suppression de calque par nom généric (?/*)


zebzeb

Messages recommandés

Bonjour,

 

Il y a longtemps que je ne fais plus d’Autocad et dans le cadre d’un DOE, j’ai créé un script (via VBA Excel), qui ouvre les fichiers un à un ; parmi les différentes actions je change des valeurs d’attributs, je purge, je lis et détache des xref, etc…

Mais je bloque pour sur les claques, je m’explique

1. Pour rendre le calque 0 actif et déverrouiller les autres

 

(command "-calque" "CH" "0" "D" "*" "") 

Si je ne mais pas les derniers "" je ne sors pas de la commande, mais les mettant ça me sort nil donc le script s’arrête

 

2. Pour supprimer des calques

(command "-suppcalque" "N" "REVISION-*")

Le hic suppression de calque ne prends pas en charge les caractères génériques, de plus si le calque est une ancienne révision il est gelé et suppcalque ne le supprime pas.

 

Donc je cherche un lisp/manipulation

1. Qui rend actif le calque 0

2. Supprime les calques "REVISION-*", "Indice-*" qu’il soit Verrouillés ou gelés, idéalement je souhaiterai pouvoir charger le lisp et entrer la commande

 

(command "NomDuLisp" "REVISION-*")
(command "NomDuLisp" "*UnCalque*")

 

Voilà je vous ai tout dit, si vous avez des idées ou quelques chose vos bibliothèques qui correspond je suis preneur

 

Merci et bonne journée

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour rendre le calque 0 courant

 

(setvar 'CLAYER "0")

 

Pour dégeler l'ensemble des calques

 

(vl-load-com)
(defun degelay ( / n la doc)
   (setq doc (vla-get-activedocument (vlax-get-acad-object)))
   (repeat (setq n (vla-get-count (vla-get-layers doc)))
       (setq la (vla-item (vla-get-layers doc) (setq n (1- n))))
       (if (= :vlax-true (vla-get-freeze la))
       (vla-put-freeze la :vlax-false)
       )
   )
);fin degelay

 

Pour tout déverrouiller sur le même principe

 

(defun develay ( / n la doc)
   (setq doc (vla-get-activedocument (vlax-get-acad-object)))
   (repeat (setq n (vla-get-count (vla-get-layers doc)))
       (setq la (vla-item (vla-get-layers doc) (setq n (1- n))))
       (if (= :vlax-true (vla-get-lock la))
       (vla-put-lock la :vlax-false)
       )
   )
);fin develay

 

Pour supprimer un calque il faut mieux qu'il soit vidé, et tu purge.

Lien vers le commentaire
Partager sur d’autres sites

Essayes ceci avec précaution (sauvegarde si tu es sûre du résultat) car j'ai pas vraiment testé...Tu copie-colle en ligne de commande.

((lambda ( / flag lay)
(setq flag T)
(while (setq lay (tblnext "LAYER" flag))
	(if (and (zerop (boole 1 16 (cdr (assoc 70 lay)))) (/= (cdr (assoc 2 lay)) "0"))
		(if (or (wcmatch (cdr (assoc 2 lay)) "REVISION-*") (wcmatch (cdr (assoc 2 lay)) "Indice-*"))
			(command "-SUPCALQUE" "N" (cdr (assoc 2 lay)) "" "oui")
		)
	)
	(setq flag nil)
)
))

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Fraid,

 

Merci pour ta réponse super rapide

 

Pour ce qui est de la suppression de calques, c’est justement pour supprimer les bulles de révisions des différents indices que je souhaite le supprimer :blink: .

 

En ce qui concerne Calque 0 courant et déverrouillage c’est nickel :D

Lien vers le commentaire
Partager sur d’autres sites

Bonjour bonuscad,

 

J’ai essayé (avec précaution merci :P ) et ça fonctionne, j’ai bien la suppression mais à la fin j’ai un nil <_< (ça plante le script)

 

Pourrais-tu (si le temps te la permet) me l’adapter dans le genre

 

(defun c :SuppCalq ( /)

… Suppression d’un [u]seul calque[/u] "Nom*" s’il existe

)

 

Pour je puisse l’intégrer dans mon script sous forme

 

(command "SuppCalq" "Nom1*")

(command "SuppCalq" "Nom2*")

 

Etc…

Lien vers le commentaire
Partager sur d’autres sites

Sans vouloir t'offenser, tu ne cherche pas beaucoup.

Mais je vais t'aider quand même :D

 

Pour la fonction de bonuscad il suffit d'utiliser un argument, ici calq.

(defun SuppCalq ( calq / flag lay)
       (setq flag T)
       (while (setq lay (tblnext "LAYER" flag))
               (if (and (zerop (boole 1 16 (cdr (assoc 70 lay)))) (/= (cdr (assoc 2 lay)) "0"))
                       (if  (wcmatch (cdr (assoc 2 lay)) calq)
                               (command "-SUPCALQUE" "N" (cdr (assoc 2 lay)) "" "oui")
                       )
               )
               (setq flag nil)
       )
);fin SuppCalq

 

que tu utilisera dans ton code principal comme ceci

 

(SuppCalq "Nom1*")

 

L'utilisation de la fonction command est réservée théoriquement au commandes natives d'Autocad et doit être utilisé quand on ne sait pas faire autrement.

Une suite de command, sans boucle, ni condition n'est pas de la programmation mais plutôt une Macro.

Je t'encourage à visiter le site de Gile et celui de Didier ainsi que l'aide aux développeurs d'Autocad.

L'apprentissage de l'Autolisp et ses technologies associées demande beaucoup d'effort, mais cela vaut le coup.

Bonne chance

Lien vers le commentaire
Partager sur d’autres sites

Fraid, non tu ne m’offense pas rassure toi, le lisp ça fait déjà quelques années que je n’y touche plus. Ce n’est pas comme le vélo !

Même sur Autocad maintenant je suis un peu pommé, bah oui avant je n’avais pas le bandeau ????

 

En tout cas je te remercie grandement pour ton aide et ta patience

 

Bonne fin de journée

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité