Aller au contenu

APPEL PROGRAMMES DEPUIS DCL


lili2006

Messages recommandés

Bonjour à toutes et tous,

 

Suite à ce post, je voudrais tester un appel de programmes sous la même forme, à savoir :

 

Le DCL =>

 

	PGP : dialog {

 label = "PROGRAMMES PERSOS" ;

 : boxed_radio_column {

   label = "OUTILS DE CALQUES" ;

   key = "APPEL PERSO" ;

   : radio_button {

     key = "calav" ;

     label = "Calque en Avant" ;

     value = "1" ;

   }

   : radio_button {

     key = "calar" ;

     label = "Calque en Arrière" ;

   }

 }

 ok_cancel ;

 : text {

   label = "TEST" ;

 }

} 

 

 

Soit, à l'affichage =>

 

http://free0.hiboox.com/images/3309/be9425aaff3de6e21c12cf1148138f73.jpg

 

Bien sûr, je ne sais pas si la syntaxe d'appel de la commande est bonne ( key = "calar" ;, par exemple pour lancer la fonction "Calque en Arrière")

 

La question est donc :

 

Comment puis-je commander la DCL depuis le lisp de manière à ce qu'une fois le bouton radio sélectionné, la BD ""PROGRAMMES PERSOS"" issu du DCL se ferme pour enclencher le programme sélectionné ?

 

Est-ce possible ?

 

Remarque : Je voudrais pouvoir classer les petits utilitaires trouvés ça et là que l'on utilise au lycée afin que les étudiants ne confondent pas les outils par défaut d'AutoCAD et les "rajouts".

Cette année, j'avais fait un menu déroulant et la barre d'outils identique nommés "PLUS" et quelques étudiants m'ont contacté durant leur stage ne comprenant pas pourquoi il n'avait pas accès à "PLUS" dans leur cabinet de stage,....

 

Bref, le message est mal passé et je ne voudrais pas reproduire cet "incident" cette année,.. ;)

 

J'avais déjà adapté plusieurs routines de sélection de (gile) pour faire ça =>

 

http://free0.hiboox.com/images/3309/06dd4e4b0152433b0372edfb7aedce6c.jpg

 

Puis-je me baser sur la même structure ?

 

Merci d'avance, :P

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Si tu veux lancer un programme LISP quand l'utilisateur clique OK, il faut faire passer l'info dans une expression :

(action_tile "accept" ...) qui définit l'action à exécuter quand l'utilisateur clique sur OK.

L'info étant le bouton radio sélectionné qu'on récupère avec :

(get_tile "APPEL PERSO")

 

Cette action doit être une chaîne contenant des expression LISP (c'est un peu tordu, mais c'est comme ça), donc il faudra écrire dans la chîne :

