Aller au contenu

Taille de boite


Messages recommandés

Invité ingoenius
Posté(e)

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

 

Posté(e)

(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

 

./__\.
(.°=°.)
Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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

Invité ingoenius
Posté(e)

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 dessin

2 lancer la subroutine Listbox sur chaque boite de la selection

3 recuperer une liste des listes de toutes le boites

 

4 faire le tri en eliminant les doublons en incrementant un compteur

5 avoir un deompte final du type

 

 

N Boites Longuer X Largeur Y Hauteur Z

N Boites Longuer X Largeur Y Hauteur Z

N Boites Longuer X Largeur Y Hauteur Z

N Boites Longuer X Largeur Y Hauteur Z..........

 

merci ;-)

 

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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)

Merci a vous tous ;-) pour les aides et les corrections

 

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é