willy95 Posté(e) le 28 avril 2009 Posté(e) le 28 avril 2009 Bonsoir a tous... Je suis toujours en train de me poser des problèmes utiles... (IF (= Nulot "sa") (setq Nulot2 sa)) (IF (= Nulot ???valeur numérique???? ) (setq Nulot2 ???la valeur numérique????) Je souhaite savoir comment mettre une condition différentesi la valeur de la variable Nulot est un chiffre autre que ma valeur sa ? Si quelqu'un peu m'aidé sur ce coup la.Merci d'avance
(gile) Posté(e) le 28 avril 2009 Posté(e) le 28 avril 2009 Salut, La question n'est pas claire... Regarde la fonction cond pour des conditions multiples.Regarde la fonction numberp pour évaluer si une valeur est numérique. Essaye de reposer ton problème de manière plus explicite ("sa" = chaîne ? sa = variable ?...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
willy95 Posté(e) le 28 avril 2009 Auteur Posté(e) le 28 avril 2009 Voila mon probleme: (Setq Nulot (Getstring T "\nNuméro du Lot ou :")) (IF (= Nulot "sa") (command "TEXTE" "ST" "COURIER" pt1 "100" "Surface Annexe Total" ) (IF (= Nulot ???Chiffre???? ) (command "TEXTE" "ST" "COURIER" pt1 "100" "????Chiffre????) Dans le Premier choix à la question on répond un chiffre (exemple :3)donc Nulot = 3Le résultat écrira juste le chiffre 3 Dans le deuxième choix on répond sa donc Nulot = sa pour écrire Surface Annexe Total Comment faire pour savoir si c'est un chiffre ou ma réponse (sa) ??
bonuscad Posté(e) le 28 avril 2009 Posté(e) le 28 avril 2009 Il y a plusieurs possibilités En gardant (getstring) (Setq Nulot (Getstring T "\nNuméro du Lot ou :")) (cond ((or (eq (type (read Nulot)) 'REAL) (eq (type (read Nulot)) 'INT)) (command "TEXTE" "ST" "COURRIER" pt1 "100" Nulot) ) ((or (eq Nulot "sa") (eq Nulot "SA") (eq Nulot "")) (command "TEXTE" "ST" "COURRIER" pt1 "100" "Surface Annexe Total" ) ) (T (princ "\nValeur invalide!") ) ) Mais tu aurais pu aussi utiliser (getreal) ou (getint) avec un (initget) armé avec des clés spécifiques (initget 6 "Sa") (Setq Nulot (Getint "\nNuméro du Lot ou :")) (if (not Nulot) (setq Nulot "Sa")) (cond ((eq Nulot "Sa") (command "TEXTE" "ST" "COURRIER" pt1 "100" "Surface Annexe Total" ) ) (T (command "TEXTE" "ST" "COURRIER" pt1 "100" Nulot) ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
(gile) Posté(e) le 29 avril 2009 Posté(e) le 29 avril 2009 Salut, Je pense qu'il est préférable d'adopter la même syntaxe/symbolique dans les invites des commandes définies en LISP que dans les commandes natives :- Les options entre crochets séparées par des barres obliques (ainsi, elles apparaîtront dans le menu contextuel) :(setq choix (getkword "\Entrez la direction ? [Nord/Est/Sud/Ouest]: "))-Le choix par défaut (à valider par Entrée Espace ou clic droit) entre inférieur et supérieur :(setq rad (getdist "\nSpécifiez le rayon : ")) Donc dans le cas présent, si "Surface Annexe Total" est considéré comme un choix par défaut (validé avec Entrée, Espace ou clic droit) les autres possibilités étant le N° du lot (entier) (initget 6) (if (not (setq Nulot (getint "\nEntrez le numéro du lot ou : ))) (setq Nulot "Surface Annexe Total") ) (command "TEXTE" "ST" "COURRIER" pt1 "100" Nulot) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
willy95 Posté(e) le 29 avril 2009 Auteur Posté(e) le 29 avril 2009 Merci pour tout, j'ai réussi à comprendre les conditions... Le plus facile pour étant "Getint" avec le iniget.Il me reste une question en suspends :A quoi correspond le chiffre 6 après le initget ?Et pour plusieurs ordre dans la condition existe ilune manière plus condensé que celle que j'ai ecrite ? (initget 6 "sa") (setq Nulot (Getint "\nNuméro de Lot2 ou :")) (if (not Nulot) (setq Nulot "sa")) (cond ((eq Nulot "sa") (command "TEXTE" "ST" "COURIER" pt33 (polar pt (+ Ang (/ (* 4.0 pi) 2)) 0.1) "Surface Annexe :" ) ) (T (Setq LotAF (Strcat "Lot n°" (itoa Nulot) ":")) (command "TEXTE" "ST" "COURIER" pt33 (polar pt33 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (prin1 LotAF)) ) ) (initget 6 "sa") (if (not Nulot) (setq Nulot "sa")) (cond ((eq Nulot "sa") (setq pt1 (polar pt (+ Ang (/ (* 3.0 pi) 2)) 0.6)) (command "TEXTE" "ST" "COURIER" pt1 (polar pt1 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (MiseEnForme "Surface Annexe Totale" (RtoS Somme 2 2))) ) (T (setq pt1 (polar pt (+ Ang (/ (* 3.0 pi) 2)) 0.6)) (command "TEXTE" "ST" "COURIER" pt1 (polar pt1 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (MiseEnForme "Surface Carrez" (RtoS Somme 2 2))) ) ) (initget 6 "sa") (if (not Nulot) (setq Nulot "sa")) (cond ((eq Nulot "sa") (setq pt (polar pt1 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt1 (polar pt Ang 5.25)) (Command "_Line" pt pt1 "") (setq pt34 (polar pt33 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt33 (polar pt34 Ang 2.5)) (Command "_Line" pt33 pt34 "") ) (T (setq pt (polar pt1 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt1 (polar pt Ang 5.25)) (Command "_Line" pt pt1 "") (setq pt34 (polar pt33 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt33 (polar pt34 Ang 1.5)) (Command "_Line" pt33 pt34 "") ) ) En tout cas encore merci pour tout cet enseignements.
(gile) Posté(e) le 30 avril 2009 Posté(e) le 30 avril 2009 Salut, Tout d'abord ça marche et ça, c'est super. La fonction initget sert à contrôler les valeurs entrées à l'appel des fonctions getXXX (regarde dans l'aide aux développeurs ou ici). Le chiffre 6 correspond à l'addition des codes binaires 2 et 4, respectivement pas de zéro et pas de nombre négatif.initget ne s'applique qu'à la fonction getXXX qui lui succède : donc dans ton code seul le premier appel est utile, tous les autres sont superflus. Tu utilises cond dans la situation typique de l'utilisation de if :(if condition (action si oui) (action si non)) De plus, tu fais 3 appels avec la même condition. Un seul suffit en regroupant les actions "si oui" et "si non". (initget 6 "sa") (if (not (setq Nulot (Getint "\nNuméro de Lot2 ou : "))) (setq nulot "sa") ) (if (= Nulot "sa") (progn (command "TEXTE" "ST" "COURIER" pt33 (polar pt (+ Ang (/ (* 4.0 pi) 2)) 0.1) "Surface Annexe :" ) (command "TEXTE" "ST" "COURIER" pt1 (polar pt1 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (MiseEnForme "Surface Annexe Totale" (RtoS Somme 2 2)) ) (setq pt (polar pt1 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt1 (polar pt Ang 5.25)) (Command "_Line" pt pt1 "") (setq pt34 (polar pt33 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt33 (polar pt34 Ang 2.5)) (Command "_Line" pt33 pt34 "") ) (progn (Setq LotAF (Strcat "Lot n°" (itoa Nulot) ":")) (command "TEXTE" "ST" "COURIER" pt33 (polar pt33 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (prin1 LotAF) ) (setq pt1 (polar pt (+ Ang (/ (* 3.0 pi) 2)) 0.6)) (command "TEXTE" "ST" "COURIER" pt1 (polar pt1 (+ Ang (/ (* 4.0 pi) 2)) 0.1) (MiseEnForme "Surface Carrez" (RtoS Somme 2 2)) ) (setq pt (polar pt1 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt1 (polar pt Ang 5.25)) (Command "_Line" pt pt1 "") (setq pt34 (polar pt33 (+ Ang (/ (* 3.0 pi) 2)) 0.07)) (Setq Pt33 (polar pt34 Ang 1.5)) (Command "_Line" pt33 pt34 "") ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Bonjour à tous, J'ai besoin de faire analysé un élement d'une liste entre autre une coordonnées X ou Y qui doit être non nulle et compris entre deux autres valeurs.J'ai donc essayé de faire des conditions multiples avec des if à répétition, utiliser la fonction cond mais sans succès. Voici le bout de code qui me pose problème: (cond [ (/= "0.000000" (nth 1 lstini)) (/= "0.000000" (nth 2 lstini)) (> (nth 1 lstini) (car pt1)) (< (nth 1 lstini) (car pt2)) (> (nth 2 lstini) (cadr pt1)) (< (nth 2 lstini) (cadr pt2)) ] (write-line (strcat (nth 0 lstini) " " (nth 1 lstini) " " (nth 2 lstini) " " (nth 3 lstini)) filcor) ) Mes deux points pt1 et pt2 sont saisies dans le dessin par l'utilisateur.Ce sont deux points extrêmes, point bas gauche et point haut droit d'une fenêtre de capture d'entité sous AutoCAD. Par contre, avec le if pour les deux premiers test, il n'y a pas de souci avec (if (/= "0.000000" [(nth 1 lstini) (nth 2 lstini)]) (write-line (strcat (nth 0 lstini) " " (nth 1 lstini) " " (nth 2 lstini) " " (nth 3 lstini)) filcor) ) mais dans ce cas, je ne peux faire mes tests avec les points pt1 et pt2. Si vous avez une idée, merci par avance de votre aide.John.John
(gile) Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Salut, Avant d'avoir essayé de comprendre exactement la demande, je note des erreurs de syntaxe:- l'utilisation de crochets "[" et "]"- les arguments pour la fonction cond doivent être des listes dont le premier élément est l'expression-condition et les suivants les expressions à évaluer si la condition est non nil (regarde l'aide). Si je comprends bien ce que tu veux faire, l'utilisation de cond n'est pas nécessaire. On utilise cond quand on veut évaluer plusieurs condition et exécuter des choses différentes suivant la condition qui est remplie.Ici, tu n'exécutes qu'une action si les condition sont remplies, il suffit de regrouper les conditions avec un opérateur logique : si le X est différent de 0 ET si le Y est différent de 0 ET si X est compris entre ... L'opérateur une tabulation c'est : "\t" (il me semble te l'avoir déjà dit...) (if (and (/= "0.000000" (car lstini)) (/= "0.000000" (cadr lstini)) ( ( ) (write-line (strcat (nth 0 lstini) "\t" (nth 1 lstini) "\t" (nth 2 lstini) "\t" (nth 3 lstini) ) filcor ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Merci Gile, Pour les crochets, dans l'aide Visual Lisp (je suis tes conseils tu vois !!!) , les tests de la fonction cond sont entre crochets du coup j'ai tenté, je pensais que mon erreur venait d'ailleurs mais non en fait. Pour les tabulations c'est un oubli désolé mais sinon ca marche pour le code.J'ai du le modifier un peu en intégrant distof pour convertir un string en décimal. Merci encore.John.
(gile) Posté(e) le 30 juillet 2009 Posté(e) le 30 juillet 2009 Dans l'aide "AutoLISP Reference", pour chaque fonction, tu trouves toujours au début une description de la fonction avec les arguments requis. Les crochets indiquent que le ou les arguments sont optionnels.Plus bas, tu as des exemples avec la syntaxe. 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