(get_tile \"APPEL PERSO\")

 

Par exemple :

 

(defun c:testDialog (/ dcl_id result)

 ;; charger le fichier DCL
 (setq dcl_id (load_dialog "ProgPerso.dcl")) ; doit correspondre au nom du fichier

 ;; Appeler la boite de dialogue
 (if (not (new_dialog "PGP" dcl_id)) ; doit correspondre au nom de la boite de dialogue
   (exit)
 )

 ;; action si l'utilisateur clique "OK" :
 ;; result = bouton radio sélectionné
 (action_tile
   "accept"
   "(setq result (get_tile \"APPEL PERSO\"))
   (done_dialog)"
 )

 ;; afficher la boite de dialogue
 (start_dialog)

 ;; décharger la boite de dialogue
 (unload_dialog dcl_id)

 ;; lancer le LISP
 (cond
   ((= result "calar") (c:calar))
   ((= result "calav") (c:calav))
 )
)

 

Mais il peut être plus filou de donner comme clé aux boutons radio le nom complet des fonctions LISP (avec le c:) dans le DCL :

key = "c:calav" ;

et

key = "c:calar" ;

 

et de faire dans le LISP :

(action_tile 
 "accept" 
 "(done_dialog) (eval (read (get_tile \"APPEL PERSO\")))"
)

 

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Salut Gilles,

 

La première méthode fonctionne bien,

 

J'ai testé la seconde façon et AutoCAD me retourne =>

 

Commande: ProgPerso

Initialisation...type d'argument incorrect: stringp nil

Commande:

 

J'ai bien modifié la DCL :

 

: radio_button {

 

key = "c:calav" ;

 

label = "Calque en Avant" ;

 

value = "1" ;

 

}

 

: radio_button {

 

key = "c:calar" ;

 

label = "Calque en Arrière" ;

 

Dans le lisp, j'ai remplacé :

 

(action_tile

 

"accept"

 

"(setq result (get_tile \"APPEL PERSO\"))

 

(done_dialog)"

 

)

 

 

par :

 

(action_tile

 

"accept"

 

"(done_dialog) (eval (read (get_tile \"APPEL PERSO\")))"

 

)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Je continu donc ma liste et l'appel de "laymch" (Changer de calque) me renvoi =>

 

Commande: ProgPerso

Initialisation...System.ArgumentException: Erreur lors de la liaison avec la

méthode cible.

à System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo

method, Boolean throwOnBindFailure)

à AcMgCommandClass.InvokeWorker(AcMgCommandClass* , MethodInfo mi, Object

commandObject, Boolean bLispFunction)

à AcMgCommandClass.InvokeWorkerWithExceptionFilter(AcMgCommandClass* ,

MethodInfo mi, Object commandObject, Boolean bLispFunction)

à AcMgPerDocumentCommandClass.Invoke(AcMgPerDocumentCommandClass* ,

gcroot<:reflection::methodinfo>* mi, Boolean bLispFunction)

à AcMgCommandClass.CommandThunk.InvokeLisp(CommandThunk* )Demande ADS erronée

Commande:

 

Une idée ?

 

Merci d'avance,

 

PS: Idem pour "laycur"

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Lili2006

 

je ne viens pas te répondre mais apporter une critique

je suis obligé de rappeler que

toute critique est constructive si elle n'est basée ni sur la jalousie ni sur l'envie

parce que en ce moment les esprits chagrins sont légion.

bon, j'en viens au fait.

 

je ne pense pas qu'il soit très judicieux de faire une case de dialogue avec

vingt boutons radio

là tu exagères et c'est contre-productif,

lire cette littérature et la commande perd son efficacité.

 

fais au moins des "frame"

si tu tiens à avoir toutes ces options.

 

amicalement ;)

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Salut Didier,

 

fais au moins des "frame"

si tu tiens à avoir toutes ces options.

 

Heu, c'est à dire ????

 

Je ne veux pas forcément l'utiliser de cette façon mais que les étudiants voient rapidement la différence entre AutoCAD base et les personnalisations dans les entreprises, toutes différentes, on est bien d'accord ?

 

Dans ma pédagogie, je tiens et me bat tous les jours pour qu'il n'y ai pas de confusion entre AutoCAD base et les personnalisations propres à l'entreprise & covadis !

 

Cela me semble essentiel.

 

De plus, cela me fait un très bon exercice.

 

Enfin, je compte faire un petit document relatif en présentant les différentes manières d'utiliser les différentes fonctions (commande par clavier, clic sur icône barre d'outils, clic dans le menu déroulant, ou bien choix depuis la DCL que je prépare), là aussi dans le soucis de laisser le choix à l'utilisateur,... ;)

 

