Aller au contenu

Question sur selection de blocs en lisp


balyoa

Messages recommandés

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)
)  

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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+

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é