CADxp: OpenDCL et un lisp - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

OpenDCL et un lisp

#1 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 26 novembre 2010 - 03:47

Bonjour à tous,

Il est vrai que cet outil manque réellement aux fonctions Lisp d'Autocad.
De plus, avec ObjectDCL ou OpenDCL, c'est vraiment la galère pour comprendre et faire intéragir un lisp avec une boite de dialogue du type .odcl ou .odc.

Rien qu'avec un bouton text, pour activer une commande lisp définie par (defun c: ...), j'ai vraiment la galère.

J'ai compris le principe de
(dcl_Project_Load "C:/....../M_DAO.ODCL" T)

(dcl_Form_Show m_dao_1) 
pour charger une feuille dans Autocad.

Dans ma boite de dialgoue OpenDCL, j'ai crée un Tab Strip avec plusieurs onglets, j'ai crée un Text Button par dessus. Si j'insére le code ci-dessous dans la console Autolisp, la fenêtre s'affiche mais sans de bouton OK ou annuler en bas, et sans le TextButton.

Quelqu'un aurait il une idée ? ou du moins un exemple ?

Le mieux pour moi serait de récupérer les infos rentrés par l'utilisateur de chaque tab sous forme de liste. Mais encore faut il savoir le faire et pour l'instant je bugge....

Merci par avance de votre aide.
John
0

#2 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 26 novembre 2010 - 04:25

J'ai pu trouver pour créer des Button Text sur chaque tab de ma boite de dialogue mais je ne trouve pas le moyen de lier un Button Text avec une commande lisp du type c:toto par exemple.

Merci encore de votre aide.
John
0

#3 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 26 novembre 2010 - 19:04

Citation

J'ai pu trouver pour créer des Button Text sur chaque tab de ma boite de dialogue mais je ne trouve pas le moyen de lier un Button Text avec une commande lisp du type c:toto par exemple.


Il faut donner une propriété à ton bouton dans l'éditeur : c'est la propriété on_clicked.

(defun c:F1_OK_OnClicked ()
(Odcl_MessageBox "To Do: code must be added to OK" "To do")
)

