balyoa Posté(e) le 25 août 2010 Posté(e) le 25 août 2010 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) )
(gile) Posté(e) le 25 août 2010 Posté(e) le 25 août 2010 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
balyoa Posté(e) le 25 août 2010 Auteur Posté(e) le 25 août 2010 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+
(gile) Posté(e) le 25 août 2010 Posté(e) le 25 août 2010 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
balyoa Posté(e) le 26 août 2010 Auteur Posté(e) le 26 août 2010 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
(gile) Posté(e) le 27 août 2010 Posté(e) le 27 août 2010 salut, Il y avait une faute de frappe dans le code, je l'ai corrigée. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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