Aller au contenu

Messages recommandés

Posté(e)

Voici un programme qui permet de selectionner seulement les objets présent sur un calque donné.

Tapez "sc" sur la ligne de commmande pour selectionner le calque filtre ou désactiver le filtre de selection.

 


;;selection du calque filtre ou desactivation de la selection par calque
(defun c:sc ()
 ;; flag : variable permettant de savoir si la selection par calque est activé ou non
 (if (equal flag 'nil)
   (setq flag 0)
 ) ;_ Fin de if
 (cond	((zerop (fix flag)) (setq flag 1))
((>= flag 1) (setq flag 0))
 ) ;_ Fin de cond
 (princ (strcat "\nSelection par calque "
	 (if (zerop flag)
	   (princ "desactivé")
	   (princ "activé")
	 ) ;_ Fin de if
 ) ;_ Fin de strcat
 ) ;_ Fin de princ
 (if (not (zerop flag))
   (progn (setq c_layer
	  (vla-get-layer
	    (vlax-ename->vla-object
	      (car (entsel "\nSelectionnez le calque de filtre :")
	      ) ;_ Fin de car
	    ) ;_ Fin de vlax-ename->vla-object
	  ) ;_ Fin de vla-get-layer
   ) ;_ Fin de setq
   (princ (strcat "\nLe calque filtre est " c_layer))
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
) ;_ Fin de defun


;;reaction
(defun choix_reac2 (a b)
 (if (equal setfirst nil)
   (setq setfirst (ssadd))
 ) ;_ Fin de if
 (if (and (not (equal (cadr (ssgetfirst)) nil))
   (not (equal c_layer nil))
     ) ;_ Fin de and
   (progn
     (if (not
    (equal (sslength (cadr (ssgetfirst))) (sslength setfirst))
  ) ;_ Fin de not
(cond
  ((and (cadr (ssgetfirst)) (= flag 1))
   (setq nb_sel	  (sslength (setq sel (cadr (ssgetfirst))))
	 i	  0
	 setfirst nil
	 set_ent  (ssadd)
   ) ;_ Fin de setq
   (repeat nb_sel
     (setq ent (ssname sel i))
     (if (not (equal ent nil))
       (progn
	 (if
	   (equal (vla-get-layer (vlax-ename->vla-object ent)) ;_ Fin de vla-get-layer
		  c_layer
	   ) ;_ Fin de equal
	    (ssadd ent set_ent)
	 ) ;_ Fin de if
       ) ;_ Fin de progn
     ) ;_ Fin de if
     (setq i (1+ i))
   ) ;_ Fin de repeat
   (setq setfirst set_ent)
   (sssetfirst nil set_ent)
   (princ (strcat "\n"
		  (itoa (sslength set_ent))
		  " objet(s) selectioné(s) - "
		  "Calque filtre : "
		  c_layer
	  ) ;_ Fin de strcat
   ) ;_ Fin de princ
   (setq set_ent nil)
  ) ;_ Fin de cond
) ;_ Fin de cond
     ) ;_ Fin de if
   ) ;_ Fin de progn
(setq setfirst nil)
 ) ;_ Fin de if
) ;_ Fin de defun


(vlr-remove reac)


;;reacteur de selection
(setq reac (vlr-miscellaneous-reactor
 nil
 '((:vlr-pickfirstModified . choix_reac2))
) ;_ Fin de vlr-object-reactor
) ;_ Fin de setq

 

Attention, si le dessin comporte beaucoup d'objets (à partir de 5000) le filtrage peut demander quelques seconde.

 

[Edité le 13/4/2005 par Titifonky]

www.le-metal.net, sur la métallerie
Posté(e)

Ouf!

 

J'ai mis du temps à comprendre ce qu'il faisait

En fait il faut choisir la méthode de travail SELECTION-ACTION pour filtrer les objet par calque.

Si on choisit la méthode ACTION-SELECTION pas de possibilité de filter.

 

Donc en résumé avec SC on active la selection filtré sur un calque, puis on fait une sélection par fenêtre ou capture et seul les objets du calaque filtré seront grippés et on fait l'action désiré.

 

L'idée est bonne, mais avec un _Qselect on peut aussi filtrer rapidement,

 

Un collègue m'a demandé la même chose il n'y a pas longtemps, j'ai trouvé que sa demande n'était pas bien fondé non plus car Qselect permettait de le faire aussi mais je lui ais pondu ceci:

(defun c:sel_by_layer ( / ent lay_name typ_ent stat_lay)
(while (null (setq ent (entsel "\nChoix de l'entité: "))))
(setq
	lay_name (cdr (assoc 8 (entget (car ent))))
	typ_ent (cdr (assoc 0 (entget (car ent))))
)
(if (eq typ_ent "INSERT")
	(alert "\nATTENTION l'entité sélectionnée appartient à un Bloc ou XRef, calque d'insertion sélectionné.")
)
(setq stat_lay (tblsearch "LAYER" lay_name))
(if (eq (boole 1 (cdr (assoc 70 stat_lay)) 4) 4)
	(alert (strcat "\nLe calque: " lay_name " est verrouillé!"))
	(progn
		(princ (strcat "\nL'entité sélectionnée appartient au calque: " lay_name))
		(princ "\nChoix des objet par capture, fenêtre, trajet ou individuel.")
		(sssetfirst nil (ssget (list (cons 8 lay_name))))
		(command "_.properties")
	)
)
(prin1)
)

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Je suis comme bonus, il m’a fallut un certain temps avant de comprendre. Juste une remarque, tu fais un vlr-remove-all sur un type de réacteur et tu risques d'en supprimer un qui se sert du même type. Ne serait-il pas plus simple de faire un vlr-remove réacteur ? (par le biais d'un setq lors de la définition du vlr-miscellaneous-reactor)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

En fait ce petit programme me permet de travailler avec des accrochages aux objets sur des objets n'appartenant pas au même calque tout en ne selectionnant que les objets du calque filtre comme si les autres calques serait des XREF. Ca permet également de selectionner un objet quand ils sont superposés.

 

Je n'avais pas pensé à la commande Qselect, le problème avec cette commande c'est qu'elle ne fonctionne pas en transparence, il faut appeller la fonction puis selectionner les objets.

 

Si tu connais une autre solution ca m'interresse.

 

J'ai remarqué que le filtrage ne fonctionne pas pendant la selection au cours d'une commande, le reacteur ne réagit pas. La solution serait peut-être de verrouiller les autres calques pour avoir également un filtrage pendant les commandes ?

 

Ton programme est interressant mais il ne permet pas de filtrer en temps réel les objets manipulés. Le gros défaut de mon programme est sa complexité, j'ai du inclure plusieurs boucle pour que le réacteur ne réagisse pas à la modification du jeu de selection principale (sssetfirst) pendant l'execution du programme. Ca le ralentit quand le nombre d'objets selectionnés devient important.

www.le-metal.net, sur la métallerie

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é