Aller au contenu

Question sur selection de blocs en lisp


Messages recommandés

Posté(e)

Bonjour,

 

J'ai le lisp ci-dessous qui écrit dans un fichier "c:\pts.txt" les XYZ des blocks anonymes de la forme "*U" ayant un un texte d'altitude.

Comment modifier ce lisp pour que la sélection soit aussi effective à l'écran avec les grips ?

 

Merci d'avance.

 

Cordialement.

 

Yoann

 

(defun C:toto ()
 (setq JEU (ssget "x" (list (cons 0 "INSERT"))))
 (setq I 0  NbJeu (sslength JEU))
 (setq f (open "c:\\pts.txt" "w"))
 (repeat NbJeu
   (setq Elt (ssname JEU I))
   (setq I (1+ I))
   (setq EltLst (entget Elt))
   (setq EltBlcName (cdr (assoc 2 EltLst)))
   (if (= "*U" (substr EltBlcName 1 2))
     (progn
     (setq EntTxt (entnext (cdr (assoc -2 (tblsearch "BLOCK" EltBlcName)))))
     (if EntTxt
(progn
(if (= (cdr (assoc 0 (entget EntTxt))) "TEXT")
  (progn
         (setq TXT (cdr (assoc 1 (entget EntTxt))))
         (setq PT (cdr (assoc 10 EltLst)))
         (write-line (strcat (rtos (car PT) 2 4) "," (rtos (cadr PT) 2 4) "," TXT) f)
  )
)
)
     ) 
     )
   )
 )
 (close f)
)  

Posté(e)

Salut,

 

Comment modifier ce lisp pour que la sélection soit aussi effective à l'écran avec les grips ?

Je ne comprends pas la question.

Si PICKFIRST est à 1, les blocs 'gripés' avant le lancement de la commande seront automatiquement sélectionnés.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

et bien non, même si je mets pickfirst à 1 il ne me sélectionne rien à l'écran.

Car je lance le traitement sur tout le dessin et pas que sur les blocks anonymes.

Moi je souhaite qu'après la commande il me sélectionne à l'écran tous les blocks qu'il a écrit dans le fichier pts.txt (cad les blocks anonymes du type"*Uxxxx" et contenant un texte de type altitude dans le block).

 

Merci de ton aide.

 

A+

Posté(e)

Re,

 

Je n'avais effectivement pas compris, PICKFIRST c'est si on sélectionne avant de lancer la commande. Et tout, tu voudrais 'griper' les blocs valides après l'exécution de la commande, c'est ça ?

 

Voilà un LISP un peu mieux écrit, avec quelques commentaires qui fait ce que décris ci-dessus.

 

(defun c:tot (/ ss n file ent blkLst name txt txtLst pt)
 ;; Sélection de tous les blocs dont le nom commence par : *U
 (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "`*U*"))))
   (progn
     (setq n	 -1
    file (open "c:\\pts.txt" "w")
     )
     ;; pour chaque objet sélectionné,
     (while (setq ent (ssname ss (setq n (1+ n))))
(setq blkLst (entget ent)
      name   (cdr (assoc 2 (entget ent)))
)
;; si la seconde entité dans la définition est un texte,
(if
  (and
    (setq
      txt (entnext (cdr (assoc -2 (tblsearch "BLOCK" name))))
    )
    (setq txtLst (entget txt))
    (= "TEXT" (cdr (assoc 0 txtLst)))
  )
  ;; on écrit une ligne dans le fichier,
   (progn
     (setq pt (cdr (assoc 10 blkLst)))
     (write-line
       (strcat
	 (rtos (car pt) 2 4)
	 ","
	 (rtos (cadr pt) 2 4)
	 ","
	 (cdr (assoc 1 txtLst))
       )
       file
     )
   )
  ;; sinon, on supprime le bloc du jeu de sélection
   (ssdel ent ss)
)
     )
     (close file)
     ;; on 'girpe' tous les blocs 'valides'
     (sssetfirst nil ss)
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut,

 

merci Gile mais j'ai une erreur quand je lance le lisp :

 

; erreur: type d'argument incorrect: consp "INSERT"

 

Une idée sur la cause ?

 

A+

 

Yoann

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é