Aller au contenu

Aperçu de la sélection par type d'entité


Matt666

Messages recommandés

Bonjour à tous,

 

Petite question à priori assez simple, je ne vois pas comment faire :

Sur Autocad, lorsqu'on demande à l'utilisateur de sélectionner une ou plusieurs entités, on peut afficher l'entité sous la souris en surbrillance ou en pointillés.

J'aimerais contrôler cette surbrillance pour n'afficher que les entités d'un type particulier (bloc ou ligne par exemple) en pointillés.

Avez-vous une solution, idéalement compatible entsel et ssget ?

Merci à vous.

 

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

Salut Matt666

 

Regarde du coté de REDRAW.

Je l'ai utilisé dans un de mes lisp où je sélectionne des fenêtres (FMULT)

 

;;-------------------------------------------------------------------------------------------;;
;;-------------------------------------- Par Vincent P. -------------------------------------;;
;; Créé un champ automatique affichant l'échelle d'une fenêtre dans un cartouche ou un texte ;;
;;-------------------------------------------------------------------------------------------;;
(vl-load-com)
(defun c:EchCart (/ fen cart id ech ctab)
 (setq ctab (getvar "Ctab")) 							; trouve le nom de la présentation courante
 (setq fen (ssget "_A" (list (cons 0 "VIEWPORT") (cons 410 ctab)))) 		; selectionne toutes les fenêtres de la présentation courante
 (if (= (sslength fen) 2) 							; si la selectione n'a qu'une fenêtre
   (progn 									; oui
     (redraw (ssname fen 0) 3) 						; surbrillance de la fenettre
     (princ "\nFenêtre auto-selectionnée")
     )
   (progn									; non
     (princ "\nSelectionner une Fenêtre")
     (while (null (setq fen (ssget "_:S:E" '((0 . "VIEWPORT"))))) 		; selection manuelle de la fenêtre
(princ "\nCe n'est pas une fenêtre"))
     ))
 (redraw (ssname fen 0) 3)							; surbrillance de la fenettre
 (setq	id (vla-get-ObjectID (vlax-ename->vla-object (ssname fen 0)))		; isoler l'ID de la fenêtre
ech (strcat "1/%<\\AcExpr (1000/%<\\AcObjProp Object(%<\\_ObjId "	; créer le champ de l'échelle
	    (itoa id)
	    ">%).CustomScale \\f \"%lu2%qf2816\">%) \\f \"%lu2%zs12%th39\">%"))
 (if (setq cart (car (entsel "\nSelectionner un cartouche")))			; si mauvaise selection
   (progn									; si bonne selection
     (setpropertyvalue cart "ECHELLE" ech)					; insérer le champ dans l'attribut Echelle du cartouche
     (command "METTREAJOURCHAMP" cart ""))					; mise à jour des champs du cartouche
   (command "-TEXTMULT" (getpoint) "L" 0 (strcat "Echelle : " ech " eme") "")	; création d'un texte contenant l'échelle
   )
 (redraw (ssname fen 0) 4)							; suprime la surbrillance de la fenêtre
 (princ)
 )

Lispeur débutant!
Autocad Map3D 2023
Covadis-Autopist 18.0C

Lien vers le commentaire
Partager sur d’autres sites

Salut Vincent, et merci pour ta réponse.

 

redraw fonctionne si une entité est sélectionnée, or là ce sont les entités qui sont sous le pointeur, avant clic gauche de sélection.

Mais peut être couplé avec un grread, je vais creuser un peu merci.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

TOUT ce qui est échangé sur ce site intéresse quelqu'un et si ce n'est pas aujourd'hui demain ce sera le cas

Je t'invite à déposer ce que tu as trouvé, à moins que tu travailles pour la NASA ou le FBI bien sûr, et tu feras progresser quelqu'un qui n'aurait peut-être pas eu l'idée de poser la question

 

Amicalement

 

Lien vers le commentaire
Partager sur d’autres sites

Voici donc le bout de code, sous forme de fonction.

;Name:  				entself
;Version:   			1.0
;Bcad Version:  	After V8
;Date:  				20190228
;Description:   	Invite utilisateur de sélection unique (comme entsel), avec filtre sur type d'entité et sur aperçu en surbrillance
;									Arguments : 
;										str : Message d'invite
;										lst : Liste des types d'entités à filtrer
;									Ex : (entself "Sélectionner les entités : " '("INSERT" "LINE"))
;History:
; v1.0	20190228	1ère version
(defun entself ( str lst / *error* osmode key e loop) 
(vl-load-com)

;Fonction d'erreur
(defun *error* (msg)
	(if 
		(and 
			msg
			(/= msg "Fonction annulée")
			(/= msg "Function cancelled")
			(/= msg "quit / exit abort")
		)
		(princ (strcat (if (= "fr_FR" (getvar 'locale)) "\nErreur: " "\Error: ") msg))
	)
	(setvar 'osmode osmode)
	(vla-endUndoMark acdoc)
	(princ)
)

(vla-startUndoMark (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object))))

(setq loop T osmode (getvar 'osmode))
(princ str)
(setvar 'osmode 0)
(sssetfirst nil nil)

(while (and (setq key (grread T 12 2)) (/= (car key) 3) loop)
	(cond
		((= 5 (car key))
			(if e (redraw e 4))
			(if (setq e (nentselp (cadr key)))
				(progn
					(if (eq 4 (length e))
						(setq e (last (last e)))
						(setq e (car e))
					)
					(if (vl-position (cdr (assoc 0 (entget e))) lst)
						(redraw e 3)
						(setq e nil)
					)
				)
			)
		)
		((eq 11 (car key))
			(if e (redraw e 4))
			(setq e nil loop nil)
		)
		((equal key '(2 13))
			(if e (redraw e 4))
			(setq loop nil)
		)
	)
)
(if e (sssetfirst nil (ssadd e (ssadd))))
(*error* nil)
e
)

 

Dites moi ce que vous en pensez. Ca fonctionne sur BricsCAD, je ne garantis rien sur AutoCAD.

 

"Chacun compte pour un, et nul ne compte pour plus d'un."

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é