Aller au contenu

Messages recommandés

Posté(e)

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érente

si 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

Posté(e)

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

Posté(e)

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 = 3

Le 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) ??

 

Posté(e)

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

Posté(e)

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

Posté(e)

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 il

une 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.

Posté(e)

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

  • 3 mois après...
Posté(e)

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

 

 

Posté(e)

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

Posté(e)

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.

 

 

Posté(e)

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

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é