Aller au contenu

Messages recommandés

Posté(e)

Bonjour

j'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

Posté(e)

Re

J'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 attribut

pour que je puisse les séparer ensuite ceux avec attribut séparer ceux qui manque une valeur à la question Alt...

 

@+

 

Michel a

 

Posté(e)

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

Posté(e)

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]

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é