Aller au contenu

vlisp et scu


zebulon_

Messages recommandés

Bonjour,

 

il m'arrive souvent d'utiliser la commande _ucs pour me mettre dans un système de coordonnées qui m'arrange, puis faire ma bidouille lisp, puis revenir au système de coordonnées précédentes.

 

(command "_ucs" "_3p" PT1 PT2 "")

...

...

...

(command "_ucs" "_p")

 

Alors plusieurs questions :

 

- comment peut-on obtenir la même chose en vlisp ? Sans forcément donner de nom au scu courant ?

- où peut bien être stockée la liste des scu précédents et comment taper dedans pour les redéfinir sans utiliser (command ...) ?

- utiliser (vl-cmdf ...) à la place de (command ...), ça apporte quelque chose ?

 

J'ai lu ceci avec intérêt et je constate que je ne suis pas le seul à qui ça file des boutons.

 

Amicalement

Zebulon_

 

 

[Edité le 8/10/2007 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)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Hélas oui on ne peut en Visual LISP ne travailler qu'avec des SCU nommés et qui plus est on ne peut supprimer de la collection le SCU qui est courant.

 

Tu trouveras une discussion à ce sujet ici.

 

Pour enrgistrer un SCU 3points en vlisp, il faut en plus que la droite du premier au troisième point soit perpendiculaire à celle du premier au second (ce qui n'est pas nécessair avec command)

 

Personnellement, j'essaye toujours d'éviter de créer de nouveaux SCU, je préfère utiliser la fonction trans dans un "SCU virtuel".

À partir de 3 points 3d, on peut trouver, par le produit vectoriel, le vecteur normal (axe Z) du plan défini par ces 3 points. En utilisant ce vecteur comme argument de la fonction trans, on peut convertir des les coordonnées de points exprimés en SCU ou SCG en coordonnées exprimées dans ce "SCU virtuel".

 

Soient trois points p1 p2 p3, respectivement origine, point positif sur l'axe des X, point dans la zone positive des Y du "SCU virtuel".

 

;; Déterminer le vecteur normal du plan p1 p2 p2

(setq zdir (v^v (mapcar '- p2 p1) (mapcar '- p3 p1)))

;; convertir le point pt du SCU courant vers le "SCU virtuel"

(trans pt 1 zdir)

;; convertir le point pt du SCg courant vers le "SCU virtuel"

(trans pt 0 zdir) 

 

La routine V^V qui calcule le produit vectoriel de deux vecteurs :

 

;;; V^V Retourne le produit vectoriel (vecteur) de deux vecteurs

(defun v^v (v1 v2)
   (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
  (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
  (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
   )
) 

 

S'il s'agit d'aligner des objets à un nouveau SCU au lieu de convertir des points, j'utilise les matrices de transformation.

 

[Edité le 8/10/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Les produits vectoriels... j'avoue que j'ai séché ce cours... (et bien d'autres, mais ce n'est pas le sujet)

 

Si je fais une application numérique, prenons par exemple :

 

p1 : (1.0 1.0 0.0)

p2 : (2.0 2.0 0.0)

p3 : (0.0 2.0 0.0)

 

ce qui me donne un zdir : (0.0 0.0 2.0)

 

pour un point pt qui vaut, par exemple : (1.0 2.0 0.0)

(trans pt 0 zdir) donne (1.0 2.0 0.0), alors que je m'attendais à avoir (0.707 0.707 0)

 

Qu'est ce que j'ai loupé ?

 

Amicalement

Zebulon_

 

 

 

 

[Edité le 10/10/2007 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)

Lien vers le commentaire
Partager sur d’autres sites

Au temps pour moi, je pensais que tu parlais de 3d (3 points dans un plan non parallèle au plan XY de SCG).

 

L'utilisation d'un vecteur comme argument de trans ne sera utile que si ce vecteur n'est pas parallèle à (0 0 1).

 

Si la direction Z est parallèle à (0 0 1) il ne s'agit que d'une rotation 2d (rotation sur l'axe Z)

 

Ce "SCU virtuel" correspond au Système de Coordonnées Objet (SCO) de tous les objets ayant la même direction d'extrusion (DXF 210). Il ne tient pas compte de la rotation sur cet axe (qui correspond à la rotation des texte, blocs, etc... DXF 50). À propos de SCO, tu peux voir ce sujet et cette réponse.

 

En fait je comprends moins bien ta question, en vlisp on n'utilise pas les coordonnées SCU, c'est le plus souvent des coordonnées dans le SCG et parfois dans le SCO (lwpolylingne, polyligne2d)

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

Lien vers le commentaire
Partager sur d’autres sites

En fait, il est souvent plus simple de transformer 2 points quelconques saisis par l'utilisateur en points particuliers d'un scu local : son origine et la direction des x. Cela facilite le calcul d'autres points nécessaires à faire un dessin, sans s'embêter avec un angle.

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)

Lien vers le commentaire
Partager sur d’autres sites

Je me suis amusé à faire 2 routines pour utiliser des systèmes de coordonnées 2d sans avoir à créer de SCU.

 

La permière : scv2d, définit un système de coordonnées à parti de deux points expimés dans le SCG : l'origine et un point sur l'axe des X.

Elle retourne une liste contenant l'origine et la matrice de rotation (ne t'affoles pas, le LISP se charge de tout).

Cette liste peut être conservée dans une variable car elle sert dans l'autre routine : trans2d.

Celle ci fonctionne un peu comme trans à ceci près qu'un des arguments doir être cette fameuse liste.

Il faut ajouter à cela deux autre routines qui facilitent le calcul matriciel.

 

Edit : code corrigé

 

;; Applique une matrice de transformation à un vecteur - Vladimir Nesterovsky
(defun mxv (m v)
 (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)

;; Transpose une matrice - Doug Wilson
(defun trp (m)
 (apply 'mapcar (cons 'list m))
)

;; SCV2D
;; Système de Coordonnées Virtuel à 2 Dimensions
;;
;; Retour
;; Une liste dont le premier élément est l'origine et le
;; second la matrice (2 X 2) de rotation par rapport au SCG
;;
;; Arguments
;; org : l'origine du système de coordonnées (dans le SCG)
;; ptx : un point sur l'axe des X (dans le SCG)
;;
;; Utilisation
;; (setq scv_1 (scv2d '(1 1 0) '(2 2 0)))
;; -> ((1 1 0) ((0.707107 0.707107) (-0.707107 0.707107)))

(defun scv2d (org ptx / ang)
 (setq ang (- (angle org ptx)))
 (list	org
(list (list (cos ang) (- (sin ang)))
      (list (sin ang) (cos ang))
)
 )
)

;; TRANS2D
;; Traduit un point d'un système de coordonnées à un autre, un des deux
;; systèmes étant une liste telle que celle retournée par SCV2D
;;
;; Retour
;; le point dans le système de coordonnées spécifié
;;
;; Arguments
;; pt : le point à traduire
;; from : le système de coordonnées dans lequel le point est exprimé
;; to : le système de coordonnées dans lequel le point doit être retourné
;; from et to peuvent avoir comme valeur :
;; - 0 (SCG)
;; - 1 (SCU courant)
;; - une liste du type (origine matrice) (SCV)
;;
;; Utilisation
;; (trans2d '(1 2 0) 0 scv_1) -> (0.707107 0.707107)
;; (trans2d '(2 0 0) scv_1 0) -> (2.41421 2.41421)

(defun trans2d (pt from to)
 (cond
   ((= from 0)
    (mxv (cadr to) (mapcar '- pt (car to)))
   )
   ((= to 0)
    (mapcar '+ (mxv (trp (cadr from)) pt) (car from))
   )
   ((= from 1)
    (mxv (cadr to) (mapcar '- (trans pt 1 0) (car to)))
   )
   ((= to 1)
    (trans (mapcar '+ (mxv (trp (cadr from)) pt) (car from)) 0 1)
   )
 )
)

 

En rouge le "SCV" défini par son origine (1 1 0) et un point sur l'axe des X (2 2 0) et les coordonnées de points dans ce système.

En blanc le SCG et les coordonnées des points dans ce système.

 

http://img529.imageshack.us/img529/7486/scvep0.png [Edité le 9/10/2007 par (gile)]

 

[Edité le 9/10/2007 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

J'ai regardé du côté de la rotation 2D et j'ai fait une fonction où l'on donne le point PT à transformer, PTC le centre de rotation (l'origine du scu local fictif) et A l'angle qui donne le sens des X positifs du scu local fictif.

 

(defun rot2d (pt ptc a)
 ;; pt point à tourner
 ;; ptc centre de rotation
 ;; a angle de rotation en radian

 (setq x 
   (+ (* (- (car pt) (car ptc)) (cos a))
      (* (- (cadr pt) (cadr ptc)) (sin a))
   )
 )
 (setq y 
   (- (* (- (cadr pt) (cadr ptc)) (cos a))
      (* (- (car pt) (car ptc)) (sin a))
   )
 )
 (list x y)
) 

 

 

exemple :

;; un point dont on veut les coordonnées locales

Commande: (setq pt (getpoint))

(1.0 2.0 0.0)

 

;; l'origine du nouveau scu

Commande: (setq ptc (getpoint))

(1.0 1.0 0.0)

 

;; un point dans le sens positif des x

Commande: (setq ptx (getpoint))

(2.0 2.0 0.0)

 

;; je calcule l'angle entre ptc et ptx

Commande: (setq a (angle ptc ptx))

0.785398

 

;; et j'utilise ma fonction rot2d en lui introduisant les données ci-dessus

Commande: (setq pt1 (rot2d pt ptc a))

(0.707107 0.707107)

 

;; ou encore

Commande: (setq pt2 (rot2d '(4 8) ptc a))

(7.07107 2.82843)

 

Ce qui est amusant, c'est qu'on peut faire l'opération inverse avec la même fonction.

 

;; je détermine les coordonnées de '(0 0) dans le scu fictif

Commande: (setq ptcg (rot2d '(0 0) ptc a))

(-1.41421 -1.11022e-016)

;;(On note quand même des petits soucis de précision...)

 

;; et je fais l'opération inverse avec pt2

Commande: (rot2d pt2 ptcg (* a -1))

(4.0 8.0)

 

;; puis avec pt1

Commande: (rot2d pt1 ptcg (* a -1))

(1.0 2.0)

 

;; ou encore

Commande: (rot2d pt1 ptcg (- (* 2 pi) a))

(1.0 2.0)

 

Inutile, peut-être, mais instructif ;)

 

Amicalement

Zebulon_

[Edité le 9/10/2007 par zebulon_][Edité le 9/10/2007 par zebulon_]

 

[Edité le 10/10/2007 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)

Lien vers le commentaire
Partager sur d’autres sites

Super ta petite fonction, ce que je donnais au dessus fait la même chose en plus compliqué.

 

Je m'aperçois d'ailleurs qu j'ai oublié de remplacer des variables, et surtout qu je faisais les calculs avec un matrice 3X3 dont la dernière colonne et la dernière rangée ne servent à rien.

 

Je corrige le message précédent.

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

Lien vers le commentaire
Partager sur d’autres sites

Super ta petite fonction, ce que je donnais au dessus fait la même chose en plus compliqué.

Je disais plus haut que j'avais séché les cours de maths quand il était question des produits vectoriels. Heureusement, quand il était question de trigo, j'étais présent ;)

 

Amicalement

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)

Lien vers le commentaire
Partager sur d’autres sites

J'avais aussi oublié ces notions de calcul vectoriel, mais je m'y suis un peu replongé quand j'ai voulu comprendre les matrices de transformation.

 

Tu fais en fait du calcul vectoriel sans le savoir (comme M. Jourdain), ta fonction est à peu près équivalente à ce je fais dans scv2d : l'application de la matrice de rotation (((cos ang) (- (sin ang))) ((sin ang) (cos ang))) au vecteur correspondant au déplacement de l'origine au point. Autrement dit le produit scalaire de chacune des rangées de la matrice par le vecteur.

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

Lien vers le commentaire
Partager sur d’autres sites

Alors là, je suis sur le cul.

Par ma foi ! il y a plus de quarante ans que je dis de la prose sans que j'en susse rien, et je vous suis le plus obligé du monde de m'avoir appris cela.

Pour Noël, je vais me faire offrir un bouquin de maths.

Niveau Terminale, ça suffira ou bien il faut taper dans du plus costaud ?

 

Amicalement

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)

Lien vers le commentaire
Partager sur d’autres sites

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é