Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Dans une routine, j'ai p1 et p2 qui sont deux points, je stock l'angle entre les deux ici :

(command "-unites" "2" "2" "3" "2" "0,0" "@0,1" "O")
....
(vlax-ldata-put "General" "AngSCU" (angle p1 p2))

 

Mais je n'arrive pas à récupérer un "angle"... Et j'ai presque tous essayé :

(setq rot 0)
(if	(= (setq rot (getorient p1 (strcat "\nOrientation du texte :"))) 0)
	(progn (setq rot (angtof (angtos (vlax-ldata-get "General" "AngSCU") (getvar "AUNITS") 4) 2))

 

Tous ceci fonctionne très bien pour générer des erreurs... Mais ce n'est pas mon but... J'en appel aux CadXPiens...

 

Autre petit truc, parfois, AutoCAD me corrige l'angle, exemple, si (angle p1 p2) fait 252.29g, il me le ramène à 52.29g ? ?

 

Quelqu'un aurrait une idée ?

 

PS : merci à CadXP pour toutes ces routines... Tous ce qui est écrit ici viens de CadXP... Merci à tous...

 

 

 

Posté(e)

C'est ce que je pensais, mais même avec ça :

(vlax-ldata-put "Phalene" "AngSCU" (* 200.0 (/ (angle p1 p2) pi)))

qui me stock bien un angle ( ex : 254.29 et non "254.29"), ca plante ! !

 

Sniffff.....

 

Merci...

Posté(e)

Salut

La formule pour convertire des radians en degrés

 

(vlax-ldata-put "Phalene" "AngSCU" (* 180.0 (/ (angle p1 p2) pi)))

 

Je ne comprends pas ton problème. Tu écris une valeur en réel

Si tu souhaites la récuperer en texte, fais

(rtos (vlax-ldata-get "Phalene" "AngSCU"))

 

@+

 

[Edité le 10/10/2006 par Patrick_35]

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)

Merci Patrick_35,

 

En fait (je travail en grades) mais je stock bien un réelle, mais dans ma routine, j'ai :

(if (= (setq rot (getorient p1 (strcat "\nOrientation du texte :"))) 0 )
   (setq rot (vlax-ldata-get "Phalene" "AngSCU"))
   )

Et lors de l'exécution, AutoCAD me réponds :

; erreur: type d'argument incorrect: numberp: nil

Spécifiez l'angle de rotation <100g>: *Annuler*

 

Je n'arrive pas à saisir pourquoi...

 

Merci.

Posté(e)

:cool: Milles excuses, mais il est long et fait appel à d'autres LiSP...

 

Je suis en train de faire ces routines, alors le mise en forme laisse vraiment à désirer, et il y a encore plein de truc en double ou qui ne servent à rien.... Je ferais le tri quand je serais meilleur en LiSP...

 

Voici celui qui créé un texte :

 

 

(defun c:phTexte (NomTxt Police Comp Inclin NomCalq Coul Just Haut Texte PreCalq / p1 rot)
 (setvar "CMDECHO" 0) 
 (if (= (setq Ech (vlax-ldata-get "Phalene" "Ech1")) nil) (PhEch))
 ;(setq Haut (atof Haut))

   (setq rot (vlax-ldata-get "Phalene" "AngSCU"))
(princ "\nRotation : ")
	(princ rot)
 (if (= Texte "")
   (setq Texte (getstring T "\nTexte :"))
 ) ;_ Fin de if
 (if (not (tblsearch "STYLE" NomTxt))
   (command "-style" NomTxt Police "0" Comp Inclin "N" "N" "N")
   (command "-style" NomTxt Police "0" Comp Inclin "N" "N" "N")
   ) ;_ Fin de if
 (if (= Just "") (setq Just "c"))
 
   (setq p1 (getpoint "\nPosition du texte : "))
   (if (null p1) (setq p1 (getvar "lastpoint")))
 (setq VOrtho (getvar "orthomode"))
 (setvar "orthomode" 1)
 (princ "\nAngle en Data : -")
(princ (vlax-ldata-get "Phalene" "AngSCU"))
 (princ "-\n")
 (if (= (setq rot (getorient p1 (strcat "\nOrientation du texte :"))) 0 )
   (setq rot (vlax-ldata-get "Phalene" "AngSCU"))
   )	
   (setvar "orthomode" VOrtho)
   ;(if (not rot) (setq rot (getvar "snapANG"))) 
 (setq Lign "-")
 (if (/= NomCalq "-") (c:phCreaCalq NomCalq Coul "-" PreCalq)) 
 (setq Haut (atof Haut))

 (progn
     ;(princ rot)
     (command "-calque" "e" (strcat NomCalq " " (rtos (fix Ech) 2 0)) "co" Coul "" "")
     (setq js (ssadd))
     (command "_-mtext" "_none" p1 "j" Just "h" (/ (* Haut Ech) 1000.0) "_r" (polar p1 (+ rot (/ pi 2)) 1000) "_w" "0.00" Texte "" ) ;_ Fin de command
     
      (if (and
          (/= (setq Ech (vlax-ldata-get "Phalene" "Ech2")) nil)
          (/= (setq Ech (vlax-ldata-get "Phalene" "Ech2")) 0)
          )
       (progn
         (command "-calque" "e" (strcat NomCalq " " (rtos (fix Ech) 2 0)) "co" Coul "" "")
         (setq js (ssadd (entlast) js))
         (command "_-mtext" "_none" p1 "j" Just "h" (/ (* Haut Ech) 1000.0) "_r" (polar p1 (+ rot (/ pi 2)) 1000) "_w" "0.00" Texte "" )
       ) ;_ Fin de progn
     ) ;_ Fin de if
   )
 (setq js (ssadd (entlast) js))
 (command "_move" js "" "_none" p1)
)

 

Et voici celui qui stock cette fameuse variable :

(defun c:_OrientSCU ();  Il n'y a pas de _ avant OrientSCU  , sinon, ça fait c:OrientSCU 
 (setq Echo (getvar "cmdecho"))
 (setvar "cmdecho" 0)
 (command "-unites" "2" "2" "3" "2" "0,0" "@0,1" "O")
 (setvar "pdmode" 32)
 (setvar "pdsize" 0.1)
 (setvar "plinegen" 1)
 (command "-couleur" "ducalque")
 (setvar "filedia" 1)
 (setvar "attdia" 1)
 (command "-typeligne" "a" "ducalque" "")
 (command "_ucs" "_w")
 (setq p1 (getpoint "\nPoint de départ : "))
 (setq VOrtho (getvar "orthomode"))
 (setvar "orthomode" 0)
 (setq p2 (getpoint p1 (strcat "\nDirection des X :")))
 (princ "\nOrientation : ")
 (setvar "orthomode" VOrtho)
 (setvar "cmdecho" 1)
 (setvar "snapang" (angle p1 p2))
(setq AnSc (+ (* 200 (/ (angle p1 p2) pi) (/ pi 2))))
(princ "\n******")
(princ AnSc)
 (setq p3 (polar p1 (+ (angle p1 p2) (/ pi 2)) 1000))
 (vlax-ldata-put "Phalene" "AngSCU" (* 200.0 (/ (angle p1 p2) pi)))
 (princ "\nAngle en Data :")
(princ (vlax-ldata-get "Phalene" "AngSCU"))
;(princ (angle p1 p2))
 (command "_ucs" "_z" p1 p3)
 (command "_ucs" "_w")
 (command "resol" "r" p1 p2)
 (setvar "snapmode" 0)
 (setvar "cmdecho" Echo)
 )

 

Merci pour tout... Et bon courage pour comprendre ce "charabia" ! ! ;)

Posté(e)

Salut Deleligne, ou devrais-je dire DenisH ?

 

Debuguer un code écrit par un autre n'est pas toujours une chose agréable, le tien est particulièrement confus et tu le sais.

Tu aurais pu/dû le nettoyer un minimum avant de demander à d'autres de mettre leur nez dedans.

 

Je ne peux, en l'état comprendre, ce que tu veux faire avec ces LISP.

Donc, juste en regardant de loin, j'ai remarqué l'expression :

 

(setq AnSc (+ (* 200 (/ (angle p1 p2) pi) (/ pi 2))))

 

qui me semble très curieuse, la fonction + ne sert à rien, et si elle servait comme on peut l'imaginer, pour ajouter (* 200 (/ (angle p1 p2) pi)) à (/ pi 2) cela reviendrait à ajouter des grades à des radians.

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

Posté(e)

Bonjour à tous...

 

Bien vu (gile), j'ai réparé le Net au boulo et aujourd'hui, j'ai amené le mot de passe pour DenisH...

 

Bon, J'ai en fait deux "petits" problèmes...

 

Le premier : je demande à l'opérateur de saisir 2 points, qui me donneront la direction pour orienté le dessin parallèlement au carroyage. Je change la résol et la rotation du plan (variable ANGBASE, je croix), pour avoir un curseur parallèle au carroyage et un carroyage parallèle à l'écran.

 (setq p1 (getpoint "\nPoint de départ : "))
 (setq p2 (getpoint p1 (strcat "\nDirection des X :")))

