Aller au contenu

J\'écris mon premier lisp : à l\'aide !!!


brunomu

Messages recommandés

Bonjour,

 

Je tente d'écrire mon premier vrai lisp tout seul comme un grand, sans partir d'un lisp préexistant, et (surprise ?) c'est pas si simple.

 

Je veux créer un lisp qui me permette de créer un scu tel que l'altitude d'un point soit directement interrogeable sur le dessin, autement dit, où la coordonnée y dans mon dessin 2D soit égale à la coordonnée z dans le vrai bâtiment.

 

La manip consisterait donc à demander à l'utilisateur un point dont il connait l'altimétrie (p1), puis sa valeur numérique (alt), et ensuite AutoCad se chargerait de de définir un nouveau scu à une distance de (0,-alt,0) du point p1.

 

J'ai donc commencé comme ça :

 

(defun c:uz()

(setq p1 (getpoint "\nPOINT DE REFERENCE ? : "))

(setq alt (getreal "n\n\ALTIMETRIE EN Z ?"))(terpri)

 

...mais après, je ne sais pas comment spécifier l'origine du nouveau scu car je ne sais pas indiquer à AutoLisp comment calculer ce nouveau point...

 

Quelqu'un peut-il m'aider [crié très fort dans l'hyperespace] ?

 

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Salut, et bienvenue à un nouveau lispeur !

 

J'avoues ne pas bien comprendre ce que tu cherches à faire.

 

je ne sais pas indiquer à AutoLisp comment calculer ce nouveau point...

Tu récupères avec "getpoint" dans p1 une liste de cordonnée sous le forme (x y z)

Si tu veux récupérer :

x = (car p1)

y = (cadr p1)

z = (caddr p1)

donc si tu veux reconstruire ton point avec un Z différent :

(setq new-pt (list (car p1) (cadr p1) alt))

 

ou

(0,-alt,0) du point p1

donc :

(setq New-pt (list (car p1) (- (cadr p1) alt) (caddr p1))

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Merci de m'aider, ô lispeur - presque - anonyme (je n'ai pris connaissance de ta réponse que ce midi).

J'ai l'impression que j'avance, mais ça ne marche pas encore. Je récapitule et je m'explique :

__________________________________

 

Je voudrais que mon lisp crée un scu avec pour nouvelle origine un point situé à (0, -alt, 0) d’un point (p1) que saisit l'utilisateur et dont il donne la valeur altimétrique (alt).

 

Donc, je définis la nouvelle commande :

(defun c:uz()

 

Je demande à l’utilisateur le point à partir duquel AutoCad va construire le nouveau scu :

(setq p1 (getpoint "\nPOINT DE REFERENCE ? : "))

 

Je demande ensuite son altimétrie :

(setq alt (getreal "n\n\ALTIMETRIE EN Z ?"))(terpri)

 

Et je crée un nouveau scu à (0,-alt, 0) du point p1 :

(command "_ucs" "_n" "_from" p1 (list (car p1) (- alt) (caddr p1))

)

 

…sauf que ça marche pas ! Sans doute à cause de mes lacunes en Autolisp (d'ailleurs j'ai droit au message pas très encourageant d'AutoCad : "malformed list on input"

 

Peux-tu me donner encore un petit coup de pouce ?

 

Merci !

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

ton lisp fonctionne chez moi.

J'ai du mal à comprendre ça :

(command "_ucs" "_n" "_from" p1 (list (car p1) (- alt) (caddr p1))
)

crée un scu avec pour nouvelle origine un point situé à (0, -alt, 0) d’un point (p1)

ceci devrait suffire, non ? :

(command "_ucs" "_n" (list (car p1) (- alt) (caddr p1)))

 

 

Nota : enlève

(terpri)

 

 

[Edité le 12/7/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

Ce n'est pas plutôt ceci que tu voudrais réaliser:

 

(defun c:uz ( / p1 alt)
(initget 1)
(setq p1 (getpoint "\nPOINT DE REFERENCE ? : "))
(initget 1)
(setq alt (getreal "n\n\ALTIMETRIE EN Z ?"))
(command "_.ucs" "_new" "_origin" "_none" (list (car p1) (- (cadr p1) alt) (caddr p1)))
(prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

D'ailleurs, je ne sais pas comment me documenter pour avancer dans Autolisp, quelqu'un sait-il comment faire ?

 

1 - Tu as ce forum qui est là pour ça.

2 - Tu as aussi CADxp

3 - Si tu cherches bien, il y a des choses ici!

:P ;) ...

et aussi :

http://aidacad.com/fr/autolisp.htm

http://www.afralisp.co.za/

etc...

tu as des livres aussi...

et surtout l'aide Lisp d'Autocad !

 

... et je t'ai dit CADxp ?

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Lien vers le commentaire
Partager sur d’autres sites

mais à quoi sert (initget 1) ?

 

Il s'utilise avec les fonction (get....) getpoint getcorner getkword getdist etc....

SAUF (getstring)

 

En fait il arme un bit de controle (qui peuvent s'additionner), ici 1 interdit une entrée vide/nulle.

Ainsi si l'utilisateur fait une erreur de saisie (une validation sans fournir le point), l'entrée est répétée jusqu'à qu'elle soit valide.

 

Si je n'avais pas fais ceci, une entré nulle aurait affectée la variable par exemple p1 à nil et bien sur la suite de la procédure aurait avorté car un (car p1) aurait été invalide.

 

(initget) est a renouveler a chaque utilisation de (get....), mais dans l'aide autolisp tu auras plus d'info.

 

D'autre part, remarque aussi que j'ai utilisé l'option "_none" ("aucun") pour être sur que le point calculé ne s'accroche par inadvertance à un objet, ce qui aurait faussé le résultat si un accroche objet avait été actif. On aurait pu aussi utiliser la variable "OSMODE".

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

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é