Aller au contenu

Comment imbriquer des conditions dans app LISP


Messages recommandés

Posté(e)

Bonjour,

Je souhaite rendre un programme que j'ai initialement devellopé pour percer dix trous sur la semelle d'une poutrelle plus flexible qui fonction correctement suite à certaine explication que j'ai obtenu sur ce forum.

 

(defun C: holes ( / HP DR ect....)

(setq HP (getpoint "`\nHole starting point :")

(setq DR (getreal "\nDiametre of hole :")

(setq gbc (getreal "\nGap betxeen column :")

Suit le rest des valeurs à entre.........

(setq HP (polar HP Pi (/ gbc 2)

suivie des autre points......

(Command "_circle" HP1 ect

(Command "_extrud" ...........)

suivie entsel pour selectionner la poutrelle

(Command "_subtract" ss0 "" ss1 ss2 ss3 ect ......)

 

J'ai commence à le modifier en inserent INIGET 1 "2 4 6 8 10"

'setq con_1 (getkword "2/4/6/8/10")

INIGET fonctionne et il me demande de choisir le numbre de trous à percer

(if (= con_1 2) (progn

(setq HP (getpoint "\nHole starting point)

suivie des autres valeurs à entre

suivie des points ect....

cependant le programme ne fonctionne pas ou realise des loop à l'infinie.

Comment imbique des conditions pour percer le nombre de trous que je veux? 2 ou 4 ou 6 ou 8 ou 10

 

Merci d'avance pour l'aide que vous pourriez m'apporter sur cette fonction.

 

Posté(e)

Salut steelbe,

 

Pour faire des boucles, tu peux utiliser :

1) while

(setq cpt 0 lg 10)

(while (< cpt lg)
        mon_traitement

       (setq cpt (1+ cpt))
) ; while

 

2) repeat

(repeat nb_fois
       mon_traitement
) ; repeat

 

autres possibilités :

3) foreach, mais pour ce cas, il faut une liste

4) mapcar, aussi avec une liste

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Salut,

 

(if (= con_1 2) (progn

Comment imbique des conditions pour percer le nombre de trous que je veux? 2 ou 4 ou 6 ou 8 ou 10

 

IF n'est pas l'idéal pour réaliser des conditions multiples, il vaudrait mieux te tourner vers COND

 

(setq con_1 (getkword "[2/4/6/8/10]"))
(cond
((eq con_1 2) (perce 2 trous))
((eq con_1 4) (perce 4 trous))
((eq con_1 6) (perce 6 trous))
((eq con_1 8) (perce 8 trous))
((eq con_1 10) (perce 10 trous))
(T (autre condition non prévue, faire l'action appropriée))
)

 

NB:L'ordre des évaluations peut être important, car dès que COND rencontre une condition valide, les autres conditions ne sont pas évaluées.

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

Posté(e)

Bonjour Bonuscad,

 

Sur les deux réponses que j'ai reçu, ta réponse est la plus approprié.

Cependant, je n'arrive pas à faire fonctionner le programme.

un message d'erreur: erreur fonction....: AUTRE faisant référence à la dernière ligne des conditions:

(T(........................))

J'ai tenté de placer

Ou devrais-je placer l'ensemble des valeurs, points de références ainsi que les commandes pour exécuter le programme.

 

Merci

Posté(e)

Salut steelbe,

 

Voici un montage possible du code (en partant de tes quelques lignes originales)

 

(defun c:holes ( / jsel HP DR gbc key_hole id_ent js)
 (princ "\nSélectionner un solide.")
 (while (null (setq jsel (ssget "_+.:E:S" '((0 . "3DSOLID")))))
   (princ "\nCe n'est pas un solide!")
 )
 (initget 9)
 (setq HP (getpoint "\nPoint du Trou de départ: "))
 (initget 91)
 (setq DR (getdist HP "\nDiamètre du Trou: "))
 (initget 91)
 (setq gbc (getdist HP "\nEcart entre colonne: "))
 (initget "2 4 6 8 10")
 (setq key_hole (getkword "\nNombre de trous à percer[2/4/6/8/10]? : "))
 (command "_.circle" "_none" HP (* DR 0.5))
 (command "_.extrude" (entlast) "" pause)
 (setq id_ent (entlast) js (ssadd))
 (cond
   ((eq key_hole "2")
     (command "_.-array" (entlast) "" "_rectangular" "2" "1" gbc)
   )
   ((eq key_hole "4")
     (command "_.-array" (entlast) "" "_rectangular" "2" "2" gbc gbc)
   )
   ((eq key_hole "6")
     (command "_.-array" (entlast) "" "_rectangular" "2" "3" gbc gbc)
   )
   ((eq key_hole "8")
     (command "_.-array" (entlast) "" "_rectangular" "2" "4" gbc gbc)
   )
   ((eq key_hole "10")
     (command "_.-array" (entlast) "" "_rectangular" "2" "5" gbc gbc)
   )
   (T
      (ssadd (entlast) js)
   )
 )
 (if key_hole
   (progn
     (ssadd id_ent js)
     (while (setq id_ent (entnext id_ent))
       (ssadd id_ent js)
     )
   )
 )
 (command "_.subtract" jsel "" js "")
 (prin1)
)

 

Décortique et si quelque chose t'échappes...

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

Posté(e)

Pour répondre à ta demande par MP, il aurait été mieux de faire le suivi sur le forum

Ainsi d'autre que moi aurait pu répondre...

 

Donc le code pour un réseau irrégulier

 

(defun c:PERCAGE ( / jsel key_hole id_ent js hole_point hole_diameter hole_depth
                    column_dist column_point lst_pt
                    row_dist1 row_point1 row_dist2 row_point2 row_dist3 row_point3 row_dist4 row_point4)
 (princ "\nSélectionner un solide.")
 (while (null (setq jsel (ssget "_+.:E:S" '((0 . "3DSOLID")))))
   (princ "\nCe n'est pas un solide!")
 )
 (initget "2 4 6 8 10")
 (setq key_hole (getkword "\nNombre de trous à percer[2/4/6/8/10]? : "))
 (setq id_ent (entlast) js (ssadd))
 (initget 9)
 (setq hole_point (getpoint "\nPoint du Trou de départ: "))
 (initget 71)
 (setq hole_diameter (getdist "\nDiamètre du Trou: "))
 (initget 71)
 (setq hole_depth (getdist hole_point "\nProfondeur du Trou: "))
 (cond
   ((eq key_hole "2")
     (initget 71)
     (setq column_dist (getdist hole_point "\nEcart entre colonne: "))
     (setq column_point (polar hole_point 0 column_dist))
     (setq lst_pt (list hole_point column_point))
   )
   ((eq key_hole "4")
     (initget 71)
     (setq column_dist (getdist hole_point "\nEcart entre colonne: "))
     (setq column_point (polar hole_point 0 column_dist))
     (initget 71)
     (setq row_dist1 (getdist hole_point "\nEcart entre la 1ère rangée: "))
     (setq row_point1 (polar hole_point (* pi 0.5) row_dist1))
     (setq lst_pt
       (list
         hole_point
         column_point
         row_point1
         (list (car column_point) (cadr row_point1) (caddr hole_point))
       )
     )
   )
   ((eq key_hole "6")
     (initget 71)
     (setq column_dist (getdist hole_point "\nEcart entre colonne: "))
     (setq column_point (polar hole_point 0 column_dist))
     (initget 71)
     (setq row_dist1 (getdist hole_point "\nEcart entre la 1ère rangée: "))
     (setq row_point1 (polar hole_point (* pi 0.5) row_dist1))
     (initget 71)
     (setq row_dist2 (getdist row_point1 "\nEcart entre la 2ème rangée: "))
     (setq row_point2 (polar row_point1 (* pi 0.5) row_dist2))
     (setq lst_pt
       (list
         hole_point
         column_point
         row_point1
         (list (car column_point) (cadr row_point1) (caddr hole_point))
         row_point2
         (list (car column_point) (cadr row_point2) (caddr hole_point))
       )
     )
   )
   ((eq key_hole "8")
     (initget 71)
     (setq column_dist (getdist hole_point "\nEcart entre colonne: "))
     (setq column_point (polar hole_point 0 column_dist))
     (initget 71)
     (setq row_dist1 (getdist hole_point "\nEcart entre la 1ère rangée: "))
     (setq row_point1 (polar hole_point (* pi 0.5) row_dist1))
     (initget 71)
     (setq row_dist2 (getdist row_point1 "\nEcart entre la 2ème rangée: "))
     (setq row_point2 (polar row_point1 (* pi 0.5) row_dist2))
     (initget 71)
     (setq row_dist3 (getdist row_point2 "\nEcart entre la 3ème rangée: "))
     (setq row_point3 (polar row_point2 (* pi 0.5) row_dist3))
     (setq lst_pt
       (list
         hole_point
         column_point
         row_point1
         (list (car column_point) (cadr row_point1) (caddr hole_point))
         row_point2
         (list (car column_point) (cadr row_point2) (caddr hole_point))
         row_point3
         (list (car column_point) (cadr row_point3) (caddr hole_point))
       )
     )
   )
   ((eq key_hole "10")
     (initget 71)
     (setq column_dist (getdist hole_point "\nEcart entre colonne: "))
     (setq column_point (polar hole_point 0 column_dist))
     (initget 71)
     (setq row_dist1 (getdist hole_point "\nEcart entre la 1ère rangée: "))
     (setq row_point1 (polar hole_point (* pi 0.5) row_dist1))
     (initget 71)
     (setq row_dist2 (getdist row_point1 "\nEcart entre la 2ème rangée: "))
     (setq row_point2 (polar row_point1 (* pi 0.5) row_dist2))
     (initget 71)
     (setq row_dist3 (getdist row_point2 "\nEcart entre la 3ème rangée: "))
     (setq row_point3 (polar row_point2 (* pi 0.5) row_dist3))
     (initget 71)
     (setq row_dist4 (getdist row_point3 "\nEcart entre la 4ème rangée: "))
     (setq row_point4 (polar row_point3 (* pi 0.5) row_dist4))
     (setq lst_pt
       (list
         hole_point
         column_point
         row_point1
         (list (car column_point) (cadr row_point1) (caddr hole_point))
         row_point2
         (list (car column_point) (cadr row_point2) (caddr hole_point))
         row_point3
         (list (car column_point) (cadr row_point3) (caddr hole_point))
         row_point4
         (list (car column_point) (cadr row_point4) (caddr hole_point))
       )
     )
   )
   (T
     (setq lst_pt (list hole_point))
   )
 )
 (setvar "cmdecho" 0)
 (mapcar
   '(lambda (x)
     (command "_.circle" "_none" x "_Diameter" hole_diameter)
     (command "_.extrude" (entlast) "" hole_depth)
   )
   lst_pt
 )
 (if key_hole
   (progn
     (ssadd id_ent js)
     (while (setq id_ent (entnext id_ent))
       (ssadd id_ent js)
     )
   )
   (ssadd (entlast) js)
 )
 (command "_.subtract" jsel "" js "")
 (setvar "cmdecho" 1)
 (prin1)
)

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

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

Bonjour à tous,

 

Toujours dans la même optique de rendre mes code lisp plus conviviale, j'ai crée un dcl à utiliser pour insérer des profiles IPE et HEA. ce dialogue comprend deux popup_list. Une regroupant les deux types de profile étant IPE et HEA et un deuxième popup_list avec les différentes hauteurs de poutrelle ex: 80 100 120 140 etc........

 

J'ai compris le fonctionnement de (COND) cependant, je me heurt à un problème pour l'évaluation de la condition à appliquer car le code devra évaluer deux conditions simultanément étant le type (I ou H) ainsi que la hauteur 100 120 etc ... provenant des popup_list.

 

Apres de nombreux essais la boite de dialogue apparait, je définis les valeurs que je souhaite mais il ne me dessine qu'une section le HEA 100 cela provient peut être des valeurs initialisé dans le lisp. Peut-etre existe t-il un code pour effectuer cette étape.

 

Merci pour l'aide que vous pourrez m'apporter sur se problème.

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é