Invité ingoenius Posté(e) le 18 juin 2009 Posté(e) le 18 juin 2009 Salut, je voudrait comptabiliser un enseble d'objets "BOITE" (le solide 3d boite de AutoCAD)j'ai besoin de sortir un listing avec les dimensions en X Y Z des boites selectionnes avec le comptage et addiction des boites avec les memes dimensions le probleme c'est que avec de blocs j'ai deja trouve comment extaire les donness d'echelle x y z par contre pour un objet simple solide boite je connais pas le code associe est-ce-que il i y a na 1? si je lance depuis la ligne de commande liste j'ai bien ces données, par contre en autolisp je sais pas les retrouver ;-( Merci a vous
Tramber Posté(e) le 18 juin 2009 Posté(e) le 18 juin 2009 (vl-load-com) (setq voir(vlax-ename->vla-object(car(entsel)))) J'ai fait cela pour regarder et puis j'ai cliqué-droit sur VOIR pour Inpsecter. C'est comme avant (ton témoignage montre que tues au moins sur une version 2007) : il n'y a aucune propriété HxLxL.Ce qui m'étonne en effet, c'est que le résultat avec la commande LISTE donne ces infos.... Alors que faire ? Je ne sais pas s'il est facile de récupérer les données renvoyés par LISTE. Peut-être avec le fichier journal de la ligne de commande...... Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 18 juin 2009 Posté(e) le 18 juin 2009 Salut (defun c:test(/ obj bd hd) (setq obj (vlax-ename->vla-object (car (entsel)))) (vla-getboundingbox obj 'bd 'hd) (setq bd (vlax-safearray->list bd) hd (vlax-safearray->list hd) ) (princ (strcat "\nCoté 1 : " (rtos (abs (- (car bd) (car hd)))))) (princ (strcat "\nCoté 2 : " (rtos (abs (- (cadr bd) (cadr hd)))))) (princ (strcat "\nHauteur : " (rtos (abs (- (caddr bd) (caddr hd)))))) (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
lecrabe Posté(e) le 18 juin 2009 Posté(e) le 18 juin 2009 Hello et si tu envisages de dessiner physiquement la Bounding Box, tu peux suivre ce sujet : http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=7992#pid48670 Le Decapode Autodesk Expert Elite Team
Tramber Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Reste le problème des rotations et des boites non dessinées dans le SCU courant.... Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Salut, Un moyen pour récupérer les coordonnées des arrêtes d'une "boite" pourrait être d'exploser la boite => une région par face, puis de décomposer chaque région => 4 lignes par région et de retourner le résultat sous forme de liste imbriquées. exemple brut de décoffrage (aucun contrôle) (defun box2ptlst (box / regs n reg lines i line elst sublst lst) (command "_copy" box "" "" "") (setq box (entlast)) (command "_.explode" box "") (setq regs (ssget "_P")) (setq n -1) (while (setq reg (ssname regs (setq n (1+ n)))) (command "_.explode" reg) (setq lines (ssget "_p")) (setq i -1) (while (setq line (ssname lines (setq i (1+ i)))) (setq elst (entget line)) (setq sublst (cons (list (cdr (assoc 10 elst)) (cdr (assoc 11 elst))) sublst ) ) ) (command "_.erase" lines "") (setq lst (cons sublst lst) sublst nil) ) lst ) en faisant :(command "_.box" '(0 0 0) '(1 2 3)) (box2ptlst (entlast)) on obtient :((((1.0 2.0 3.0) (1.0 2.0 0.0)) ((1.0 0.0 3.0) (1.0 2.0 3.0)) ((1.0 2.0 0.0) (1.0 0.0 0.0)) ((1.0 0.0 3.0) (1.0 0.0 0.0)) ) (((0.0 2.0 3.0) (0.0 2.0 0.0)) ((1.0 2.0 3.0) (0.0 2.0 3.0)) ((0.0 2.0 0.0) (1.0 2.0 0.0)) ((1.0 2.0 3.0) (1.0 2.0 0.0)) ) (((0.0 0.0 3.0) (0.0 0.0 0.0)) ((0.0 2.0 3.0) (0.0 0.0 3.0)) ((0.0 0.0 0.0) (0.0 2.0 0.0)) ((0.0 2.0 3.0) (0.0 2.0 0.0)) ) (((1.0 0.0 3.0) (1.0 0.0 0.0)) ((0.0 0.0 3.0) (1.0 0.0 3.0)) ((1.0 0.0 0.0) (0.0 0.0 0.0)) ((0.0 0.0 3.0) (0.0 0.0 0.0)) ) (((0.0 0.0 0.0) (0.0 2.0 0.0)) ((0.0 2.0 0.0) (1.0 2.0 0.0)) ((1.0 0.0 0.0) (0.0 0.0 0.0)) ((1.0 2.0 0.0) (1.0 0.0 0.0)) ) (((0.0 2.0 3.0) (0.0 0.0 3.0)) ((0.0 0.0 3.0) (1.0 0.0 3.0)) ((1.0 2.0 3.0) (0.0 2.0 3.0)) ((1.0 0.0 3.0) (1.0 2.0 3.0)) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Pas bête ! Dans mon premier message, j'évoque un point : LISTE sur 2007 est plus impressionant que sur 2006 : la boite est reconnue, HxLxL et non plus la bounding box et en plus, la rotation ! Si quelqu'un sait récupérer les données renvoyées par LISTE !?Je suppose qu'ingoenius a la 2007 au moins. Chers collègues, avez-vous regardé ? Y-a-il un moyen de lisper l'extraction du résultat en ligne de commande de LISTE ? Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Re, Pour récupérer les données de la fenêtre de texte, on peut activer l'enregistrement du fichier journal (LOGFILEMODE) et lire ce fichier (LOGFILENAME). Un exemple, pour récupérer "Longueur" "Largeur" "Hauteur" et "rotation" d'une "boîte". Ne fonctionne qu'avec les primitives créées avec la commande BOITE (_BOX). La routine ne fait aucun contrôle sur le type d'entité, mais ça serait faisable.La précision des données est fonction de la précision de l'affichage (LUPREC et AUPREC)Pour n'avoir qu'une liste par objet, le fichier est supprimé après récupération des données. (defun boxList (box / file loop line lst) (setvar 'logfilemode 1) (command "_list" box "") (setvar 'logfilemode 0) (setq file (open (getvar 'logfilename) "r")) (while (setq line (read-line file)) (foreach prop '("Longueur" "Largeur" "Hauteur" "Rotation") (if (vl-string-search prop line) (setq lst (cons (cons prop (atof (substr line (+ 3 (vl-string-position (ascii ":") line)) ) ) ) lst ) ) ) ) ) (close file) (vl-file-delete (getvar 'logfilename)) (reverse lst) ) En faisant :(command "_.box" '(0 0 0) '(1 2 3)) (boxList (entlast)) On obtient :(("Longueur" . 1.0) ("Largeur" . 2.0) ("Hauteur" . 3.0) ("Rotation" . 0.0)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Avec (gile) y a toujours moyen ! :cool: Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Invité ingoenius Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Genial, vous etes toujours de bon conseil ;-) par contre j'arrive pas a faire la conclusion de la routine car le debout de ce lisp ne fonctionne pas (setq SS (ssget (list)));selection (setq Q (sslength SS)) (setq INDEX 0) (setq L_Boites (list nil));liste vide des boites (repeat Q (setq EL (entget (SSNAME SS INDEX))) [/surligneur] (setq BOI (boxList EL));cela ne fonctionne pas [/surligneur] 1 selections de plusieure boites dens l'espace de dessin2 lancer la subroutine Listbox sur chaque boite de la selection3 recuperer une liste des listes de toutes le boites 4 faire le tri en eliminant les doublons en incrementant un compteur5 avoir un deompte final du type N Boites Longuer X Largeur Y Hauteur ZN Boites Longuer X Largeur Y Hauteur ZN Boites Longuer X Largeur Y Hauteur ZN Boites Longuer X Largeur Y Hauteur Z.......... merci ;-)
Tramber Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Attention !(gile) donne (boxList (entlast)) donc (setq BOI (boxList (SSNAME SS INDEX))) et non pas le ENTGET ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 19 juin 2009 Posté(e) le 19 juin 2009 Re, Une autre avec la première méthode qui retourne juste un liste de 3 dimensions sous forme de chaînes triées en ordre décroissant et dont le nombre de décimales est le deuxième argument de la fonction. (defun boxdim (box dec / regs n reg lines i line elst lst tmp res) (setq echo (getvar 'cmdecho)) (setvar 'cmdecho 0) (command "_copy" box "" "" "") (setq box (entlast)) (command "_.explode" box) (setq regs (ssget "_P")) (setq n -1) (while (setq reg (ssname regs (setq n (1+ n)))) (command "_.explode" reg) (setq lines (ssget "_p")) (setq i -1) (while (setq line (ssname lines (setq i (1+ i)))) (setq elst (entget line)) (setq lst (cons (rtos (distance (cdr (assoc 10 elst)) (cdr (assoc 11 elst))) 2 dec ) lst ) ) ) (command "_.erase" lines "") ) (while lst (setq tmp (vl-remove-if-not '(lambda (x) (equal (car lst) x)) lst) lst (vl-remove-if '(lambda (x) (equal (car lst) x)) lst) len (length tmp) ) (cond ((= len 8) (setq res (cons (car tmp) res))) ((= len 16) (setq res (cons (car tmp) (cons (car tmp) res))) ) ((= len 24) (setq res (list (car tmp) (car tmp) (car tmp)))) (T (setq lst nil)) ) ) (setvar 'cmdecho echo) (reverse (acad_strlsort res)) ) Une commande pour tester avec un jeu de sélection. le résultat est affiché dans la fenêtre de texte sous forme de paires pointées :(("Longueur" "Largeur" "Épaisseur") . quantité) (defun c:test (/ ss n lst ent dim pair result) (setq n -1) (if (setq ss (ssget ":L" '((0 . "3DSOLID")))) (while (setq ent (ssname ss (setq n (1+ n)))) (if (setq dim (boxdim ent 2)) ; changer le nombre de décimales ici (setq lst (cons dim lst)) ) ) ) (while lst (setq first (car lst) lst (cdr lst) ) (if (setq pair (assoc first result)) (setq result (subst (cons first (1+ (cdr pair))) pair result)) (setq result (cons (cons first 1) result)) ) ) (mapcar 'print result) (textscr) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité ingoenius Posté(e) le 22 juin 2009 Posté(e) le 22 juin 2009 Merci a vous tous ;-) pour les aides et les corrections
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