Aller au contenu

Prob sur mon lisp


Ellionel

Messages recommandés

Bonjour ,

 

Je viens de faire de lisp :

---------------------------

(defun G_strtrim (s)

(cond

((/= (type s) 'str) nil)

(t (G_strltrim (G_strrtrim s)))

)

)

(defun G_strltrim (s)

(cond

((eq s "") s)

((/= " " (substr s 1 1)) s)

(t (G_strltrim (substr s 2)))

)

)

(defun G_strrtrim (s)

(cond

((eq s "") s)

((/= " " (substr s (strlen s) 1)) s)

(t (G_strrtrim (substr s 1 (1- (strlen s)))))

)

)

 

(defun G_strpos (c1 c2 / trouve i j l1 l2)

(setq trouve nil

i 1

l1 (strlen c1)

l2 (strlen c2))

(while (and (not trouve) (<= i l2) (<= l1 l2))

(if (eq (substr c1 1 1) (substr c2 i 1))

(progn

(setq trouve T

j 2)

(while (<= j l1)

(if (> (- (+ i j) 1) l2)

(setq trouve nil)

(if (/= (substr c1 j 1) (substr c2 (- (+ i j) 1) 1))

(setq trouve nil)

)

)

(setq j (1+ j))

)

)

)

(setq i (1+ i))

)

(if trouve

(eval (1- i))

(eval nil)

)

)

 

(defun c:cengra ( / fic ens )

 

(defun F_AffCenGra ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Centre*")))

(setq chaine (read-line fic_inf))

)

(if chaine

(setq chaine2 (read-line fic_inf))

)

(close fic_inf)

(if (and (wcmatch chaine "*X:*") (wcmatch chaine2 "*Y:*"))

(progn

(setq pos_x (g_strpos "X:" chaine))

(setq pos_y (g_strpos "Y:" chaine2))

(setq val_x (substr chaine (+ pos_x 2)))

(setq val_y (substr chaine2 (+ pos_y 2)))

(setq val_x (atof (G_strtrim val_x)))

(setq val_y (atof (G_strtrim val_y)))

(command "point" (list val_x val_y))

(setq gpt (list val_x val_y))

)

)

)

)

 

)

 

(defun F_RecupMom ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Moments d'inertie*")))

(setq chaine (read-line fic_inf))

)

(if chaine

(setq chaine2 (read-line fic_inf))

)

(close fic_inf)

(if (and (wcmatch chaine "*X:*") (wcmatch chaine2 "*Y:*"))

(progn

(setq pos_x (g_strpos "X:" chaine))

(setq pos_y (g_strpos "Y:" chaine2))

(setq val_x (substr chaine (+ pos_x 2)))

(setq val_y (substr chaine2 (+ pos_y 2)))

(setq val_x (atof (G_strtrim val_x)))

(setq val_y (atof (G_strtrim val_y)))

(list val_x val_y)

)

)

)

)

 

)

 

(defun F_RecupRay ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Rayon de giration*")))

(setq chaine (read-line fic_inf))

)

(if chaine

(setq chaine2 (read-line fic_inf))

)

(close fic_inf)

(if (and (wcmatch chaine "*X:*") (wcmatch chaine2 "*Y:*"))

(progn

(setq pos_x (g_strpos "X:" chaine))

(setq pos_y (g_strpos "Y:" chaine2))

(setq val_x (substr chaine (+ pos_x 2)))

(setq val_y (substr chaine2 (+ pos_y 2)))

(setq val_x (atof (G_strtrim val_x)))

(setq val_y (atof (G_strtrim val_y)))

(list val_x val_y)

)

)

)

)

 

)

 

(defun F_RecupAire( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Aire:*")))

(setq chaine (read-line fic_inf))

)

(close fic_inf)

(setq val_x (substr chaine 6))

(setq val_x (atof (G_strtrim val_x)))

)

)

 

)

 

(defun F_RecupBoite ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y

val_x1 val_x2 val_y1 val_y2

)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Boîte*")))

(setq chaine (read-line fic_inf))

)

(if chaine

(setq chaine2 (read-line fic_inf))

)

(close fic_inf)

(if (and (wcmatch chaine "*X:*") (wcmatch chaine2 "*Y:*"))

(progn

(setq pos_x1 (g_strpos "X:" chaine))

(setq pos_x2 (g_strpos "--" chaine))

(setq pos_y1 (g_strpos "Y:" chaine2))

(setq pos_y2 (g_strpos "--" chaine2))

(setq val_x1 (substr chaine (+ pos_x1 2) (- pos_x2 1)))

(setq val_x2 (substr chaine (+ pos_x2 2)))

(setq val_y1 (substr chaine2 (+ pos_y1 2) (- pos_y2 1)))

(setq val_y2 (substr chaine2 (+ pos_y2 2)))

(setq val_x1 (atof (G_strtrim val_x1)))

(setq val_x2 (atof (G_strtrim val_x2)))

(setq val_y1 (atof (G_strtrim val_y1)))

(setq val_y2 (atof (G_strtrim val_y2)))

(if (> (abs val_x1) (abs val_x2))

(setq val_x (abs val_x1))

(setq val_x (abs val_x2))

)

(if (> (abs val_y1) (abs val_y2))

(setq val_y (abs val_y1))

(setq val_y (abs val_y2))

)

(list val_x val_y)

)

)

)

)

 

)