Voici le code Odcl (je n'utilise pas Open) pour mon bouton OK. Ensuite tu remplaces le messageBox par ton code. Ici, dans le bouton OK, ca sera (odcl_form_close Besc_F1) pour fermer (normal, j'ai pris l'exemple du bouton Ok). Mais ca aurait pu être toto.

Attention, il faut faire un load en mode debug pour voir s'appliquer l'événement. Et avoir enregistré le fichier Odc, off course !

En Odcl, on gère des événements.

Ne pas baissser les bras, l'apprentissage est ingrat (et long, vraiment long) mais les résultats sont d'enfer :cool:
Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#4 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 26 novembre 2010 - 19:08

Oups, je reviens sur le début.

Si tu parles bien d'un Tabcontrol, attention, cet objet cache ce qu'il y a en dessous. Je ne comprends pas bien le problème (premier message).

Commence par du tout simple, genre une boite avec 1 ou 2 controles....
0

#5 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 27 novembre 2010 - 08:03

MErci Tramber,

J'ai pu m'en sortir avec tes conseils maitenant tout marche nickel.
Je suis en train d'essayer de faire une COmbo BOX maintenant.

Je ne trouve pas dans la fenêtre proprietés d'Open DCL où l'on met les valeurs d'entrées comme une popup list en pur Lisp ou on crée la liste avant et puis on charge la popup list avec

 (start_list "typf")

(mapcar 'add_list ltypf)

(end_list)


De plus, comment faire pour extraire les données d'entrées d'un utilisateur à partir d'un Text Box ?

Merci par avance de ton aide.
John
0

#6 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 27 novembre 2010 - 15:01

Vite fait : je suis là une demie-heure. Ca t'arrange peut-être pour ce WE.

(defun c:test()  

  

  (defun c:DclForm1_OnInitialize ()

    (Odcl_Control_SetText boite_DclForm1_TextBox1 (rtos 33.21 2 2))

    (Odcl_ComboBox_AddList boite_DclForm1_ComboBox1 (mapcar 'rtos(list  1 2 35 21.2)))

    )  

  

  (defun c:DclForm1_Ok_OnClicked ()

    (Setq rValue (atof (Odcl_ComboBox_GetTBText boite_DclForm1_ComboBox1)))

    (Setq rValue2 (Odcl_Control_getText boite_DclForm1_TextBox1))

    (odcl_form_close boite_DclForm1)

    )


  (Odcl_Form_Show boite_DclForm1)


  )


J'ai ici une boite DclForm1 du fichier boite.odc.
J'ay ai créé une textbox et une combobox.

Il faut lui cliquer la propriété OnInitialize.
J'ai ajouté le bouton Ok et coché la propriété On_clicked.

Pour le reste des formules, elles se trouvent dans les propriétés intelligentes (clic-droit sur le controle).

Attention, je n'utilise pas Open, le vocabulaire est légèrement différent.
Méfiance, j'ai fait l'alimentation de la combo, mais je n'ai pas choisi de selection, elle apparaitra vide, il faut ajouter un (Setq rValue (Odcl_ComboBox_SelectString boite_DclForm1_ComboBox1 sSearchString [as String])) dans l'initialisation si souhaité.
Attention aux textboxes, il faut régler le filterstyle.
Ne vas pas trop loin. Mairtriser les textbox est déjà long !

Avantage si tu connais les problématiques du DCL.
Moi, je n'ai jamais eu le temps de l'apprendre, quel paradoxe !
0

#7 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 04 décembre 2010 - 10:37

Bonjour Tramber

Désolé de te répondre tardivement mais j'étais en déplacement cette semaine.
Je ne m'en sors pas.
Je verrais plus cela dans le détail demain j'aurais plus de temps

Merci encore de ta réponse.
Je reviendrais vers toi pour de donner des nouvelles.

John
0

#8 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 04 décembre 2010 - 21:03

Rebonjour Tramber

Ca y est, j'y suis presque, j'ai pu alimenter et sortir une valeur de mes combo box et des text box avec en OpenDcl

(defun c:tmp_cmd_FORM_TXT100_OnClicked (/ val1 val2 val3 val4 val5 lst_f)

(setq val1 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX1))

(setq val2 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX2))

(setq val3 (dcl_Control_GetText tmp_cmd_FORM_TBOX1))

(setq val4 (dcl_Control_GetText tmp_cmd_FORM_TBOX2))

(setq val5 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX3))

(dcl_Form_Close tmp_cmd_FORM)

(setq lst_f (list val1 val2 val3 val4 val5))

(princ lst_f)

) 


Maintenant j'ai deux petits problèmes et je n'arrive pas à trouver de solution même en tout essayant dans les proprietés, je n'arrive pas à attribuer une valeur par défaut à mes combo box dès l'affichage de ma boite de dialogue alors qu'en cliquant sur la même box en question, toutes les valeurs s'affichent bien.

D'autre part, j'ai un bouton qui me permet normalement (par une fonction que Gile m'a fait) de sélectionner un texte dans mon dessin et je voudrais attribuder la valeur de ce texte à un TextBox,

j'ai essayé avec

 (defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi)

(dcl_Form_Close tmp_cmd_FORM)

(setq rdi (SelectText))

(dcl_Form_Show tmp_cmd_FORM)

(dcl_Control_SetText tmp_cmd_FORM_TBOX2 rdi)

)


Mais ca ne marche pas,

Si tu as des idées, sinon c'est pas grave, je vais encore trifouiller par ci par là
Merci encore de ton aide.

John
0

#9 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 04 décembre 2010 - 23:19

Tramber,

Pour la valeur par défaut c'est bon j'ai pu m'en sortir dans les proprietés des combo box dans OpenDCL mais pour le bouton qui doit attribuer une valeur au TextBox et l'afficher dans ma boite de dialogue toujours pas......

Merci par avance de ton aide et celle de Gile (si vous avez 2min).
John
0

#10 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 05 décembre 2010 - 16:10

Je crois que tu n'as pas encore compris le principe et que tu n'as pas été attentif à mon exemple :

Une boite doit être initialisé par l'événement adéquat. Une boite doit avoir l'événement cliqué dans l'éditeur ODCL. Et cet événement est c:DclForm1_OnInitialize dans mon exemple.

Encore une fois, tant que tu n'as pas réussi cela, ne vas pas plus loin :cool:

Mon exemple Test est encore loin du niveau à atteindre car je n'ai pas voulu t'effrayer. (en même temps ca n'est pas l'ascension du Mont-Blanc !). Mais il représente un code avec l'intialisation de la boite.

Pour les controles, je les interroge en sortie avec le bouton OK. Mais le mieux sera d'utiliser les OnkillFocus ou OnEditchanged respectivement des texbox et des combo pour surveiller les valeurs à l'évenement (l'édition par l'utilisateur de chacun).
Cliquer sur le bouton OK ne doit être qu'une confirmation et l'envoi d'une fonction ou l'enregistrement définitif des valeurs surveillées ou bien encore les 2.

Mais commence par ma fonction Test, on verra ce 2ème point plus tard.
Ils n'ont pas de tuto sur OpenDCL ?


[Edité le 6/12/2010 par Tramber]
0

#11 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 05 décembre 2010 - 18:43

Citation

Ils n'ont pas de tuto sur OpenDCL ?


Si, ici.

Et justement, le premier exercice, après le traditionnel "Hello world !", consiste à faire une boite de dialogue avec un contrôle TextBox et à récupérer le texte entré par l'utilisateur.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#12 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 06 décembre 2010 - 10:08

Bonjour Tramber Gile

Tramber j'ai suivi tes conseils.
Ma boite de dialogue marche bien.

Au départ, au lieu d'alimenter mes combo box dans un
c:tmp_cmd_FORM_OnInitialize 

je mettais pour chaque combo box un defun du type
(defun c:tmp_cmd_FORM_CBOX1_OnDropDown (/) 

mes combo box et mes textbox s'affichent (avec l'une au l'autre méthode) correctement et je peux récupérer toutes les valeurs que je souhaite par :

 (setq val1 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX1))

(setq val2 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX2))

