ingoenius
Guest
Bonjour tout le monde J'ai un lisp de fichier que je dois extraire dans le fichier texte l'emplacement des coordonnées et le nom du bloc d'échelle
en général cela fonctionne, mais j'ai le problème de transcrire correctement les rotations des blocs lorsque le bloc et tourné sur plusieurs axes en 3d
Je t'ai mis ici sous mon nez si quelqu'un de plus expérimenté (pour jeter un oeil serait parfait
Je vous remercie.
en général cela fonctionne, mais j'ai le problème de transcrire correctement les rotations des blocs lorsque le bloc et tourné sur plusieurs axes en 3d
Je t'ai mis ici sous mon nez si quelqu'un de plus expérimenté (pour jeter un oeil serait parfait
Je vous remercie.
Code:
;;; asin retourne l'arc sinus du nombre, en radians
(vl-load-com)
(defun asin (num)
(if (<= -1 num 1)
(atan num (sqrt (- 1 (expt num 2))))
)
)
;;; apply a transformation matrix to a vector by vladimir nesterovsky
(defun mxv (m v)
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)
;(defun c:blend ()
(defun c:blender (/ ss n index str obj nome ins rot norm rotvec rotx roty rotz rotvec file)
(setq ss (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
(setq n (sslength ss))
(setq index 0)
(setq old-arcunits (getvar "aunits"))
(setq old-arcprec (getvar "auprec"))
;(setvar "aunits" 0) ;set des unité pour le degres
;(setvar "auprec" 6) ;set des precision pour le degres
(setq str "") ; chaine de caractère vide
;inizio del repeat ------------------------------------
(repeat n ; répéter pour chaque bloc
(setq obj (vlax-ename->vla-object (ssname ss index)))
(setq nome (if (vlax-property-available-p obj "effectivename")
(setq nome (vla-get-effectivename obj))
(setq nome (vla-get-name obj))
)
)
(setq ins (vlax-get obj 'insertionpoint))
(setq rot (vla-get-rotation obj))
(setq norm (vlax-get obj 'normal))
;; calcul de la rotation du vecteur x dans le sco du bloc
(setq rotvec (trans (polar '(0 0 0) rot 1.0) norm 0))
;; calcul des rotations subie par le bloc sur y puis sur z
(setq roty (- (asin (caddr rotvec)))) ; rotation sur y
(setq rotz (atan (cadr rotvec) (car rotvec))) ; rotation sur z
;; calcul de la rotation inverse subie par le vecteur normal sur z
(setq zvec (mxv (list
(list (cos (- rotz)) (- (sin (- rotz))) 0)
(list (sin (- rotz)) (cos (- rotz)) 0)
'(0 0 1)
)
norm
)
)
;; calcul de la rotation inverse subie par le vecteur normal sur y
(setq zvec (mxv (list
(list (cos (- roty)) 0 (sin (- roty)))
'(0 1 0)
(list (- (sin (- roty))) 0 (cos (- roty)))
)
zvec
)
)
;; calcul de la rotation subie par le bloc sur x
(setq rotx (- (atan (cadr zvec) (caddr zvec))))
(setq str (strcat str ; ajout à la chaine précédente
nome
" "
(rtos (car ins)2 6);6 é la quantità di decimali da calcolare
" "
(rtos (cadr ins)2 6)
" "
(rtos (caddr ins)2 6)
" "
(angtos rotx 0 8);8 é la quantità di decimali da calcolare
" "
(angtos roty 0 8)
" "
(angtos rotz 0 8)
" "
(rtos (vla-get-xscalefactor obj))
" "
(rtos (vla-get-yscalefactor obj))
" "
(rtos (vla-get-zscalefactor obj))
"\n" ; saut de ligne
)
)
(setq index (1+ index)) ;pour passer au bloc suivant
) ; fin de repeat
;(setvar "aunits" old-arcunits)
;(setvar "auprec" old-arcprec)
(if
(setq file (getfiled "seletionner un fichier" "" "txt" 1))
;choisir ou créer un fichier
(progn
(setq file (open file "a")) ; ouvrir lr fichier
(princ str file) ; écrire dans le fichier
(close file) ; fermer le fichier
)
)
(princ)
)