vincent32050 Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 Voila je viens de réaliser une programme d'incrémentation d'attribut de blocs qui permet de choisir un prefix, un sufix... mais je suis confronté à un problémes, le programme fonctionne correctement si je rentre tout les paramétre dans un seul programme mais je souhaiterais réaliser un programme pour chaque variable pour ne pas être obliger de rentré toute les variables à chaque fois. Cela me permettré de réaliser un bouton pour chaque variable et un bouton pour exécuter l'ensemble. Voila le programme que j'ai écrit pour le moment (trés inspirer de programme trouver sur le forum) merci de m'aider à le faire fonctionner: ;========================================================================= ; ; Incrémentation Vincent ; ; (C) 2008 ;========================================================================= (defun c:action(/ ) ;------------------------------------------------------------------------- ; Action ;------------------------------------------------------------------------- (defun c:increm(/ typef typed numdi numde numcf num oldcmd cmdecho dev der nbr inc ent ntxt tew ) (setq ent 1) (setq cont 1) (setq inc 1) (setq ntxt "") (setq der "") (setq dev "") (setq nbr 1) (setq tew 10) (setq dev (strcat typed "." (itoa numdi) "." numcf "." (itoa numde) "." )) (setq ent 1) (setq der (strcat typef)) (setq num (- num inc)) ; **pour partir du numero de depart (while ent (setq ent (nentsel "\nSelectionner le texte ou l'attribut a incrementer : ")) (if ent ;**si il y a selection d'une entite (progn (setq ent (car ent)) ;**nom de l'entite a modifiee (setq ent (entget ent)) (if (and (/= (cdr (assoc 0 ent)) "TEXT") (/= (cdr (assoc 0 ent)) "ATTRIB")) (alert "ERREUR : Mauvaise selection.") (progn (if (= num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (> num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (< num 9) (setq ntxt (strcat dev "0" (itoa (+ num inc ))"." der)) ) ) ) (setq ent (subst (cons 1 ntxt) (assoc 1 ent) ent)) (entmod ent);**regenere la base de donnee (entupd (cdar ent));**regenere les attributs a l'ecran (setq num (+ num inc)) (setq cont 1) (setq ntxt "") ) ) ) ) ;==================== (defun c:num(/ num ) ;------------------------------------------------------------------------- ; Ajouter Premier numéro ;------------------------------------------------------------------------- (setq num (getint "\nPremier numéro (par defaut 1) :")) ) ;============== (defun c:numcf(/ numcf ) ;------------------------------------------------------------------------- ; Ajouter Numéro du coffret ;------------------------------------------------------------------------- (setq numcf (getstring "\Numéro du coffret ** :")) ) ;=============== (defun c:numde(/ numde ) ;------------------------------------------------------------------------- ; Ajouter Numéro départ ;------------------------------------------------------------------------- (setq numde (getint "\Numéro de départ du coffret :")) ) ;========================================================================= (defun c:numdi(/ numdi ) ;------------------------------------------------------------------------- ; Ajouter Numéro division ;------------------------------------------------------------------------- (setq numdi (getint "\Numéro de la division :")) ) ;========================================================================= (defun c:typed(/ typed ) ;------------------------------------------------------------------------- ; Ajouter Catégorie ;------------------------------------------------------------------------- (setq typed (getstring T"\nCatégorie de l'équipement N/S/X :")) ) ;========================================================================= (defun c:typef(/ typef ) ;------------------------------------------------------------------------- ; Ajouter Type Equipement ;------------------------------------------------------------------------- (setq typef (getstring T"\nType de l'équipement CR/ES/BQ :")) ) ) (setq nom_lisp "typef, typed, numdi, numde, numcf, num, increm") (if (/= app nil) (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp) (princ (strcat "..." nom_lisp " chargé.")) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (setq nom_lisp nil) (princ)
(gile) Posté(e) le 29 septembre 2008 Posté(e) le 29 septembre 2008 Salut, Il me semble que ton problème est un problème de stockage de valeurs et d'accessibilité à ces valeurs. Quand tu écris : (defun c:num (/ num) (setq num (getint "\nPremier numéro (par defaut 1) :")) ) tu déclares la variable num dans l'expression (/ num), ce faisant la valeur attribuée à cette variable n'est accessible que dans la fonction c:num et num retourne à nil quand on sort de la fonction. Comme la fonction ne fait qu'attribuer une valeur à la variable, elle ne sert à rien... Suivant le niveau d'accessibilité qu'on veut donner à une valeur, on peut employer différentes méthodes. Pour une valeur accessible dans un dessin pendant la session, on peut utiliser une variable globale (non déclarée) : (defun c:num (/ num) (setq *num* (getint "\nPremier numéro (par defaut 1) :")) (princ) ) Une fois la valeur attribuée à *num*, on peut y accéder pendant toute la session en rappelant la variable, mais elle retournera à nil à la réouverture du dessin.Par convention, on met des astérisque au début et à la fin des variables globales. Pour que la valeur soit conservée dans le dessin au delà de la session, on peut utiliser les dictionnaires, les Xrecords ou données LISP (ldata qui fonctionnent comme des dictionnaires).Ces dernières sont les plus simples d'utilisation (defun c:num (/ num) (and (setq num (getint "\nPremier numéro (par defaut 1) :")) (vlax-ldata-put "Increment" "num" num) ) (princ) ) pour récupérer la valeur, on fait : (vlax-ldata-get "Increment" "num") Pour que la valeur soit accessible tout le temps et dans tous les dessins, on peut les inscrire dans la base de registre avec vl-registry-write ou, plus simplement, utiliser les variables d'environnement, dans ce cas les valeurs doivent être converties en chaînes. (defun c:num (/ num) (and (setq num (getint "\nPremier numéro (par defaut 1) :")) (setenv "Increment_num" (itoa num)) ) On récupère la valeur en faisant : (atoi (getenv "Increment_num")) Regarde l'aide pour ces fonctions... Quelle que soit la méthode choisie, il faudrait soit initialiser ces valeurs dans la fonction principale (valeur par défaut), soit tester si elles ne sont pas nil auquel cas lancer les fonction pour leur attribuer une valeur.[Edité le 29/9/2008 par (gile)] [Edité le 29/9/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
vincent32050 Posté(e) le 30 septembre 2008 Auteur Posté(e) le 30 septembre 2008 Merci beaucoup pour les explications mais je suis toujours bloqué voila se que j'ai fait : ;========================================================================= ; ; Incrémentation Vincent ; ; (C) 2008 ;========================================================================= (defun c:action(/ ) ;------------------------------------------------------------------------- ; Action ;------------------------------------------------------------------------- (defun c:increm(/ oldcmd cmdecho dev der nbr inc ent ntxt tew ) (setq ent 1) (setq cont 1) (setq inc 1) (setq ntxt "") (setq der "") (setq dev "") (setq nbr 1) (setq tew 10) (vlax-ldata-get "num" "numcf" "numde" "numedi" "typed" "typef") (setq dev (strcat typed "." (itoa numdi) "." numcf "." (itoa numde) "." )) (setq ent 1) (setq der (strcat typef)) (setq num (- num inc)) ; **pour partir du numero de depart (while ent (setq ent (nentsel "\nSelectionner le texte ou l'attribut a incrementer : ")) (if ent ;**si il y a selection d'une entite (progn (setq ent (car ent)) ;**nom de l'entite a modifiee (setq ent (entget ent)) (if (and (/= (cdr (assoc 0 ent)) "TEXT") (/= (cdr (assoc 0 ent)) "ATTRIB")) (alert "ERREUR : Mauvaise selection.") (progn (if (= num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (> num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (< num 9) (setq ntxt (strcat dev "0" (itoa (+ num inc ))"." der)) ) ) ) (setq ent (subst (cons 1 ntxt) (assoc 1 ent) ent)) (entmod ent);**regenere la base de donnee (entupd (cdar ent));**regenere les attributs a l'ecran (setq num (+ num inc)) (setq cont 1) (setq ntxt "") ) ) ) ) ;------------------------------------------------------------------------- ; Ajouter Premier numéro ;------------------------------------------------------------------------- (defun c:num (/ num) (and (setq num (getint "\nPremier numéro (par defaut 1) :")) (vlax-ldata-put "num" num) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro du coffret ;------------------------------------------------------------------------- (defun c:numcf (/ numcf) (and (setq numcf (getstring "\Numéro du coffret ** :")) (vlax-ldata-put "numcf" numcf) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro départ coffret ;------------------------------------------------------------------------- (defun c:numde (/ numde) (and (setq numde (getint "\Numéro de départ du coffret :")) (vlax-ldata-put "numcf" numcf) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro division ;------------------------------------------------------------------------- (defun c:numdi (/ numdi) (and (setq numdi (getint "\Numéro de la division :")) (vlax-ldata-put "numdi" numdi) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Catégorie ;------------------------------------------------------------------------- (defun c:typed (/ typed) (and (setq typed (getstring T"\nCatégorie de l'équipement N/S/X :")) (vlax-ldata-put "typed" typed) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Type Equipement ;------------------------------------------------------------------------- (defun c:typef (/ typef) (and (setq typef (getstring T"\nType de l'équipement CR/ES/BQ :")) (vlax-ldata-put "typef" typef) ) (princ) ) ) (setq nom_lisp "typef, typed, numdi, numde, numcf, num, increm") (if (/= app nil) (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp) (princ (strcat "..." nom_lisp " chargé.")) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (setq nom_lisp nil) (princ) Lorsque je lance "increm" il me dit toujours que j'ai une variable nil ('; erreur: type d'argument incorrect: fixnump: nil')
(gile) Posté(e) le 30 septembre 2008 Posté(e) le 30 septembre 2008 Salut, Plusieurs choses : - ton LISP compte de nombreuses "parenthèses fermantes non appariées" (utilise l'éditeur Visual LISP) - la fonction est nommée "c:action" et tu dis lancer "increm" !? - l'expression :(vlax-ldata-get "num" "numcf" "numde" "numedi" "typed" "typef") n'est pas valide les arguments requis pour cette fonction sont : un nom de dictionnaire et une clé (regarde dans l'aide pour les fonctions vlax-ldata*). - au lancement de la routine, les variables num, numcf, numde, numdi, typed et typef sont donc nil. Il faudrait, en début de routine, - soit attribuer à ces variables une valeur : la valeur ldata pour la clé donnée si elle exite, une valeur par défaut sinon.Exemple pour num et numcf (il faut le faire pour chaque variable)Increment est le nom du dictionnaire (tu peux mettre la chaîne que tu veux)"num" et "numcf" sont des clés dans ce dictionnaire (tu peux mettre les chaînes que tu veux)1 est la valeur par défaut attribuée à la variable num (tu peux mettre l'entier que tu veux)"1" est la valeur par défaut attribuée à la variable numcf (tu peux mettre la chaîne que tu veux) (or (setq num (vlax-ldata-get "Increment" "num")) (setq num 1) ) (or (setq numcf (vlax-ldata-get "Increment" "numcf")) (setq numcf "1") ) - soit appeler la fonction correspondante pour la définir si elle n'existe pas (pour toutes les variables, évidemment) (while (not (setq num (vlax-ldata-get "Increment" "num"))) (c:num) ) (while (not (setq numcf (vlax-ldata-get "Increment" "numcf"))) (c:numcf) ) De même, si tu veux une commande par variable pour définir ou changer la valeur de la variable, il faut faire un (defun c:... ) par variable : (defun c:num (/ num) (and (setq num (getint "\nPremier numéro (par defaut 1) :")) (vlax-ldata-put "Increment" "num" num) ) (princ) ) (defun c:numcf (/ numcf) (and (setq num (getstring "\nNuméro du coffret ** :")) (vlax-ldata-put "Increment" "numcf" numcf) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
vincent32050 Posté(e) le 30 septembre 2008 Auteur Posté(e) le 30 septembre 2008 Encore merci pour ton aide Gile Voila je suis toujours bloqué mais je suis perdu sur la definition des variables ou dois je définir mes variables dans (defun c:action ...) ou dans chaque fonction (num, numcf ...) Quand j'exécute le programme suivant il bloque sur le choix du coffret numcf ! n'importe quelle valeur que je rentre il me redemande, enfin j'utilise bien visual LISP donc je ne pense pas avoir d'erreur de paranthése ;========================================================================= ; ; Incrémentation Vincent ; ; (C) 2008 ;========================================================================= (defun c:action(/ oldcmd cmdecho dev der nbr inc ent ntxt tew num numcf numde numdi typed typef ) ;------------------------------------------------------------------------- ; Action ;------------------------------------------------------------------------- (setq ent 1) (setq cont 1) (setq inc 1) (setq ntxt "") (setq der "") (setq dev "") (setq nbr 1) (setq tew 10) (vlax-ldata-get "increment" "num") (vlax-ldata-get "increment" "numcf") (vlax-ldata-get "increment" "numde") (vlax-ldata-get "increment" "numdi") (vlax-ldata-get "increment" "typed") (vlax-ldata-get "increment" "typef") (while (not (setq num (vlax-ldata-get "Increment" "num"))) (c:num) ) (while (not (setq numcf (vlax-ldata-get "Increment" "numcf"))) (c:numcf) ) (while (not (setq numde (vlax-ldata-get "Increment" "numde"))) (c:numde) ) (while (not (setq numdi (vlax-ldata-get "Increment" "numdi"))) (c:numdi) ) (while (not (setq typed (vlax-ldata-get "Increment" "typed"))) (c:typed) ) (while (not (setq typef (vlax-ldata-get "Increment" "typef"))) (c:typef) ) (setq dev (strcat typed "." (itoa numdi) "." numcf "." (itoa numde) "." )) (setq ent 1) (setq der (strcat typef)) (setq num (- num inc)) ; **pour partir du numero de depart (while ent (setq ent (nentsel "\nSelectionner le texte ou l'attribut a incrementer : ")) (if ent ;**si il y a selection d'une entite (progn (setq ent (car ent)) ;**nom de l'entite a modifiee (setq ent (entget ent)) (if (and (/= (cdr (assoc 0 ent)) "TEXT") (/= (cdr (assoc 0 ent)) "ATTRIB")) (alert "ERREUR : Mauvaise selection.") (progn (if (= num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (> num 9) (setq ntxt (strcat dev (itoa (+ num inc ))"." der)) ) (if (< num 9) (setq ntxt (strcat dev "0" (itoa (+ num inc ))"." der)) ) ) ) (setq ent (subst (cons 1 ntxt) (assoc 1 ent) ent)) (entmod ent);**regenere la base de donnee (entupd (cdar ent));**regenere les attributs a l'ecran (setq num (+ num inc)) (setq cont 1) (setq ntxt "") ) ) ) ) ;------------------------------------------------------------------------- ; Ajouter Premier numéro ;------------------------------------------------------------------------- (defun c:num (/ num) (and (setq num (getint "\nPremier numéro (par defaut 1) :")) (vlax-ldata-put "increment" "num" num) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro du coffret ;------------------------------------------------------------------------- (defun c:numcf (/ numcf) (and (setq numcf (getstring "\Numéro du coffret ** :")) (vlax-ldata-put "increment" "numcf" numcf) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro départ coffret ;------------------------------------------------------------------------- (defun c:numde (/ numde) (and (setq numde (getint "\Numéro de départ du coffret :")) (vlax-ldata-put "increment" "numcf" numcf) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Numéro division ;------------------------------------------------------------------------- (defun c:numdi (/ numdi) (and (setq numdi (getint "\Numéro de la division :")) (vlax-ldata-put "increment" "numdi" numdi) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Catégorie ;------------------------------------------------------------------------- (defun c:typed (/ typed) (and (setq typed (getstring T"\nCatégorie de l'équipement N/S/X :")) (vlax-ldata-put "increment" "typed" typed) ) (princ) ) ;------------------------------------------------------------------------- ; Ajouter Type Equipement ;------------------------------------------------------------------------- (defun c:typef (/ typef) (and (setq typef (getstring T"\nType de l'équipement CR/ES/BQ :")) (vlax-ldata-put "increment" "typef" typef) ) (princ) ) (setq nom_lisp "typef, typed, numdi, numde, numcf, num, increm") (if (/= app nil) (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp) (princ (strcat "..." nom_lisp " chargé.")) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (princ (strcat "\n" nom_lisp " Chargé......Faites " nom_lisp " pour exécuter la fonction désirée."))) (setq nom_lisp nil) (princ)
(gile) Posté(e) le 30 septembre 2008 Posté(e) le 30 septembre 2008 Salut, L'erreur vient de là : (defun c:numde (/ numde) (and (setq numde (getint "\Numéro de départ du coffret :")) (vlax-ldata-put "increment" [surligneur]"numcf" numcf[/surligneur] ) ) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
vincent32050 Posté(e) le 30 septembre 2008 Auteur Posté(e) le 30 septembre 2008 Merci beaucoup ca marche trés bien je n'est plus qu'a créer mes boutons et mon programme sera fin pret, une derniére petite question je sait pas si c'est possible je voudrais afficher la valeur en cour de la variable au pret de mon bouton : Par exemple pour num afficher num suivit de la derniére valeur rentré !
vincent32050 Posté(e) le 30 septembre 2008 Auteur Posté(e) le 30 septembre 2008 En créent mes boutons j'ai vu que l'on pouvais créer des menu déroulant comme pour afficher les calques par exemble, comment est ce que je peux afficher ma variable dans un menu déroulant ? comme lorsque que l'on et dans les commandes d'autocad et qu'avec la fléche du haut on peu récupérer les derniére valeur de la variable ?
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