speedy Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 Bonjourj'ai reçu un plan topo avec des blocs en vrac et j'aimerais en faire qu'un..... j'ai utilisé toute sorte de filtres mais je bloque à certains endroit....j'ai utilisé remplace des expresstools mais quand je synchronise je perd les valeurs des attributs ? ;sélectionner tous les blocs sans préciser le nom(sssetfirst nil (ssget "x" '((0 . "INSERT")))); sélectionner tous les blocs dont le nom commençant par t(sssetfirst nil (ssget "_X" '((0 . "INSERT") (2 . "`t*"))));filtrer les blocs sans attributs?; filtrer les blocs avec attribut?;renommer etiquette altitude par alt; numero par mat (en gardant les valeurs des attributs)?; filtrer les blocs avec attribut dont la valeur de l'etiquette alt est vide ? merci de votre aide Michel a
vinz34 Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 Salut, regarde ce sujet, tu devrais y trouver ton bonheur.
speedy Posté(e) le 5 février 2008 Auteur Posté(e) le 5 février 2008 ReJ'ai déjà vue cette discussion j'ai déjà du mal avec du lisp alors en Vlisp.....j'avais essayé de suivre mais je bloque encore.. comment modifier ton code vinz34 qu'il me filtre tous les blocs avec attribut ou sans attributpour que je puisse les séparer ensuite ceux avec attribut séparer ceux qui manque une valeur à la question Alt... @+ Michel a
pascal19 Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 Il y a une solution à la fin de la discution évoquée par vinz34 (ma derniere réponse)mais on doit pouvoir trouver mieux...
(gile) Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 Salut, Pour filter les blocs sans attributs : (ssget "_X" '((0 . "INSERT") (66 . 0))) Pour filter les blocs sans attributs : (ssget "_X" '((0 . "INSERT") (66 . 1))) Pour renommer des étiquettes, c'est plus complexe. Il faut modifier les définitions d'attribut, mais si tu veux conserver les valeurs des attributs, il faut d'abord les stocker puis les réattribuer après avoir changé les étiquettes. Un exemple pour changer les étiquettes "ALTITUDE" et "NUMERO" en, respectivement, "ALT" et "MAT" sur tous les blocs dont le nom commence par "t". (defun renommer_etiquette (/ ss n ent elst sub lst def) ;; récupérer les valeurs d'attribut dans une liste de listes d'association (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "t*") (66 . 1)))) (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n))) att (entnext ent) sub nil ) (while (= (cdr (assoc 0 (setq elst (entget att)))) "ATTRIB") (if (= (cdr (assoc 2 elst)) "ALTITUDE") (setq sub (cons (cons "ALT" (cdr (assoc 1 elst))) sub)) ) (if (= (cdr (assoc 2 elst)) "NUMERO") (setq sub (cons (cons "MAT" (cdr (assoc 1 elst))) sub)) ) (setq att (entnext att)) ) (setq lst (cons (cons (cons -1 ent) sub) lst)) ) ) ;; Renommer les étiquettes dans les définitions des blocs dont les noms commencent par t (while (setq def (tblnext "BLOCK" (not def))) (if (wcmatch (cdr (assoc 2 def)) "t*") (progn (setq ent (cdr (assoc -2 def))) (while ent (if (= (cdr (assoc 0 (setq elst (entget ent)))) "ATTDEF") (cond ((= (cdr (assoc 2 elst)) "ALTITUDE") (entmod (subst (cons 2 "ALT") (assoc 2 elst) elst)) ) ((= (cdr (assoc 2 elst)) "NUMERO") (entmod (subst (cons 2 "MAT") (assoc 2 elst) elst)) ) ) ) (setq ent (entnext ent)) ) (command "_.attsync" "_n" (cdr (assoc 2 def))) ) ) ) ;; Réattribuer leurs valeurs aux références (mapcar '(lambda (x / k) (setq att (entnext (cdar x))) (while (= (cdr (assoc 0 (setq elst (entget att)))) "ATTRIB") (setq k (cdr (assoc 2 elst))) (if (assoc k x) (entmod (subst (cons 1 (cdr (assoc k x))) (assoc 1 elst) elst) ) ) (setq att (entnext att)) ) (entupd (cdar x)) ) lst ) ) Pour sélectionner les blocs dont la valeur d'un attribut est vide, regarde ce LISP Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
speedy Posté(e) le 5 février 2008 Auteur Posté(e) le 5 février 2008 Bonjour Merci Gile, c'est éxactement ça..... je vais essayer le reste.. @+ Michel a
vinz34 Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 speedy, Pour savoir si tu as un attribut dans un bloc, il te faut savoir si le bloc a le drapeau 'entité suivent'.Tu peux commencer comme ça : (setq ss (ssget "_X" '((66 . 1)))) Tu te retrouves maintenant avec un jeu de sélection de blocs, il faut donc traiter les blocs un par un pour tester sur chaque entité si cette dernière est un attribut (0 . "ATTRIB"). (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n))) e (entnext ent)) (while e (cond ((= (cdr (assoc 0 (setq elist (entget e)))) "ATTRIB") (progn (ssadd ent ssatt)(setq e nil))) ((= (cdr (assoc 0 (setq elist (entget e)))) "SEQEND") (setq e nil))))) (sssetfirst nil ssatt) On peut l'écrire plus proprement mais ça fonctionne Edit : Trop tard ! ;) [Edité le 5/2/2008 par vinz34]
speedy Posté(e) le 5 février 2008 Auteur Posté(e) le 5 février 2008 Merci de votre aide j'ai une erreur au démarrage du code "renommer_etiquette" ????? ..... Michel a
(gile) Posté(e) le 5 février 2008 Posté(e) le 5 février 2008 Quel type d'erreur ?Je viens de refaire un test, ça marche bien chez moi. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
speedy Posté(e) le 6 février 2008 Auteur Posté(e) le 6 février 2008 Bonjour à tous voici l'erreur....http://images3.hiboox.com/images/0608/3rtartbl.jpg j'ai tcpoint avec alt et mat, et tcpoint2 avec altitude et numero, (en réalité j'ai 4 types de blocs, je les ai renommer pour qu'ils commencent par t). @+ Michel a
speedy Posté(e) le 6 février 2008 Auteur Posté(e) le 6 février 2008 Re j'ai trouvé, aprés avoir rajouter "c:" ça a fonctionné....(defun c:renommer_etiquette (/ ss n ent elst sub lst def) et merci Gile c'est parfait.... @+ Michel a
vinz34 Posté(e) le 6 février 2008 Posté(e) le 6 février 2008 Salut speedy, Sinon tu pouvais l'écrire entre parenthèses dans la ligne de commande (renommer_etiquette)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant