Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

nouveau sujet pour éviter de couper le débat.

 

questions à (gile) :

 

-1- est ce normal que en lancant DGRP (degrouper) que l'on puisse dégrouper un groupe avec un nom (çà peut être génant) ?

 

-2- ne serait il pas possible en lancant GRP (grouper), qu'un message d'alerte nous indique si il y a dejà des groupes sans nom dans le dessin ?

 

-3- et si l'on veut faire un nouveau groupe (different du premier) et que l'on clique un groupe existant, que le programme nous l'indique ?

 

merci

 

A+

 

 

Posté(e)

Salut,

 

Tout d'abord, j'avais fait ces routines (un peu par jeu) pour avoir un fonctionnement similaire à celui de DeliCAD, et je trouvais bien ces routines pour faire (et défaire) des groupes rapidement.

 

-1- est ce normal que en lancant DGRP (degrouper) que l'on puisse dégrouper un groupe avec un nom (çà peut être génant) ?

"Normal", je ne sais pas mais je l'avais fait pour ça aussi, je pensais qu'il était pratique de pouvoir décomposer n'importe quel groupe avec cette commande.

 

Voici une version qui ne décompose que les groupes créés avec la commande GRP.

 

;; DGRP
;; Supprime tous les groupes créés avec GRP auxquels appartient l'entité

(defun c:dgrp (/ ent)
 (and
   (setq ent (car (entsel)))
   (mapcar
     (function
(lambda	(p)
  (and
    (= (car p) 330)
    (= (cdr (assoc 0 (entget (cdr p)))) "GROUP")
    (wcmatch (cdr (assoc
		    3
		    (member
		      (cons 350 (cdr p))
		      (reverse (dictsearch (namedobjdict) "ACAD_GROUP"))
		    )
		  )
	     )
	     "GRP*"
	     )
    (entdel (cdr p))
  )
)
     )
     (entget ent)
   )
 )
 (princ)
) 

 

-2- ne serait il pas possible en lancant GRP (grouper), qu'un message d'alerte nous indique si il y a dejà des groupes sans nom dans le dessin ?

 

-3- et si l'on veut faire un nouveau groupe (different du premier) et que l'on clique un groupe existant, que le programme nous l'indique ?

 

Tout ça est possible, mais ça commence à devenir presque aussi lourd à utiliser que la commande GROUPER.

 

;; GROUPLIST
;; Retourne un liste de tous les groupes du dessin du type :
;; ((nom_du_groupe_1 . ename_1) (nom_du_groupe_2 . ename_2) ...)

(defun grouplist (/ dict lst)
 (setq	dict (vl-member-if
       '(lambda (x) (= (car x) 3))
       (dictsearch (namedobjdict) "ACAD_GROUP")
     )
 )
 (while dict
   (setq lst  (cons (cons (cdar dict) (cdadr dict)) lst)
  dict (cddr dict)
   )
 )
 (reverse lst)
)

;; MAKEGROUP
;; Crée un groupe sans nom avec les entités contenues dans la liste
;;
;; Argument
;; lst : liste des entités (ename)
;;
;; Retour
;; le groupe créé (ename) ou nil

(defun makegroup (lst / dict ind)
 (setq dict (dictsearch (namedobjdict) "ACAD_GROUP")
ind "GRP1")
 (while (member (cons 3 ind) dict)
   (setq ind (strcat "GRP" (itoa (1+ (atoi (substr ind 4))))))
 )
 (dictadd
   (cdr (assoc -1 dict))
   ind
   (entmakex
     (append
(list
  '(0 . "GROUP") '(100 . "AcDbGroup") '(300 . "") '(70 . 1) '(71 . 1))
(mapcar (function (lambda (x) (cons 340 x))) lst)
     )
   )
 )
)

;; GROUPED-P
;; Evalue si l'entité est liée à un groupe
;;
;; Argument
;; ent : ename de l'entité à évaluer
;;
;; Retour
;; T si l'entité est liée à un groupe, nil sinon.

(defun grouped-p (ent)
 (vl-some '(lambda (p)
      (and (= (car p) 330)
	   (= (cdr (assoc 0 (entget (cdr p)))) "GROUP")
      )
    )
   (entget ent)
 )
)

;;; MsgBox (Patrick_35)
;;; Ouvre une boite de dialogue pour récupérer la réponse à une question

(defun MsgBox (Titre Boutons Message Time / Reponse WshShell)
 (vl-load-com)
 (setq WshShell (vlax-create-object "WScript.Shell"))
 (setq	Reponse	(vlax-invoke
	  WshShell
	  'Popup
	  Message
	  Time
	  Titre
	  (itoa Boutons)
	)
 )
 (vlax-release-object WshShell)
 Reponse
)

;; GRP

(defun c:grp (/ l1 l2 ss n ent lst prd)
 (setq	l1 (grouplist)
l2 (vl-remove-if-not '(lambda (x) (wcmatch (car x) "`*A*")) l1)
l1 (vl-remove-if-not '(lambda (x) (wcmatch (car x) "GRP*")) l1)
 )
 (if (or l1 l2)
   (alert (strcat
     "Il existe des groupes anonymes dans le dessin :\n"
     (itoa (length l1))
     " créés avec le LISP GRP\n"
     (itoa (length l2))
     " créés avec la commande GROUPE"
   )
   )
 )
 (if (setq ss (ssget))
   (progn
     (repeat (setq n (sslength ss))
(setq ent (ssname ss (setq n (1- n)))
      lst (cons ent lst)
)
(or prd
    (if	(grouped-p ent)
      (setq prd T)
    )
)
     )
     (if
(or
  (not prd)
  (=
    (MsgBox
      "Message GRO"
      49
      "Certains objets sélectionnés appartiennent déjà à un groupe.
      \nContinuer la création du groupe ?"
      10
    )
    1
  )
)
 (makegroup lst)
     )
   )
 )
 (princ)
) 

 

[Edité le 25/2/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

merci,

 

çà marche, sauf que si je clique un groupe exixtant créé avec GRP

j'ai le message suivant :

 

[surligneur] ; erreur: no function definition: VLAX-CREATE-OBJECT[/surligneur]

 

de MsgBox surement un problème de version (V2002)

 

 

A+

Posté(e)

merci (gile)

 

çà fonctionne, j'aurais du y penser à insérer cette commande, c'est pas la première fois que çà arrive.

 

juste un petit détail, si on choisit un groupe déjà existant en premier, on a bien le message et si on répond OK le programme s'arrete, si on choisi une entité puis un groupe existant, le message arrive, on répond OK et le nouveau grope est fait, c'est juste une question d'habitude à prendre.

 

Ce principe de groupe sans nom est interressant pour moi, pour réaliser rapidement des groupes "provisoire" pour, par exemple, faire un ordre d'affichage dessus dessous.

 

A bientot.

 

 

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é