Aller au contenu

Messages recommandés

Posté(e)

Bonjour à toutes et à tous.

 

Je voudrait savoir ce qu'il ne va pas dans ma fonction, étant un débutant, j'aurait besoin de votre aide.

 

Je voudrait mettre un point entre deux points spécifiés.

 

(defun c:acc_mil ( / pt1 pt2 di )
 (setq pt1 (getpoint "\nSpécifiez le premier point: "))
 (setq pt2 (getpoint pt1 "\nSpécifiez le deuxième point: "))
 (setq di (distance pt1 pt2))
 (command "point" (/ di 2))
 (princ)
)

 

En fait cette fonction , je voudrait qu'elle me serve comme un accrochage milieu entre deux points.

 

Merçi pour votre aide.

 

PS: Version AutoCAD 2004

 

[Edité le 10/5/2009 par Chris24]

Posté(e)

Salut,

 

Quels type de valeur sont assignés à tes variables ?

pt1 et pt2 : un point, soit une liste de 3 nombres réels

di : un nombre réel (la distance entre pt1 et pt2)

 

l'expression (command "_point" ...) attend un point (une liste de 2 ou 3 réels) mais l'expression (/ di 2) retourne aussi un nombre réel (la moitié de la distance).

 

Il faut donc calculer le point qui est au milieu de pt1 et pt2 appelons le mid, par exemple).

Il y a plusieurs façons de le faire.

 

Tu peux utiliser la fonction polar qui permet de spécifier un point à partir d'une origine, d'un angle et d'une distance

 

(setq mid (polar pt1 (angle pt1 pt2) (/ di 2)))

 

Tu peux aussi utiliser les coordonnées de pt1 et pt2 pour trouver mid : les coordonnées de mid sont la moyenne des coordonnées de pt1 et pt2.

 

(setq mid (list	(/ (+ (car pt1) (car pt2)) 2.0)
	(/ (+ (cadr pt1) (cadr pt2)) 2.0)
	(/ (+ (caddr pt1) (caddr pt2)) 2.0)
  )
)

 

Si le code ci dessus fonctionne, il n'est pas très élégant. on répète 3 fois les mêmes opérations sur les éléments correspondants de 2 listes (pt1 et pt2).

AutoLISP fournit une fonction puissante pour résoudre ce problème : mapcar

mapcar requiert comme argument une fonction et une ou plusieurs listes et retourne une liste qui est résultat de l'exécution de la fonction avec comme argument chacun des éléments de la (ou des) liste(s)

 

Dans notre cas, il faudrait une fonction qui divise par 2 la somme de 2 nombre réels.

On peut définir une telle fonction pour l'utiliser avec mapcar :

(defun moyenne2 (x1 x2) (/ (+ x1 x2) 2.0))

 

(moyenne2 4.5 6.5) retourne 5.5 qui est bien la moyenne de 4.5 et 6.5

 

et ensuite, on peut faire :

(setq mid (mapcar 'moyenne2 pt1 pt2))

 

On peut aussi éviter de définir une fonction extérieure (qui n'est pas d'un grand intérêt) et définir cette fonction localement à l'intérieur de l'expression mapcar en utilisant la fonction lambda qui permet justement de définir des fonctions anonymes :

(setq mid (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) pt1 pt2))

 

On peut remarquer que la fonction lambda ci-dessus est identique à la fonction moyenne2 à ceci près qu'elle n'a pas de nom (normal elle est anonyme).

 

La compréhension et l'utilisation des fonctions mapcar et lambda peut paraître difficile au début mais elle est un passage majeur dans l'apprentissage du LISP.

 

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

Posté(e)

Salut Gile

 

Avec cette fontion:

 

(setq mid (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) pt1 pt2))

 

Le programme fonctionne quand je sélectionne deux points opposé d'un rectangle, mai quand je sélectionne par exemple les deux extrémités d'une ligne ou une polyligne, il me met comme point de départ le premier point sélectionné.

 

A tu un idée.

 

@+

Posté(e)

Ce n'est pas du à la fonction, qui est juste géométriquement.

 

Je pense plutôt que c'est dû à l'accrochage aux objets "Extrémité" qui doit être active.

La fonction command est sensible aux accrobj il faut soit désactiver temporairement les accrobj dans l'expression avec l'option "_non" ou ("auc" en français) pour AUCun :

(command "_point" "_non" mid)

soit en mettant la variable osmode à 0. Pour cette dernière solution, il est préférable de sauvegarder la valeur initiale pour pouvoir la restaurer ensuite :

