Aller au contenu

Rendre un groupe selectionnable


Messages recommandés

Posté(e)

Bonjour,

Je voudrais essayer de créer un icone qui me permettrait de rendre un goupe selectionnable ou non en le selectionnant directement sur le dessin.

 

La commande groupe ne permet pas de selectionner le groupe sur le dessin auquel on veut changer la propriété "selectionnable", il faut le nommer et les symboles de remplacement tels que "# * ? " ne fonctionnent pas.

 

Je voudrais créer une commande Lisp qui me permettrait de retrouver le nom d'un groupe à partir de la selection d'un objet sur le dessin mais je ne sais pas comment Autocad gére les propriétés des groupes et où il les stock.

 

Si quelqu'un aurait une petit idée sur ce sujet cela m'interesserai.

 

Merci

:)

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

Titifonky,

 

;;; spyDictionnaries

;;; Retourne une liste triée de tous les groupes auquel un objet fait partie.

;;; Reçoit un objet (ename)

;;; Retourne une liste de noms.

;;; Par Serge cAMIRÉ, cAD-NOVATION. 2005-02-21

(defun spyDictionnaries (

object

/ AllDictObjects AllDictObjectsLength AllDictObjectsLength existIn groupDictionnary

isMemberOf MyDictObjs names objectGet pos

)

(setq objectGet (entget object))

(setq isMemberOf nil)

 

(setq groupDictionnary (dictsearch (namedobjdict) "acad_group"))

(if groupDictionnary

(progn

(setq names (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 3 (car x))) groupDictionnary)))

(setq AllDictObjects (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) groupDictionnary)))

;; Si on ramasse des objets 330 non pertinents, ce n'est pas grave puisqu'on les filtrera

;; mais ça donne du code plus court

(setq MyDictObjs (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 330 (car x))) objectGet)))

(setq AllDictObjectsLength (length AllDictObjects))

(foreach MyDictObj MyDictObjs

(setq existIn (member MyDictObj AllDictObjects))

(if existIn

(progn

(setq pos (- AllDictObjectsLength (length existIn)))

(setq isMemberOf (cons (nth pos names) isMemberOf))

))

)

))

(acad_strlsort isMemberOf)

)

 

(defun c:test (

/ object objectSel reponse

)

(setq objectSel (entsel "\nChoisissez l'objet: "))

(setq object (car objectSel))

(setq reponse (spyDictionnaries object))

(if reponse

(progn

(princ "\nLes groupes sont: ")

(princ reponse)

)

(progn

(princ "\nAucun groupe.")

))

(princ)

)

 

Serge

 

Posté(e)

Bonjour Serge, j'ai essayé d'analyser ton programme mais mes connaissances sont trop faibles pour tout comprendre.

Je n'arrive pas à trouver de solutions pour modifier les propriétés d'un groupe à partir du Lisp. Existe-il un livre assez complet où le fonctionnement de la base de donnée d'un dessin est expliqué parce que je suis toujours à la recherche de ces informations.

J'ai essayé d'utiliser le nom que je recupère à partir de ton programme pour l'inserer dans la commande "-groupe" avec la commande lisp "command"-groupe" " mais cela ne fonctionne pas. Acad demende de taper un nom alors que celui que je recupere s'affiche avec des parenthèses à l'écran.

Je me demande si ce ne serait pas plus simple de modifier les propriétés directement dans la base de donnée du dessin mais comment ? J'ai essayé de chercher ou était stocké ces infos mais je n'ai pas trouvé. Si tu a quelques connaissances dans ce domaine, elles seraient les bienvenue

 

Merci

 

Titifonky

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

Titifonky,

 

Pour ce qui est des livres, je ne sais pas. Pour ce qui est de la routine, je t'ai ajouté quelques lignes en espérant que cela te conviendra.

 

;;; c:ChgGroupStatus

;;; Change le mode de séletion des groupes associés à un objet choisi.