(setq val3 (dcl_Control_GetText tmp_cmd_FORM_TBOX1))

(setq val4 (dcl_Control_GetText tmp_cmd_FORM_TBOX2))

(setq val5 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX3))


Jusque là je n'ai pas de problème Gile
Le OnInitialize c'est vrai que c'est plus propre comme code.
Maintenant, j'ai un problème pour saisir un texte dans un Autocad qui correspond à une distance en texte et attribuer cette valeur à un text box.

Je peux cliquer sur le bouton, je sélectionne mon texte mais le problème c'est que je ne peux pas revenir à ma boite de dialogue initiale.

Je pense en effet que je dois utiliser un
 (defun c:tmp_cmd_FORM_TBOX2_OnEditChanged (NewValue /)

ou un
 (defun c:tmp_cmd_FORM_TBOX2_OnDragnDropFromOther (DropPoint [as Varies] /)

)

mais je ne sais pas comment.

Gile j'ai vu l'aide mais je n'ai pas trouvé de solution à cette question.

Merci encore de votre aide.
John.
0

#13 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 06 décembre 2010 - 18:31

Citation

Maintenant, j'ai un problème pour saisir un texte dans un Autocad qui correspond à une distance en texte et attribuer cette valeur à un text box


Impossible de comprendre ton problème.
A moins que, et cela m'effraie un peu, tu ne connaisses pas le lisp...

Ou alors ton problème est que tu ne parviens pas à fermer la boite et la rouvrir ?

Dans ma routine TEST : je remplace
(Odcl_Form_Show boite_DclForm1)
par
 (setq bOkPressed T)


  (while bOkPressed

    (setq bOkPressed nil)

           (defun c:.....DclForm1_Picketage_OnClicked ()

      (odcl_form_close boite_DclForm1)

      (setq p1 (getpoint "\nPoint de départ :")

	    p2 (getpoint "\nPoint de distance :" p1)

	    )

      (setq bOkPressed T)

      )

    (Odcl_Form_Show boite_DclForm1)

    )


Il doit

Tu peux créer un bouton (différent du bouton OK). Picketage par exemple !

J'ai regardé le tuto, il est trop léger.

2 solutions pour progresser : les forums http://www.opendcl.com/forum/ d'abord.
Aller voir aussi le tuto d'Objectdcl avec sa documentation originelle. (attention, c'est bien oBJECTdcl).
0