Ensuite, je stock cet angle dans le dessin mais... AutoCAD ne stock pas ce qu'il me dit :

 

(vlax-ldata-put "Phalene" "AngSCU" (angle p1 p2))
 (princ "\nAngle en Data :")
 (princ (vlax-ldata-get "Phalene" "AngSCU"))

L'angle p1 p2 est de 203.59gr, mais lors du princ, AutoCAD me l'affiche en radian...

 

Donc, quand je récupère cette variable dans d'autres lisp, mon angle n'est pas comme il le faudrait :

(if (= (setq rot (getorient p1 (strcat "\nOrientation du texte :"))) 0 )
   (setq rot (vlax-ldata-get "Phalene" "AngSCU"))
   )

 

Et mon texte (par exemple) n'est pas parallèle au carroyage mais presque (la valeur en radian donne un tout petit angle en grade si on ne le converti pas)

(command "_-mtext" "_none" p1 "j" Just "h" 1 "_r" rot "_w" "0.00" Texte "" )

 

Ca, c'était mon premier problème, le deuxième est beaucoup plus simple (heureusement :) ) :

Une fois la saisie des deux coins de carroyage faite, je saisi la rotation de l'angle de "RESOL" et AutoCAD me dit :

Spécifiez le point de base <1127.92,5212.21>: Spécifiez l'angle de rotation <203.59g>:

Angle ajusté à 3.59g

Et mes textes, si j'utilise la variable "ANGBASE" se retrouves à l'envers...

Je comprend AutoCAD, qui n'a pas besoin d'un ANGBASE supérieur à 100...

Mais ma direction peut aller de 0 à 400 ( où 400 sera ajusté à 0, et là, c'est Ok pour moi).

 

Donc, voilà mon problème...

Je demande à l'opérateur de cliquer sur le coin "BasGauche" du carroyage, puis le coin "BasDroite". J'oriente la vue pour que le carroyage soit parallèle au bas de l'écran, je stock cet angle dans le dessin. Et plus jamais l'opérateur n'aura à se soucier de l'angle avec le SCU pour écrire un texte horizontal...

 

J'espère avoir été compréhensible... Ce n'est pas facile d'expliquer ce qu'on veux faire entre AutoCAD, le LiSP et la saisi, à des personnes qui n'ont pas forcément la même méthode de travail...

 

Merci encore à tous...

 

Maintenant, au boulo comme à la maison, c'est DenisH... ;) (Il faudrait que je demande à Patrick d'annulé "Deleligne", ainsi que "CabinetD" qui était moi et un collègue)

 

Voilà, sur ce, je vous souhaite, à tous, une bonne journée... Bien profiteuse...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

(vlax-ldata-put "Phalene" "AngSCU" val) stocke la valeur val que tu lui donnes ,

et (vlax-ldata-get "Phalene" "AngSCU") te retourne cette valeur.

(angle p1 p2) retourne un angle en radian.

 

AutoCAD fait tous les calculs en radians, c'est uniquement lors de la saisie de donnée par l'utilisateur avec (getangle ...) ou (getorient ...) et du passage d'arguments à la fonction (command ...) que sont utilisées les unités angulaires définies dans AUNITS.

 

Si tu veux stocker un angle en grades, tu peux le convertir quand tu le passes comme argument à vlax_put_ldata :

(vlax-ldata-put "Phalene" "AngSCU" [surligneur] (* 200 (/ (angle p1 p2) pi))[/surligneur])

 

Sinon, tu fais toutes tes opérations en radians, jusqu'à ce que tu aies besoin de convertir l'angle en grades, à savoir pour le passer comme argument de la fonction command :

(command "_-mtext" "_none" p1 "j" Just "h" 1 "_r" [surligneur] (* 200 (/ rot pi))[/surligneur] "_w" "0.00" Texte "" )

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

Posté(e)

Merci beaucoup (gile).

 

Mais, est-il nécessaire de passer en grade ? Car l'angle cet angle n'est jamais saisi directement (au clavier) par l'opérateur...

 

On travail en grade parce qu'on est géomètre... Mais cela nous sert uniquement quand on demande une distance...

 

Merci encore et bonne journée.

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Mais, est-il nécessaire de passer en grade ?

 

Oui, si comme dit plus haut tu uilises la fonctions (command ...) pour laquelle les arguments sont les mêmes que ceux entrés au clavier.

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

Posté(e)

Ok, bien reçu...

 

Merci encore...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bon, j'ai, me semble-t'il, résolu le problème...

 

Enfin, "j'ai"... c'est plustôt "vous" mais c'est MOI qui ai fais le "copier/coller" ;)

 

Je stock donc mon angle comme ça :

	(setq AngScu (- 500 (* 200 (/ (angle p1 p2) pi))))
(if (<= AngScu 400) (- AngScu 400))
 (vlax-ldata-put "Phalene" "AngSCU" AngScu)

 

Et je le récupère comme ça :

(if (= (setq rot (getorient p1 (strcat "\nOrientation du texte :"))) nil )
   (progn
		;* * * * * * * Orientation horizontale
		(setq rot (- (vlax-ldata-get "Phalene" "AngSCU") 100))
		)
	(progn
		;* * * * * * * Orientation alignée
		(setq rot (- 400 (* 200 (/ rot pi))))
   	(if (<= rot 400) (- rot 400))
		)
   )

 

Oui, je sais, soustraire l'angle à 500, c'est nul, je suis d'accord, mais l'ordre des "setvar" de ma routine doit mettre l'origine des Y à l'EST et pas au NORD... ou c'est le sens d'AutoCAD... ou un truc comme ça... Mais comme je suis SUPER à la bourre dans mon boulo... je n'ai pas le temps de chercher le pourquoi du comment.

 

Je le ferais plus tard... ( bref... jamais) ;)

 

Merci BEAUCOUP à TOUS ! !

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut (gile)...

 

Bien sur qu'elle sert à quelque chose.... Elle sert à ma faire penser à ne pas oublier le setq... ;)

 

Aaaaah.... Il est si bon de rire, parfois...

 

J'ai donc maintenant :

 

(if (<= rot 400) (setq rot (- rot 400)))

 

Mais je ne sais pas si cela sert à grand chose... Puisque un texte à la même orientation dans ces deux cas : angle = 525 et angle = 125...

 

Mais celà dit... Je te remerci encore beaucoup...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

  • 2 semaines après...
Posté(e)

Pfffffff, y-a rien à faire ! !

 

"j'entrave quedalle" (H.Simpson)

 

J'ai rot = 51.38 (pas "51.38" ni "51.38g"), PIns les coordonnées d'un point

 

Mais

 (command "_.line" PIns (polar PIns (- rot 300) 5) "")

Me donne une ligne de 5 de long, mais de 51.38 d'angle dans le sens trigo, alors que je suis dans le sens horaire ! !

 

Il n'y a rien à faire... Tous les efforts surhumains de (gile) n'en viennent pas à bout ! ! (les miens nonplus...)

 

Quand je lance la commande "distance" pour connaitre le bon angle, j'obtiens bien 51.38.

 

Quoi c'est ti que c'truc là ? ?

 

Merci,

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Pardon, je continuais mes "expériences" et je me suis relu...

 

Je reformule :

 

Dans :

  (command "_-mtext" "_none" pins "j" "hg" "h" (/ (* Haut Ech) 1000.0) "_r" rot "_w" "0.00" Texte "")
 (princ (- rot 300))
 (command "_.line" pins (polar pins rot 5) "")

Pourquoi ma ligne n'est pas le long du texte (qui lui est bien orienté) ?

 

Merci à vous,

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut,

 

Pour la fonction POLAR, l'argument angle est exprimé en radians, à partir de l'axe des X du SCU courant, dans le sens trigonométrique.

 

Pour la fonction COMMAND les angles sont exprimés en unités courantes, et tiennent compte des paramètres courants ANGDIR et ANGBASE.

 

Donc si rot est un angle en unités courantes (le grade pour toi) pour le traduire en radians dans le sens trigonométrique, à partir de l'axe des X du SCU :

 

(setq rot_rd (* (/ rot 200.0) pi)) ; traduction des grades en radians
(if (= 1 (getvar "ANGDIR")) ; inversion si sens horaire
 (setq rot_rd (- rot_rd))
 )
(setq rot_rd (+ (getvar "ANGBASE") rot_rd)) ; prise en compte de ANGBASE

(command "_.line" "_non" pins "_non" (polar pins rot_rd 5) "")

 

PS : la rotation d'un texte est exprimée à partir de l'axe X du SCU courant quelque soit la valeur de ANGBASE, donc pour que la ligne soit parallèle au texte, il ne faut pas faire la dernière conversion (prise en compte de ANGBASE).

 

[Edité le 25/10/2006 par (gile)]

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é