Aller au contenu

GRIPPER TEXTES SELECTION


Messages recommandés

Posté(e)

Bonjour à toutes et tous,

 

Suite à cette demande concernant le lisp "RECH V1.10" de Patrick_35 existe t-il un lisp qui permettent de décompter les textes sélectionnées ? Il faudrait pouvoir cumuler la fonction de recherche de texte ainsi que le nombre.

 

Il serait intéressant également de pouvoir les sélectionner ("gripper"), est-ce possible ?

 

Merci d'avance

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Salut,

 

J'ai essayé quelque chose qui ne fait que compter et sélectionner dans l'espace courant les textes correspondants aux critères spécifiés dans la boite de dialogue.

Dans le cas d'attributs ou de textes dans des tableaux, c'est le bloc ou le tableau qui est 'grippé'.

 

http://img.ahst.fr/data/images/seltxt.png

 

;; SELTXT (gile)
;; Sélectionne dans l'espace courant les textes suivant les critères spécifiés

(defun c:SELTXT	(/ TextCountBox SelectText TextMatch massoc lst ss)
 (vl-load-com)

 (defun TextCountBox (/ tmp file dcl_id typ opt pat stat)
   (setq tmp  (vl-filename-mktemp "tmp.dcl")
  file (open tmp "w")
   )
   (write-line
     "TextCountBox:dialog{label=\"Sélection de textes\";initial_focus=\"pat\";
     :edit_box{label=\"Rechercher\";key=\"pat\";allow_accept=true;}
     :row{
       :boxed_column{label=\"Type de texte\";
         :toggle{label=\"Textes\";key=\"txt\";}
         :toggle{label=\"Attributs\";key=\"att\";}
         :toggle{label=\"Tableaux\";key=\"tbl\";}
       }
       :boxed_column{label=\"Options de sélection\";
         :toggle{label=\"Respecter la casse\";key=\"case\";}
         :toggle{label=\"Utiliser les caractères génériques\";key=\"regex\";}
         :toggle{label=\"Chercher dans les blocs\";key=\"blks\";}
       }
     }
     spacer;
     ok_cancel;
   }"
     file
   )
   (close file)
   (setq dcl_id (load_dialog tmp))
   (if	(not (new_dialog "TextCountBox" dcl_id))
     (exit)
   )
   (setq typ
   (cond
     ((vlax-ldata-get "gile_TextCount" "type"))
     ((vlax-ldata-put "gile_TextCount" "type" 1))
   )
   )
   (setq opt
   (cond
     ((vlax-ldata-get "gile_TextCount" "option"))
     ((vlax-ldata-put "gile_TextCount" "option" 2))
   )
   )
   (mapcar
     (function
(lambda	(k v)
  (set_tile k
	    (if	(= (Boole 1 typ v) v)
	      "1"
	      "0"
	    )
  )
)
     )
     '("txt" "att" "tbl")
     '(1 2 4)
   )
   (mapcar
     (function
(lambda	(k v)
  (set_tile k
	    (if	(= (Boole 1 opt v) v)
	      "1"
	      "0"
	    )
  )
)
     )
     '("case" "regex" "blks")
     '(1 2 4)
   )
   (action_tile
     "accept"
     "(setq pat (get_tile \"pat\"))
     (mapcar
(function
  (lambda (k v)
    (if	(= \"1\" (get_tile k))
      (setq typ (Boole 7 typ v))
      (setq typ (Boole 2 typ v))
    )
  )
)
'(\"txt\" \"att\" \"tbl\")
'(1 2 4)
     )
     (mapcar
(function
  (lambda (k v)
    (if	(= \"1\" (get_tile k))
      (setq opt (Boole 7 opt v))
      (setq opt (Boole 2 opt v))
    )
  )
)
'(\"case\" \"regex\" \"blks\")
'(1 2 4)
     )
     (vlax-ldata-put \"gile_TextCount\" \"type\" typ)
     (vlax-ldata-put \"gile_TextCount\" \"option\" opt)
     (done_dialog 1)"
   )
   (setq stat (start_dialog))
   (unload_dialog dcl_id)
   (vl-file-delete tmp)
   (if	(= 1 stat)
     (list pat typ opt)
   )
 )

 (defun SelectText (lst / cnt ss filter n sel ent elst att valid blk)
   (setq cnt 0
  ss (ssadd)
  filter ""
   )
   (mapcar
     (function
(lambda	(v s)
  (if (= v (Boole 1 (cadr lst) v))
    (setq filter (strcat filter s))
  )
)
     )
     '(1 2 4)
     '("TEXT,MTEXT," "INSERT," "ACAD_TABLE,")
   )
   (if
     (setq n	-1
    sel	(ssget "_X" (list (cons 0 filter) (cons 410 (getvar 'ctab))))
     )
      (while (setq ent (ssname sel (setq n (1+ n))))
 (setq elst (entget ent))
 (cond
   ((= "INSERT" (cdr (assoc 0 elst)))
    (setq att	(entnext ent)
	  valid	nil
    )
    (while (and att (= "ATTRIB" (cdr (assoc 0 (setq elst (entget att))))))
      (if (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
	(setq valid T
	      cnt   (1+ cnt)
	)
      )
      (setq att (entnext att))
    )
    (and valid (ssadd ent ss))
   )
   ((= "ACAD_TABLE" (cdr (assoc 0 elst)))
    (setq valid nil)
    (foreach s (massoc 1 elst)
      (if (TextMatch s (car lst) (caddr lst))
	(setq valid T
	      cnt   (1+ cnt)
	)
      )
    )
    (and valid (ssadd ent ss))
   )
   (T
    (and (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
	 (setq cnt (1+ cnt))
	 (ssadd ent ss)
    )
   )
 )
      )
   )
   (if	(= 4 (Boole 1 (caddr lst) 4))
     (while (setq blk (tblnext "BLOCK" (not blk)))
(setq valid 0
      ent   (cdr (assoc -2 blk))
)
(while ent
  (setq	elst (entget ent)
	ent  (entnext ent)
  )
  (if
    (and
      (member (cdr (assoc 0 elst)) '("TEXT" "MTEXT"))
      (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
    )
     (setq valid (1+ valid))
  )
)
(if
  (and (	       (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar 'ctab)) (assoc 2 blk))))
  )
   (repeat (setq n (sslength sel))
     (ssadd (ssname sel (setq n (1- n))) ss)
     (setq cnt (+ valid cnt))
   )
)
     )
   )
   (list ss cnt)
 )

 (defun TextMatch (str pat flag)
   (apply (if (= 2 (Boole 1 flag 2))
     'wcmatch
     '=
   )
   (if (= 1 (Boole 1 flag 1))
     (list str pat)
     (mapcar 'strcase (list str pat))
   )
   )
 )

 (defun massoc	(code alst / pair)
   (if	(setq alst (member (assoc code alst) alst))
     (cons (cdar alst) (massoc code (cdr alst)))
   )
 )

 (if
   (and
     (setq lst (TextCountBox))
     (setq ss (SelectText lst))
   )
    (progn
      (princ (strcat "\n" (itoa (cadr ss)) " texte(s) trouvé(s)"))
      (sssetfirst nil (car ss))
    )
 )
 (princ)
)

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

Posté(e)

Re,

 

Que dire ?

 

Tu est tout simplement génial (gile), :exclam:

 

En plus, je viens de me rendre compte que certains voiles (murs) sont repérés avec des blocs "attributs", donc

"SELTXT" est également efficace dans ce cas ! :D

 

Un grand merci car cet outil est lui aussi formidable,.. :P

 

Question subsidiaire => Il serait intéressant par la suite de pouvoir garder le texte "grippé" au lancement d'une autre fonction "par exemple "TotalPerim" en ce qui me concerne afin de pouvoir métré à suivre le linéaire correspondant aux textes sélectionnés (ceux-ci correspondant au repérage d'un Voile). Est-ce possible d'enchainer ces deux lisps ?

 

En image =>

 

Depuis "SELTXT" => "Grippage" des textes correspondant aux Voiles V1 (donc, ayant les même caractéristiques en terme de ferraillage)

 

http://img.ahst.fr/data/images/grip1.jpg

 

Enchainement de TotalPerim afin de pouvoir métré le linéaire correspondant aux Voiles numérotés V1 (en cyan sur l'image ci-dessous)=>

 

http://img.ahst.fr/data/images/grip2.jpg

 

 

A moins qu'une autre idée soit possible,...?!!

 

C'est bête ce truc, je me rend compte que je ne suis pas capable de métré "simplement" un linéaire correspondant à un repérage,

 

De toute façon, déjà un énorme merci car on peut toujours faire ça en plusieurs étapes =>

 

"SELTXT" filtre puis, grace au grip, changement de calques.

Ensuite isolement des calques "Voile" et repérage de voiles depuis le filtrage précédent). Mais je pense que cela risque d'être fastidieux,...Voici un aperçu (bâtiment à métré entièrement en ferraillage de 150m x 100m sur 5 niveaux,...)

 

http://img.ahst.fr/data/images/grip3.jpg

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Salut,

 

Je ne comprends pas la demande : SELTEXT sélectionne des textes et/ou des blocs/ et/ou des tabeaux et TotalPerim demande une sélection d'entités curvilignes...

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

Posté(e)

Re,

 

Je ne comprends pas la demande :

 

Une fois que j'ai localisé mes différents Voiles (V1, par exemple) avec SELTEXT sur mon plan, je dois ensuite calculer la longueur totale des Voiles repérés V1 avec TotalPerim. Hors, si je lance TotalPerim après le "grippage" des repères V1, ceux-si se "dégrippent" et je ne sais plus ou sont mes Voiles V1 sélectionnés auparavant,...

 

Mais, j'arrive à me débrouiller via plusieurs manips =>

 

"SELTXT" filtre puis, grace au grip, changement de calques.

Ensuite isolement des calques "Voile" et repérage de voiles depuis le filtrage précédent)

 

(Sur l'exemple ci-dessous, j'ai "grippé" moi-même ces 4 entités)

 

http://img.ahst.fr/data/images/grip4.jpg

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Re,

 

Pour certains textes, j'ai besoin de filtrer par zone en sélectionnant un contour fermé type polyligne, est-ce "facile" de rajouter cette option dans "SELTXT" ?

 

Pour le moment, MAJ + fenêtre de capture pour désélectionner fonctionne bien, sauf qu'il faut vraiment zoomer par endroit et je refais 2 fois (voire plus) la manip pour m'assurer que je n'ai rien oublié,...

 

Merci d'avance,

 

http://img.ahst.fr/data/images/grip5.jpg

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Salut,

 

Une nouvelle version.

Après la fermeture de la boite, tu fais une sélection classique ou tu fais Entrée, Espace ou clic droit pour tout l'espace courant.

 

;; SELTXT (gile)
;; Sélectionne dans l'espace courant les textes suivant les critères spécifiés

(defun c:SELTXT	(/ TextCountBox SelectText TextMatch massoc lst ss)
 (vl-load-com)

 (defun TextCountBox (/ tmp file dcl_id typ opt pat stat)
   (setq tmp  (vl-filename-mktemp "tmp.dcl")
  file (open tmp "w")
   )
   (write-line
     "TextCountBox:dialog{label=\"Sélection de textes\";initial_focus=\"pat\";
     :edit_box{label=\"Rechercher\";key=\"pat\";allow_accept=true;}
     :row{
       :boxed_column{label=\"Type de texte\";
         :toggle{label=\"Textes\";key=\"txt\";}
         :toggle{label=\"Attributs\";key=\"att\";}
         :toggle{label=\"Tableaux\";key=\"tbl\";}
       }
       :boxed_column{label=\"Options de sélection\";
         :toggle{label=\"Respecter la casse\";key=\"case\";}
         :toggle{label=\"Utiliser les caractères génériques\";key=\"regex\";}
         :toggle{label=\"Chercher dans les blocs\";key=\"blks\";}
       }
     }
     spacer;
     ok_cancel;
   }"
     file
   )
   (close file)
   (setq dcl_id (load_dialog tmp))
   (if	(not (new_dialog "TextCountBox" dcl_id))
     (exit)
   )
   (setq typ
   (cond
     ((vlax-ldata-get "gile_TextCount" "type"))
     ((vlax-ldata-put "gile_TextCount" "type" 1))
   )
   )
   (setq opt
   (cond
     ((vlax-ldata-get "gile_TextCount" "option"))
     ((vlax-ldata-put "gile_TextCount" "option" 2))
   )
   )
   (mapcar
     (function
(lambda	(k v)
  (set_tile k
	    (if	(= (Boole 1 typ v) v)
	      "1"
	      "0"
	    )
  )
)
     )
     '("txt" "att" "tbl")
     '(1 2 4)
   )
   (mapcar
     (function
(lambda	(k v)
  (set_tile k
	    (if	(= (Boole 1 opt v) v)
	      "1"
	      "0"
	    )
  )
)
     )
     '("case" "regex" "blks")
     '(1 2 4)
   )
   (action_tile
     "accept"
     "(setq pat (get_tile \"pat\"))
     (mapcar
(function
  (lambda (k v)
    (if	(= \"1\" (get_tile k))
      (setq typ (Boole 7 typ v))
      (setq typ (Boole 2 typ v))
    )
  )
)
'(\"txt\" \"att\" \"tbl\")
'(1 2 4)
     )
     (mapcar
(function
  (lambda (k v)
    (if	(= \"1\" (get_tile k))
      (setq opt (Boole 7 opt v))
      (setq opt (Boole 2 opt v))
    )
  )
)
'(\"case\" \"regex\" \"blks\")
'(1 2 4)
     )
     (vlax-ldata-put \"gile_TextCount\" \"type\" typ)
     (vlax-ldata-put \"gile_TextCount\" \"option\" opt)
     (done_dialog 1)"
   )
   (setq stat (start_dialog))
   (unload_dialog dcl_id)
   (vl-file-delete tmp)
   (if	(= 1 stat)
     (list pat typ opt)
   )
 )

 (defun SelectText (lst / cnt ss filter n sel ent elst att valid blk)
   (setq cnt 0
  ss (ssadd)
  filter ""
  n -1
   )
   (mapcar
     (function
(lambda	(v s)
  (if (= v (Boole 1 (cadr lst) v))
    (setq filter (strcat filter s))
  )
)
     )
     '(1 2 4)
     '("TEXT,MTEXT," "INSERT," "ACAD_TABLE,")
   )
   (princ "\Sélectionnez les objets ou valider pour tous.")
   (if
     (or
(setq sel (ssget (list (cons 0 filter))))
(setq sel (ssget "_X" (list (cons 0 filter) (cons 410 (getvar 'ctab)))))
     )
      (while (setq ent (ssname sel (setq n (1+ n))))
 (setq elst (entget ent))
 (cond
   ((= "INSERT" (cdr (assoc 0 elst)))
    (setq att	(entnext ent)
	  valid	nil
    )
    (while (and att (= "ATTRIB" (cdr (assoc 0 (setq elst (entget att))))))
      (if (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
	(setq valid T
	      cnt   (1+ cnt)
	)
      )
      (setq att (entnext att))
    )
    (and valid (ssadd ent ss))
   )
   ((= "ACAD_TABLE" (cdr (assoc 0 elst)))
    (setq valid nil)
    (foreach s (massoc 1 elst)
      (if (TextMatch s (car lst) (caddr lst))
	(setq valid T
	      cnt   (1+ cnt)
	)
      )
    )
    (and valid (ssadd ent ss))
   )
   (T
    (and (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
	 (setq cnt (1+ cnt))
	 (ssadd ent ss)
    )
   )
 )
      )
   )
   (if	(= 4 (Boole 1 (caddr lst) 4))
     (while (setq blk (tblnext "BLOCK" (not blk)))
(setq valid 0
      ent   (cdr (assoc -2 blk))
)
(while ent
  (setq	elst (entget ent)
	ent  (entnext ent)
  )
  (if
    (and
      (member (cdr (assoc 0 elst)) '("TEXT" "MTEXT"))
      (TextMatch (cdr (assoc 1 elst)) (car lst) (caddr lst))
    )
     (setq valid (1+ valid))
  )
)
(if
  (and (	       (setq sel (ssget "_X" (list '(0 . "INSERT") (cons 410 (getvar 'ctab)) (assoc 2 blk))))
  )
   (repeat (setq n (sslength sel))
     (ssadd (ssname sel (setq n (1- n))) ss)
     (setq cnt (+ valid cnt))
   )
)
     )
   )
   (list ss cnt)
 )

 (defun TextMatch (str pat flag)
   (apply (if (= 2 (Boole 1 flag 2))
     'wcmatch
     '=
   )
   (if (= 1 (Boole 1 flag 1))
     (list str pat)
     (mapcar 'strcase (list str pat))
   )
   )
 )

 (defun massoc	(code alst / pair)
   (if	(setq alst (member (assoc code alst) alst))
     (cons (cdar alst) (massoc code (cdr alst)))
   )
 )

 (if
   (and
     (setq lst (TextCountBox))
     (setq ss (SelectText lst))
   )
    (progn
      (princ (strcat "\n" (itoa (cadr ss)) " texte(s) trouvé(s)"))
      (sssetfirst nil (car ss))
    )
 )
 (princ)
)

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

Posté(e)

 

Hello

 

TOP Nickel Chrome le Gilles comme d'habitude ! :D

 

Et je me vote un microscopique & minuscule "Merci" pour avoir suggere un petite amelioration sur le bon vieux et neanmoins efficace RECH ! :P

 

Merci aussi a Lili pour ces exemples particulierement demonstratifs ! :)

 

Encore Merci, Le Decapode

 

 

 

 

Autodesk Expert Elite Team

Posté(e)

Salut,

 

Merci à vous.

 

j'ai remarqué que le "*" fonctionne aussi dans "SELTXT"

C'est parce que la case "Utiliser les caractère génériques" est cochée.

On peut utiliser tous les caractères génériques définis dans l'Aide > Manuel d'utilisation > Hachures, notes, tableaux et cotes > Notes et étiquettes > Modification du texte > Modification du texte multiligne

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

Posté(e)

Re,

 

Vu,

 

l'Aide > Manuel d'utilisation > Hachures, notes, tableaux et cotes > Notes et étiquettes > Modification du texte > Modification du texte multiligne

 

(J'étais en train de faire une recherche justement sur ces caractères mais j'étais loin de me douter que cette info se cachait là !!! :o

 

Merci à vous.

 

Merci à toi plutôt,...

 

(Je dépanne un ami, gérant d'un BE Structure, qui est plus que super charrette, et là, on peut oublier la vieille méthode "papier" avec les risques que l'on connait,...(Je parle des oublis en tout genre,... )

 

Et je me vote un microscopique & minuscule "Merci" pour avoir suggere un petite amelioration sur le bon vieux et neanmoins efficace RECH !

 

Absolument d'accord, car au départ ma demande n'était pas tout à fait aussi "affiné", donc merci également à toi, :P )

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

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é