cath287 Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 Salut, je commence tout juste à tripatouiller le lisp qui me donnait envie depuis bien longtemps. Je connais donc mes premiers déboires... D'où cet appel au secours. Dans mon premier programme, j'ai cru comprendre que pour déplacer d'un point A à un point B il ne fallait pas évaluer les coordonnées des points et donc mettre '(0 0 0) par exemple. (Bien sûr j'ai peux être compris de travers mais en tout cas ça fonctionne dans mon tout petit programme...). Mon problème est que dans mon deuxième programme je commence par calculer une distance D5 et je dois copier du point 0,0,0 au point D5,0,0. J'ai tenté plein de trucs différents mais je ne comprends pas comment évaluer juste D5 puis utiliser les coordonnées telle quelle... Je suis loin d'etre sure que c'était clair alors pour vous embrouiller encore un peu plus voici les quelques lignes que j'ai ;calpinage automatique (defun c:d10 ( / ) ;Définir D1, la distance hors tout (setq pt1 (getpoint "\nSelectionner le coin du premier dessus")) (setq pt2 (getpoint "\nSelectionner le coin du dernier dessus")) (setq D1 (distance pt1 pt2)) ;Définir D2, la distance entre le dessus et la première console : 185 ou 235 (setq D2 (getdist "\n spécifiez distance axe de console dessus")) ;Calculer D3, la distance entre la première et la dernière console : D1-2xD2 (setq D3 (- D1 (* 2 D2))) ;Calcul de D4, le nombre d'espace entre 2 consoles : D3/1460 avec arrondi au dessus (setq nbre1 (/ D3 1460.0)) ;nbre1 : D3/1460 (setq nbre2 (fix nbre1)) ;nbre2 : arrondi de nbre1 (setq nbre3 (- nbre1 nbre2)) ;nbre3 : reste après la virgule de nbre1 (setq D4 (if (equal 0.0 nbre3) nbre1 (+ nbre2 1))) ;si nbre3 différent de 0 alors D4=nbre2+1 sinon, D4=nbre1 ;Calcul de D5, la distance entre 2 consoles : D3/D4 (setq D5 (/ D3 D4)) ;Selection de Sel1, la première console (Setq sel1 (ssget)) (princ) ;Copier Sel1 à D5 mm (command "_copy" sel1 "" "" (d5 0.0 0.0)) ; nil : '((list d5) 0.0 0.0)), '(list d5 0.0 0.0), !d5,0.0,0.0, d5,0.0,0.0, ; erreur : fonction incorrecte : (d5 0.0 0.0) ; erreur: no function definition: !D5 : (!d5 0.0 0.0) ; erreur: Fonction annulée : "!d5 0.0 0.0" , "d5 0.0 0.0", "d5,0.0,0.0", "!d5,0.0,0.0" (princ) ;Copier Sel1 à D5x2mm ;... A faire D4 fois ) fin de defun les commentaires après la commande copy sont les tests que j'ai fait et les réponses que ça me donnait et ce qu'il y a en dessous, n'en tenez pas compte je n'en suis pas encore là... Et bien si vous arrivez à m'aidez, ça serait top!!! Merci d'avance de votre patience... Ps: si en plus vous pouvez m'expliquer comment mettre l'axe x dans le sens pt1 vers pt2...
(gile) Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 Salut, L'interpréteur LISP attend toujours une fonction derrière une parenthèse. La seule exception, qui n'en est pas vraiment une en fait, est quand la parenthèse est précédée d'une apostrophe. Cette apostrophe est en fait une abréviation de la fonction quote :'(d5 0.0 0.0) est équivalent à (quote (d5 0.0 0.0))La fonction quote sert à empêcher l'évaluation de l'expression qui lui est passée en argument.Les deux expression ci dessus retournent donc la même chose à savoir la liste telle qu'elle sans évaluer son contenu :(d5 0.0 0.0) L'erreur que tu as eu en essayant de passer directement (d5 0.0 0.0) à la fonction command est due au fait que l'interpréteur LISP s'attendait à ce que d5 soit une fonction. Ce que tu cherches à faire c'est passer une liste en argument tout en laissant l'interpréteur évaluer le contenu de cette liste (notamment la variable d5). Pour ce faire il faut utiliser la fonction list qui créer une liste en évaluant chacun des arguments qui lui sont passés.(list d5 0.0 0.0) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
cath287 Posté(e) le 22 février 2016 Auteur Posté(e) le 22 février 2016 ah ok je faisais un gros mélange de tout ça au petit bonheur la chance en ne comprenant pas tout mais avec tes explications je crois que c'est acquis, j'essaye demain matin pour voir ça. J'avoue que c'est pas simple quand tu n'a jamais rien programmé de ta vie... En tout cas merci aussi pour ton document qui m'aide beaucoup.
Tramber Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 les commentaires après la commande copy sont les tests que j'ai fait et les réponses que ça me donnait et ce qu'il y a en dessous, n'en tenez pas compte je n'en suis pas encore là...Moi je dis bravo car le renvoi de la console permet de pister tout de suite.Rares sont les gens qui s'essaient et mettent un peu de commentaires utiles.J'ajoute que lorsque tu fais !d5 c'est en ligne de commande ou dans la console. Donc tu ne peux pas le coller à ,0.0,0.0 et ça n'est pas une expression lisp du tout. C'est juste pour appeler la valeur d'une variable lisp dans la ligne de commande. Mais tu le sais. (/ D3 1460.0)) -> bien ! éviter les entiers pour diviser même si là les risques sont éliminés par D3 surement réel.C'est un bon programme à première vue B) J'avais lu le sujet avant de devoir partir et (gile t'a sauvé avec la correction à la fin). Bon perso, moi j'écris calepinage ;) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Tramber Posté(e) le 22 février 2016 Posté(e) le 22 février 2016 ;Définir D2, la distance entre le dessus et la première console : 185 ou 235 (setq D2 (getdist "\n spécifiez distance axe de console dessus 1 (185) 2 (235)")) (cond((= D2 1)(setq D2 185.0))((= D2 2)(setq D2 235.0)))Pourrait être sympa, non ? Tu n'as plus qu'à répondre 1 ou 2 pour tes valeurs préférées.Si tu entres 1 en ligne de commande ou 2, tu obtiens la valeur préréglée. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
cath287 Posté(e) le 23 février 2016 Auteur Posté(e) le 23 février 2016 Vous êtes top, mon programme marche et je comprends maintenant ce qui n'allait pas et ce qu'il faudra faire la prochaine fois!!! Concernant ma distance D2 c'est justement ce que je voulais faire mais je ne savais pas comment m'y prendre, ça faisait partie des choses en attente comme l'histoire du SCU et de l’incrémentation sur lesquels il faut que je me penche maintenant.
Tramber Posté(e) le 23 février 2016 Posté(e) le 23 février 2016 SCU est la commande la plus bête qui existe pourvu qu'on se penche un peu (beaucoup) dessus.Quand on connait bien une fonctionnalité en ligne de commande on la programme bien plus facilement en Autolisp (avec command, pour dire vite).En VisualLisp, c'est différent. On programme plus "moderne" dans l'arborescence de toute l'informatique en cours, OS, Acad, dessin, entité. Mais, chaque chose en son temps. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant