Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

J'ai remarqué dans les nouvelles versions d'autocad que l'on pouvait utiliser l'accrochage au objet nommé "Milieu entre 2 points" dans le menu contextuel. Il y a quelques post qui en parle mais pas d'integration dans le menu. Je propose cette solution :

 

Rajoutez cette ligne dans le menu ***POP0 **SNAP des fichiers AutoCAD.mnu et AutoCAD.mns

 

"ID_MidPoints [Milieu en&tre 2 points]_non ^P(list (/ (+ (car (setq p1 (getpoint))) (car (setq p2 (getpoint)))) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) (/ (+ (caddr p1) (caddr p2)) 2.0))"

 

A+

 

[Edité le 29/6/2005 par Titifonky]

www.le-metal.net, sur la métallerie
Posté(e)

Tout ca me parait bien compliqué pour un accorchage que l'on peut émuler avec la fonction CAL !

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonjour Tramber,

 

le seul intêret de passer par du Lisp c'est la transparence de la commande. En passant par la fonction CAL il y a toujours des lignes qui s'affiche comme

>> Expression: (cur+cur)/2

>> Entrez un point:

>> Entrez un point:

 

A+

www.le-metal.net, sur la métallerie
Posté(e)

N'empèche Titifonky que ta commande lisp ne fonctionne pas sur acad2002, alors que (cur + cur + cur + cur)/3 que j'ai mis dans mon menu marche niquel.

Parfois les choses les plus simples sont les meilleurs!

 

XXL

 

XXL

Posté(e)

La ligne de Titifonky est bonne, du moins je l'ai testée d'un un bouton avec ceci:

 

_non ^P(list (/ (+ (car (setq p1 (getpoint))) (car (setq p2 (getpoint)))) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) (/ (+ (caddr p1) (caddr p2)) 2.0))

 

Par contre la tienne, je serais surpris qu'elle retourne le milieu de 2 pts.

Tu as 4 points / 3 ?!?!? encore que 3 pts/3 pourait te donner le barycentre d'un triangle

 

Autre remarque, ta procédure ne vérifie pas l'accroche-objet, si par malchanche le point retourner se trouve sur un objet, il sera faux suivant le mode actif. Titifonky a utilisé "_non" (aucun) pour palier a ce problème.

 

Quoiqu'il en soit les 2 méthode sont bonnes. Personellement j'utilise le lisp dans un bouton comme ceci

((lambda ( / p1 p2 p)
(prompt "\nPoint milieu entre ")
(setq p1 (getpoint "premier point : "))
(setq p2 (getpoint p1 "\nsecond point : "))
(setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384)))
(setq p (list (/ (+ (car p1) (car p2)) 2)
              (/ (+ (cadr p1) (cadr p2)) 2)
              (/ (+ (caddr p1) (caddr p2)) 2)
	)
)
(setvar "lastpoint" p)
))

J'ai choisi cette méthode car si je n'ai pas une commande en cours le point est stoké dans "LASTPOINT" et je peux m'en servir dans la commande suivante à l'aide "@"

Mais on pourrait faire la même chose avec (cur + cur)/2 aussi. ;)

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

Posté(e)

La ligne que j'ai affichée me donne effectivement le barycentre pour trois points et tu fais la même chose pour 4 points.

En fait j'ai affiché ceci dans mon menu:

ID_Mid3Points [Milieu entre 3 points]_non;'cal (cur + cur + cur)/3;

ID_Mid4Points [Milieu entre 4 points]_non;'cal (cur + cur + cur + cur)/4;

Mais merci pour l'astuce en lisp

 

XXL

 

XXL

Posté(e)

Salut à tous,

 

Je me permet une petite précision de géométrie euclidienne pour éviter certaines confusions:

 

Le barycentre (ou plus exactement l'équibarycentre) renvoyé par (cur+cur+cur+cur)/4 ne correspond au centre de gravité que dans le cas de quadrilatères réguliers.

 

Le dessin ci-desssous illustre une méthode graphique de détermination du centre de gravité d'un quadrilatère irrégulier par sa décomposition en triangles : le centre de gravité du quadrilatère est situé sur la droite définie par les centres de gravité des triangles qui le compose.

http://img158.imageshack.us/img158/8571/centredegravit9wr.jpg

 

Le lisp suivant place un point sur le centre de gravité d'un solide ou d'une région :

 

;;; c:pt_cen Crée un point sur le centre de gravité d'une région ou d'un solide

(vl-load-com)

(defun c:pt_cen	(/ AcDoc ModSp reg cen)
 (setq	AcDoc (vla-get-activedocument (vlax-get-acad-object))
ModSp (vla-get-ModelSpace AcDoc)
 )
 (vla-startundomark AcDoc)
 (while (not
   (member
     (cdr
       (assoc 0
	      (entget
		(setq reg (car (entsel "\nSélectionnez la région ou le solide: ")))
	      )
       )
     )
     '("REGION" "3DSOLID")
   )
 )
   (princ "\nEntité non valide.")
 )
 (setq	reg (vlax-ename->vla-object reg)
cen (vlax-safearray->list
      (vlax-variant-value (vla-get-Centroid reg))
    )
 )
 (if (= (vla-get-ObjectName reg) "AcDbRegion")
   (setq cen (trans cen 1 0))
 )
 (vla-addPoint ModSp (vlax-3D-point cen))
 (vla-endundomark AcDoc)
 (princ)
)

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é