Lorsque la DCL sera terminé, je ferai un imprime écran en commentant les commandes car combien ne savent pas bien utiliser déjà les commandes de base AutoCAD ??? (Et j'en fait très vraisemblablement parti,... :mad: )

 

c'est contre-productif

 

Ils ont 40 ans pour découvrir,...

 

 

Voilà ou j'en suis =>

 

http://free0.hiboox.com/images/3309/46576acf7ca950015115360dd44be45b.jpg

 

A ce propos, j'aimerai mettre trois rubriques par colonne (Ici : Outils de calques, Outils de dessins et Outils de modification, la seconde colonne : Outils de Cotation, outils de sélection et Outils de présentation), quelle écriture adoptée ?

 

De même, pour faire fonctionner les lisps sous la rubrique "OUTILS DE DESSIN", que dois-je rajouter dans le lisp qui commande la DCL, j'ai essayé =>

 

 (action_tile

   "accept"

   "(setq result (get_tile \"APPEL OUTILS DE CALQUES\"))

   (done_dialog)"

 )

(action_tile

   "accept"

   "(setq result (get_tile \"APPEL OUTILS DE DESSIN\"))

   (done_dialog)"

 ) 

 

Mais, cela ne fonctionne pas,...

 

(Nota: J'ai remplacé "APPEL PERSO" par "APPEL OUTILS DE CALQUES" )

 

Lorsque je sélectionne le Bouton radio "Modifications multiples" ou "Raccord sur Lignes", je retrouve le lancement de la fonction "calav",..

 

Merci d'avance,

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ne voyant pas le code de ton DCL, je ne peux dire d'où vient le problème, mais je précise à tout hasard :

- première chose :

Il ne faut pas confondre le label (texte qui sera affiché) et la key (clé qui sert à identifier le contrôle)

- deuxième chose les accolades ont le même rôle que les parenthèses en LISP et servent à imbriquer les contrôles les uns dans les autres.

On peut donc à l'intérieur d'une rangée (row) faire plusieurs colonnes (column) et vice-versa.

Dans ton cas, les contrôles radio_button semblent être contenus dans une radio_column (ou une boxed_radio_column).

Quand on appelle la fonction get_tile en lui passant comme argument la clé de la radio_column, elle retourne la clé du radio_button activé dans la colonne qui le contient.

Donc si tu as plusieurs radio_column tu peux activer un radio_button dans chacune et ce n'est pas ce que tu veux, il me semble.

 

Par ailleurs, si l'unique fonction de la boite dialogue est de lancer une commande, il serait préférable d'utiliser des button qui tous appellent (done_dialog) et donc valident et ferment la boite de dialogue (un seul clic au lieu de deux) le bouton "OK" n'est plus nécessaire mais un bouton "Annuler" reste indispensable.

 

Ici l'astuce consiste à mettre somme clé (key) une chaîne qui contient l'expression LISP qui lance la commande. Cette expression ne doit contenir aucun espace pour pouvoir être utilisée dans le LISP avec les fonctions read et eval

 

Un petit exemple, le DCL :

PGP : dialog {
 label = "PROGRAMMES PERSOS" ;
 : boxed_column {
   label = "OUTILS DE CALQUES" ;
   : row {
     : button {
       key = "(c:calav)" ;
       label = "CALAV" ;
       width = 12 ;
     }
     : text {
       label = "Calque en Avant" ;
       width = 26 ;
     }
   }
   : row {
     : button {
       key = "(c:calar)" ;
       label = "CALAV" ;
       width = 12 ;
     }
     : text {
       label = "Calque en Avant" ;
       width = 26 ;
     }
   }
 }
 : boxed_column {
   label = "OUTILS DE DESSIN" ;
   : row {
     : button {
       key = "(c:modifs)" ;
       label = "MODIFS" ;
       width = 12 ;
     }
     : text {
       label = "Modifications multiples" ;
       width = 26 ;
     }
   }
   : row {
     : button {
       key = "(c:raclign)" ;
       label = "RACLIGN" ;
       width = 12 ;
     }
     : text {
       label = "Raccord sur Lignes" ;
       width = 26 ;
     }
   }
 }
 cancel_button;
} 

 

Le LISP :

(defun c:pgp (/ dcl_id result)
 (setq dcl_id (load_dialog "PGP.dcl"))
 (if (not (new_dialog "PGP" dcl_id))
   (exit)
 )

 ;; pour chacune des clés de la liste, si le l'utilisateur clique sur le bouton,
 ;; la clé est affectée à la variable result et la boite est refermée (done_dialog)
 (foreach k '("(c:calav)" "(c:calar)" "(c:modifs)" "(c:raclign)")
   (action_tile k "(setq result $key) (done_dialog)")
 )

 ;; si l'utilisateur clique sur Annuler la boite est refermée
 ;; et la variable result reste  nil
 (action_tile "cancel" "(done_dialog 0)")
 (start_dialog)
 (unload_dialog dcl_id)

 ;; si une valeur est affectée à la variable,
 ;; l'expression retournée par : (read result) est évaluée
 (if result
   (eval (read result)) 
 )
 (princ)
)

 

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Merci Gilles,

 

Suite à tes remarques, j'ai tout recommencé.

 

Je me rend compte comme il est difficile de gérer les parenthèses ou les accolades .

 

A ce propos est-ce à cause des accolades que je ne peux pas formater la fenêtre d'édition ??

 

Les Fichiers

 

J'ai essayé plusieurs choses pour créer une seconde colonne du même style que la première sans succès pour le moment,..

 

http://free0.hiboox.com/images/3409/bf7bd41d3bf9deb7d627dddfb5a6c80a.jpg

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tout d'abord, malheureusement l'éditeur Visual LISP ne fait pas de formatage automatique (identation) pour les DCL.

 

Ensuite, il faut bien comprendre que les contrôles (tiles) sont imbriqués les uns dans les autres.

Par défaut une boite de dialogue est organisée sur une colonne, donc si on veut en faire plusieurs, il faut les imbriquer dans une rangée, etc.

Rangées (row) et colonnes (column) peuvent contenir d'autres rangées ou colonnes.

Elles peuvent être encadrées (boxed_row et boxed_column) ou non.

 

Dans ton exemple, chaque boxed_column contient plusieurs rangées qui chacune contiennent un bouton et un texte.

Pour mette ta boite de dialogue sur 3 colonnes, par exemple, il faut faire :

-une rangée qui contient :

-- une première colonne (encadrée) qui contient :

--- 5 rangées qui contiennent un bouton et un texte.

-- une deuxième colonne (encadrée) qui contient :

--- 6 rangées qui contiennent un bouton et un texte.

-- une troisième colonne qui contient :

--- une première colonne (encadrée) qui contient :

---- 3 rangées qui contiennent un bouton et un texte.

--- une seconde colonne (encadrée) qui contient :

---- 3 rangées qui contiennent un bouton et un texte.

 

http://img11.imageshack.us/img11/7263/pgp.png

 

PGP : dialog {
 label = "PROGRAMMES PERSOS" ;
 : row {// rangée qui contient toutes les colonnes
   : boxed_column { // colonne 1 (boxed)
     label = "OUTILS DE CALQUES" ;
     : row {
       : button { key = "(c:calav)" ; label = "CALAV" ; width = 12 ; }
       : text { label = "Calque en Avant" ; width = 26 ;}
     }
     : row {
       : button { key = "(c:calar)" ; label = "CALAR" ; width = 12 ; }
       : text { label = "Calque en Arrière" ; width = 26 ;}
     }
     : row {
       : button { key = "(c:examipl)" ; label = "EXAMC" ; width = 12 ; }
       : text { label = "Examen Calques 1 à 1" ; width = 26 ;}
     }
     : row {
       : button { key = "(c:msfreeze)" ; label = "GCDEO" ; width = 12 ; }
       : text { label = "Gel calques EO sans EP" ; width = 26 ;}
     }
     : row {
       : button { key = "(c:GEL_FEN)" ; label = "GCDEO" ; width = 12 ; }
       : text { label = "Gel calques EP sans EO" ; width = 26 ; }
     }
   } // fin de colonne 1
   : boxed_column { // colonne 2 (boxed)
     label = "OUTILS DE DESSIN" ;
     : row {
       : button { key = "(c:xe)" ; label = "MODIFS" ; width = 12 ; }
       : text { label = "Modifications multiples" ; width = 26 ; }
     }
     : row {
       : button { key = "(c:plrac)" ; label = "RACLIN" ; width = 12 ; }
       : text { label = "Raccord sur Lignes" ; width = 26 ; }
     }
     : row {
       : button {  key = "(c:addvtx)" ; label = "AJSOM" ; width = 12 ; }
       : text { label = "Ajout Sommets Poly" ; width = 26 ; }
     }
     : row {
       : button { key = "(c:delvtx)" ; label = "SPSOM" ; width = 12 ; }
       : text { label = "Supprime Sommets Poly" ; width = 26 ;}
     }
     : row {
       : button { key = "(c:nod-pl)" ; label = "PTPOLY" ; width = 12 ; }
       : text { label = "Points sur Sommets Poly" ; width = 26 ; }
     }
     : row {
       : button { key = "(c:jpl)" ; label = "EDRAP" ; width = 12 ; }
       : text { label = "Edit rapide Poly" ; width = 26 ;}
     }
   }
   : column { // colonne 3 contient 2 boxed_column
     : boxed_column { // boxed_column 1
       label = "OUTILS DE SELECTION" ;
       : row {
         : button { key = "(c:sel)" ; label = "JEUSEL" ; width = 12 ; }
         : text { label = "Jeux de sélection" ; width = 26 ; }
       }
       : row {
         : button { key = "(c:ssb)" ; label = "SELBLO" ; width = 12 ; }
         : text { label = "Sélection blocs" ; width = 26 ; }
       }
       : row {
         : button { key = "(c:mcopy)" ; label = "COPMUL" ; width = 12 ; }
         : text { label = "Copies Multiples" ; width = 26 ; }
       }
     } // fin de boxed_column 1
     : boxed_column { // boxed_column 2
       label = "OUTILS DE COTATION" ;
       : row {
         : button { key = "(c:Cctlili)" ; label = "COTRAP" ; width = 12 ; }
         : text { label = "Cotation Echelles" ; width = 26 ; }
       }
       : row {
         : button { key = "(c:cf)" ; label = "COTFOR" ; width = 12 ; }
         : text { label = "Souligne Cotes Forcées" ; width = 26 ; }
       }
       : row {
         : button { key = "(c:dimreassoc)" ; label = "SUPCOF" ; width = 12 ; }
         : text { label = "Supprime cotes Forcées" ; width = 26 ; }
       }
     } // fin de boxed_column 2
   } // fin de colonne 3
 } // fin de rangée
 cancel_button;
}

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

Lien vers le commentaire
Partager sur d’autres sites

Ouh là, ça se complique,...

 

Non, pas vraiment, il suffit d'être un peu organisé :

- faire un croquis de la BD qui permet d'en voir la structure (colonnes, rangées, sous colonnes, etc.).

- commence à écrire le fichier DCL en ne mettant que les rangées et colonnes primaire, puis celle imbriquées ainsi de suite jusqu'aux contrôles finaux.

 

pour reprendre l'exemple ci-dessus, la boite (:dialog { ... }) est une colonne dans laquelle on veut une rangée et le bouton Annuler :

PGP : dialog {
 : row { }
 cancel_button ;
}

 

Dans la rangée, on veut 3 colonnes :

PGP : dialog {
 : row {
   : column { }
   : column { }
   : column { }
 }
 cancel_button ;
}

 

Les deux premières colonnes sont encadrées (boxed_column) et la troisième contient 2 colonnes encadrées :

PGP : dialog {
 : row {
   : boxed_column { }
   : boxed_column { }
   : column {
     : boxed_column{ }
     : boxed_column{ }
   }
 }
 cancel_button ;
}

 

La première colonne contient 5 rangées, la seconde 6 rangées, etc.

PGP : dialog {
 : row {
   : boxed_column {
     : row { }
     : row { }
     : row { }
     : row { }
     : row { }
   }
   : boxed_column {
     : row { }
     : row { }
     : row { }
     : row { }
     : row { }
     : row { }
   }
   : column {
     : boxed_column{
       : row { }
       : row { }
       : row { }
     }
     : boxed_column{
       : row { }
       : row { }
       : row { }
     }
   }
 }
 cancel_button ;
}

 

il n'y a plus qu'à mettre les boutons et les textes dans chaque rangée...

 

EDIT : corrigé oubli de point virgule

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Une fois de plus, rien de tel qu'une bonne organisation,...

 

Je vais suivre ce sage conseil pour organiser ma BD finale qui commence à bien se profiler dans mon esprit,...

 

Merci encore et je reviendrai donner des nouvelles quand celle-ci aura évoluée,..

 

Pour continuer l'apprentissage, petite idée :

 

comment pourrais-je mettre un menu avec ascenseur à la place du bouton "JEUSEL" tes routines (SSE,SSL,SSC,...etc) ??

 

Du style ? =>

 

: popup_list {
       label = "Choix d'un jeu : ";
       key = "(c:sel)";
     }
      

Et bien entendu, déclarer "sel" dans le lisp.

 

(Pas encore testé,)

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je suis d'accord avec Didier en ce qui concerne la contre productivité d'une boite de dialogue qui aurait trop de boutons, d'autant que ce type de boite dialogue n'apporte pas grand chose de plus qu'une barre d'outils, une palette ou un ruban...

 

Par ailleurs, si tu veux intégrer une liste déroulante (popup_list), tu vas devoir tout revoir, car si un bouton peut entraîner directement une validation et la fermeture de la BD, une liste déroulante nécessite une validation (bouton OK).

Et les contrôle de listes (popup_list ou list_box) DCL sont moins facile à manipuler en LISP...

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Merci de ces précisions Gilles.

 

Je profiterai alors d'un autre exercice pour voir le fonctionnement des listes déroulantes,...

 

Il ne s'agit pas ici de productivité ni de contre productivité MAIS avant tout d'un exercice pour moi et une quatrième méthode d'accès au fonction "PLUS" de AutoCAD afin qu'il n'y ai pas confusion dans l'esprit des étudiants. Bien entendu, je reconstituerai la barre d'outils et le menu déroulant qui vont avec,.

 

Merci encore, je me repenche sur la construction du DCL

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Pfuuuuuu !

 

Une heure de différents tests,...

 

 

Eh béh tout compte fait, cela peut être pratique lorsqu'on enchaine plusieurs fonctions,...

 

Un clic droit et je choisi une autre fonction, donc deux clics pour arriver sur une application, c'est pas si mal,..

 

Bon, je termine le menu déroulant et la barre d'outils qui va avec et je pourrai écrire un p'tit document concernant les différentes applications et les manières d'y accéder,...

 

 

Merci à tous,

 

Exercice terminé !

 

900x400http://free0.hiboox.com/images/3409/29beadfd98feab5f52a00fb81b778537.jpg[/img]

 

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

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é