#14 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 10 décembre 2010 - 12:02

Citation

Impossible de comprendre ton problème.
A moins que, et cela m'effraie un peu, tu ne connaisses pas le lisp...


Je ne suis certes pas un cador du lisp comme toi ou certains de ce forum mais de là à dire çà, il y a une marge...

Sur ce, mon problème est effectivement

Citation

Ou alors ton problème est que tu ne parviens pas à fermer la boite et la rouvrir


J'ai essayé de prendre exemple sur ton code mais rien à faire, après la sélection du texte dans Autocad, la boite de dialogue ne se réaffiche toujours pas.

Par contre, avec ce code non pas dans ma routine principale qui affiche la boite de dialogue mais à la suite
(defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi TXT102)

(setq TXT102 T)

(while (/= TXT102 nil)

(setq TXT102 nil)

(dcl_Form_Close tmp_cmd_FORM)

(setq rdi (dcl_Control_SetText tmp_cmd_FORM_TBOX2 (SelectText)))

(setq TXT102 T)

(dcl_Form_Show tmp_cmd_FORM)

)

) 


La valeur s'insère bien dans le TextBox mais elle se répète à l'infini et ne s'arrête jamais.
Je sais qu'il y a un pb dans mon code mais je ne vois pas comment faire.

Si tu as 2min.
Merci encore.


0

#15 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8464
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 10 décembre 2010 - 12:26

Citation

Je ne suis certes pas un cador du lisp comme toi ou certains de ce forum mais de là à dire çà, il y a une marge...

Autant pour moi pour le niveau, mais je croyais autre chose en lisant ta phrase.

Bref.

As-tu au moins un bouton OK quelque part dans la boite et dans le code qui fait un dcl_form_close ?
Moi juste donné un exemple, le bouton "Picketage" qui permet d'aller dans le dessin avant que la boite ne se réaffiche.

Ton code comporte une abbération :
(dcl_Form_Close tmp_cmd_FORM)

(setq rdi (dcl_Control_SetText tmp_cmd_FORM_TBOX2 (SelectText)))

(setq TXT102 T)

(dcl_Form_Show tmp_cmd_FORM)

 


C'est invraisemblable que tu fermes une boite pour y faire un SetText avant de la réouvrir !
Tu dois gentillement faire ton (selectText), en sortir une valeur et initialiser la valeur à l'évènement OnInitialize de ta boite (dont je me demande si tu l'as implanté !) ?
Fermer la boite momentanément, c'est pour donner des instructions à AutoCAD, pas au DCL.
Tu comprends ?

Un petit lien vers Object
0

#16 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 10 décembre 2010 - 14:34

Salut,

Je ne suis pas du tout un spécialiste d'ODCL mais les boites modales fonctionnent de manière semblables en DCL, ODCL ou .NET.

L'évènement OnInitialize initialise l'état des contrôles à l'ouverture de la boite (comme les set_tile en LISP/DCL). Cet évènement est déclenché à chaque ré-ouverture. On peut donc stocker les valeurs de certains contrôles dans des variables de façon à pouvoir les modifier entre 2 ouvertures (la valeur de ta TextBox par exemple).

dcl_form_show retourne le résultat de la façon dont la boite a été fermée sous forme d'un entier (comme start_dialog en LISP/DCL) soit :
1 pour le bouton OK ou Enter
2 pour Annuler, fermer ou Echap (0 en LISP/DCL)
et n'importe quelle autre valeur supérieure à 2 qui aura été explicitement passée comme argument à dcl_Form_Close (done_dialog en LISP/DCL).
Si aucun argument n'est passé à dcl_Form_Close, dcl_form_show retourne 0 quand l'évènement est déclenché, donc si plusieurs boutons utilisent dcl_Form_Close sans argument, il est plus difficile de savoir quel bouton a fermé la boite...

On peut donc utiliser ce résultat dans une boucle pour ré-ouvrir automatiquement la boite de dialogue quand elle a été fermée pour permettre une entrée utilisateur (2 < résultat).

Un petit exemple vite fait avec un un boite sommaire (Textbox_Form1) qui contient :
un textbox (TextBox1)
un bouton OK (TextButton1)
un bouton Selection (TextButton2)

(command "_OPENDCL")


(defun c:test (/

	       ;; fonctions locales

	       c:Textbox_Form1_OnInitialize

	       c:Textbox_Form1_TextButton2_OnClicked

	       c:Textbox_Form1_TextButton1_OnClicked

	       ;; variables locales

	       result

	       txt

	       str

	       elst

	      )

  

  ;; initialisation du contenu de la TextBox avec la variable str

  (defun c:Textbox_Form1_OnInitialize (/)

    (dcl_Control_SetText Textbox_Form1_TextBox1 str)

  )

  

  ;; clic sur le bouton Sélection : ferme la boite et fait retourner 3 par dcl_form_show

  (defun c:Textbox_Form1_TextButton2_OnClicked (/)

    (dcl_Form_Close Textbox_Form1 3)

  )


  ;; clic sur le bouton OK : ferme la boite et fait retourner 1 par dcl_form_show

  (defun c:Textbox_Form1_TextButton1_OnClicked (/)

    (dcl_Form_Close Textbox_Form1 1)

  )


 ;; chargement du projet

  (dcl_Project_Load "Textbox" T)


  ;; initialisation des variables result et str

  (setq	result 3

	str "toto"

  )


  (while (< 2 result)


    ;; démarrage du dialogue, affecte à result 1, 2 ou 3 suivant que

    ;; la boite ait été fermée avec : OK, fermer ou échap, Sélection

    (setq result (dcl_form_show Textbox_Form1))


    (cond

      ;; boite a été fermée avec OK

      ((= 1 result)

       (dcl_MessageBox "OK" "Result")

      )

      ;; boite a été fermée avec fermer ou Echap

      ((= 2 result)

       (dcl_MessageBox "Annuler" "Result")

      )

      ;; boite a été fermée avec Sélection, affecte la valeur du texte sélectionné à str

      ((= 3 result)

       (if (and	(setq txt (car (entsel)))

		(= "TEXT" (cdr (assoc 0 (setq elst (entget txt)))))

	   )

	 (setq str (cdr (assoc 1 elst)))

       )

      )

    )

  )

  (princ)

)


Edit : voir dans les dossier ...\OpenDCL Studio\ENU\Samples le fichier Selections.lsp
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#17 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 11 décembre 2010 - 00:31

Bonjour Gile Tramber

Merci pour vos réponses.
Gile, ton code marche nickel mais avec une boite de dialogue tout simple.
Le problème, c'est que si je gère tous les évenements de chaque bouton dans ma routine principale à l'exemple de Tramber avec sa fonction defun c:TEST, j'ai peur que mon projet devienne vite une usine à gaz. Car ma boite de dialogue est constitué de plusieurs TabString contenant chacun un ou plusieurs boutons.

Dans mon code lsp, j'ai fait

 (defun c:tmp1 (/)

(setvar "CMDECHO" 0)

(command "OPENDCL")

(dcl_Project_Load "C:/Users/LISP ACAD/Lisp modif/tmp_cmd.odcl" T)

(dcl_Form_Show tmp_cmd_FORM)

(setvar "CMDECHO" 1)

(prin1)

)


