Aller au contenu

dégrouper par paquets


La Lozère

Messages recommandés

Bonjour,

Alors, juste en intro, là où je suis, j'ai un débit très très faible, et une recherche dans les fils existant me prendrais trop de temps. Alors désolé si je part au plus pressé. ;)

 

Voilà, je cherche une routine ou un truc qui permettrait de dégrouper x groupes d'un seul coup.

 

J'utilise autopiste, et quand on dessine les profil en travers, il créait forcément un groupe pour chaque profil. Donc 200 profils = 200 groupes. Et si on doit reprendre, il faut les effacer, ce qui prend un temps monstrueux. Et j'ai remarquer que si ce n'est plus des groupes, c'est plus rapide.

 

Voilà, merci.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je n'ai pas bien compris le pourquoi du comment, mais voici un petit lisp que j'avais déjà écrit:

 

(defun c:ungroup (/ acdoc groups group )
(vl-load-com)
(setq	acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
		groups (vla-get-groups acdoc)
)
(vla-startundomark acdoc)
(vlax-for group groups
	(vla-delete group)
)
(vla-endundomark acdoc)
(princ)
)

Lien vers le commentaire
Partager sur d’autres sites

Pour répondre Didier, si tu fais Ctrl+H, tu "dégroupes" ton groupe, C'est à dire que tu peux sélectionner individuellement chaque éléments du groupe. Mais si tu refait Ctrl+H, le groupe se reforme. Autrement dis, Ctrl+H ne détruit pas les groupes.

 

Vous pouvez sélectionner un groupe en indiquant son nom à l'invite Choix des objets. Si la variable système PICKSTYLE a pour valeur 1 ou 3, et que vous sélectionnez un membre d'un groupe sélectionnable, tous les objets du groupe répondant au critère de sélection sont sélectionnés. L'activation et la désactivation de la sélection de groupes peut s'effectuer en appuyant sur les touches CTRL+H ou CTRL+MAJ+A.

 

Merci Bryce, cela pourrait convenir, mais ta routine traite tous les groupes du dessin. Serait-il possible de faire une sélection par fenetre des groupe que l'on veut?

 

A plus.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

hello

 

avec experience je prendrais la solution de didier

et jouer avec pickstyle à 0 (control +h)

 

les entites reste des groupes, mais tu peux bosser entité par entité

et la c'est aussi rapide que si c'etait degroupé

 

il y a aussi un LISP qui groupe / degroupe sur le site

un *.VLX fonction "degrp" "grp"

 

http://www.delicad.com/autocad/sommaire_divers.htm

 

a+

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Je viens de faire ça vite fait

(defun c:dgrp (/ lst lst2 nb grou pts)
  (vl-load-com)

;---liste des groupes---
(setq grou (dictsearch (namedobjdict) "ACAD_GROUP"))
(setq lst (vl-remove-if 'vl-symbolp (mapcar '(lambda (x) (if (or (= (car x) 3) (= (car x) 350)) (cdr x) T)) grou)))
(setq nb 0 lst2 nil pts nil)
(if (= lst nil) (progn (print "Pas de groupes dans le dessin") (exit)))
(while (<= nb (length lst))
 (if (< (length pts) 2)
   (progn
     (setq pts (append pts (list (nth nb lst))))
     (setq nb (+ nb 1))
   )
   (progn
     (setq lst2 (append lst2 (list pts)))
     (setq pts nil)
   )
 )
)
;-----------

;; DCL load
(setq tmp (WriteDcl))
(setq dcl_id (load_dialog tmp))
(if (not (new_dialog "dial" dcl_id)) (exit))

(start_list "lstg")
(mapcar 'add_list (mapcar '(lambda (x) (car x)) lst2))
(end_list)
(action_tile "degr" "(degroup (get_tile\"lstg\") lst2)")

(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete tmp)

)

