MiniMinus Posté(e) le 23 juin 2006 Posté(e) le 23 juin 2006 Bonsoir à tous Avant toute chose, pourrait-on me dire ce que signifie l'apostraophe ( ' ) devant certaines données. Ceci étant fait, j'ai fait un petit programme pour dessiner un poteau (à partir de mon fichier txt des profils) vu de profil (c-à-d 2 lignes d'épaisseur d'aile à equidistance de l'axe), mais je n'arrive pas à avoir le bon dessin. Mes lignes ne sont pas toutes parallèles alors que les points de coordonnées sont exacts. Quelqu'un pourrait-il me dire si c'est une question de coordonnées absolues ou relatives et comment remédier à ce problème? Merci d'avance MiniMinus PS : je sais qu'il y a moyen de faire plus court mais pour l'instant j'essaye surtout que cela marche correctement. (je ferais des oeuvres d'art plus tard :D ) Programme :(defun LireFic (); / choix Profil x MonFic) (setq MonFic "C:/Documents and Settings/Manuel/Application Data/Autodesk/AutoCAD 2004/R16.0/fra/Support/Fichier_Profils.txt") (setq x (open MonFic "r")) (setq choix (getstring "Le profil :")) (while (/= choix Profil) (setq Profil (read-line x)) (if (= Profil "fin") (progn (princ "Profil non répertorié !!!") (close x) (exit) ) ) (setq Haut (read-line x)) (setq Large (read-line x)) (setq Ame (read-line x)) (setq Aile (read-line x)) (setq Conge (read-line x)) ) (close x) (princ) ) (defun main (); / l1 l2 l3 h1 h2 h3 X1 X2 Y1 Y2 Xtemp Ytemp) (setq P1 (getpoint "1er point :") P2 (getpoint P1 "2ème point :") X1 (car P1) Y1 (cadr P1) X2 (car P2) Y2 (cadr P2)) (if (< Y2 Y1) (setq Xtemp X1 Ytemp Y1 X1 X2 Y1 Y2 X2 Xtemp Y2 Ytemp) ) (setq l1 0 h1 0 l2 0 h2 0 l3 0 h3 0) (LireFic) (setq l1 (- X2 X1) h1 (- Y2 Y1) alpha (atan h1 l1)) (setq alpha (- (/ pi 2) alpha)) (setq l2 (* (/ (atof Haut) 2) (cos alpha))) (setq h2 (* (/ (atof Haut) 2) (sin alpha))) (setq l3 (* (- (/ (atof Haut) 2) (atof Aile)) (cos alpha))) (setq h3 (* (- (/ (atof Haut) 2) (atof Aile)) (sin alpha))) (princ (strcat (rtos l2) " " (rtos h2) "===" (rtos l3) " " (rtos h3))) (setq P3 (list (- X1 l2) (+ Y1 h2))) (setq P4 (list (- X2 l2) (+ Y2 h2))) (setq P5 (list (- X1 l3) (+ Y1 h3))) (setq P6 (list (- X2 l3) (+ Y2 h3))) (setq P7 (list (+ X1 l3) (- Y1 h3))) (setq P8 (list (+ X2 l3) (- Y2 h3))) (setq P9 (list (+ X1 l2) (- Y1 h2))) (setq P10 (list (+ X2 l2) (- Y2 h2))) (command "_line" P1 P2 "") (command "_line" P3 P4 "") (command "_line" P5 P6 "") (command "_line" P7 P8 "") (command "_line" P9 P10 "") (princ) )
Tramber Posté(e) le 23 juin 2006 Posté(e) le 23 juin 2006 Je ne vois pas de contrôle de la variable OSMODE dans ton code, méfie-toi. Qui sait, tu as peut-être un problème d'accrochage aux objets. L'apostrophe signifie QUOTE, c'est une façon de passer un argument sans l'évaluer. De lire comment il s'appelle. Ainsi (SET 'A 10) équivaut à (setq A 10). le ' a été transformé en QUOTE, soit Q et a glissé vers SET pour y être collé. Ca a donné SETQ. Comme la naissance de l'enfant Jesus, ce fut un événement. [Edité le 23/6/2006 par Tramber] Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 23 juin 2006 Posté(e) le 23 juin 2006 Pour quote, une explication ici Pour OSMODE, je ne peux qu'aller dans le sens de Tramber, dès qu'on crée des entités graphiques avec (command ...) il vaut mieux que OSMODE soit à 0. (setq os (getvar "OSMODE")) en début de routine(setvar "OSMODE" 0) avant les (command ...)(setvar "OSMODE" os) à la fin. Tu peux faire aussi :(setvar "OSMODE" (+ (getvar "OSMODE") 16384)) pour désactiver les accrobj, et :(setvar "OSMODE" (- (getvar "OSMODE") 16384)) pour les ré-activer. [Edité le 23/6/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 23 juin 2006 Posté(e) le 23 juin 2006 Juste une remarqueOuvre ton fichier une fois que l'utilisateur a donné une réponse, car si elle est nil,il a été ouvert pour rien @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
MiniMinus Posté(e) le 24 juin 2006 Auteur Posté(e) le 24 juin 2006 Merci à tous les deux L'ignare que je suis, ne connaissais pas "OSMODE". Encore une chose que j'ai apprise. Je progresse, je progresse... Encore vingt ans et je pourrais passer à cinquante lignes de programme. MiniMinus
(gile) Posté(e) le 24 juin 2006 Posté(e) le 24 juin 2006 Une petite chose, Lorsqu'on modifie les valeurs initiales de variables système dans un LISP, si une erreur ou une annulation (echap) intervient avant que les valeurs initiales aient été restaurées elles conservent les valeurs qui leur ont été attribuées par la routine (exemple classique : "Pourquoi mon accrochage aux objets est-il désactivé ?"). Pour éviter ce problème on peut gérer les erreurs en redéfinissant la fonction *error* dans une sous-routine, en chargeant cette nouvelle définition dans la routine principale et en restaurant la fonction initiale à la fin de la routine principale et de la fonction erreur redéfinie. Cette méthode peut servir aussi, par exemple, pour restaurer le SCU d'origine (si celui-ci a été modifié) et est incontournable pour fermer un groupe d'annulation -(command "_undo" "_end"). Exemple de redéfinition de la fonction *error* pour un LISP dans lequel l'accrochage aux objets et l'écho des invites de commandes sont désactivés et où les commandes sont réunies dans un groupe d'annulation : ;;; Redéfinition de *error* (defun MonErreur (msg) (if (= msg "Fonction annulée") (princ) ;_ aucun message en cas d'annulation (princ (strcat "Erreur : " msg)) ;_ message d'erreur AutoCAD ) (command "_undo" "_end") ;_ clôture du groupe d'annulation (setvar "OSMODE" os) ;_ restauration de l'accrochage (setvar "CMDECHO" cm) ;_ restauration de l'écho (setq *error* m:err ;_ restauration de la fonction *error* initiale m:err nil) (princ) ) Utilisation de la fonction MonErreur dans MonLisp : (defun c:MonLisp (/ os cm ) (setq m:err *error* ;_ sauvegarde de *error* initiale dans la variable m:err *error* MonErreur ;_ chargement de MonErreur ) (setq os (getvar "OSMODE") ;_ sauvegarde des variables système cm (getvar "CMDECHO") ) (command "_undo" "_begin") ;_ début du groupe d'annulation (setvar "OSMODE" 0) ;_ modification des variables système (setvar "CMDECHO" 0) ;; Le code avec les (command ...) (command "_undo" "_end") ;_ clôture du groupe d'annulation (setvar "OSMODE" os) ;_ restauration de l'accrochage (setvar "CMDECHO" cm) ;_ restauration de l'echo (setq *error* m:err ;_ restauration de la fonction *error* initiale m:err nil) (princ) ) NB : Les lignes de code sont les mêmes à la fin des deux routines. Çà peut paraître fastidieux, mais çà devient vite une habitude, et dès que tu seras un peu plus aguérri, tu utiliseras plus volontiers les fonctions entmake, entmod ... ou les fonctions vla- vlax- qui ne nécessitent pas de désactiver les variables citées ci-dessus qui sont les plus courament modifiées en AutoLISP. [Edité le 24/6/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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