puis après

(defun c:tmp_cmd_FORM_OnInitialize (/ echx echy m_cmd)


(dcl_ListBox_Clear tmp_cmd_FORM_LBOX1)

(dcl_ListBox_AddList tmp_cmd_FORM_LBOX1 (list

"Charger les DLLs utilisés"

"Rendre calque courant"

"Sommets Polylignes"

(setq m_cmd (dcl_ListBox_SelectString tmp_cmd_FORM_LBOX1 "Sommets Polylignes"))


(dcl_ComboBox_Clear tmp_cmd_FORM_CBOX1)

(dcl_ComboBox_AddList tmp_cmd_FORM_CBOX1 (list "100" "125" "150" "200" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000" "7500" "10000"))

(setq echx (dcl_ComboBox_SelectString tmp_cmd_FORM_CBOX1 "2500"))


(dcl_ComboBox_Clear tmp_cmd_FORM_CBOX2)

(dcl_ComboBox_AddList tmp_cmd_FORM_CBOX2 (list "100" "125" "150" "200" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000" "7500" "10000"))

(setq echy (dcl_ComboBox_SelectString tmp_cmd_FORM_CBOX2 "500"))



(dcl_Control_SetText tmp_cmd_FORM_TBOX2 "0.00")


) 



Puis après je gère les évenements dès que l'utilisateur appuie sur un bouton

 (defun c:tmp_cmd_FORM_TXT401_OnClicked (/ cmd1)

(setq cmd1 '("dll1" "pll"  "inf1"))

(dcl_Form_Close tmp_cmd_FORM)

(princ 

(strcat 

"\nFonction principale : "

(dcl_ListBox_GetSelectedItems tmp_cmd_FORM_LBOX1)

" - "

(nth (dcl_ListBox_GetCurSel tmp_cmd_FORM_LBOX1) cmd1)

)

)

)


ou encore

 (defun c:tmp_cmd_FORM_TXT90_OnClicked (/)

(dcl_Form_Close tmp_cmd_FORM)

(IMP1)

)


ou encore pour fermer la boite de dialogue sans aucune entrée

 (defun c:tmp_cmd_FORM_BUT203_OnClicked (/)

(dcl_Form_Close tmp_cmd_FORM)

)



Si tu me confirme donc qu'on peut utiliser à la suite de ces routines, une fonction du type

(defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi)

(dcl_Form_Close tmp_cmd_FORM)

(dcl_TabStrip_HideTab tmp_cmd_FORM_MENU1 1)

(setq rdi (SelectText))

(dcl_Control_SetText tmp_cmd_FORM_TBOX2 rdi)

(dcl_Form_Show tmp_cmd_FORM)

) 


Je vais trouver une autre solution où l'utilisateur devra entrer la distance lui-même.
Déjà que c'est assez compliqué OpenDCL, je ne veux pas tout mettre dans ma routine principale sinon je sais que je ne vais pas m'en sortir.

Donc soit il faut modifier je pense le code de la fonction c:tmp_cmd_FORM_TXT102_OnClicked, ajouter une propriété supplémentaire de la boite de dialogue soit je ne fais pas ce bouton.

Merci encore de ton aide.
John
0

#18 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 11 décembre 2010 - 09:25

Salut,

On dirait que tu mets la charrue avant les bœufs et ODCL favorise ça car il est beaucoup plus facile d'ajouter des contrôles par cliquer déposer que d'écrire le code qui rendra ces contrôles opérationnels. Et on a vite fait de se retrouver avec une magnifique boite de dialogue super élaborée sans que rien (encore) ne fonctionne.

Et quand tu te retrouves là face à une (petite) difficulté qui est un cas classique dans l'utilisation des boites modales (fermer temporairement la boite pour laisser la main à l'utilisateur), tu sembles prêt à renoncer à cette option.

La méthode que je montre pour fermer temporairement une boite modale est un des fondamentaux dans l'apprentissage du DCL classique (qui permet beaucoup moins de contrôle que ODCL). Vouloir éviter de passer par là sous prétexte que la boite a beaucoup d'autre contrôles à gérer, c'est ce que j'appelle "mettre la charrue avant les bœufs" ou "vouloir courir avant de savoir marcher".

Commence par un boite plus simple, sans onglets, fais déjà fonctionner tous les contrôles de cette boite, puis rajoute petit à petit d'autres contrôles (onglets, par exemple), et fait les fonctionner avant d'en rajouter d'autres. Tu verras aussi que ce sera plus facile pour organiser ton code.

Si tu ne veux pas mettre toutes les fonctions à l'intérieur de la commande principale, libre à toi, mais ce moyen permet de déclarer localement fonctions et variable et ainsi d'éviter de possibles conflits (difficiles à localiser eux) et ça ne change rien à la complexité du code : il faudra bien gérer tous évènements liés aux contrôles dont tu as besoin, que ces fonctions soient localisées dans une fonction principale ou globales.

Par contre, je te recommande fortement de laisser dans la commande principale les fonctions d'initialisation (OnInitialize), de démarrage (dcl_Form_Show) et les traitements en fonction de la valeur retournée par dcl_Form_Show (expression (cond ...)). Ceci permet d'utiliser des variables locales pour modifier des valeurs de propriétés de contrôles via OnInitialize.

Petit rappel :
OnInitialize initialise l'état de la boite avant qu'elle ne soit affichée
dcl_Form_Show affiche ensuite la boite et retourne une valeur (1, 2 ou autre) quand la boite est fermée.



Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#19 L'utilisateur est hors-ligne   chris_mtp 

  • ceinture noire
  • Groupe : Membres
  • Messages : 394
  • Inscrit(e) : 22-novembre 06

Posté 11 décembre 2010 - 11:33

Merci Gile pour tes conseils.
C'est vrai je mets peut être

Citation

"la charrue avant les bœufs" ou "vouloir courir avant de savoir marcher".


J'arrive avec une boite de dialogue tout simple en pur DCL comme avec OpenDCL, j'ai même réussi dans mon code mais le problème, ca me fou le souc sur d'autres contrôles si j'attribue à mon button OK la valeur 1. Je n'ai pas trop le temps de faire un code vraiment abouti.

Du coup, j'ai fais un simple ButtonText qui lance un lisp avec une boite de dialogue en Pur DCL lisp et là ca marche nickel.

Je vois que les contrôles des buttons et les boites de dialogues avec OpenDCL sont certes plus intéressants mais aussi un peu plus difficile à gérer.

Je sais à quoi m'en tenir maintenant.

Merci encore de ton aide à toi et Tramber.
John.
0

#20 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 11 décembre 2010 - 12:01

Citation

Je vois que les contrôles des buttons et les boites de dialogues avec OpenDCL sont certes plus intéressants mais aussi un peu plus difficile à gérer.


ODCL offre plus de possibilités mais le principe est le même.

Par exemple, pour un bouton, en DCL, action_tile correspond à l'évènement Clicked avec ODCL. Mais il n'est pas possible, en DCL, de gérer les autres évènements que fournit ODCL (.NET/Visual Studio en fournit encore plus).

Comme dit plus haut, done_dialog correspond à dcl_Form_Close et start_dialog à dcl_Form_Show (aux valeurs retournées par cette dernière près).

Citation

ca me fou le souc sur d'autres contrôles si j'attribue à mon button OK la valeur 1.

Je ne vois pas pourquoi et d'ailleurs, je suis étonné que ODCL ne fournisse pas de boutons OK et Cancel ou de propriété DialogResult pour les boutons avec les valeurs "accept" (1) et "cancel" (2).

L'équivalent ODCL des boutons DCL "OK" et "Cancel" serait des boutons avec pour réponse (callback) à l'évènement Clicked, un appel à dcl_Form_Close avec les arguments 1 et 2 respectivement (puis que ce sont les valeurs retournée quan la boit est fermée par Enter d'un côté et fermer ou Echap de l'autre).
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)