(defun degroup (lnb lst / a l lst2 nb)
 (setq l '())
 (while (/= lnb "")
   (setq a (read lnb))
   (setq l (cons a l))
   (setq lnb (vl-string-left-trim " " lnb))
   (setq lnb (vl-string-left-trim (itoa a) lnb))
 )
 (setq nb 0 lst2 lst)
 (while (< nb (length l))
   (setq pos (nth nb l))
   (entdel (cadr (nth pos lst)))
   (setq lst2 (vl-remove (nth pos lst) lst2))
   (setq nb (+ nb 1))
 )
 (start_list "lstg")
   (mapcar 'add_list (mapcar '(lambda (x) (car x)) lst2))
 (end_list)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun WriteDcl ()
  (setq fichier (vl-filename-mktemp "tmp.dcl"))
  (setq file (open fichier "w"))
  (write-line
  "dial : dialog {
 label = \"Multi degroupage\" ;
 : boxed_column {
   label = \"Selectionnez les groupes\";
     : list_box {
           multiple_select = true;
           value = \"0\";
           key = \"lstg\";
           height = 15;
           fixed_height = true;
           width = 40;
           fixed_width = true;
         }
     : button {
         key = \"degr\";
         label = \"Degrouper\";
         width = 10;
         fixed_width = true;
       }
     spacer;
 }
 ok_only ;
}"
  
  file
  )
  (close file)
  fichier
)

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Voici ma proposition :

http://www.creao.fr/uploads/lisp/dg.lsp

 

Le code (obsolète, voir nouvelle version plus bas):

(defun c:dg (/ *error* oldcmdecho acdoc groups group ss e i)
; Décompose les groupes auxquels appartiennent les objets sélectionnés.
; Brice Studer, ocobre 2011

(vl-load-com)
(setq   acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       groups (vla-get-groups acdoc)
)

(defun *error* (msg)
 (and msg
   (or
     (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
     (princ (strcat "\nErreur : " msg))
   )
 )
 (if ss (vla-delete ss))
 (setvar "cmdecho" oldcmdecho)
 (vla-endundomark acdoc)
 (princ)
)

(vla-startundomark acdoc)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)

(princ "\nSélectionnez les groupes à décomposer <entrée pour tous> : ")
(if (setq ss (ssget))
 (progn
   (setq ss (vla-get-activeselectionset acdoc))
   (vlax-for e ss
     (vlax-for group groups
       (vlax-for i group
         (if (eq (vlax-vla-object->ename e) (vlax-vla-object->ename i)) (vla-delete group)) 
       )
     )
   )
 )
 (vlax-for group groups
   (vla-delete group)
 )
)

(*error* nil)
(princ)
)

(princ "\nCommande à utiliser : DG")
(princ)

 

3 boucles vlax-for imbriquées, j'espère que (gile) ne va pas faire une attaque ! :P

Modifié par bryce
Lien vers le commentaire
Partager sur d’autres sites

Merci les gars,

Bryce, chez moi, je sélectionne mes groupes et quand je valide, il ne finit pas la commande.

 

Vincentp010, nickel ça marche.

 

Du coup, j'ai remarqué une chose, pour revenir à la discussion, d'avec didier. Si on efface tout les éléments d'un groupe (si on utilise uniquement Ctrl+H), cela ne détruit pas le groupe. Donc ceci expliquant peut-être cela avec Autopiste.

 

Encore merci de vous être penché sur mon souci.

 

PS: (Gile), je connais très bien ta routine, chez moi, elle est même chargée au démarrage avec icônes associés. Mais, sauf si elle a évoluée, il faut relancer la commande pour chaque groupe.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

Bryce, chez moi, je sélectionne mes groupes et quand je valide, il ne finit pas la commande.

C'est-à-dire ? :unsure:

Je viens de retester sur un fichier contenant à peu près 5000 objets, et certes ça mouline quelques secondes, mais ça fonctionne...

Lien vers le commentaire
Partager sur d’autres sites

3 boucles vlax-for imbriquées, j'espère que (gile) ne va pas faire une attaque ! :P

Salut

 

