Aller au contenu

Erreur sur boite DCL avec liste, mais pas Toujours !


Messages recommandés

Posté(e)

Bonjour,

 

Nota j'ai modifier tous le lisp + dcl , et je change de question

J'ai récuperé un lisp + dcl, et je l'ai modifié (ne trouvant pas de réponse à mon probleme)

 

Mais j'ai un nouveau probléme: il y a une erreur apres le lancement si je ne change rien à la selection de la liste1 et de la liste2

exemple: si je fais un choix dans la liste de droite uniquement,ensuite je valide, et j'ai une erreur

Si ensuite je fais un choix à gauche dans la liste, la liste de droite change (c'est ok), ensuite je valide, et de nouveau erreur.

Mais si au premier lancement, je fais un choix dans la liste de droite, puis dans celle de gauche, la aucun probleme.

** Error: type d'argument incorrect: stringp nil **

 

il me semble que le probleme vient de la:

      (action_tile "lst2" (strcat "(setq *Model* $value)" "(setq *Make* $value1)" "(setq tempo_index2 (atoi *Model*))" "(setq tempo_SNC_CAL (nth tempo_index2 lst2))"))

]

 

Code:

(defun c:SNC_X (var_snc / *error* UpdateList data dclfile dclhandle )

 

;; This program demonstrates how to update a secondary list_box based

;; on user selection from a primary list_box.

 

;; Example courtesy of Lee Mac © 2010 (www.lee-mac.com)

 

;; Accompanying DCL File:

 

;**************************

(setq NAMES_COUL (list 1 2 3 4 5 6))

 

(setq NAMES_LIN (list "CACHE2" "CACHE2" "CACHE2" "CACHE2" "CACHE2" "CACHE2"))

 

(setq NAMES_EP_L (list 2 2 2 2 2 2)) ; épaisseur pour ligne

(setq NAMES_EP_T (list 1 1 1 1 1 1)) ; épaisseur pour texte

(setq NAMES_EP_E (list 0.5 0.5 0.5 0.5 0.5 0.5)) ; épaisseur pour équipement

 

;*************************

 

 

 

(setq dclFile "listboxexample.dcl")

 

;; Ensure this file resides in an AutoCAD Support Path

 

(defun *error* ( msg )

 

;; Error Handler - will unload the dialog

;; from memory should the user decide to hit Esc

 

(if dclHandle (unload_dialog dclHandle))

(or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")

(princ (strcat "\n** Error: " msg " **")))

(princ)

)

 

(defun UpdateList ( key lst )

 

;; This function updates the list_box associated with the specified key

;; using the contents of the supplied lst

 

(start_list key)

(mapcar 'add_list lst)

(end_list)

)

 

;; Data used to Populate List_Boxes:

;; I've chosen to use this list structure because it suits the data,

;; but there are many other possibilities.

 

(setq Data

'(

("Ventilation" ("CV-451 Air neuf-un" "CV-452 Air soufflé-un" "CV-453 Air repris-un" "CV-454 Rejet d’air-un" "CV-455 VMC-un" "CV-456 Air extrait-un"))

("Plomberie" ("SA-610 Eau Froide-bi" "SA-620 Eau chaude-bi" "SA-625 Bouclage Eau chaude-bi" "SA-630 Eau mitigée-bi"))

)

)

 

;; Start of Main Routine

;; Lots of Error Trapping to make sure the Dialog Loads:

 

(cond

( (<= (setq dclHandle (load_dialog dclFile)) 0)

 

(princ "\n--> DCL File not Found.")

)

( (not (new_dialog "listboxexample" dclHandle))

 

(setq dclHandle (unload_dialog dclHandle))

(princ "\n--> Dialog Definition not Found.")

)

( t

;; Dialog Loaded Successfully.

 

(or *Make* (setq *Make* "0"))

(or *Model* (setq *Model* "0"))

 

;; Set up some default selections, for the first-time running of the program.

;; The variables *Make* & *Model* are intended to be global and hence will

;; remember the user's last selections.

 

;; Populate the List_Boxes:

 

;; List_Box 'lst1'

 

(UpdateList "lst1" (mapcar 'car Data))

(set_tile "lst1" *Make*)

 

;; List_Box 'lst2'

 

(UpdateList "lst2" (cadr (nth (atoi *Make*) Data)))

(set_tile "lst2" *Model*)

 

;; Action_tile Statements:

;; These control what happens when the user interacts with a tile in the dialog.

 

(action_tile "lst1"

(strcat

"(setq $value1 $value) (UpdateList \"lst2\" (setq lst2 (cadr (nth (atoi (setq *Make* $value)) Data))))"

"(setq *Model*"

" (set_tile \"lst2\""

" (if (< (atoi *Model*) (length lst2)) *Model* \"0\")"

" )"

")"

)

)

 

;; Here, when the user selects an item from 'lst1', the UpdateList subfunction

;; is fired to update the items in list_box 'lst2'.

 

;; list_box 'lst2' is also set to the value of *Model* if the index is

;; available for the selected item, else the first item is selected.

 

;; Note that $value is a string containg the index of the item

;; that the user has selected.

 

(action_tile "lst2" (strcat "(setq *Model* $value)" "(setq *Make* $value1)" "(setq tempo_index2 (atoi *Model*))" "(setq tempo_SNC_CAL (nth tempo_index2 lst2))"))

 

;; Dialog setup, lets start it:

 

(start_dialog)

(setq dclHandle (unload_dialog dclHandle))

)

)

;******

 

;(alert (strcat "la valeur est :" *Make* " " *Model*))

 

(setq SNC_CAL tempo_SNC_CAL)

(setq index1 (atoi *Make*)) ; list Lot

(setq index2 (atoi *Model*)) ; list Calque

 

;(setq SNC_CAL (nth index2 NAMES_CAL)) ;récupérer nom du calque dans liste

(setq SNC_COUL (nth index2 NAMES_COUL)) ;récupérer couleur dans la liste

 

;var_snc = "L" pour ligne

;var_snc = "T" pour texte

;var_snc = "E" pour equipement

 

;****************

; LIGNE / RESEAU

;

(if (= var_snc "L")

(progn

(setq SNC_EP (nth index2 NAMES_EP_L)) ;récupérer épaisseur dans la liste pour ligne

(setq SNC_LIN (nth index2 NAMES_LIN)) ; récupérer le type de ligne

; creation calque

(if (= (tblsearch "layer" SNC_CAL) nil)

;création calque

(command "-calque" "n" SNC_CAL "co" SNC_COUL SNC_CAL "tl" SNC_LIN SNC_CAL "ep" SNC_EP SNC_CAL "ch" SNC_CAL "")

)

(command "_line")

); fin progn

); fin if

 

;****************

; TEXTE

;

(if (= var_snc "T")

(progn

(setq SNC_CAL (strcat SNC_CAL "_Texte"))

(setq SNC_EP (nth index1 NAMES_EP_T)) ;récupérer épaisseur dans la liste pour texte

(setq SNC_LIN "CONTINUOUS") ; fixe le type de ligne

; creation calque

(if (= (tblsearch "layer" SNC_CAL) nil)

;création calque

(command "-calque" "n" SNC_CAL "co" SNC_COUL SNC_CAL "tl" SNC_LIN SNC_CAL "ep" SNC_EP SNC_CAL "ch" SNC_CAL "")

)

(command "_text")

); fin progn

); fin if

 

 

;****************

;EQUIPEMENT

;

(if (= var_snc "E")

(progn

(setq SNC_CAL (strcat SNC_CAL "_Equip"))

(setq SNC_EP (nth index1 NAMES_EP_E)) ;récupérer épaisseur dans la liste pour equipement

(setq SNC_LIN "CONTINUOUS") ; fixe le type de ligne

; creation calque

(if (= (tblsearch "layer" SNC_CAL) nil)

;création calque

(command "-calque" "n" SNC_CAL "co" SNC_COUL SNC_CAL "tl" SNC_LIN SNC_CAL "ep" SNC_EP SNC_CAL "ch" SNC_CAL "")

)

; lancement icon

; Gestion des lot cv fm ....

;

 

(setq Lot "I=SNC1.CVC1")

(menucmd Lot)

;(menucmd "I=SNC1.CVC1")

(menucmd "I=SNC1.*")

 

); fin progn

); fin if

 

 

;**********

(princ)

 

); defun

 

 

Boite DCL:

// DCL File to be saved as listboxexample.dcl

// Example courtesy of Lee Mac © 2010 (www.lee-mac.com)

 

lbox : list_box { width = 25; fixed_width = true; alignment = centered; }

 

listboxexample : dialog { label ="List Box Synchronisation"; spacer;

: row {

: lbox { key = "lst1"; label = "Make" ; }

: lbox { key = "lst2"; label = "Model"; }

}

ok_only;

}

Posté(e)

C'est bon, j'ai trouvé le probleme.

J'ai modifieé le lisp, pour non plus "passer" une variable avec le nom du calque, mais la list.

 

 

Question: comment clore le sujet ?

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é