Titifonky Posté(e) le 21 février 2005 Posté(e) le 21 février 2005 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
Serge Posté(e) le 21 février 2005 Posté(e) le 21 février 2005 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
Titifonky Posté(e) le 22 février 2005 Auteur Posté(e) le 22 février 2005 Merci beaucoup pour la reponse, je vais voir ce que je peut faire avec. ;) www.le-metal.net, sur la métallerie
Titifonky Posté(e) le 22 février 2005 Auteur Posté(e) le 22 février 2005 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
Serge Posté(e) le 22 février 2005 Posté(e) le 22 février 2005 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
Titifonky Posté(e) le 22 février 2005 Auteur Posté(e) le 22 février 2005 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
Serge Posté(e) le 22 février 2005 Posté(e) le 22 février 2005 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant