Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Décidément, j'ai du mal avec les matrices. Dire que (gile) est modeste quand je vois ce qu'il est capable de faire.

 

Donc, je lance une bouteille à la mer.

Dans une présentation et dans une fenêtre active (cvport <> 1), un (trans (trans pt 0 2) 2 3) me retourne la bonne valeur.

Par contre, dans l'espace papier (cvport = 1), le résultat peut-être différent :o (scu <> sgc dans la fenêtre, fenêtre sur une partie du dessin par exemple).

 

J'aimerai en conséquence retrouver le premier résultat sans utiliser la fonction trans, en étant dans l'espace papier et uniquement avec une matrice, ceci pour éviter d'activer la bonne fenêtre, d'utiliser trans, de retourner dans l'espace papier et d'alourdir considérablement le temps d'exécution.

 

Merci

 

@+

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)

Salut,

 

Si j'ai bien compris, voici 6 fonctions de traductions de coordonnées, les arguments requis sont le point à traduire et l'objet Viewport (ename ou vla-object) qui n'a donc pas besoin d'être activé :

 

- WCS2DCS : pour traduire du SCG vers le SC de la vue de la fenêtre spécifiée - (trans pt 0 2)

- DCS2WCS : pour traduire du SC de la vue de la fenêtre spécifiée vers le SCG - (trans pt 2 0)

- DCS2PCS : pour traduire du SC de la vue de la fenêtre spécifiée vers le SC de l'espace papier - (trans pt 2 3)

- PCS2DCS : pour traduire du SC de la vue de la fenêtre spécifiée vers le SC de l'espace papier - (trans pt 3 2)

- WCS2PCS : pour traduire directement du SCG correspondant à la vue vers l'EP - (trans (trans pt 0 2) 2 3)

- PCS2WCS : pour traduire directement de lEP ver le SCG correspondant à la vue - (trans (trans pt 3 2) 2 0)

 

EDIT : J'avais tout écrit en vlisp, mais ça semble un peu plus rapide avec les codes DXF

EDIT 2 : version corrigée et amendée

 

;; WCS2DCS (gile)
;; Traduit les coordonnées d'un point du SCG au SC de la vue
;; dans la fenêtre spécifiée
;; (WCS2DCS pt vp) est équivalent à (trans pt 0 2) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun WCS2DCS (pt vp / ang nor mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
ang  (cdr (assoc 51 elst))
nor  (cdr (assoc 16 elst))
mat  (mxm
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
       (mapcar (function (lambda (v) (trans v nor 0 T)))
	       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
       )
     )
 )
 (mxv mat (mapcar '- pt (cdr (assoc 17 elst))))
)

;; DCS2WCS (gile)
;; Traduit les coordonnées d'un point du SC de la vue dans la fenêtre
;; spécifiée au SCG
;; (DCS2WCS pt vp) est équivalent à (trans pt 2 0) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun DCS2WCS (pt vp / ang nor mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
ang  (- (cdr (assoc 51 elst)))
nor  (cdr (assoc 16 elst))
mat  (mxm
       (mapcar (function (lambda (v) (trans v 0 nor T)))
	       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
       )
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
     )
 )
 (mapcar '+ (mxv mat pt) (cdr (assoc 17 elst)))
)

;; PCS2DCS (gile)
;; Traduit les coordonnées d'un point du SC de l'espace papier au SC
;; de la vue dans la fenêtre spécifiée
;; (PCS2DCS pt vp) est équivalent à (trans pt 3 2) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun PCS2DCS (pt vp / elst ang scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
scl  (/ (cdr (assoc 45 elst)) (cdr (assoc 41 elst)))
 )
 (mapcar '+
  (mapcar (function (lambda (x) (* x scl))) pt)
  (mapcar (function (lambda (x) (* x (- scl))))
	  (cdr (assoc 10 elst))
  )
  (cdr (assoc 12 elst))
 )
)

;; DCS2PCS (gile)
;; Traduit les coordonnées d'un point du le système de coordonées
;; de la vue dans la fenêtre spécifiée dans le SC de l'espace papier
;; (DCS2PCS pt vp) est équivalent à (trans pt 2 3) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun DCS2PCS (pt vp / elst ang scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
scl  (/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
 )
 (mapcar '+
  (mapcar (function (lambda (x) (* x scl))) pt)
  (cdr (assoc 10 elst))
  (mapcar (function (lambda (x) (* x (- scl))))
	  (cdr (assoc 12 elst))
  )
 )
)

;; WCS2PCS (gile)
;; Traduit les coordonnées d'un point du SCG dans le SC de l'espace
;; papier correspondant à la fenêtre spécifiée
;; (WCS2PCS pt vp) est équivalent à (trans (trans pt 0 2) 2 3) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun WCS2PCS (pt vp / ang nor scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
ang  (cdr (assoc 51 elst))
nor  (cdr (assoc 16 elst))
scl  (/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
mat  (mxm
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
       (mapcar (function (lambda (v) (trans v nor 0 T)))
	       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
       )
     )
 )
 (mapcar '+
  (mapcar (function (lambda (x) (* x scl)))
	  (mxv mat (mapcar '- pt (cdr (assoc 17 elst))))
  )
  (cdr (assoc 10 elst))
  (mapcar (function (lambda (x) (* x (- scl))))
	  (cdr (assoc 12 elst))
  )
 )
)


;; PCS2WCS (gile)
;; Traduit les coordonnées d'un point de l'espace papier dans le
;; SCG correspondant à la fenêtre spécifiée
;; (PCS2WCS pt vp) est équivalent à (trans (trans pt 3 2) 2 0) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun PCS2WCS (pt vp / ang nor scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	elst (entget vp)
ang  (- (cdr (assoc 51 elst)))
nor  (cdr (assoc 16 elst))
scl  (/ (cdr (assoc 45 elst)) (cdr (assoc 41 elst)))
mat  (mxm
       (mapcar (function (lambda (v) (trans v 0 nor T)))
	       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
       )
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
     )
 )
 (mapcar '+
  (mxv mat
       (mapcar '+
	       (mapcar (function (lambda (x) (* x scl))) pt)
	       (mapcar (function (lambda (x) (* x (- scl))))
		       (cdr (assoc 10 elst))
	       )
	       (cdr (assoc 12 elst))
       )
  )
  (cdr (assoc 17 elst))
 )
) 

[Edité le 22/4/2008 par (gile)]

 

[Edité le 22/4/2008 par (gile)]

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

Posté(e)

Merci (gile) :)

 

Mais je n'ai pas le bon résultat car mon scu est tourné à 90° dans ma fenêtre active

 

ps : si tu veux mon fichier de test, transmet-moi ton courriel.

 

@+

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)

Effectivement j'ai été un peu léger sur les tests :calim:

 

Bon, je pense avoir trouvé, en fait la traduction DCS PCS ne semble pas nécessiter de matrices, il s'agit juste de translation et mise l'échelle uniforme.

J'ai ajouté 2 fonction directes WCS PCS, qui seront certainement les plus utiles.

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

Posté(e)

Comme ça a l'air de bien fonctionner, j'en ai fait une synthèse qui s'utilise comme la fonction trans, avec l'argument vp en plus et la possibilité de traduire directement de l'EO à l'EP.

 

;; TransSpace (gile) 23/04/2008
;; Traduit les coordonnées d'un point entre deux systèmes de coordonnées
;; Permet les traductions "trans-spatiales" sans que la fenêtre soit active.
;; Permet la traduction directe entre espace paier et espace objet
;;
;; Arguments
;; pt : le point à traduire
;; vp : la fenêtre (ename ou vla-object)
;; from et to : comme avec la fonction trans
;;              0 = SCG
;;              1 = SCU courant
;;              2 = SC de la vue correspondant à la fenêtre
;;              3 = SC de l'espace papier correspondant à la fenêtre

(defun TransSpace (pt vp from to / ang nor scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (if
   (and
     (setq elst (entget vp))
     (= (cdr (assoc 0 elst)) "VIEWPORT")
     (setq ang	(cdr (assoc 51 elst))
    nor	(cdr (assoc 16 elst))
    scl	(/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
    mat	(mxm
	  (list	(list (cos ang) (- (sin ang)) 0.0)
		(list (sin ang) (cos ang) 0.0)
		'(0.0 0.0 1.0)
	  )
	  (mapcar (function (lambda (v) (trans v nor 0 T)))
		  '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
	  )
	)
     )
     (if (= from 1)
(setq pt   (trans pt 1 0)
      from 0
)
(setq pt (trans pt 0 0))
     )
   )
    (cond
      ((= from 0)
(cond
  ((= to 0) pt)
  ((= to 1) (trans pt 0 1))
  ((= to 2) (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))))
  ((= to 3)
   (mapcar '+
	   (vxs (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))) scl)
	   (cdr (assoc 10 elst))
	   (vxs (cdr (assoc 12 elst)) (- scl))
   )
  )
)
      )
      ((= 2 from)
(cond
  ((= 0 to)
   (mapcar '+ (mxv (trp mat) pt) (cdr (assoc 17 elst)))
  )
  ((= 1 to)
   (trans (mapcar '+ (mxv (trp mat) pt) (cdr (assoc 17 elst)))
	  0
	  1
   )
  )
  ((= 2 to) pt)
  ((= 3 to)
   (mapcar '+
	   (vxs pt scl)
	   (cdr (assoc 10 elst))
	   (vxs (cdr (assoc 12 elst)) (- scl))
   )
  )
)
      )
      ((= 3 from)
(cond
  ((= 0 to)
   (mapcar '+
	   (mxv	(trp mat)
		(mapcar	'+
			(vxs pt (/ 1 scl))
			(vxs (cdr (assoc 10 elst)) (/ -1 scl))
			(cdr (assoc 12 elst))
		)
	   )
	   (cdr (assoc 17 elst))
   )
  )
  ((= 1 to)
   (trans (mapcar '+
		  (mxv (trp mat)
		       (mapcar '+
			       (vxs pt (/ 1 scl))
			       (vxs (cdr (assoc 10 elst)) (/ -1 scl))
			       (cdr (assoc 12 elst))
		       )
		  )
		  (cdr (assoc 17 elst))
	  )
	  0
	  1
   )
  )
  ((= 2 to)
   (mapcar '+
	   (vxs pt (/ 1 scl))
	   (vxs (cdr (assoc 10 elst)) (/ -1 scl))
	   (cdr (assoc 12 elst))
   )
  )
  ((= 3 to) pt)
)
      )
    )
 )
)(defun TransSpace (pt vp from to / ang nor scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (if
   (and
     (setq elst (entget vp))
     (= (cdr (assoc 0 elst)) "VIEWPORT")
     (setq ang	(cdr (assoc 51 elst))
    nor	(cdr (assoc 16 elst))
    scl	(/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
    mat	(mxm
	  (list	(list (cos ang) (- (sin ang)) 0.0)
		(list (sin ang) (cos ang) 0.0)
		'(0.0 0.0 1.0)
	  )
	  (mapcar (function (lambda (v) (trans v nor 0 T)))
		  '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
	  )
	)
     )
     (if (= from 1)
(setq pt   (trans pt 1 0)
      from 0
)
(setq pt (trans pt 0 0))
     )
   )
    (cond
      ((= from 0)
(cond
  ((= to 0) pt)
  ((= to 1) (trans pt 0 1))
  ((= to 2) (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))))
  ((= to 3)
   (mapcar '+
	   (vxs (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))) scl)
	   (cdr (assoc 10 elst))
	   (vxs (cdr (assoc 12 elst)) (- scl))
   )
  )
)
      )
      ((= 2 from)
(cond
  ((= 0 to)
   (mapcar '+ (mxv (trp mat) pt) (cdr (assoc 17 elst)))
  )
  ((= 1 to)
   (trans (mapcar '+ (mxv (trp mat) pt) (cdr (assoc 17 elst)))
	  0
	  1
   )
  )
  ((= 2 to) pt)
  ((= 3 to)
   (mapcar '+
	   (vxs pt scl)
	   (cdr (assoc 10 elst))
	   (vxs (cdr (assoc 12 elst)) (- scl))
   )
  )
)
      )
      ((= 3 from)
(cond
  ((= 0 to)
   (mapcar '+
	   (mxv	(trp mat)
		(mapcar	'+
			(vxs pt (/ 1 scl))
			(vxs (cdr (assoc 10 elst)) (/ -1 scl))
			(cdr (assoc 12 elst))
		)
	   )
	   (cdr (assoc 17 elst))
   )
  )
  ((= 1 to)
   (trans (mapcar '+
		  (mxv (trp mat)
		       (mapcar '+
			       (vxs pt (/ 1 scl))
			       (vxs (cdr (assoc 10 elst)) (/ -1 scl))
			       (cdr (assoc 12 elst))
		       )
		  )
		  (cdr (assoc 17 elst))
	  )
	  0
	  1
   )
  )
  ((= 2 to)
   (mapcar '+
	   (vxs pt (/ 1 scl))
	   (vxs (cdr (assoc 10 elst)) (/ -1 scl))
	   (cdr (assoc 12 elst))
   )
  )
  ((= 3 to) pt)
)
      )
    )
 )
)

;; VXS (gile)
;; Retourne le produit d'un vecteur par un scalaire
;;
;; Arguments : un vecteur et un réel

(defun vxs (v s) (mapcar (function (lambda (x) (* x s))) v))


;; VXV (gile)
;; Retourne le produit scalaire (réel) de deux vecteurs
;;
;; Arguments : deux vecteurs

(defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2)))


;; TRP
;; transpose une matrice -Doug Wilson-
;;
;; Argument : une matrice

(defun trp (m) (apply 'mapcar (cons 'list m)))

;; MXV
;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky-
;;
;; Arguments : une matrice et un vecteur

(defun mxv (m v)
 (mapcar (function (lambda (r) (vxv r v))) m)
)

;; MXM
;; Multiple (combine) deux matrices -Vladimir Nesterovsky-
;;
;; Arguments : deux matrices

(defun mxm (m q)
 (mapcar (function (lambda (r) (mxv (trp q) r))) m)
) 

 

[Edité le 23/4/2008 par (gile)]

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

Posté(e)

Bonjour,

 

Je me suis cassé un peu la tête sur un sujet similaire et j'ai obtenu quelque chose qui marche, mais c'est un peu Mr Bricolage...

 

Donc, mon but est de représenter un objet 3D (une culée d'un pont, pour être précis) en isométrie dans un fenêtre Fmult et de donner des cotes de nivellement NGF dans l'espace papier.

 

http://img408.imageshack.us/img408/545/culeemz8.jpg

 

Donc, je clique un point en espace papier et je souhaite obtenir le point correspondant du scu local de la fenêtre, pour en extraire la valeur Z et écrire cette valeur sur l'espace papier.

 

Ce que j'ai écrit :

 

(defun c:niviso ()
 (setvar "DIMZIN" 0)   ; pour que le rtos ne sucre pas les zero de fin
 (command "_mspace")
 (setq PT (getpoint "\nPoint à niveler"))
 (command "_pspace")

 (setq PTL1 (getpoint "\nPremier point : "));
 (setq PTL2 (getpoint PTL1 "\nDeuxième point : "))
 
 (setq OldOS (getvar "OSMODE"))
 (setvar "OSMODE" 0)

 (command "_leader" PTL1 PTL2 "" 
   (rtos (caddr PT) 2 3)
    ""
 )
 (setvar "OSMODE" OldOS)
) 

 

là où c'est nul, c'est qu'il faut que je saisisse PT et PTL1 qui sont au même endroit, sauf que l'un est en mspace et l'autre en pspace.

 

Est-ce que le transspace peut s'adapter à mon cas ou bien je suis complètement hors sujet ?

 

Merci

 

Amicalement

Vincent

 

 

[Edité le 23/4/2008 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Tu n'es pas du tout hors sujet, et ta demande me fait voir que dans le sens EP -> EO, même si TransSpace retourne les mêmes résultats que trans, c'est complètement inopérant en 3D.

Dans ce cas là, on est bien obligé de passer en EO et revenir en EP.

 

Mais on peut gagner un clic.

 

(defun c:niviso	(/ PT PTL1 ptl2)
 (setvar "DIMZIN" 0)
   (setq OldOS (getvar "OSMODE"))
   (while (and
     (not (command "_mspace"))
     (setq PT (getpoint "\nPoint à niveler"))
     (setq PTL1 (trans (trans PT 0 2) 2 3))
     (not (command "_pspace"))
     (setq PTL2 (getpoint PTL1 "\nDeuxième point : "))
   )
     (setvar "OSMODE" 0)
     (command "_leader"
       PTL1
       PTL2
       ""
       (rtos (caddr PT))
       ""
     )
     (setvar "OSMODE" OldOS)
   )
 (command "_pspace")
) 

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

Posté(e)

Un grand merci (gile) :)

Ton lisp marche très bien.

 

Je ne dirai qu'une chose

Les grandes oeuvres d'art ne sont grandes que parce qu'elles sont accessibles et compréhensibles à tous.

Léon Tolstoï

 

_Zebulon

Le lisp retranscrit les coordonnées d'un point entre espace papier et espace objet.

Utilisons l'exemple de l'espace objet vers l'espace papier.

Le résultat est le même qu'avec un (trans (trans pt 0 2) 2 3), mais sans avoir besoin de passer en espace objet dans la fenêtre utilisée, d'utiliser les trans, puis de re-basculer en espace papier. Tout se passe dans le même espace et permet donc une exécution beaucoup plus rapide des lisps.

J'ai un lisp qui n'arrête pas de calculer les coordonnées entre UCS et DCS, et grâce à (gile), le temps de traitement est au moins divisé par dix (au bout de 5mn de traitement, j'ai abandonné mon test par un esc).

 

Pour ton lisp, ce n'est pas du bricolage. Regarde par curiosité le lisp chspace des express tools. Il utilise la même technique que la tienne (mais sans le point).

 

@+

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)

Houuu, j'ai du mal avec le (trans (trans PT 0 2) 2 3) :casstet:

 

Donc, on va y aller par étape, vous me direz si je me trompe.

 

(trans PT 0 2) transforme un point du système de coordonnées universel vers le SCV de la fenêtre courante.

et

(trans RES 2 3) transforme un point de la fenêtre espace modèle courant vers le SCV de l'espace papier.

 

Mais il se trouve que dans ma fmult je ne suis pas en SCG (ça marcherait si c'était le cas), mais avec un SCU utilisateur et là, forcément, ça donne n'importe quoi.

 

Donc, si j'écris (trans (trans PT 1 2) 2 3) je pense que c'est mieux et ça marche aussi quand on est en SCG, qui n'est finalement qu'un SCU particulier.

 

Imbriquer des trans, suffisait d'y penser ! Maintenant, grâce à vous, je vais pouvoir passer pour un cador avec la fonction trans :)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

zebulon_

 

C'est tout à fait ça ;)

 

Je te propose une autre méthode pour "niviso" qui fonctionne dans l"autre sens : à partir du point spécifié dans l'EP, on retrouve le point dans l'EO grâce aux accrochage aux objets actifs.

le passage EP->EO->EP se fait juste pour "accrocher et traduire le point, il passe donc inaperçu.

Ça devrait fonctionner quelques soient les SCU courants dans l'EP et dans l'EO.

 

En l'état, le LISP retourne les coordonnées du point dans le SCG de l'espace objet, je te laisse le soin de l'adapter à tes besoins.

 

EDIT : Code modifié pour un fonctionnement avec les fenêtres créées à partir d'objets.

 

;; Coords
;; Crée des lignes de repère dans l'espace papier dont le texte
;; correspond au coordonnées SCG des points sélectionnés

(defun c:Coords	(/ vp elst os pt1 pt2 pt)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (if (= (getvar "TILEMODE") 0)
   (progn
     (vla-put-MSpace *acdoc* :vlax-False)
     (and
(setq vp (car (entsel "\nSélectionnez la fenêtre: ")))
(setq elst (entget vp))
(or (= (cdr (assoc 0 elst)) "VIEWPORT")
    (and (member (cdr (assoc 0 elst))
		 '("CIRCLE" "ELLIPSE" "LWPOLYLINE" "REGION" "SPLINE")
	 )
	 (setq vp (cdr (assoc 330 elst)))
	 (= (cdr (assoc 0 (entget vp))) "VIEWPORT")
    )
)
(setq vp (vlax-ename->vla-object vp))
(= (vla-get-ObjectName vp) "AcDbViewport")
(setq os (osmodes))
(while
  (and
    (setq pt1 (getpoint "\nPremier point de la ligne de repère: "))
    (setq pt1 (trans pt1 1 0))
    (not (vla-put-MSpace *acdoc* :vlax-true))
    (not (vla-put-activePViewport *acdoc* vp))
    (setq pt (osnap (trans (trans pt1 3 2) 2 1) os))
    (setq pt (trans pt 1 0))
    (not (vla-put-MSpace *acdoc* :vlax-False))
    (setq pt1 (trans pt1 0 1))
    (setq pt2 (getpoint pt1 "\nPoint suivant: "))
  )
   (vl-cmdf "_.leader"
	    "_non"
	    pt1
	    "_non"
	    pt2
	    ""
	    (strcat
	      (rtos (car pt))
	      "  "
	      (rtos (cadr pt))
	      "  "
	      (rtos (caddr pt))
	    )
	    ""
   )
)
(vla-put-MSpace *acdoc* :vlax-False)
     )
   )
   (princ
     "\nCette commande n'est accessible que dans les présentations."
   )
 )
 (princ)
)

;; osmodes
;; Retourne une chaîne avec accrocages actifs pour osnap

(defun osmodes (/ os str)
 (setq	os  (getvar 'osmode)
str ""
 )
 (mapcar
   (function
     (lambda (m b)
(if (= b (logand b os))
  (setq str (strcat str m ","))
)
     )
   )
   '("_end" "_mid" "_cen" "_nod" "_qua" "_int" "_ins" "_nea")
   '(1 2 4 8 16 32 64 512)
 )
 str
) 

 

Patrick_35

 

Tout bien réfléchi, TransSpace ressemble plutôt à un exercice de style, la seule traduction qui me semble pertinente à l'usage est celle qui t'intéressait (SCG --> EP) je vois mal comment utiliser les autres sans repasser d'un espace à l'autre.

 

Donc, à n'en garder qu'une, j'ai finalisé WCS2PCS.

 

;; WCS2PCS (gile)
;; Traduit les coordonnées d'un point du SCG dans le SC de l'espace
;; papier correspondant à la fenêtre spécifiée
;; (WCS2PCS pt vp) est équivalent à (trans (trans pt 0 2) 2 3) avec vp active
;;
;; Arguments
;; pt : un point
;; vp : la fenêtre (ename ou vla-object)

(defun WCS2PCS (pt vp / elst ang nor scl mat)
 (vl-load-com)
 (and (= (type vp) 'VLA-OBJECT)
      (setq vp (vlax-vla-object->ename vp))
 )
 (setq	pt   (trans pt 0 0)
elst (entget vp)
ang  (cdr (assoc 51 elst))
nor  (cdr (assoc 16 elst))
scl  (/ (cdr (assoc 41 elst)) (cdr (assoc 45 elst)))
mat  (mxm
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
       (mapcar (function (lambda (v) (trans v nor 0 T)))
	       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
       )
     )
 )
 (mapcar '+
  (vxs (mxv mat (mapcar '- pt (cdr (assoc 17 elst)))) scl)
  (vxs (cdr (assoc 12 elst)) (- scl))
  (cdr (assoc 10 elst))
 )
)

;; VXS (gile)
;; Retourne le produit d'un vecteur par un scalaire
;;
;; Arguments : un vecteur et un réel

(defun vxs (v s) (mapcar (function (lambda (x) (* x s))) v))


;; VXV (gile)
;; Retourne le produit scalaire (réel) de deux vecteurs
;;
;; Arguments : deux vecteurs

(defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2)))


;; MXV
;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky-
;;
;; Arguments : une matrice et un vecteur

(defun mxv (m v)
 (mapcar (function (lambda (r) (vxv r v))) m)
)

;; MXM
;; Multiple (combine) deux matrices -Vladimir Nesterovsky-
;;
;; Arguments : deux matrices

(defun mxm (m q)
 (mapcar (function (lambda (r) (mxv (trp q) r))) m)
) 

[Edité le 23/4/2008 par (gile)]

 

[Edité le 27/4/2008 par (gile)]

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

Posté(e)

Imbriquer des trans, suffisait d'y penser ! Maintenant, grâce à vous, je vais pouvoir passer pour un cador avec la fonction trans

 

ATTENTION on peut avoir de grosses surprises avec des imbrications de trans mal ordonnées.

la multiplication de matrice N'EST PAS commutative

 

ALORS CES MATRICES ?

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

Posté(e)

(setq pt (osnap (trans (trans pt1 3 2) 2 1) os))

;;;(setq pt (trans pt 1 0))

(not (vla-put-MSpace *acdoc* :vlax-False))

 

j'ai mis cette ligne en commentaire pour avoir le point pt dans le scu utilisateur.

 

Belle variante en tout cas, qu'il va falloir que je regarde de plus près.

 

Merci

Amicalement

 

Vincent

 

 

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é