Aller au contenu

Probléme programme d\'incrémentation


Messages recommandés

Posté(e)

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)

Posté(e)

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

Posté(e)

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')

 

 

Posté(e)

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

Posté(e)

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)

Posté(e)

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

Posté(e)

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

Posté(e)

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 ?

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é