Aller au contenu

Filtrer les blocs dynamiques


(gile)

Messages recommandés

Salut,

 

Je reprends ici un sujet commencé et qui commençait à être long et confus.

 

Il s'agit d'une routine pour palier la carence de la commande SELECTRAP (_QSELECT) avec les blocs dynamiques.

 

La routine permet de faire une sélection de blocs dynamique en filtrant les valeurs d'une ou plusieurs propriétés dynamiques.

 

;;; SSD version 2.6 (gile) 14/07/08 (dernière révision 17/11/2011)
;;; Sélection de blocs dynamiques par des valeurs de paramètres dynamiques
;;;
;;; Utilisations :
;;; - Pour créer un jeu de sélection, entrer SSD, sélectionner un bloc source
;;;   puis choisir les valeurs à filtrer dans la boite de dialogue.
;;; - A l'intérieur d'un commande de modification, à l'invite "Choix des objets: "
;;;   entrer (SSD).
;;; Le filtre peut se faire sur tout le dessin ou à l'intérieur d'une sélection

(defun ssd (/ *error* ToString DynBlkPropValue dz ss ent blk name pop fuzz ret sel res)

 (vl-load-com)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

 (defun *error* (msg)
   (if	(/= msg "Fonction annulée")
     (princ (strcat "Erreur: " msg))
   )
   (and blk (not (redraw (vlax-vla-object->ename blk) 4)))
   (setvar 'dimzin dz)
   (princ)
 )

 (defun ToString (v u)
   (cond
     ((= 0 u) (vl-princ-to-string v))
     ((= 1 u) (angtos v (getvar 'aunits) 16))
     ((if (< (abs v) 1e-6)
 (rtos v 1 6)
 (rtos v (getvar 'lunits) 12)
      )
     )
   )
 )

 ;; DynBlkPropValue
 ;; Boite de dialogue pour choisir des valeurs de paramètres dynamiques
 ;;
 ;; Argument : la liste des paramètres dynamiques

 (defun DynBlkPropValue (lst / tmp file pn unt av dcl_id val)
   (setq tmp  (vl-filename-mktemp "Tmp.dcl")
  file (open tmp "w")
   )
   (write-line
     (strcat
"DynBlkProps:dialog{label=\"Filtre de blocs dynamiques\";"
":text{label=\"Nom du bloc : \""
(vl-prin1-to-string name)
";}spacer;:boxed_column{label=\"Propriétés dynamiques\";"
     )
     file
   )
   (foreach p lst
     (setq pn	(vla-get-PropertyName p)
    unt	(vla-get-UnitsType p)
     )
     (cond
((setq av (vlax-get p 'AllowedValues))
 (setq av  (mapcar '(lambda (x) (ToString x unt)) av)
       pop (cons (vl-list* pn "*" av) pop)
 )
 (write-line
   (strcat
     ":popup_list{label="
     (vl-prin1-to-string pn)
     ";key="
     (vl-prin1-to-string pn)
     ";value="
     (itoa (1+ (vl-position (ToString (vlax-get p 'Value) unt) av)))
     ";edit_width=25;allow_accept=true;}"
   )
   file
 )
)
((/= pn "Origin")
 (setq fuzz (cons pn fuzz))
 (write-line
   (strcat
     ":row{:edit_box{label="
     (vl-prin1-to-string pn)
     ";key="
     (vl-prin1-to-string pn)
     ";value="
     (vl-prin1-to-string (ToString (vlax-get p 'Value) unt))
     ";edit_width=18;allow_accept=true;}"
     ":edit_box{label=\"Tolérance\";key="
     (vl-prin1-to-string (strcat pn "_fuzz"))
     ";value=\"1e-12\";edit_width=6;allow_accept=true;}}"
   )
   file
 )
)
     )
   )
   (write-line
     (strcat
"}spacer;:radio_row{key=\"selset\";"
":radio_button{label=\"Tout le dessin\";key=\"all\";value=\"1\";}"
":radio_button{label=\"Sélection\";key=\"sel\";}}"
"spacer;ok_cancel;}"
     )
     file
   )
   (close file)
   (setq dcl_id (load_dialog tmp))
   (if	(not (new_dialog "DynBlkProps" dcl_id))
     (exit)
   )
   (foreach p pop
     (start_list (car p))
     (mapcar 'add_list (cdr p))
     (end_list)
   )
   (action_tile
     "accept"
     "(foreach p (mapcar 'vla-get-PropertyName lst)
     (if (assoc p pop)
     (setq val (nth (atoi (get_tile p)) (cdr (assoc p pop))))
     (setq val (get_tile p)))
     (if (and val (/= val \"\") (/= val \"*\"))
     (setq ret (cons (cons p val) ret))))
     (setq fuzz (mapcar (function (lambda (x)
     (cons x (get_tile (strcat x \"_fuzz\"))))) fuzz))
     (and (not ret) (setq ret T))
     (setq sel (get_tile \"selset\"))
     (done_dialog)"
   )
   (action_tile "cancel" "(setq ret nil)")
   (start_dialog)
   (unload_dialog dcl_id)
   (vl-file-delete tmp)
   ret
 )

 ;;----------------------------------------------------;;

 (setq dz (getvar 'dimzin))
 (setvar 'dimzin 8)
 (and
   (or
     (and
(setq ss (cadr (ssgetfirst)))
(= 1 (sslength ss))
(setq ent (ssname ss 0))
(sssetfirst nil nil)
     )
     (and
(sssetfirst nil nil)
(setq ent (car (entsel)))
     )
   )
   (setq blk (vlax-ename->vla-object ent))
   (= (vla-get-ObjectName blk) "AcDbBlockReference")
   (= (vla-get-IsDynamicBlock blk) :vlax-true)
   (not (redraw ent 3))
   (setq name (vla-get-EffectiveName blk))
   (or
     (DynBlkPropValue (vlax-invoke blk 'getDynamicBlockProperties))
     (redraw ent 4)
   )
   (not (redraw ent 4))
   (if	(= sel "all")
     (ssget "_X"
     (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")))
     )
     (ssget (list '(0 . "INSERT") (cons 2 (strcat name ",`*U*")))
     )
   )
   (setq res (ssadd))
   (vlax-for b	(setq ss (vla-get-ActiveSelectionSet *acdoc*))
     (if
(and
  (= (vla-get-EffectiveName B) name)
  (or
    (= ret T)
    ((lambda (lst)
       (apply
	 '=
	 (cons
	   T
	   (mapcar
	     (function
	       (lambda (p / n v l u f)
		 (setq n (car p)
		       l (assoc n lst)
		       u (vla-get-UnitsType (caddr l))
		 )
		 (equal	(cond
			  ((= 0 u) (cdr p))
			  ((= 1 u) (angtof (cdr p)))
			  (T (distof (cdr p)))
			)
			(if (= u 0)
			  (vl-princ-to-string (cadr l))
			  (cadr l)
			)
			(if (and (setq f (cdr (assoc n fuzz)))
				 (numberp (read f))
			    )
			  (atof f)
			  1e-12
			)
		 )
	       )
	     )
	     ret
	   )
	 )
       )
     )
      (mapcar
	(function
	  (lambda (p / n v)
	    (list
	      (setq n (vla-get-PropertyName p))
	      (vlax-get p 'Value)
	      p
	    )
	  )
	)
	(vlax-invoke b 'getDynamicBlockProperties)
      )
    )
  )
)
 (ssadd (vlax-vla-object->ename B) res)
     )
   )
   (vla-delete ss)
 )
 (setvar 'dimzin dz)
 res
)

(defun c:ssd ()
 (sssetfirst nil (ssd))
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut!

 

Ben voila c'est super Gile!!3

 

Bravo!!

 

Très bonne routine!!

Avec bd ou tout le monde comprend!

 

Quand rejoins tu Autodesk!! :cool:

"Je suis fasciné par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre... Et les avions aussi... En même temps l'air tu peux pas le toucher... Ca existe et ça existe pas... Ca nourrit l'homme sans qu'il ait faim... It's magic ! L'air c'est beau en même temps tu peux pas le voir, c'est doux et tu peux pas le toucher... L'air, c'est un peu comme mon cerveau..."

J-C Van Damme

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

hello gile

 

la commande "ssd" est tres pratique

 

mais maintenant j'ai crée des blocs paramétrique avec des attributs et des champs

 

est ce qu'il serait possible de rajouter a "SDD" la recherche avec des champs et des attributs

 

on peut tres bien avoir des parametres dynamiques similaires et des champs ou attibuts differents

 

merci

 

a+

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne pense pas rajouter de fonctionnalités à SSD (dernière version dans Special_Selections ici).

La boite de dialogue peut déjà être conséquente avec des blocs dynamiques complexes, je n'ai pas envie d'en faire une 'usine à gaz'.

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é