Titifonky Posté(e) le 1 mars 2005 Posté(e) le 1 mars 2005 Bonjour, Je voudrai savoir comment il faut faire pour supprimer un groupe à partir du Lisp.Je n'arrive pas à comprendre où sont stockés les informations sur les groupes et comment les modifier. La seule commande que je connais pour récuperer les noms des groupes est (dictsearch (namedobjdict) "acad_group").Quelles sont les autres symboles tel que "acad_group" que l'on peut utiliser et coment modifier ces noms ? Merci www.le-metal.net, sur la métallerie
Patrick_35 Posté(e) le 1 mars 2005 Posté(e) le 1 mars 2005 Pour avoir la liste des groupes (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 3)) (dictsearch (namedobjdict) "acad_group"))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Titifonky Posté(e) le 1 mars 2005 Auteur Posté(e) le 1 mars 2005 ca y est j'ai trouvé, Il faut utiliser la fonction (dictsearch ([nom du dictionnaire des entités acad_group] )) "[nom du groupe] ") pour obtenir la définition d'un groupe. Pour le supprimer, il ne reste plus qu'a utiliser (entdel ([nom du groupe indice -1] )) www.le-metal.net, sur la métallerie
didier Posté(e) le 1 mars 2005 Posté(e) le 1 mars 2005 coucou c'est Patrick qui va être content de savoir que tu as trouvé ;) ciaooooooooooo Éternel débutant... Mon site perso : Programmer dans AutoCAD
Titifonky Posté(e) le 2 mars 2005 Auteur Posté(e) le 2 mars 2005 J'aimerais avoir vos critiques sur ce premier Lisp que je viens de créer après quelques heures de dur labeur. Ce Lisp me permet de decomposer les groupes à partir d'une selection sur l'écran. (defun c:dg ()(setq i 0)(setq nosgroup '(nil))(setq namesel (ssget))(setq lgsel (sslength namesel))(while (< i lgsel)(setq entdef (entget (ssname namesel i)))(if (equal '(102 . "{ACAD_REACTORS") (assoc 102 entdef))(progn(setq groupno (assoc 330 entdef))(if (not (member groupno nosgroup))(progn(setq nosgroup (subst groupno 'nil nosgroup))(setq nosgroup (cons 'nil nosgroup))))))(setq i (+ 1 i)))(setq nosgroup (cdr nosgroup))(setq nosgroupc (mapcar '(lambda (x) (cons 350 (cdr x))) nosgroup))(setq dictgroup (dictsearch (namedobjdict) "acad_group"))(setq nomdic (cdar dictgroup))(setq lgnosgroupc (length nosgroupc))(setq lgdict (length dictgroup))(setq i 0)(while (< i lgnosgroupc)(setq pos (- lgdict (+ 1 (length (member (nth i nosgroupc) dictgroup)))))(setq nomgroup (nth pos dictgroup))(entdel (cdr (assoc -1 (dictsearch nomdic (cdr nomgroup)))))(setq i (+ 1 i)))) A+ et j'espere aussi que patrick sera content ;) www.le-metal.net, sur la métallerie
Patrick_35 Posté(e) le 2 mars 2005 Posté(e) le 2 mars 2005 Salut,Patrick content, oui...oui content Bon, blague à part, c'est très bien et le principal c'est que ça fonctionne, quels que soient les critiques que l'on puisse formulerMaintenant que tu demandes notre avis, je vais te le refaire en plus court. C’est selon ma manière de fonctionner et ce n'est surtout pas une critique de ce que tu as fait, au contraire, j’aurai cherché ailleurs. C’est juste pour mettre l'accent sur deux ou trois choses (je n'ai pas trop les chevilles qui gonflent, non...., non, donc ça va)Regarde-le et n'hésite pas à poser des questions (defun c:dg(/ i namesel entdef) (if (setq namesel (ssget)) (progn (setq i 0) (while (ssname namesel i) (setq entdef (entget (ssname namesel i))) (if (= (cdr (assoc 102 entdef)) "{ACAD_REACTORS") (entdel (cdr (assoc 330 entdef))) ) (setq i (1+ i)) ) ) ) (princ) ) Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Titifonky Posté(e) le 2 mars 2005 Auteur Posté(e) le 2 mars 2005 Salut Patrick; On va dire que c'est extra-simplifié et ca permet de comprendre très rapidement le code, le mien est un petit peu plus brouillon.En fait, si je suis passé par la fonction (dictsearch) pour trouver le nom du groupe, c'est que la première que j'ai essayé de supprimer un groupe en utilisant son nom dans la définition de l'objet, j'ai eu une reponse du style "type d'argument incorrect", allez savoir pourquoi. A partir de là, j'ai essayé de trouver une autre solution.Dans tout les cas, cette recherche m'a permis de comprendre d'autres fonctions que je ne connaissais pas et donc n'utilisais pas tel que (mapcar) (lambda) (foreach) (progn).Ton programme est super, il me permet de comprendre comment optimiser le code.Merci. www.le-metal.net, sur la métallerie
BIM G CO Posté(e) le 8 mars 2005 Posté(e) le 8 mars 2005 Mon très cher Patrick_35 je crois que tu viens de m'enlever une épine du pied. (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 3)) (dictsearch (namedobjdict) "acad_group"))) au lieu de me concentrer sur le code 3 je prend le code 350. J'obtiens la liste des différents groupe (lisible avec un simple entget) pour avoir la liste de tous les objets étant affiliés (code 340) Je n'ai pas encore vérifié mais si ce groupe ne contient pas d'élément(assoc 340 ....) = nil c'est que le groupe est vide non?donc on peut le "purger" non? (avec entdel) les filtres de calques purgeables déjà avec cette petite appli trouvée le 21/07/2004je crois que Patrick_35 a ouvert la voie sur les groupes vides ?!? Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
BIM G CO Posté(e) le 8 mars 2005 Posté(e) le 8 mars 2005 du style : ;;; ---------------------------------------------------------------------- (defun ListGPName () (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 3)) (dictsearch (namedobjdict) "ACAD_GROUP") ) ) ) ;;; ---------------------------------------------------------------------- (defun ListGPeName () (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 350)) (dictsearch (namedobjdict) "ACAD_GROUP") ) ) ) ;;; ---------------------------------------------------------------------- (defun ListGPvide (/ PRIVE_LISTE PRIVE_BOUCLE) (setq PRIVE_BOUCLE 0) (setq PRIVE_LISTE nil) (while (< PRIVE_BOUCLE (length (ListGPeName))) (if (not (assoc 340 (entget (nth PRIVE_BOUCLE (ListGPeName))))) (if PRIVE_LISTE (setq PRIVE_LISTE (append PRIVE_LISTE (list (nth PRIVE_BOUCLE (ListGPeName))) ) ) (setq PRIVE_LISTE (list (nth PRIVE_BOUCLE (ListGPeName)))) ) ) (setq PRIVE_BOUCLE (1+ PRIVE_BOUCLE)) ) PRIVE_LISTE ) ;;; ---------------------------------------------------------------------- ;;; Programme (foreach n (ListGPvide) (entdel n)) (princ) Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
Patrick_35 Posté(e) le 14 mars 2005 Posté(e) le 14 mars 2005 MaximilienA force de t’enlever les épines du pied, on dirait que tu as marché sur un oursin :’)Blague à part, tu as aussi ce sujet pour un dessin vide de quelques méga @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Titifonky Posté(e) le 14 mars 2005 Auteur Posté(e) le 14 mars 2005 Je viens également de faire un petit programme pour nettoyer les groupes vides ou ne contenant qu'une seule entité (defun c:pgp () (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq dictgroup (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) dictgroup ) ) ) (setq i 0) (while (< i (length dictgroup)) (setq groupdf (entget (nth i dictgroup))) (if (or (= 71 (car (last groupdf))) (<= (length (member (assoc 340 groupdf) groupdf)) 1) ) (entdel (nth i dictgroup)) ) (setq i (1+ i)) ) ) J'en ai fais encore trois autres qui permettent d'enlever ou d'ajouter une entité ou de supprimer plusieurs groupes Supprime les groupes selectionnés (defun c:dg () ;;creer un jeu de selection (setq selection (ssget) i 0 ) (while (< i (sslength selection)) ;;recherche le numero du groupe (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget (ssname selection i)) ) ) ) ;;test si groupnumero n'est pas nil (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (entdel groupnumero) ) ) ) (setq i (1+ i)) ) ) Ajoute une ou plusieurs entités à un groupe (defun addgroup (group /) (princ "\nSelectionnez les objets à ajouter au groupe :") (setq selectionset (ssget) i 0 ) (while (< i (sslength selectionset)) (isgroup (ssname selectionset i)) (if (not is) (progn (setq entname (list (cons 340 (ssname selectionset i)))) (setq group (entmod (append group entname))) ) (princ "\nLes groupes selectionné ne sont pas ajouté au groupe de reference" ) ) (setq i (1+ i)) ) ) (defun isgroup (numeroent /) (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget numeroent) ) ) ) (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (setq is T) (setq is nil) ) ) (setq is nil) ) ) (defun c:ag () (setq selectiongroup (car (entsel "\nSelectionnez le groupe de reference :") ) ) (isgroup selectiongroup) (setq group groupdef) (if is (addgroup group) (progn (princ "\nCe n'est pas un groupe") ) ) ) Enleve une ou plusieurs entités aux goupes auquels elles appartienent (defun isgroup (numeroent /) (setq groupnumero (cdadr (member '(102 . "{ACAD_REACTORS") (entget numeroent) ) ) ) (if groupnumero (progn (setq groupdef (entget groupnumero)) ;;test si groupnumero est bien un groupe (if (equal (cadr groupdef) '(0 . "GROUP")) (setq is T) (setq is nil) ) ) (setq is nil) ) ) (defun purggroup () (setq dictgroup (dictsearch (namedobjdict) "acad_group")) (setq dictgroup (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 350 (car x))) dictgroup ) ) ) (setq i 0) (while (< i (length dictgroup)) (setq groupdf (entget (nth i dictgroup))) (if (or (= 71 (car (last groupdf))) (<= (length (member (assoc 340 groupdf) groupdf)) 1) ) (entdel (nth i dictgroup)) ) (setq i (1+ i)) ) ) (defun c:rg () (setq pick (getvar "PICKSTYLE")) (setvar "PICKSTYLE" 0) (princ "\nSelectionnez les objets à enlever du groupe :") (setq selectionset (ssget) i 0 ) (while (< i (sslength selectionset)) (isgroup (ssname selectionset i)) (if is (progn (setq entname (cons 340 (ssname selectionset i))) (entmod (vl-remove entname groupdef)) ) ) (setq i (1+ i)) ) (purggroup) (setvar "PICKSTYLE" pick) ) Je ne sais pas si c'est le bon endroit pour les mettre à disposition mais dans tout les cas je remercie tout ceux qui on pu m'aider à les créer. www.le-metal.net, sur la métallerie
Patrick_35 Posté(e) le 14 mars 2005 Posté(e) le 14 mars 2005 Ouf, ça commence à décoiffer sérieuxPour les routines, tu as ce forum @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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