zebulon_ Posté(e) le 27 janvier 2022 Posté(e) le 27 janvier 2022 Bonjour, lorsqu'on exploite un dcl, on dispose des fonctions set_tile et get_tile pour affecter des valeurs a des éléments de boite de dialogue, respectivement pour les récupérer. Par contre, je n'ai rien trouvé de simple pour définir le label à partir du lisp. par exemple, j'ai dans mon dcl la séquence suivante : popup_list { label = "Mandrin"; key = tmandrin_anc2fer; list = "Ancrage\nCadre"; } la "list" est facilement paramétrable dans le lisp, mais pas le label. Si je veux que ce soit "Mandrin" pour une version française et "Mandrel" pour une version anglaise, je suis soit : - obligé d'avoir 2 fichiers dcl. Le lisp en choisit un ou l'autre en fonction du paramètre de la langue - ne plus avoir de fichier dcl et le faire créer de façon temporaire par le lisp lui-même comme ici. Ainsi on peut paramétrer ce qu'on veut. Est-ce que vous voyez un autre moyen simple ? Merci Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Luna Posté(e) le 27 janvier 2022 Posté(e) le 27 janvier 2022 Coucou, Ce n'est que récemment que je me suis confronté à la programmation french/english et je n'ai pas trouvé mieux que développer la fonction (LgT), en PJ. (defun LgT (en fr flag) (cond ((= flag 1) en) ((= flag 2) fr) (T (LgT en fr (if (= (getvar "LOCALE") "FR") 2 1))) ) ) Du coup désormais lorsque j'écris mes programmes, j'écris la version anglaise et la version française des textes et selon la valeur du 'flag', la commande fonctionne en anglais ou en français. Autrement, concernant les fichiers DCL je te conseille de ne jamais écrire directement de fichier DCL (justement en raison du fait que l'on ne peut pas jouer sur certains paramètres. Perso, je créer toujours des fichiers DCL via (vl-filename-mktemp) et (open ... "W"). Du coup je créé le fichier DCL directement depuis un programme LISP et donc on peut y affecter des variables ou modifier sa structure plus facilement. Mais en effet lorsqu'il faut qu'un programme fonctionne avec plusieurs langages, il faut travailler plusieurs fois pour écrire en dur les différentes traductions ! J'avais également essayé de voir avec la fonction (showhtmlmodalwindow) mais je n'arrive pas à ouvrir une page web, intervenir sur cette page et la refermer, le tout de manière transparente... Le mieux que j'ai pu faire c'est le programme OpenDeepL : (defun c:OpenDeepL (/ URLencode AutoCAD-string _GetClipBoardText mode name str) (defun URLencode (URL / dec->hex f xpt) (defun dec->hex (n) (cond ( (< 15 n) (strcat (dec->hex (lsh n -4)) (dec->hex (rem n 16))) ) ( (< n 10) (itoa n) ) (T (chr (+ n 55)) ) ) ) (defun f (l / d) (if l (strcat (cond ( (or (< 47 (car l) 58) ; [0-9] (< 64 (car l) 91) ; [A-Z] (< 96 (car l) 123) ; [a-z] (member (car l) xpt) ; non-encoded special characters ) (chr (car l)) ) ( (< (car l) 128) (strcat "%" (if (= 1 (strlen (setq d (dec->hex (car l))))) (strcat "0" d) d)) ) ( (< (car l) 192) (strcat "%C2%" (if (= 1 (strlen (setq d (dec->hex (car l))))) (strcat "0" d) d)) ) ( (< (car l) 256) (strcat "%C3%" (if (= 1 (strlen (setq d (dec->hex (- (car l) 64))))) (strcat "0" d) d)) ) ) (f (cdr l)) ) "" ) ) (setq xpt (vl-string->list "-_.!~*'()") ; JScript ;;(vl-string->list "-._~") ; the Internet Society ;;(vl-string->list "-_.!*()") ; .NET ) (f (vl-string->list URL)) ) (defun AutoCAD-string (str new old / len pos) (setq len (- (strlen (vl-prin1-to-string old)) 2)) (while (setq pos (vl-string-search old str)) (setq str (strcat (substr str 1 pos) new (substr str (+ pos len)) ) ) ) str ) (defun _GetClipBoardText( / h r) (setq r (vlax-invoke (vlax-get (vlax-get (setq h (vlax-create-object "htmlfile")) 'ParentWindow ) 'ClipBoardData ) 'GetData "Text" ) ) (vlax-release-object h) r ) (initget "ObjectSelection Text") (cond ( (= "Text" (setq mode (getkword "\nSpecifie what you want to translate [ObjectSelection/Text] <ObjectSelection> : "))) (setq str (getstring T "\nEnter the text : ")) ) ( (null (while (not (and (setq name (nentsel "\nSelect an object with a text : ")) (setq name (car name)) (assoc 1 (entget name)) (wcmatch (cdr (assoc 1 (entget name))) "*") ) ) ) ) (setq mode "ObjectSelection" str (cdr (assoc 1 (entget name))) ) ) ) (showhtmlmodalwindow (strcat "https://www.deepl.com/translator#fr/en/" (progn (setq str (ACAD-string str "\n" "\\P")) (URLencode str) ) ) ) (if name (entmod (subst (cons 1 (_GetClipBoardText)) (assoc 1 (entget name)) (entget name))) ) (princ) ) Le principe permet de traduire des textes sans mise en forme complexe en ouvrant une page DeepL, l'utilisateur doit ensuite copier le texte traduit dans le presse-papier et fermer la fenêtre pour que le texte soit traduit "approximativement" automatiquement (à partir du presse-papier du moins). Bisous, Luna UtWin . LgT.lsp
zebulon_ Posté(e) le 27 janvier 2022 Auteur Posté(e) le 27 janvier 2022 Merci Je vais donc m'orienter vers la création des fichiers DCL via (vl-filename-mktemp). Tout sera dans le lisp et sera plus facilement paramétrable. Pour l'instant, j'ai toujours un fichier lisp et un fichier dcl du même nom. Je compile les deux pour créer un vlx qui est le seul fichier distribué à des tiers. Si on crée le dcl "à la volée", via le runtime, je pense qu'au moment de le compilation, on n'a plus besoin d'indiquer un fichier de ressources dcl pour créer le vlx ? Le vlx ouvrira le dcl temporaire comme le ferait un lsp, enfin je pense, c'est ce qui me semble dans la logique des choses. J'essaierai ! Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 27 janvier 2022 Auteur Posté(e) le 27 janvier 2022 ça fonctionne comme j'espérais. ça marche bien ainsi et je vais pouvoir changer le contenu du dcl selon les paramètres que je veux, le tout à l'intérieur du lisp. Merci Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 31 janvier 2022 Auteur Posté(e) le 31 janvier 2022 Bonjour Le principe que j'ai retenu est de faire créer le dcl par le lisp comme décrit ci dessus. Ensuite, tout mes textes ou liste de texte sont regroupés dans un fichier texte. Le lisp va lire ce fichier et en extrait les textes nécessaires à la boîte de dialogue ou questions et affichages du lisp. En fonction de la langue, ça prend tel ou tel fichier texte. Ainsi, sans changer de programmation, j'ai plusieurs versions disponibles. Par ailleurs, si la traduction n'est pas géniale, chacun pourra aller dans le fichier texte correspondant et corriger. On peut aussi traduire dans la langue qu'on veut en rajoutant le fichier texte qui lui correspond Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
VDH-Bruno Posté(e) le 31 janvier 2022 Posté(e) le 31 janvier 2022 Bonjour Zebulon_ Ca fait bien longtemps que je ne me suis pas intéressé au dcl, personnellement j'avais opté pour l'autre solution. Influencé sans doute par le fichier AutoCAD.dcl que j'avais édité pour voir comment Autodesk avait traité la question. Après je m'étais écris un fichier texte avec les occurrences à traduire puis je passais par un remplacer dans le bloc-notes. Pour une petite boite de dialogue écrire le dcl à la volée c'est rapide, mais dans un fichier avec beaucoup de boite de dialogue, je trouvais pratique d'avoir un dcl pour pouvoir inspecter /visualiser ses BD dans l'éditeur Visual Lisp. Salutations Bruno Apprendre => Prendre => Rendre
zebulon_ Posté(e) le 1 février 2022 Auteur Posté(e) le 1 février 2022 Il y a 11 heures, VDH-Bruno a dit : Influencé sans doute par le fichier AutoCAD.dcl que j'avais édité pour voir comment Autodesk avait traité la question. Bonjour, Ceux de notre génération qui se sont intéressés au sujet sont tous allés s'abreuver à la même source. Pour moi, c'était donc pareil et j'ai toujours scindé le fichier lsp et le fichier dcl. Après, quand on n'est pas dogmatique, on se laisse aussi influencer par quelques écrits apocryphes et j'ai constaté que le dcl, intégré au fichier lsp était beaucoup plus souple d'utilisation. J'avais peur que ce soit indigeste au niveau de la lecture du dcl dans le lsp, mais on peut faire en sorte que ce soit plus ou moins pareil que le dcl pur et dur. La seule chose à laquelle il faut veiller, c'est la longueur de la chaine de caractères. Si elle devient trop longue, il faut faire deux ou trois write-line. Mais sinon, on peut présenter de la même manière que dans le fichier dcl. Amitiés Vincent (defun create_dialog_cadfer (/ fndcl) (setq fnamedcl (vl-filename-mktemp "dcl.dcl")) (setq fndcl (open fnamedcl "w")) (write-line (strcat "temp : dialog { key = label_cadfer; : row { : column { : button { label = \"" (get_MSG 1) "\"; fixed_width = true; key = pick_cadfer; } : image { width = 20; aspect_ratio = 1.3; color = 0; key = image_cadfer; } : popup_list { key = form_cadfer; } : popup_list { key = ferm_cadfer; } : popup_list { key = ins_cadfer; } } spacer_1; spacer_1; " ) fndcl ) (write-line (strcat ": column { fixed_height = true; alignment = top; : popup_list { label = \"" (get_MSG 2) "\"; key = acier_cadfer; } : text { key = type_cadfer; } : text { key = phiext_cadfer; } : text { key = mandrin_cadfer; } : edit_box { label = \"" (get_MSG 3) "\"; key = enrob_cadfer; } spacer_1; : edit_box { label = \"" (get_MSG 4) "\"; key = brins_cadfer; } spacer_1; : row { : edit_box { label = \"" (get_MSG 5) "\"; key = reteq_cadfer; } : text { label = \"" (chr 248) "\"; } } } } spacer_1; ok_cancel_help; } " ) fndcl ) (close fndcl) fnamedcl );defun C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 1 février 2022 Auteur Posté(e) le 1 février 2022 puis j'ouvre la boite de dialogue, je la ferme et j'efface le dcl ;ouverture de la boîte de dialogue (setq fnamedcl (create_dialog_cadfer)) (setq dcl_id (load_dialog fnamedcl)) (setq what_next 5) (while (< 2 what_next) (if (not (new_dialog "temp" dcl_id)) (exit)) blablabla ) (unload_dialog dcl_id) (vl-file-delete fnamedcl) C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 1 février 2022 Auteur Posté(e) le 1 février 2022 tous les messages sont regroupés dans un fichier texte externe qui se présente de la manière suivante : (1 . "Saisir<") (2 . "Acier : ") (3 . "Enrobage : ") (4 . "Nb brins : ") (5 . "Retour : ") (6 . "Premier point : ") (7 . "Deuxième point : ") (8 . "Troisième point : ") (9 . "Quatrième point : ") (10 . ("Crochet norm. 135°" "Equerre norm. 90°" "Retour norm. 180°")) (11 . ("Crochet norm. 135°" "Equerre norm. 90°")) C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
zebulon_ Posté(e) le 1 février 2022 Auteur Posté(e) le 1 février 2022 ensuite, je commence par charger ce fichier et je le transforme en liste. (setq GLOBAL_MSG (read_listfersystem_file "fr.cfg")) ;; français ou une autre langue ;;; avec cette fonction (defun read_listfersystem_file (cfgfilename / FACIER F LIGNE L) (setq FACIER (findfile cfgfilename)) (setq F (open FACIER "r")) (while (setq LIGNE (read-line F)) (setq L (cons (read LIGNE) L)) ) (close F) (reverse L) ) ;; puis je peux me servir de chaque texte en le retrouvant facilement avec l'index (setq PTB1 (getpoint (strcat "\n" (get_MSG 6)))) ;; qui utilise cette fonction (defun get_MSG (NUMSG) (cdr (assoc NUMSG GLOBAL_MSG)) ) Le setq GLOBAL_MSG peut évidemment être conditionné par la valeur de la variable LOCALE et on peut faire prendre "fr.fcg" ou "en.cfg" ou tout autre langue selon les circonstances. Compte tenu que les textes sont tous regroupés à l'extérieur du code, dans un fichier texte, c'est facile de corriger et/ou de créer un nouveau fichier pour une autre langue. Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Luna Posté(e) le 1 février 2022 Posté(e) le 1 février 2022 Coucou, Je n'avais pas pensé à la lecture d'un simple fichier texte en effet, cela est très certainement plus simple à modifier. Après j'ai peur aussi par rapport au temps d'exécution du programme...Cela ne ralenti pas trop le programme d'ouvrir un fichier texte à chaque fois ? Bisous, Luna
zebulon_ Posté(e) le 1 février 2022 Auteur Posté(e) le 1 février 2022 Bonjour, Il y a 2 heures, Luna a dit : Cela ne ralenti pas trop le programme d'ouvrir un fichier texte à chaque fois ? C'est surement un poil plus lent que de laisser les textes dans le code, mais je ne me rends compte d'aucun ralentissement notable. Amitiés Vincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
VDH-Bruno Posté(e) le 1 février 2022 Posté(e) le 1 février 2022 Bonjour, Oui c'est une façon de faire, après si je peux faire un parallèle avec des choses que j'ai déjà mis en oeuvre et éviter la lecture d'un fichier de config .cfg et ainsi répondre à cette interrogation: Il y a 2 heures, Luna a dit : Coucou, Je n'avais pas pensé à la lecture d'un simple fichier texte en effet, cela est très certainement plus simple à modifier. Après j'ai peur aussi par rapport au temps d'exécution du programme...Cela ne ralenti pas trop le programme d'ouvrir un fichier texte à chaque fois ? Bisous, Luna Surtout si le fichier cfg est écrit sous forme d'un lisp, c'est dans faire directement un fichier config_fr.lsp en autochargement en déclarant directement la variable globale *GLOBAL_MSG* à l'intérieur du fichier. Il y a 3 heures, zebulon_ a dit : tous les messages sont regroupés dans un fichier texte externe qui se présente de la manière suivante : (1 . "Saisir<") (2 . "Acier : ") (3 . "Enrobage : ") (4 . "Nb brins : ") (5 . "Retour : ") (6 . "Premier point : ") (7 . "Deuxième point : ") (8 . "Troisième point : ") (9 . "Quatrième point : ") (10 . ("Crochet norm. 135°" "Equerre norm. 90°" "Retour norm. 180°")) (11 . ("Crochet norm. 135°" "Equerre norm. 90°")) Ce qui permet d'économiser les lignes suivantes dans le corps du programme et accessoirement le temps de chargement correspondant, temps qui reste négligeable car effectué qu'une seul fois dans ton programme. Il y a 3 heures, zebulon_ a dit : ensuite, je commence par charger ce fichier et je le transforme en liste. (setq GLOBAL_MSG (read_listfersystem_file "fr.cfg")) ;; français ou une autre langue ;;; avec cette fonction (defun read_listfersystem_file (cfgfilename / FACIER F LIGNE L) (setq FACIER (findfile cfgfilename)) (setq F (open FACIER "r")) (while (setq LIGNE (read-line F)) (setq L (cons (read LIGNE) L)) ) (close F) (reverse L) ) En faire un fichier lisp n’empêche en rien la personnalisation du fichier de config, si il n'est pas encapsulé dans ton vlx, car cela reste un fichier texte. Il y a 15 heures, zebulon_ a dit : En fonction de la langue, ça prend tel ou tel fichier texte. Ainsi, sans changer de programmation, j'ai plusieurs versions disponibles. Par ailleurs, si la traduction n'est pas géniale, chacun pourra aller dans le fichier texte correspondant et corriger. On peut aussi traduire dans la langue qu'on veut en rajoutant le fichier texte qui lui correspond Pour cela suffit de mettre quelques commentaire bien choisi en entête du fichier config_**.lsp pour permettre à l'utilisateur de le personnaliser. En tout cas jolie travail et bonne continuation dans ton projet, projet que j'observe de loin mais toujours avec intérêt étant "retraité" du lisp, ne travaillant plus que très occasionnellement sous AutoCAD. Amicalement Bruno Apprendre => Prendre => Rendre
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