Aller au contenu

Messages recommandés

Posté(e)

(et je mets quiconque au défi) de définir un seul plan avec seulement 2 points.

 

(gile) j'adore ce genre de défi, j'en ai bavé (surtout pour la fonction z_dir) :casstet: mais je crois y être arrivé :D

 

La routine n'est pas achevée pour faire la flèche mais le plus gros est fait.

Donc il est possible de fournir 2 points en 3D et une polyligne2D sera créée dans son SCO.

 

NB: Pour l'instant je n'ai essayé que depuis le SCG, je pense qu'il faudra encore adapter pour l'acquisition depuis un SCU

 

(defun z_dir (p1 p2 / )
(trans
	'(0.0 1.0 0.0)
	(mapcar
		'(lambda (k)
			(/ k
				(sqrt
					(apply '+
						(mapcar
							'(lambda (x) (* x x))
							(mapcar '- p2 p1)
						)
					)
				)
			)
		)
		(mapcar '- p2 p1)
	)
	0
)
)
(defun c:make_arrow ( / pt1 pt2 k pt_x dxf_210)
(initget 9)
(setq pt1 (getpoint "\nPoint de départ de la flèche: ") pt2 pt1)
(initget 9)
(while (equal pt2 pt1)
	(setq pt2 (getpoint pt1 "\nPoint d'arrivée de la flèche: "))
	(if (equal pt2 pt1)
		(progn
			(princ "\nLe point de départ et d'arrivée sont confondus!")
			(initget 9)
		)
	)
)
(setq
	pt1 (trans pt1 1 0)
	pt2 (trans pt2 1 0)
	k (/ (- (distance pt1 pt2) (* (getvar "DIMSCALE") (getvar "DIMASZ"))) (distance pt1 pt2))
	pt_x (mapcar '+ pt1 (mapcar '(lambda (x) (* k x)) (mapcar '- pt2 pt1)))
	dxf_210 (z_dir pt1 pt2)
	pt1 (trans pt1 0 dxf_210)
	pt_x (trans pt_x 0 dxf_210)
	pt2 (trans pt2 0 dxf_210)
)
(entmake
	(list
		(cons 0 "LWPOLYLINE")
		(cons 100 "AcDbEntity")
		(cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
		(cons 410 (getvar "CTAB"))
		(cons 8 (getvar "CLAYER"))
		(cons 62 (if (eq (getvar "CECOLOR") "BYLAYER") 256 (getvar "CECOLOR")))
		(cons 6 (getvar "CELTYPE"))
		(cons 370 (getvar "CELWEIGHT"))
		(cons 100 "AcDbPolyline")
		(cons 90 3)
		(cons 70 0)
		(cons 38 (caddr pt1))
		(cons 39 (getvar "THICKNESS"))
		(cons 10 (list (car pt1) (cadr pt1)))
		(cons 40 0.0)
		(cons 41 0.0)
		(cons 42 0.0)
		(cons 10 (list (car pt_x) (cadr pt_x)))
		(cons 40 (/ (* (getvar "DIMSCALE") (getvar "DIMASZ")) 3.0))
		(cons 41 0.0)
		(cons 42 0.0)
		(cons 10 (list (car pt2) (cadr pt2)))
		(cons 40 0.0)
		(cons 41 0.0)
		(cons 42 0.0)
		(cons 210 dxf_210)
	)
)
(prin1)
)

Modifiée, devrait fonctionner dans toutes situation en 3D, s'appuie sur la taille des flèche de cotation [Edité le 5/4/2006 par bonuscad][Edité le 6/4/2006 par bonuscad]

Modifié après une suggestion de (gile) sur l'usage de DimScale et l'identification d'un bug lors de l'utilisation parralèle à l'axe des Z

 

[Edité le 6/4/2006 par bonuscad]

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

Posté(e)

Salut Bonus,

 

Çà ne marche pas chez moi (à moins que je n'ai pas compris ce que tu voulais faire), et çà me rassure plutôt !

 

http://xs75.xs.to/pics/06143/Arrow.PNG.xs.jpg

 

Géométriquement parlant, Z_dir, la direction d'extrusion ou normale du plan XY est le vecteur normé (de 1 unité) perpendiculaire à ce plan. Or un plan ne peut être défini uniquement par 2 points. 2 points définissent une droite unique qui peut être contenue par une infinité de plans (rotation3D). Je n'ai pas décortiqué ta routine, mais il y a forcément quelque chose d'arbitraire là dedans.

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

Posté(e)

Je peux pas avoir bon du 1er coup :mad:

 

En effet si la direction est colinéaire au Z du SCG, ça donne un résultat bizarre!

J'ai du oublier une condition (faudra que je trouve :casstet: )

 

Mais si tu t'appuis sur des diagonales, ç a marche bien non?

 

mais il y a forcément quelque chose d'arbitraire là dedans.

 

Extrait de l'aide:

L'algorithme d'axe arbitraire est utilisé en interne par AutoCAD pour mettre en œuvre une génération arbitraire mais homogène de systèmes de coordonnées d'objet pour toutes les entités qui utilisent un système de coordonnées d'objet.

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

Posté(e)

Mais si tu t'appuis sur des diagonales, ç a marche bien non?

 

Oui çà marche.

 

C'est un peu hors sujet, il ne s'agit plus de polyligne, mais de flèche 3D (solide)

 

(defun arr_err (msg)
 (if (= msg "Fonction annulée")
   (princ)
   (princ (strcat "\nErreur: " msg))
 )
 (command "_.ucs" "_restore" "scu_init")
 (command "_.ucs" "_delete" "scu_init")
 (command "_.undo" "_end")
 (setvar "cmdecho" echo)
 (setvar "delobj" delo)
 (setvar "osmode" osmo)
 (setq	*error*	m:err
m:err nil
 )
 (princ)
)

;;; VEC1 Retourne le vecteur normé (1 unité) de p1 à p2

(defun vec1 (p1 p2)
 (if (not (equal p1 p2 1e-009))
   (mapcar
     '(lambda (x) (/ x (distance p1 p2)))
     (mapcar '- p2 p1)
   )
 )
)

(defun c:3d_arrow (/ osmo echo delo pt1 pt2 pt3 long)
 (setq	m:err	*error*
*error*	arr_err
echo	(getvar "cmdecho")
delo	(getvar "delobj")
osmo	(getvar "osmode")
 )
 (command "_.undo" "_begin")
 (setvar "cmdecho" 0)
 (command "_.ucs" "_save" "scu_init")
 (initget 9)
 (setq	pt1 (getpoint "\nPoint de départ de la flèche: ")
pt2 pt1
 )
 (initget 9)
 (while (equal pt2 pt1)
   (setq pt2 (getpoint pt1 "\nPoint d'arrivée de la flèche: "))
   (if	(equal pt2 pt1)
     (progn
(princ "\nLe point de départ et d'arrivée sont confondus!")
(initget 9)
     )
   )
 )
 (setq	pt01 (trans pt1 1 0)
pt02 (trans pt2 1 0)
long (getvar "DIMASZ")
pt03 (mapcar '- pt02
	  (mapcar '(lambda (x) (* x long)) (vec1 pt01 pt02))
	  )
 )
 (setvar "osmode" 0)
 (command "_ucs" "_zaxis" pt1 pt2)
 (foreach pt '(pt01 pt02 pt03)
   (set pt (trans (eval pt) 0 1))
 )
 (command "_.circle" pt01 (/ long 50))
 (command "_.extrude" (entlast) "" (distance pt01 pt03) 0.0)
 (setq ent (entlast))
 (command "_.circle" pt03 (/ long 5))
 (command "_.extrude"
   (entlast)
   ""
   long
   (angtos (atan (/ long 5) long)
	   (getvar "aunits")
	   14
   )
 )
 (command "_.union" ent (entlast) "")
 (command "_.ucs" "_restore" "scu_init")
 (command "_.ucs" "_delete" "scu_init")
 (command "_.undo" "_end")
 (setvar "cmdecho" echo)
 (setvar "delobj" delo)
 (setvar "osmode" osmo)
 (setq	*error*	m:err
m:err nil
 )
) 

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

Posté(e)

Bonuscad,

En effet si la direction est colinéaire au Z du SCG, ça donne un résultat bizarre!

 

Je pense que c'est dû à l'utilisation de (angle pt1 pt2) dans la définition de pt_x, si la direction est colinéaire au Z du SCU, les projections de pt1 et pt2 sur le plan sont confondues, donc pas d'angle mesurable.

 

Je pense avoir trouvé un moyen de définir pt_x sans passer par angle et polar, avec un peu de calcul vectoriel (encore !!!) :

 

(setq pt_x
      (mapcar
 '-
 pt2
 (mapcar
   '(lambda (x) (* x (/ (getvar "DIMASZ") (distance pt1 pt2))))
   (mapcar '- pt2 pt1)
 )
      )
)

 

qu'on peut écrire, en utilisant Vec1 :

 

(setq pt_x
      (mapcar '-
       pt2
       (mapcar '(lambda (x) (* x (getvar "DIMASZ")))
	       (vec1 pt1 pt2)
       )
      )
) 

 

Pour déterminer Z_dir, on peut donc prendre n'importe quel plan contenant pt1 et pt2, avec le calcul vectoriel (encore !!!) on peut faire un Norm_3pts avec pt1 pt2 et n'importe quel autre point qui ne soit pas aligné avec les deux premiers, par exemple (un peu comme SCU 3points) :

 

(defun z_dir (p1 p2 / x_dir y_pt)

 ;; Axe des X
 (setq	x_dir (vec1 p1 p2)) 
 
 ;; Point arbitraire dans les Y positif
 (if (and (equal (car x_dir) 0.0 1e-009)
   (equal (cadr x_dir) 0.0 1e-009)
     )
   (setq y_pt '(0 1 0))
   (setq y_pt (list (- (cadr x_dir)) (car x_dir) (caddr x_dir)) 
   )
 )
 (norm_3pts '(0 0 0) x_dir y_pt)
) 

 

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

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

Posté(e)

Je pense que c'est dû à l'utilisation de (angle pt1 pt2)

 

Merci (gile) d'avoir mis le doigt sur le problème, j'avais songé à la même chose.

 

Avec tes suggestions j'ai remanié le code dans mon post précédent.

J'ai donc abandonné la fonction (angle) et procédé tout simplement par proportion pour le calcul de pt_x.

 

De cette manière j'ai réussi a ne pas trop alourdir le code avec des fonctions supplémentaires.

 

Je pense que ce coup-ci c'est Tip-top :P

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

Posté(e)

Je pense que ce coup-ci c'est Tip-top

 

Çà marche très bien, j'ai pensé à une améliortion, c'est une suggestion, il serait peut-être intéressant, puisque la taille de la pointe de la flèche est celle des cotations d'intégrer l'échelle des cotations courante en remplaçant les (getvar "DIMASZ") par (* (getvar "DIMSCALE") (getvar "DIMASZ"))

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

Posté(e)

Pourquoi pas? C''est une bonne idée! :exclam:

 

Je crois même l'avoir déjà observé sur des routines essayées deci-delà.

 

On pourrait même aller plus loin, monter des réacteurs (enfin je pense, car les cotation vaste chantier :casstet: ) pour réagir aux changement de 'dimscale'. Mais dans ce domaine Patrick_35 serait plus perfomant que moi ;)

 

Seul ombre: si DimScale et autant pour DimAsz est mis à 0.0, ça fonctionne mais on se retrouve avec une polyligne normale avec un doublon dans les sommets.

 

Je modifie à nouveaux le post.

Merci de ton aide :cool:

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

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é