(setvar "cmdecho" 0)

(command "pdmode" 34)

(command "pdsize" 0.0)

(setq fic "c:/toto.mpr")

(setq ens (ssget))

(if (and ens (> (sslength ens) 0))

(progn

(command "_massprop" ens "" "o" fic)

(F_AffCenGra fic)

(command "scu" "o" gpt )

(command "_massprop" ens "" "o" fic)

(command "scu" "" )

(setq val_sf (F_RecupAire fic))

(setq l_val (F_RecupBoite fic))

(setq l_val_ray (F_RecupRay fic))

(setq ray_x (car l_val_ray))

(setq ray_y (cadr l_val_ray))

(setq l_val_i (F_RecupMom fic))

(setq Ix_v (/ (car l_val_i) (cadr l_val)))

(setq Iy_v (/ (cadr l_val_i) (car l_val)))

(print Ix_v)

(print Iy_v)

(princ "\nPosition du texte...")

(command "texte" pause 3.0 0 (strcat "Ix = " (rtos (car l_val_i) 2 0) " mm4"))

(command "texte" "@0,-5" 3.0 0 (strcat "Iy = " (rtos (cadr l_val_i) 2 0) " mm4"))

(command "texte" "@0,-5" 3.0 0 (strcat "Ix/v = " (rtos Ix_v 2 0) " mm3"))

(command "texte" "@0,-5" 3.0 0 (strcat "Iy/v = " (rtos Iy_v 2 0) " mm3"))

(command "texte" "@0,-5" 3.0 0 (strcat "Aire = " (rtos val_sf 2 0) " mm2"))

(command "texte" "@0,-5" 3.0 0 (strcat "Rx = " (rtos ray_x 2 1) " mm"))

(command "texte" "@0,-5" 3.0 0 (strcat "Ry = " (rtos ray_y 2 1) " mm"))

)

(princ "\n\tAucun objet selectionne !")

)

(setvar "cmdecho" 1)

)

(princ)

 

---------------------

 

Mais il me plante avec le message " erreur: type d'argument incorrect: stringp nil "

 

Pouvez m'aider , svp ???

 

Merci

 

 

Lien vers le commentaire
Partager sur d’autres sites

Je pense que l'erreur peut venir de là

 

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine "Aire:*")))

(setq chaine (read-line fic_inf))

)

(close fic_inf)

(setq val_x (substr chaine 6))

(setq val_x (atof (G_strtrim val_x)))

 

Si après la boucle (while) ta variable chaine est à nil car (wcmatch) n'a pas abouti,

(substr chaine 6) vas forcément planter.

 

NB: Le message " erreur: type d'argument incorrect: stringp nil " veut dire qu'une chaine est attendue est que rien n'a pus être transmi.

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

Lien vers le commentaire
Partager sur d’autres sites

????

 

Est ce vraiment toi qui a pondu ce code?

Au vu de l'emploi des (cond et (if fait dans celui-ci, je suis surpris que tu poses cette question.

Ce n'est qu'une condition de plus à faire pour affecter par exemple une valeur "0.0" à ta chaine.

 

 

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

Lien vers le commentaire
Partager sur d’autres sites

Sur quelle version travailles tu?

Si ce n'est pas 2006 ou supérieure, j'essayerais de voir ce qui cloche de plus près à temps perdu.

 

Quel est le résultat que tout souhaite vraiment obtenir, il y a peut être d'autres cheminements possible (les fonctions vlax. pour les solides peuvent être utiles) au lieu de passer par un fichier texte.

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

Lien vers le commentaire
Partager sur d’autres sites

Je travaille sur Autocad 2007 .

 

Mon but est qu'a partir d'une région , je fasse apparaitre une boite de message aves les infos suivantes concernat le région soit :

 

Périmetre

Poids calculé : Aire*2.7

Moment d'inertie

Rayon de giration ,

Le centre de gravité .

 

Pour calculé , il faut que le centre de gravité au point 0,0 .

Voilou , cela est pour de la 2 d .

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Quelques lignes de code qui devraient répondre à ta question.

 

Il n'est pas nécessaire que centre de gravité de la région soit en 0,0, les moments d'inertie sont ceux calculés par rapport au centre de gravité (si tu veux les moments d'inertie par rapport au 0,0 remplace (setq mi (vlax-get reg 'PrincipalMoments)) par (setq mi (vlax-get reg 'MomentOfInertia))

La routine retourne les mêmes valeurs que la commande PROPMECA.

 

(vl-load-com)
(if (and
     (setq reg (car (entsel)))
     (setq reg (vlax-ename->vla-object reg))
     (= (vla-get-ObjectName reg) "AcDbRegion")
     (setq mi (vlax-get reg 'PrincipalMoments))
     (setq rg (vlax-get reg 'RadiiOfGyration))
     (setq cg (vlax-get reg 'Centroid))
   )
   (alert
     (strcat
"\nPérimètre : "
(rtos (vla-get-Perimeter reg))
"\nPoids : "
(rtos (* 2.7 (vla-get-Area reg)))
"\nMoment d'inertie, I : "
(rtos (car mi))
" J : "
(rtos (cadr mi))
"\nRayon de giration, X : "
(rtos (car rg))
" Y : "
(rtos (cadr rg))
"\nCentre de gravité, X : "
(rtos (car cg))
" Y : "
(rtos (cadr cg))
     )
 )
) 

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

Lien vers le commentaire
Partager sur d’autres sites

Merci ,

 

Ton code marche , c'est moi qui me suis trompé ,....

Pour les moments d'inerties , il faut que le centre de gravité soit en 0,0 car autocat donne les moments principaux autour du centre de gravité , ms pas les moments d'inertie ..

 

Merci ..

 

Est il possible , dans le cas ou il y aurait plusieurs regions de faire la somme des périmetres interieurs( tous sauf le plus grand ) , et d'afficher le périmetre exterieur ( le plus grand tout seul ) ...

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Voici une autre version qui déplace la région avant d'extraire les moments d'inertie et la replace ensuite.

Les résultats des différents moments (inertie et principaux) sont affichés, les coordonnées du centre de gravité sont données dans le SCU courant, à l'emplacement d'origine de la région.

 

(vl-load-com)
(if (and
     (setq reg (car (entsel)))
     (setq reg (vlax-ename->vla-object reg))
     (= (vla-get-ObjectName reg) "AcDbRegion")
   )
 (progn
   (setq cg (vlax-get reg 'Centroid))
   (vla-Move reg
      (vlax-3d-point (trans cg 1 0))
      (vlax-3d-point (trans '(0 0 0) 1 0))
   )
   (setq mp (vlax-get reg 'PrincipalMoments))
   (setq mi (vlax-get reg 'MomentOfInertia))
   (setq rg (vlax-get reg 'RadiiOfGyration))
   (vla-Move reg
      (vlax-3d-point (trans '(0 0 0) 1 0))
      (vlax-3d-point (trans cg 1 0))
   )
   (alert
     (strcat
"\nPérimètre :\t"
(rtos (vla-get-Perimeter reg))
"\nPoids :\t\t"
(rtos (* 2.7 (vla-get-Area reg)))
"\nMoment principaux,\tI : "
(rtos (car mp))
"\tJ : "
(rtos (cadr mp))
"\nMoments d'inertie,\tX : "
(rtos (car mi))
"\tY : "
(rtos (cadr mi))
"\nRayon de giration,\tX : "
(rtos (car rg))
"\tY : "
(rtos (cadr rg))
"\nCentre de gravité,\tX : "
(rtos (car cg))
"\tY : "
(rtos (cadr cg))
     )
   )
 )
) 

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

 

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

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

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

gile, pratique ton bout de code, mais tu ne calcul pas le Ix/v et Iy/v ce que fait le programme cengra

 

Pour répondre a la question

 

voila le probleme

 

(defun F_RecupBoite ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y

val_x1 val_x2 val_y1 val_y2

)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine " [surligneur] Boîte[/surligneur]*")))

(setq chaine (read-line fic_inf))

)

 

Dans les dernieres version d'autocad il a été remplacé par "Zone"

 

Correction

 

(defun F_RecupBoite ( fichier / fic_inf chaine chaine2 pos_x val_x pos_y val_y

val_x1 val_x2 val_y1 val_y2

)

(setq fic_inf (open fichier "r"))

(if fic_inf

(progn

(setq chaine (read-line fic_inf))

(while (and chaine (null (wcmatch chaine " Zone*")))

(setq chaine (read-line fic_inf))

)

 

et voilou

 

Ellionel pour le fun par contre j'aimerai bien savoir ou tu as repêcher le bout de code Cengra

 

 

 

 

[Edité le 13/7/2007 par frmahe]

Lien vers le commentaire
Partager sur d’autres sites

  • 13 ans aprè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 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é