Aller au contenu

orientation bloc en 3d


Messages recommandés

Invité ingoenius
Posté(e)

En suivant ce post

 

http://www.cadxp.com/sujetXForum-12016.htm

on arriva a un gros probleme pour moi,

 

comment peut on recuperer les rotations relative a un bloc (2d ou 3d) positionné dans l'espace et

avec diverses rotationselong la vue du haut de face ou de coté??

 

est possible le faire??

 

j'ai essaie d'insere un bloc en vue top poi le tourner de 20 degres, puis je passe en vue face et je donne un rotation au meme bloc de 30 degre et ensuite meme chose a partir de la vue side

 

maintenan comment recuperer ces info a partire du lisp????

 

 

merci a tous

 

 

 

 

[Edité le 5/10/2006 par ingoenius]

Posté(e)

Salut,

 

On ne peut pas récupérer directement en LISP les rotations 3D subies sur les 3 axes X Y et Z.

 

On peut récupérer le vecteur normal du plan XY du SCO du bloc :

 

(setq norm (cdr (assoc 210 (entget ent)))) ou (vlax-get (vlax-ename->vla-object ent) 'normal)

 

et la rotation globale par rapport à l'axe des X du SCG :

 

(setq norm (cdr (assoc 50 (entget ent)))) ou (vla-get-rotation (vlax-ename->vla-object ent))

 

Ces données, avec le point d'insertion, sont suffisantes pour replacer un bloc dans la même position.

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

Invité ingoenius
Posté(e)

merci

donc dans le cas d'un bloc selectionnes

 

comment tu inseres la bonne sintaxe pour recuperee les trois valeurs rot x roty rotz?

 

j'ai assayer a inserér tes lignes de code mais je n'obtiens rien ;-(

 

 

 

 
(defun C:Blend3 ()

(setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
(setq N (sslength SS))
(setq INDEX 0)

(setq STR "") ; chaine de caractère vide

;(repeat n     ; Répéter pour chaque bloc

(setq EL (entget (ssname SS INDEX)))
(setq nome (cdr (assoc 2 EL))) ;nom bloc


(setq PX (cadr (assoc 10 EL))) 	;Posizione x
(setq PY (caddr (assoc 10 EL))) ;Posizione y
(setq PZ (cadddr (assoc 10 EL)));Posizione y

(setq SX (cdr (assoc 41 EL))) 	; Fattore Scala x
(setq SY (cdr (assoc 42 EL))) 	; Fattore Scala y
(setq SZ (cdr (assoc 43 EL))) 	; Fattore Scala z


(setq rotX 0.0) 	; rot x
(setq rotX(/(* rotX 180.0)pi))

(setq rotY 0.0) 	; roty
(setq rotY(/(* rotY 180.0)pi))


(setq norm1 (cdr (assoc 210 EL))) 	; Fattore Scala z
(setq norm2 (cdr (assoc 50 EL))) 	; Fattore Scala z


(setq norm1 (cdr (assoc 210 (entget EL))))ou (vlax-get (vlax-ename->vla-object EL) 'normal)
(setq norm1(/(* norm1 180.0)pi))
 
;et la rotation globale par rapport à l'axe des X du SCG :

(setq norm2 (cdr (assoc 50 (entget EL)))) ou (vla-get-rotation (vlax-ename->vla-object EL))
(setq norm2(/(* norm2 180.0)pi))
 
 
(setq rotZ (cdr (assoc 50 EL))) 	; rotation z
(setq rotZ(/(* rotZ 180.0)pi))

)

 

[Edité le 5/10/2006 par ingoenius]

Invité ingoenius
Posté(e)

je suis en rain d'essaier ceci, mais j'ariva pas a suivre completement le raisonement, est ce cela ca vous semple correct ?? pour recuperer en degres les rotations 3d des blocs???

 

 

 

(defun C:Blend ()

(setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
(setq N (sslength SS))
(setq INDEX 0)

(setq STR "") ; chaine de caractère vide


;INIZIO DEL REPEAT ------------------------------------


 

 
(repeat n     ; Répéter pour chaque bloc

(setq EL (entget (ssname SS INDEX)))
(setq nome (cdr (assoc 2 EL))) ;nom bloc


;-------qui devo inserira la sostituzione dei nomi se necessaria

 
[surligneur]
(setq norm (cdr (assoc 210 EL))) ;direzione di estrusion  scu oggetto?
			 ;(vlax-get (vlax-ename->vla-object ent) 'normal)
(setq normX (car norm))
(setq normX(/(* normX 180.0)pi))  ;trasform to degres

(setq normY (cadr norm))
(setq normY(/(* normY 180.0)pi))  ;trasform to degres
(setq normZ (caddr norm))
(setq normZ(/(* normZ 180.0)pi))  ;trasform to degres
 [/surligneur]  

;et la rotation globale par rapport à l'axe des X du SCG :

(setq norm2 (cdr (assoc 50  EL))) ;ou (vla-get-rotation (vlax-ename->vla-object ent))
(setq norm2(/(* norm2 180.0)pi))  ;questa é la rotazione sull'asse z
 
 

(setq PX (cadr (assoc 10 EL))) 	;Posizione x
(setq PY (caddr (assoc 10 EL))) ;Posizione y
(setq PZ (cadddr (assoc 10 EL)));Posizione y

(setq SX (cdr (assoc 41 EL))) 	; Fattore Scala x
(setq SY (cdr (assoc 42 EL))) 	; Fattore Scala y
(setq SZ (cdr (assoc 43 EL))) 	; Fattore Scala z


(setq rotX 0.0) 	; rot x
(setq rotX(/(* rotX 180.0)pi))

(setq rotX normX);test 


(setq rotY 0.0) 	; roty
(setq rotY(/(* rotY 180.0)pi))

(setq rotY normY);test
 
(setq rotZ (cdr (assoc 50 EL))) 	; rotation z
(setq rotZ(/(* rotZ 180.0)pi))

(setq rotZ normZ);test

(setq str (strcat str ; ajout à la chaine précédente
nome
" "
(rtos PX)
" "
(rtos PY)
" "
(rtos PZ)
" "
(rtos rotX)
" "
(rtos rotY)
" "
(rtos rotZ)
" "
(rtos SX)
" "
(rtos SY)
" "
(rtos SZ)
"\n" ; saut de ligne
)
)
 (setq INDEX (1+ INDEX)) ;pour passer au bloc suivant
	) ; fin de repeat

(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)
)

Posté(e)

Salut,

 

Excuse moi pour cette réponse tardive.

 

Ta méthode n'est pas bonne, les coordonnées retournées par (cdr (assoc 210 EL)) ou (vlax-get obj 'Normal) sont celles du vecteur de une unité dont l'origine est en 0,0,0 et qui est perpendiculaire au plan XY du SCO de l'objet (la direction d'extrusion de ce plan).

 

J'ai trouvé un moyen, pas très orthodoxe, pour récupérer les angles de rotations suivant les axes X, Y et Z du SCG.

 

Par le calcul trigonométrique, à partir des coordonnée de la direction d'extrusion du bloc, on peut trouver une rotation sur X, puis, une fois celle ci effectuée, une rotation sur Y pour que le bloc revienne dans un plan parallèle au plan XY.

Ensuite n'ai pas su trouver le rapport entre l'angle retourné par (cdr (assoc 50 EL)) ou (vla-get-Rotation obj) et la rotation finale à effectuer sur Z.

Je propose donc un artifice, je fais faire au bloc ces deux rotations pour le remettre dans le plan XY, puis je récupère l'angle de rotation sur Z, et je refais les rotaion en sens et en ordre inverse pour remettre le bloc dans sa position initiale.

 

Attention pour remettre un bloc dans la même position, après insertion, il faut lui faire faire les rotations d'abord sur Z, puis sur Y, et enfin sur X (dans le fichier elles apparaissent dans l'ordre inverse).

 

Voici ce que je te propose à partir de ce que tu avais fait :

 

(defun C:Blend ()

 (setq SS (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
 (setq N (sslength SS))
 (setq INDEX 0)

 (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 norm (vlax-get obj 'normal))

   ;; Calcul des rotations sur X puis sur Y pour remettre le bloc dans le plan XY de SCG

   (setq rotX (- (atan (cadr norm) (caddr norm)))) ; rotation sur X
   (setq rotY (atan (car norm) (sqrt (- 1 (expt (car norm) 2)))))
				; rotation sur Y

   ;; Replace le bloc dans le plan XY du SCG

   ;; Rotation du bloc sur X
   (vla-rotate3d
     obj
     (vlax-3d-point ins)
     (vlax-3d-point (mapcar '+ ins '(1 0 0)))
     (- rotX)
   )
   ;; Rotation du bloc sur Y
   (vla-rotate3d
     obj
     (vlax-3d-point ins)
     (vlax-3d-point (mapcar '+ ins '(0 1 0)))
     (- rotY)
   )

   ;; Récupère la rotation du bloc sur Z
   (setq rotZ (vla-get-Rotation obj))

   ;; Replace le bloc dans sa position initiale
   (vla-rotate3d
     obj
     (vlax-3d-point ins)
     (vlax-3d-point (mapcar '+ ins '(0 1 0)))
     rotY
   )
   (vla-rotate3d
     obj
     (vlax-3d-point ins)
     (vlax-3d-point (mapcar '+ ins '(1 0 0)))
     rotX
   )

   (setq str (strcat str		; ajout à la chaine précédente
	      nome
	      " "
	      (rtos (car ins))
	      " "
	      (rtos (cadr ins))
	      " "
	      (rtos (caddr ins))
	      " "
	      (angtos rotX)
	      " "
	      (angtos rotY)
	      " "
	      (angtos rotZ)
	      " "
	      (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

 (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)
) 

 

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

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

Posté(e)

J'ai pas essayé le lisp de gile, mais j'admire ses résolutions de problèmes en 3D.

 

Personnellement, je me perds vite dans la compréhension en 3D.

En plus quand je lis ceci (concernant le SCO) dans l'aide DXF - Annexe B - concepts avancés .

 

Extrait:

Une fois qu'AutoCAD a établi le SCO pour une entité donnée, ce SCO fonctionne de la manière suivante : la valeur d'élévation conservée avec une entité indique dans quelle mesure il faut faire glisser le plan XY le long de l'axe Z (à partir de l'origine du SCG) pour le faire coïncider avec le plan qui contient l'entité. La valeur d’élévation définie par l’utilisateur est sans importance.

Tout point 2D entré dans le SCU est transformé en point 2D correspondant dans le SCO, qui est déplacé et pivoté par rapport au SCU.

 

Ce processus entraîne certaines conséquences :

 

Il n'est pas possible de savoir avec certitude quel était le SCU effectif lors de l'acquisition de l'entité.

Lorsque vous entrez les coordonnées XY d'une entité dans un SCU donné puis exécutez la commande SAUVENOM, il est peu probable que vous reconnaissiez ces coordonnées dans le fichier DXF. Vous devez connaître la méthode avec laquelle AutoCAD calcule les axes X et Y pour pouvoir travailler avec ces valeurs.

La valeur d'élévation conservée avec une entité et sortie dans les fichiers DXF est la somme de la différence entre la coordonnée Z du plan XY du SCU et du plan XY du SCO et de la valeur d'élévation spécifiée par l'utilisateur au moment où l'entité a été dessinée.

 

C'est compliqué le SCO :casstet:

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

Posté(e)

Là c'est pas évident, et avoir du passer par un artifice ne me satisfait à moitié.

 

Je ne comprends pas ce qu'indique la donnée "rotation" d'un bloc en 3D.

Tant qu'on est dans un plan parallèle au SCU (bloc uniquement pivoté sur Z), pas de souci, c'est l'angle par rapport à l'axe des X du SCG, mais si le bloc a subi une rotation sur un autre axe, impossible (pour moi) de comprendre à quoi il correspond !

Pourtant cette donnée plus l'angle d'extrusion doivent être suffisantes pour décrire l'orientation du bloc.

 

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

Posté(e)

Je me suis bien essayé au 3d, mais j'ai du mal à suivre.

Je pense que dans ce domaine, tu es le seul sur ce forum à décortiquer la 3D aussi pronfondément, pour l'instant (car un jour l'élève dépasse le maitre) ;)

 

Je penses qu'il faut arriver à comprendre le système d'axe abitraire, j'ai pu l'observé mais pas le comprendre.

 

J'avais trouvé un code interressant que je n'ai pas encore exploité car pas compris :(

 

Je sais plus qui est l'auteur désolé! Mais avec le nouveau Google Machin on pourras peut être retrouver

;;; this function as the cyclically next one after the given axis
;;; (e.g., if you give it a Z-axis, it returns a suitable X-axis).
;;;
;;; Example (ArbAxis (list 1.0 0.0 0.0))
;;;
(defun ArbAxis(v)
(if (and (< (abs (car v)) 0.015625) (< (abs (cadr v)) 0.015625))
	(VectorUnitize (VectorCrossProduct '(0.0 1.0 0.0) v))
	(VectorUnitize (VectorCrossProduct '(0.0 0.0 1.0) v))
)
)
(defun VectorCrossProduct(v1 v2)
(list
	(- (* (cadr v1) (caddr v2)) (* (cadr v2) (caddr v1)))
	(- (* (caddr v1) (car v2)) (* (caddr v2) (car v1)))
	(- (* (car v1) (cadr v2)) (* (car v2) (cadr v1)))
)
)
(defun VectorUnitize(v / dist)
(setq dist (VectorLength v))
(if (> dist 0.0)
	(list (/ (car v) dist) (/ (cadr v) dist) (/ (caddr v) dist))
	v
)
)
(defun VectorLength(v / dist)
(setq dist
	(+
		(* (car v) (car v))
		(* (cadr v) (cadr v))
		(* (caddr v) (caddr v))
	)
)
(if (> dist 0.0)
	(sqrt dist)
	0.0
)
)

 

Voilà j'espère que ça va te combler et te permettre d'avancer encore... :exclam:

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

Posté(e)

Merci Bonus, très intéressant :D

 

Certaines de ces lignes de code rappellent ce sujet à propos de vecteurs et calcul vectoriel.

 

Le code que tu donnes propose de calculer le vecteur directeur d'un axe X arbitraire à partir d'un vecteur unitaire v qui serait le directeur de l'axe Z.

 

Ce code met en oeuvre l'Algorithme d'axe arbitraire décrit dans l'aide aux développeurs >> Référence DXF >> Concepts DXF avancés (la page suivant celle citée plus haut).

 

Il utilise le produit vectoriel de deux vecteurs (fonction VectorCrossProduct, que j'avais de mon côté appelé v^v).

 

Le produit vectoriel de deux vecteurs de direction différentes (concourants, donc définissant un plan) est un vecteur perpendiculaire à ces deux là (normal au plan). Si ce vecteur est ramené à une unité, c'est le vecteur normal du plan, il peut être un vecteur directeur pour un axe X d'un repère (système de coordonnées) dont v serait le directeur de l'axe Z.

 

Le vecteur utilisé pour faire le produit vectoriel avec v sera soit le vecteur Y du SCG (0,1,0) soit le vecteur Z (0,0,1). C'est l'algorithme d'axe arbitraire qui permet de déterminer lequel des deux est retenu. Si le vecteur v est proche du vecteur Z du SCG, ses coordonnées x et y sont inférieures à 1/64, le vecteur X arbitraire sera le produit du vecteur Y du SCG par v, sinon le résultat du produit vectoriel de du vecteur Z du SCG par v.

 

En faisant le produit vectoriel de v par le vecteur X arbitraire trouvé on obtiendrait un autre vecteur, qui ramené à une unité, serait le troisième vecteur de notre repère (axe Y).

 

Attention toutefois le produit vectoriel n'est pas une opération commutative. Si on inverse l'ordre dans lequels sont passés les arguments, le résultat sera le vecteur inverse (règle de la main droite) :

 

(v^v '(1 0 0) '(0 1 0)) retourne (0 0 1)

(v^v '(0 1 0) '(1 0 0)) retourne (0 0 -1)

 

Dans le même esprit, on peut voir aussi ici une explication pour créer un SCU à partir de trois points.

 

 

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

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

Posté(e)

Grace à la piste donnée par Bonuscad, on peut reconstituer le SCO d'un bloc, et il semble bien que la rotation (code DXF 50) corresponde à l'angle avec l'axe des X du SCO.

 

Je vérifie tout ça et, si je trouve, je redonne un LISP plus "mathématique" pour extraire les rotations sur les différents axes.

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

Posté(e)

J'ai réussi à trouver un solution moins "bricolage".

 

Les rotations du bloc subies sur les axes Y et Z sont calculées à partir des coordonnées du vecteur "rotvec".

Ce vecteur est une rotation du vecteur X (1,0,0) du SCO, d'un angle égal à "rot" (code DXF 50), dans le plan du SCO.

 

La rotation du bloc sur l'axe X est calculée à partir des rotations inverses sur les axes Y et Z du SCG, appliquées à l'aide de matrices de rotation, du vecteur norm (direction d'extrusion du SCO code DXF 210).

 

Deux petites routines son nécéssaires au fonctionnement du LISP (asin et mxv).

 

Les coordonnées du point d'insertion son retournées dans le SCG, les angles de rotations suivant les axes X, Y et Z du SCG au point d'insertion.

 

Pour faire subir les mêmes rotation aux blocs dans un aure fichier il faut les appliquer dans l'ordre : rotation sur X, puis sur Y et enfin sur Z.

 

;;; ASIN Retourne l'arc sinus du nombre, en radians

(defun ASIN (num)
 (if (    (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 (/ 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 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))
	      " "
	      (rtos (cadr ins))
	      " "
	      (rtos (caddr ins))
	      " "
	      (angtos rotX)
	      " "
	      (angtos rotY)
	      " "
	      (angtos rotZ)
	      " "
	      (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

 (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)
) 

 

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

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

Posté(e)

Salut ingoenius,je suis un gros utilisateur de 3D sous Autocad, et par intéret pourrais-tu m'expliquer que est l'utilité de ce que tu demandes ?.

 

Merci.

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Invité ingoenius
Posté(e)

alors, de retour du we je suis dejà aux test, alors merci

 

ancore a vous tous, je pense que ce soit presque bon.

 

seul souci avec le dernier script que tu as poste, le dernier quand je reimporte avec ces donnes les mesh dans blender j'ai (si les bloc ont subis des rotation sur tous les axes des legers decalages)

 

j'arrive pas a savoir de quoi depend cela ci c'est de pertes d'informations apres les convertions ou quoi ?

 

la chose bizarre est que si les bloc on subi une rotation sur seulement 2 axes ca marche parfait, de que le fai des rot sur les trois axes je trouve de decalages (qui sont toujours de meme quantité)

peut etre il aurait un petit probleme de calcul ou de conversion quelque part?

 

PS

Je retire ce que jeai dit plus haut, le script marche pairfectement, il faut seulement

avoir dans (format controle des unité de autocad ) un niveau de precision elevé pour le calcul des degrae

, moi j'ai mis precision de degras a 0.000000 et c'est parfait

 

a ce point je sais pas si cette option de calcul est implementable directement dans le script

 

de que tout sera terminé je ferais un petit turoriel explicant la facon de passer de bloc de autocad a blender en utilisant 2 script et une biblioteque personnaliseé

 

;-)

 

 

 

 

 

[Edité le 9/10/2006 par ingoenius]

Invité ingoenius
Posté(e)

j'ai ajoutés quelque ligne au code pour resoudre le probleme de precision

 

seul souci avec le dernier script que tu as poste, le dernier quand je reimporte avec ces donnes les mesh dans blender j'ai (si les bloc ont subis des rotation sur tous les axes des legers decalages)

 

i

(setvar "aunits" 0);set des unité pour le degres 
(setvar "auprec" 6);set des precision  pour le degres 

 

 

avec cela c'est parfait ! merci encore a vous tous ;-)

Posté(e)

Salut,

 

si tu veux ganer en précision sans changer la valeur de AUPRC, et gagner aussi en précision pour le point d'insertion, tu peux remplacer :

 

(rtos (car ins))

" "

(rtos (cadr ins))

" "

(rtos (caddr ins))

" "

(angtos rotX)

" "

(angtos rotY)

" "

(angtos rotZ)

" "

 

par :

 

(rtos (car ins) 2 14)

" "

(rtos (cadr ins) 2 14)

" "

(rtos (caddr ins) 2 14)

" "

(angtos rotX 0 14)

" "

(angtos rotY 0 14)

" "

(angtos rotZ 0 14)

" "

 

et tu auras 14 décimales.

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

Invité ingoenius
Posté(e)

merci gile,

c'est parfait, tout ca

 

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é