Aller au contenu

Longueur Cylindre en lisp ???


Messages recommandés

Posté(e)

Bonjour a tous,

 

je bute sur un truc (tout bete), je cherche à avoir la longueur d'un cylindre 3D créé par la commande autocad : 'cylindre'.

 

auriez-vous une solution ?

 

merci beaucoup ...

Posté(e)

Bonjour,

 

Si tu es sûr de pouvoir retrouver le SCU de construction (s'il y en a eu un!), la commande PROPMECA (_MASSPROP) de donnera la boite de délimitation, en soustrayant le Z mini au Z maxi, tu devrais avoir la hauteur de ton cylindre...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

bonjour et merci,

 

je retrouve bien ma longueur de cylindre en faisant comme vous dites, mème si pour mes constructions de tube je change tres souvent de SCU.

 

Je trace d'abord mon axe de tube (bien sur il peut avoir différente orientation de SCU), puis j'oriente mon SCU Z suivant mon axe de tube et enfin je dessine mon cylindre.

 

Donc grace à votre méthode, en revenant dans le SCU Z de mon tube je retrouve bien ma longueur.

Par contre j'aimerais savoir maintenant comment retrouver le SCU de mon tube lors de sa création de tel maniere à traiter en automatique tout cet ensemble.

en gros :

1)sélection du cylindre

2)quel SCU lors de la crétion de mon cylindre

3)ensuite PROPMECA pour trouver la longueur de mon/mes cylindre

 

Merci encore pour cette réponse tres utile.

 

Posté(e)

rebonjour,

 

j'ai trouvé une solution (grace a vous),

il faut que j'extrais le volume de mon cylindre, et vu que je connais le rayon de celui ci,

je peux tres facilement en déduire ma longueur de tube.

 

par contre comment faire pour réussir à récupérer le diametre ou rayon de mon cylindre ?

 

merci

Posté(e)

Hihihi, bah tu divise la volume par la longueur !!!

 

Plus sérieusement, il existe un lisp qui traduit les données 3D du moteur volumique (ACIS) mais il ne marche que sur les versions

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

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

excellent,

 

merci de cette aide précieuse ....

autrement si quelqu'un saurait comment extraire le rayon d'un cylindre en LISP ...

ca serait sympa

 

a+

Posté(e)

Salut,

 

Je pense avoir trouvé quelque chose en Visual LISP.

 

Avec la propriété Position des primitives 3d (coordonnées du centre de la base du solide) et le centre de gravité (Centroid) on retrouve aisément la hauteur du cylindre, puis à partir du volume, le rayon.

 

(if (and
     ;; sélection du solide
     (setq cyl (car (entsel "\nSélectionnez un cylindre: ")))

     ;; transformation du nom d'entité en objet vla
     (setq cyl (vlax-ename->vla-object cyl))

     ;; l'objet est bien un solide 3d
     (= (vla-get-ObjectName cyl) "AcDb3dSolid")

     ;; l'objet est bien un cylindre (primitive)
      (= (vl-catch-all-apply 'vla-get-SolidType (list cyl)) "Cylindre")
   )

 (setq
   ;; hauteur du cylindre
   ht	(* 2 (distance (vlax-get cyl 'Position) (vlax-get cyl 'centroid)))

   ;; rayon du cylindre
   rad	(sqrt (/ (vla-get-Volume cyl) (* pi ht)))
 )

 (princ "\nEntité non valide.")
) 

 

PS : La propriété Position est peut-être arrivée avec la version 2007, comme la poignée située au centre de la base des primitives et qui sert à déplacer ces solides.

 

[Edité le 6/9/2007 par (gile)]

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

Posté(e)

merci beaucoup gile,

 

mais je ne suis déja pas bien fortiche en Lisp mais le Vlisp encore moins ....

j'ai trouvé comment charger le fichier déja !!!

mais il me met une erreur apres la sélection du cylindre :

 

Sélectionnez un cylindre: ; erreur: no function definition:

VLAX-ENAME->VLA-OBJECT

 

???!!!???!!!

 

en tout cas merci quand mème ...

Posté(e)

exact,

 

en gratouillant un peu à droite et à gauche, j'avais trouvé l'expression (vl-load-com).

je te remercie beaucoup, cela m'a vraiment fait avancer dans le bon sens.

 

Alles un autre défi ?

voila je voudrais que mon bout de prog sélectionne tout les cylindres

dans mon dessin pour en faire une liste que je pourrais transformer en fichier texte.

 

as-tu une idée ? j'ai planché dessus cette nuit jusqu'a au moins 2H du mat,

en Lisp, je pourrais y arriver, mais 'entsel' ,e reconnais pas les objets 'cylindre' ...

à moins que je me trompe de commande ....

 

a+ et merci encore ....

 

voila mon p'tit bout de prog :

 

(defun c:lg ()

 

(if (and

;; sélection du solide

(setq cyl (car (entsel "\nSélectionnez un cylindre: ")))

 

;; transformation du nom d'entité en objet vla

(setq cyl (vlax-ename->vla-object cyl))

 

;; l'objet est bien un solide 3d

(= (vla-get-ObjectName cyl) "AcDb3dSolid")

 

;; l'objet est bien un cylindre (primitive)

(= (vl-catch-all-apply 'vla-get-SolidType (list cyl)) "Cylindre")

)

 

(setq

;; hauteur du cylindre

ht (* 2 (distance (vlax-get cyl 'Position) (vlax-get cyl 'centroid)))

 

;; diametre du cylindre

diam (* 2 (sqrt (/ (vla-get-Volume cyl) (* pi ht))))

)

 

(princ "\nEntité non valide.")

)

 

(setq calque (cdr (assoc 8 (entget (car (entsel))))))

 

(princ)

(prompt "\nRepere ligne = ")

(princ calque)

(princ)

(prompt "\nDiamètre = ")

(princ diam)

(princ)

(prompt "\nLongueur = ")

(princ ht)

(princ)

 

 

)

Posté(e)

Salut,

 

Voilà un exemple avec sélection de tous les cylindres du dessin, affichage du résultat dans la fenêtre de texte et possibilité d'enregistrer ce résultat dans un fichier txt.

 

Tu devrais pouvoir l'adapter à tes besoins.

 

(defun c:lg (/ ss n cyl txt ht diam file)	; déclaration des variables locales

 ;; chargement des fonctions Visual LISP
 (vl-load-com)

 (setq txt "")

 ;; sélection de tous les solides du dessin
 (if (setq ss (ssget "_X" '((0 . "3DSOLID"))))

   ;; parcourir le jeu de sélection
   (repeat (setq n (sslength ss))

     ;; transformation du nom d'entité en objet vla
     (setq cyl (vlax-ename->vla-object (ssname ss (setq n (1- n)))))

     ;; si l'objet est un cylindre
     (if (= (vl-catch-all-apply 'vla-get-SolidType (list cyl))
     "Cylindre"
  )

(setq
  ;; hauteur du cylindre
  ht   (* 2
	  (distance (vlax-get cyl 'Position)
		    (vlax-get cyl 'centroid)
	  )
       )

  ;; diametre du cylindre
  diam (* 2 (sqrt (/ (vla-get-Volume cyl) (* pi ht))))

  ;; concatenation du texte
  txt  (strcat txt
	       "Repère ligne =\t"
	       (vla-get-Layer cyl)
	       "\nDiamètre =\t"
	       (rtos diam)
	       "\nLongueur =\t"
	       (rtos ht)
	       "\n\n"
       )
)
     )
   )
 )
 (if (/= txt "")
   (progn
     (textscr)				; afficher la fenêtre de texte
     (princ txt)

     ;; proposer l'enregistrement dans un fichier
     (initget "Oui Non")
     (if (= (getkword
       "\nEnregistrer dans un fichier ? [Oui/Non] : "
     )
     "Oui"
  )

;; choix et création du fichier
(progn
  (setq
    file
     (open
       (getfiled "Créez ou sélectionnez un fichier" "" "txt" 1)
       "w"
     )
  )
  (princ txt file)
  (close file)
)
     )
     (graphscr)			; retour à la fenêtre de dessin
   )
 )
 (princ)
) 

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

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é