Pour éviter d'imbriquer les groupes, tu peux faire une liste des groupes et ensuite utiliser la fonction member pour la liste dans la recherche des groupes.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Bryce: Chez moi, je sélectionne par exemple 2-3 objets correspondant à 2-3 groupes différents. Ce qui à pour effet de sélectionner 2-3 groupes à détruire. Et donc quand je valide par "Entrée", il ne se passe rien, cela ne lance pas a commande. Je suis obligé de faire "Echap". Et du coup, je n'ai qu'un groupe de détruit.

 

Didier: Pas de problème on est là pour discuter. Mon but final, est d'effacer les objets de mes groupes. Mais, j'ai remarqué que cela était plus rapide si les objets ne faisaient plus parti d'un groupe. Du coup, avec la routine de (gile) je les détruisais un par un.

 

Mon projet Autopiste comporte 200 profils avec chacun environ 400 objets. Soit 200 groupes et 80000 objets.

 

Voilà, à plus.

 

PS: Je suis sur Autocad 2010

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Lien vers le commentaire
Partager sur d’autres sites

coucou

 

bien sûr qu'il n'y a pas de problème, qui a dit le contraire ?

 

tu veux effacer les entités, non ?

 

tu n'as pas besoin de toutes ces fioritures

qui peuvent servir à ceux qui n'ont pas Covadis.

 

je dis que Ctrl+H est efficace

et si vraiment tu veux supprimer les groupes (devenus vides)

CovEdition > Purger > Groupes Vides

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Mon projet Autopiste comporte 200 profils avec chacun environ 400 objets. Soit 200 groupes et 80000 objets.

Ça doit être pour ça que la commande semble ne pas se terminer.

Mon lisp n'est pas optimisé pour la rapidité, il parcourt pour chaque objet sélectionné l'ensemble du contenu de chaque groupe, donc vu le nombre d'objets dans ton dessin ça doit prendre un temps certain... <_<

Je suppose qu'en étant très patient, il finirait par y arriver... :P

 

Pour éviter d'imbriquer les groupes, tu peux faire une liste des groupes et ensuite utiliser la fonction member pour la liste dans la recherche des groupes.

Patrick, le problème c'est que je ne vois pas comment faire pour trouver les groupes auxquels appartient chaque objet de la sélection sans parcourir à chaque fois le contenu de chaque groupe.

Si tu as une astuce, ça m'intéresse ! :)

Lien vers le commentaire
Partager sur d’autres sites

Bon, en fait j'avais complètement zappé le code 330 qui permet de savoir à quel(s) groupe(s) appartient un objet... :blink:

 

Voici donc une nouvelle version de mon lisp, beaucoup plus rapide:

http://www.creao.fr/uploads/lisp/dg.lsp

 

(defun c:dg (/ *error* oldcmdecho acdoc groups ss i li g gl)
; Décompose les groupes auxquels appartiennent les objets sélectionnés.
; Brice Studer, ocobre 2011

(vl-load-com)
(setq   acdoc (vla-get-ActiveDocument (vlax-get-acad-object))
       groups (vla-get-groups acdoc)
)

(defun *error* (msg)
 (and msg
   (or
     (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
     (princ (strcat "\nErreur : " msg))
   )
 )
 (if ss (setq ss nil))
 (setvar "cmdecho" oldcmdecho)
 (vla-endundomark acdoc)
 (princ)
)

(vla-startundomark acdoc)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)

(princ "\nSélectionnez les groupes à décomposer <entrée pour tous> : ")
(if (setq ss (ssget))
 (progn
   (setq i 0)
   (repeat (sslength ss)
     (setq li (entget (ssname ss i)))
       (while li
         (if (setq g (cdr (assoc 330 li)))
           (or
             (member g gl)
             (and
               (= (cdr (assoc 0 (entget g))) "GROUP")
               (setq gl (cons g gl))
             )
           )
         )
         (setq li (cdr li))
       )
     (setq i (1+ i))
   )
   (foreach g gl
     (entdel g)
   )
 )
 (vlax-for g groups
   (setq gl (cons g gl))
   (vla-delete g)
 )
)

(princ (strcat "\n" (itoa (length gl)) " groupes décomposés !"))
(*error* nil)
(princ)
)

(princ "\nCommande à utiliser : DG")
(princ)

Lien vers le commentaire
Partager sur d’autres sites

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é