(setq osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(command "_point" mid)
(setvar "OSMODE" osmode)

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

Posté(e)

Bonjour à toutes et à tous.

et salut Gile.

 

Si je sauvegarde la valeur initiale OSMODE pour pouvoir la restaurer, Sela ne marche pas.

(defun c:acc_mil ( / pt1 pt2 mid )
(setq osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
   (setq pt1 (getpoint "\nSpécifiez le premier point: "))
   (setq pt2 (getpoint "\nSpécifiez le deuxième point: "))
   (setq mid (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) pt1 pt2))
(setvar "OSMODE" osmode)
)

 

Par contre si je met la variable OSMODE à 0 sans la restaurer sela fonctionne.

(defun c:acc_mil ( / pt1 pt2 mid )
(setvar "OSMODE" 0)
   (setq pt1 (getpoint "\nSpécifiez le premier point: "))
   (setq pt2 (getpoint "\nSpécifiez le deuxième point: "))
   (setq mid (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) pt1 pt2))
)

Et je perd tous mes accrobj.

 

En fait je me sert de acc_mil en transparence en tappant 'acc_mil aprés la commade ligne ou polyline.

 

@+

Posté(e)

Je n'avais pas compris ce que tu voulais faire.

Désactiver l'accrochage aux objets n'est utile qu'avec la fonction command (en LISP).

 

Pour ce que tu veux faire, suivant ta version d'AutoCAD, tu n'as pas besoin LISP, il suffit d'entrer mtp ou m2p ou encore CTRL+M à l'invite qui demande de spécifier un point.

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

Posté(e)

Salut à toutes et à tous.

 

Désolé de répondre un peut tard.

 

Avec ma version AutoCAD 2004, mtp ou m2p ou encore CTRL+M à l'invite ne marche pas.

 

Mais je pense que je vais me débrouiller avec le petit Lisp en mettant la variable OSMODE à 0 sans la restaurer, se n'est pas bien grave.

 

Merçi encore.

 

@+

Posté(e)

Salut,

 

Ce qui serait un peu mieux et de DESACTIVER "osmode" si tu ne peux pas restorer sa valeur en fin de code.

 

Exemple d'un bouton que je m'étais fait sur des versions anciennes.

 

((lambda ( / p1 p2)
(prompt "\nPoint milieu entre ")
(initget 1)
(setq p1 (getpoint "premier point : "))
(initget 1)
(setq p2 (getpoint p1 "\nsecond point : "))
(setvar "osmode" (+ 16384 (rem (getvar "osmode") 16384)))
(setvar "lastpoint" (mapcar '* (mapcar '+ p1 p2) '(0.5 0.5 0.5)))
))

 

Réactiver osmode avec sa dernière valeur est plus simple, soit par F3 ou le bouton approprié dans la barre d'état

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

Posté(e)

Salut,

 

En fait le plus sur est d'enregistrer le code donné dans un fichier lisp, par exemple xmil.lsp dans un dossier de recherche d'autocad. Puis de mettre tout simplement (load "xmil") dans la macro comme indiqué dans l'image.

 

http://moe.mabul.org/up/moe/2009/05/14/img-234923v5qbx.png

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

Posté(e)

coucou

 

je ne suis pas contre l'aide à l'apprentissage du Lisp

loin de moi cette idée, mais ...

je me permets de rappeler que cette commande est native dans autocad

 

taper m2p donne ce résultat.

 

ceci est un message pour mémoire

 

bonne continuation aux débutants qui se coltinent avec ce langage magique.

 

amicalement

Posté(e)

Bonjour à tous.

 

Avec la version AutoCAD 2004, mtp ou m2p ou encore CTRL+M à l'invite ne marche pas.

 

Il me dit "Point incorrect."

 

@+

 

[Edité le 18/5/2009 par Chris24]

Posté(e)

Bonjour,

 

Par contre avec la 2004, je pense que l'usage de la calculatrice en transparence peut faire la même chose.

 

Lors du message de l'acquisition d'un point, tu peux rentrer en transparence dans le mode de calcul en tapant:

'CAL et au message ">>>> Expression:" taper:

mee ce qui signifie milieu en 1ere extrémité et 2ème extrémité (en mode accrochage objet)

 

Si l'expression te semple longue tu peux en faire une macro (sans ^C^C pour l'avoir en transparence)

 

Si tu veux utiliser d'autre accrochage tu peux utiliser aussi l'expression:

(cur+cur)*0.5 qui signifie position courante du curseur et au message:

">>>> Entrez un point:" forcer l'accrochage voulu même si l'accrochage est actif car il n'est pas fonctionnel en mode calculatrice.

 

 

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é