;;; Par Serge Camiré Cad-Novation 2005-02-22

 

;;; spyDictionnaries

;;; Retourne une liste triée de tous les groupes auquel un objet fait partie.

;;; Reçoit un objet (ename)

;;; Retourne une liste de noms.

(defun spyDictionnaries (

object

/ AllDictObjects AllDictObjectsLength AllDictObjectsLength existIn groupDictionnary

isMemberOf MyDictObjs names objectGet pos

)

(setq objectGet (entget object))

(setq isMemberOf nil)

 

(setq groupDictionnary (dictsearch (namedobjdict) "acad_group"))

(if groupDictionnary

(progn

(setq names (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 3 (car x))) groupDictionnary)))

(setq AllDictObjects (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) groupDictionnary)))

;; Si on ramasse des objets 330 non pertinents, ce n'est pas grave puisqu'on les filtrera

;; mais ça donne du code plus court

(setq MyDictObjs (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 330 (car x))) objectGet)))

(setq AllDictObjectsLength (length AllDictObjects))

(foreach MyDictObj MyDictObjs

(setq existIn (member MyDictObj AllDictObjects))

(if existIn

(progn

(setq pos (- AllDictObjectsLength (length existIn)))

(setq isMemberOf (cons (nth pos names) isMemberOf))

))

)

))

(acad_strlsort isMemberOf)

)

 

;;; changeGroupStatus

;;; Change le statut de sélection.

;;; Reçoit :

;;; dictName: 'STR, le nom du dictionnaire

;;; selectableMode: 0 ou 1

;;; Retourne: rien

(defun changeGroupStatus (

dictName selectableMode

/ groupDictionnary objDictionnary objDictionnaryGet

)

(cond

((not (setq groupDictionnary (dictsearch (namedobjdict) "acad_group"))) nil)

((not (setq groupDictionnary (member (cons 3 dictName) groupDictionnary))) nil)

((not (setq objDictionnary (cdadr groupDictionnary))) nil)

((not (setq objDictionnaryGet (entget objDictionnary))) nil)

(t

(setq objDictionnaryGet (subst (cons 71 selectableMode) (assoc 71 objDictionnaryGet) objDictionnaryGet))

(entmod objDictionnaryGet)

(entupd objDictionnary)

)

)

nil

)

 

(defun c:ChgGroupStatus (

/ groupes msg object objectSel reponse status

)

(setq objectSel (entsel "\nChoisissez l'objet: "))

(setq object (car objectSel))

(setq groupes (spyDictionnaries object))

(if groupes

(progn

(setq msg (if (> (length groupes) 1)

"Rendre ces groupes sélectionnables"

"Rendre ce groupe sélectionnable"

))

(setq msg (strcat msg " [Oui/Non] : "))

(initget "Oui Non")

(setq reponse (getkword msg))

(setq status (if (= "Non" reponse) 0 1))

(foreach groupe groupes

(changeGroupStatus groupe status)

)

)

(progn

(princ "\nAucun groupe.")

))

(princ)

)

(princ "\nTapez ChgGroupStatus pour modifier le statut de sélection des groupes.")

(princ)

 

Serge

 

Posté(e)

Je te remercie beaucoup Serge, c'est exactement le resultat que j'attendais. C'est dommage que mes connaissance ne me permettent pas de comprendre l'inrtegralité du code mais je vais me pencher dessus. J'aurai aimé savoir où tu a appris à manipuler toutes ces commandes qui ne sont pas aussi bien expliqué sur les sites internet que j'ai trouvé.

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

Tiffonky,

 

Je n'ai aucun mérite, je travaille avec AutoCAD presque tous les mois depuis 20 ans. Je suis autodidacte. Le plus dur ces temps ci est de prgrammer un jour en Lisp, l'autre jour en .Net (DotNet) et l'autre jour en C++

 

Serge

 

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é