Aller au contenu

Messages recommandés

Posté(e)

Bonjour, J'ai encore besoin d'un peu d'aide avec un petite routine que je fais.

 

La voici :

 

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                     CE PROGRAM EST CONÇU POUR FAIRE                     ¦¦¦;
;¦¦¦                             LA COUPE DE BOIS                            ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                   AUTEUR : CadFrank, Copyright ® 2012                   ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                   Ce sous-program défini les calques                    ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

(defun NouveauCalque ()

 (if (not (tblsearch "LAYER" "-LU BOIS"))
     (Command "_layer" "_n" "-LU BOIS" "_C" "41" "-LU BOIS" "" "")
     
 )

); fin NouveauCalque

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                 Ce sous-program défini les dimensions                   ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;
 
(defun parametre ()
 
 (setq dist1 20)
 (setq dist2 38)
 (setq dist3 64)
 (setq dist4 90)
 (setq dist6 140)
 (setq dist8 190)
 (setq dist10 241)

); fin parametre

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                 Ce sous-program défini les questions                    ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

(defun question ( / val d1 d2)
 
 (initget 1 "2x3 2x4 2x6 2x8 2x10 4x4 4x6")
 (setq val (getkword "\n choisir la dimension du bois [2x3/2x4/2x6/2x8/2x10/4x4/4x6] "))

   (if (= val "2x3") (list(setq di1 dist3) (setq di2 dist2)))
   (if (= val "2x4") (list(setq di1 dist4) (setq di2 dist2)))
   (if (= val "2x6") (list(setq di1 dist6) (setq di2 dist2)))
   (if (= val "2x8") (list(setq di1 dist8) (setq di2 dist2)))
   (if (= val "2x10") (list(setq di1 dist10) (setq di2 dist2)))
   (if (= val "4x4") (list(setq di1 dist4) (setq di2 dist4)))
   (if (= val "4x6") (list(setq di1 dist6) (setq di2 dist4)))

 (setq pt-i (getpoint "\n Déterminer le point d'insertion. "))
   (setq p2 (list (+(car pt-i) di1) (+(cadr pt-i) di2)))
   (setq p3 (list (car pt-i) (+(cadr pt-i) di2)))
   (setq p4 (list (+(car pt-i) di1) (cadr pt-i)))

); fin question

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                 Ce sous-program défini les questions                    ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;
 
(defun Block (/ bent1 bent2 bent3)
 
 (setvar "clayer" "-LU BOIS")
 
 (command "_rectangle" pt-i "d" di1 di2 pt-i)
 (setq bent1 (entlast))
 (command "_line" pt-i p2 "")
 (setq bent2 (entlast))
 (command "_line" p3 p4 "")
 (setq bent3 (entlast))

 (command "_block" val pt-i bent1 bent2 bent3 "")
   
 ; mon problem est ici !!!
 
 
); fin block

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                          PROGRAM PRINCIPAL                              ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

(defun c:bois ()

 (NouveauCalque)
 (Parametre)
 (Question)
 (Block)

 (princ)

);fin bois

 

le problem survien quand je refais le meme block. j'ai essayé avec tblsearch mais sa ne fonctionne pas

 

Donc, y-aurait-il d'autre moyen pour y parvenir.

 

Merci !

Posté(e)

Bonjour CadFranck,

 

Tu déclares les variables val, d1 et d2 dans ta sous-routine question. Celle-ci sont donc remis à nil avant leur utilisation.

Déclares les dans la routine principale pour les supprimer à la fin. Attention tu as d'autres variables non-déclarées.

 

Bonne soirée

Olivier

Posté(e)

Merci Olivier pour ton information. Je vais modifier le tout.

 

Par contre, pour le question principale aurait tu une idee de se que je devrais faire ?

 

Bon Matin !

Posté(e)

Bonjour Patrick, mon problem n'est pas exactement cela. Je sais comment faire la commande pour redéfinir. Je me suis p-e mal exprimé.

 

En prenant compte que la premiere fois qu'on utilise le program "routine" le block n'existe pas. La commande ci-haut fonctionne. Mais plutard dans le meme dessins si je veux le recréer avec ma routine on me demande de redéfénir. Voila ou sa bloque.

 

Donc, j'ai essayer avec tblsearch et if sa ne marche pas ainsi j'ai essayé Not et Or. Pas plus !

 

Toujour un message d'erreur qui apparait hehe!

 

Donc je cherche juste a savoir si j'aurais d'autre chemin a utilisé pour m'y rendre !

 

Voici voila mon problem !

 

Fin !

Posté(e)

Salut

 

(defun Block (/ bent1 bent2 bent3)
 
 (setvar "clayer" "-LU BOIS")
 (if (tblsearch "block" val)
   (command "_insert" val pt-i "" "" "")
   (progn
     (command "_rectangle" pt-i "d" di1 di2 pt-i)
     (setq bent1 (entlast))
     (command "_line" pt-i p2 "")
     (setq bent2 (entlast))
     (command "_line" p3 p4 "")
     (setq bent3 (entlast))

     (command "_block" val pt-i bent1 bent2 bent3 "")
   )
 )
 
); fin block

 

Par ailleurs, la manière dont tu as structuré ton code te fait utiliser de nombreuses variables globales pour passer des valeurs d'une fonction à une autre. Ce n'est pas une bonne pratique parce que cela peut générer des erreurs difficiles à localiser.

Soit tu ne fais qu'une fonction dans laquelle tu pourras déclarer tes variables, soit tu utilise des valeurs de retours pour tes fonctions (sous forme de liste si plusieurs valeurs doivent être retournées) et/ou tu utilises des arguments.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Non, décomposer un programme en plusieurs sous-routines est une bonne pratique tant que cela ne nuit pas à la compréhension (surtout si le programme est long). Mais il faut, à mon avis que les sous routines utilisent des arguments et retournent des valeurs pour ne pas avoir de variables globales qui "trainent".

 

Voilà un exemple de ce qu'on peut faire.

J'ai supprimé la sous routine parametre qui ne faisait que définir inutilement des variable globales.

J'ai conservé NouveauCalque qui ne requiert pas d'argument et ne retourne rien.

J'ai incorporé (et modifié) question à la fonction principale.

J'ai modifié block qui est appelé par la fonction principale si le bloc n'existe pas. Les données nécessaires à la création du bloc sont passées à la fonction sous forme d'arguments.

 

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                     CE PROGRAM EST CONÇU POUR FAIRE                     ¦¦¦;
;¦¦¦                             LA COUPE DE BOIS                            ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                   AUTEUR : CadFrank, Copyright ® 2012                   ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                   Ce sous-program défini les calques                    ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

(defun NouveauCalque ()

 (if (not (tblsearch "LAYER" "-LU BOIS"))
     (Command "_layer" "_n" "-LU BOIS" "_C" "41" "-LU BOIS" "" "")
 )

); fin NouveauCalque

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                     Ce sous-program crée le bloc                        ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;
 
(defun Block (pt-i di1 di2 / p2 p3 p4 bent1 bent2 bent3)

 (setq p2 (list (+ (car pt-i) di1) (+ (cadr pt-i) di2)))
 (setq p3 (list (car pt-i) (+ (cadr pt-i) di2)))
 (setq p4 (list (+ (car pt-i) di1) (cadr pt-i)))

 (command "_rectangle" pt-i "_d" di1 di2 pt-i)
 (setq bent1 (entlast))
 (command "_line" pt-i p2 "")
 (setq bent2 (entlast))
 (command "_line" p3 p4 "")
 (setq bent3 (entlast))

 (command "_block" val pt-i bent1 bent2 bent3 "")

); fin block

;¦¦¦ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¦¦¦;
;¦¦¦                          PROGRAM PRINCIPAL                              ¦¦¦;
;¦¦¦ _______________________________________________________________________ ¦¦¦;

(defun c:bois (/ val di1 di2 pt-i)

 (NouveauCalque)

 (initget 1 "2x3 2x4 2x6 2x8 2x10 4x4 4x6")
 (setq val (getkword "\n choisir la dimension du bois [2x3/2x4/2x6/2x8/2x10/4x4/4x6] "))
 (cond
   ((= val "2x3")
    (setq di1 64
   di2 38
    )
   )
   ((= val "2x4")
    (setq di1 90
   di2 38
    )
   )
   ((= val "2x6")
    (setq di1 140
   di2 38
    )
   )
   ((= val "2x8")
    (setq di1 190
   di2 38
    )
   )
   ((= val "2x10")
    (setq di1 241
   di2 38
    )
   )
   ((= val "4x4")
    (setq di1 90
   di2 90
    )
   )
   ((= val "4x6")
    (setq di1 90
   di2 140
    )
   )
 )

 (setq pt-i (getpoint "\n Déterminer le point d'insertion. "))

 (setvar "clayer" "-LU BOIS")

 (if (not (tblsearch "BLOCK" val))
   (block pt-i di1 di2)
 )
 
 (command "_insert" val pt-i "" "" "")

 (princ)

);fin bois

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Un gros MERCI Gile.

 

Je vais tanté d'améliorer ma routine avec d'autre option. un jour va falloir que j'y rajoute un DCL

 

hehe mais je dois pour le moment me concentrer sur le Lisp.

 

Bon sur ce je vais analysé le tout et essayer de mieux comprendre. Par contre, tes explications sont clair.

 

Merci encore.

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é