• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Blocs de rotation de transcription de problèmes avec extraction d'info

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.

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)
)
 
rappeler la fonction en passant l'entité nom <n> et les <tipo> vous voulez que je revienne.
puis pour obtenir les trois axes de rotation, rappelle la fonction 3 fois:
(setq rotxy (fnbloccorot n "xy")
(setq rotxz)
(setq rotyz)

salutations

c'est la fonction:
; blocs construits avec des entités extrudées selon l'axe z du monde ucs
; n: nom de l'entité; type: "xy" (rotation piano xy), "xz" (rotation piano xz), "yz" (rotation piano yz)
(défun fnbloccorot(n type / pourriture x y z pt)
(setqnt)
(setq pt (cdr (assoc 210 en)))
(setq x (car pt))
(setq y) (cadr pt)
(Sectq z)
(cond)
((= type "xy") (pourriture de setq (cdr)))
((= type "xz") (pourriture de setq (angle (liste 0 0) (liste x z 0,0))))
((= type "yz") (pourriture de setq (angle (liste 0 0) (liste y z 0,0))))
)
; des rayons aux sessadecimali
(pourriture de setq (*(/ 180,0 pi)))
; fonction retourne la conversion en nombre réel de la chaîne d'angle avec précision à 6 décimales
; utilisé pour arrondir la mesure à 6 décimales
(au (rtos pourriture 2 6)
)</tipo></n>
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut