Aller au contenu

Messages recommandés

Posté(e)

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
Posté(e)

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
Posté(e)

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
Posté(e)

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 formuler

Maintenant 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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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
Posté(e)

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/2004

je 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

Posté(e)

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

Posté(e)

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

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é