jeefreeze Posté(e) le 30 janvier 2009 Posté(e) le 30 janvier 2009 Bonsoir,Et bonne et heureuse année à tous (j'ai encore le droit le mois de janvier n'est pas terminé) Je viens vers vous, car je suis une vraie quiche en informatique ... alors le Lisp ou le VB :( J'ai le problème suivant:J'ai un paquet de plan (160) qui contiennent des nomenclatures sous forme de texte simple et parfois d'attributs. Et il me faut traduire ou changer ces textes. L'idée serait d'avoir un fichier Excel (Excel un exemple) avec sur une colonne le texte d'origine, et de l'autre le texte traduit. et de lancer un petit programe depuis AutoCad qui fasse la recherche dans le fichier Excel et qu'il change le texte trouvé dans la première colonne avec le nouveau formatage de la colonne qui suit..... Simple comme çaMais dans la réalité, je coince. J'ai cherché de droite à gauche sans succés Utilisateur du merveilleux LXL de Patrick_35 je me suis dit que l'idée de départ était là, mais la création des liaisons d'attributs est carrément impossible à la vue du nombre d'éléments à changer, de plus cela ne marche que pour les attributs. Donc en conclusion existe t-il une petite routine qui puisse remplir cette fonction ? Merci par avance [Edité le 30/1/2009 par jeefreeze]
rebcao Posté(e) le 31 janvier 2009 Posté(e) le 31 janvier 2009 Bonjour, Je pense à un savant Mélange entre EXCEL, un SCRIPT et un LISP... Avec un tableau EXCEL, on peut effectivement de manière très simple et conviviale définir les correspondances entre les éléments et avec un LISP effectuer les remplacements Christian [Edité le 31/1/2009 par rebcao] Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
jeefreeze Posté(e) le 31 janvier 2009 Auteur Posté(e) le 31 janvier 2009 Bonjour Christian ..... Je suppose aussi que c'est faisable .... Mais comme dit précedement j'suis une quiche en informatique, alors utiliser une script un lisp ou qqchose du genre puis aider à tester OK .... mais pour le dévellopement faut pas compter sur moi !!Je fais donc une demande formelle à une âme charitable A+[Edité le 31/1/2009 par jeefreeze] [Edité le 4/2/2009 par jeefreeze]
rebcao Posté(e) le 31 janvier 2009 Posté(e) le 31 janvier 2009 Bonsoir, As-tu un exemple de tableau EXCEL avec les textes à remplacer... Et quelques fichiers pour TEST. Tu peux m'envoyer tout ça à l'adresse en pied de page. Merci. Christian Formateur, Consultant Expert AutoCAD, REVIT MEP, INVENTOR, télécharger , des Outils AutoCAD...cad123 @ wanadoo.fr (enlever les espaces de part et d'autre de @)
jeefreeze Posté(e) le 31 janvier 2009 Auteur Posté(e) le 31 janvier 2009 Bonsoir Christian,Je n'ai pas à proprement parler les fichiers disposC'est pour un amis que je cherche une solution.Mais il est possible de faire des tests simples Sur Excel colonne A le texte inital contenu dans autocad (un genre de dictionnaire), mais pas forcement la liste strcite du texte contenu dans ... la liste ne devrait pas être exhaustive.Et sur la colonne B le texte à changer ou à traduire En fait, la liste Excel peut contenir 200 mots, et Autocad n'en utilisera que le nombre nécessaire trouvé dans la base L'idée est de faire chercher autocad, sur la colonne A en automatique, et qu'il remplace ce dernier (Même police même mise en forme) par celui de la colonne B Je propose Excel, car je maitrise mieux .... A+[Edité le 31/1/2009 par jeefreeze] [Edité le 4/2/2009 par jeefreeze]
jeefreeze Posté(e) le 2 février 2009 Auteur Posté(e) le 2 février 2009 Bonjour à tous Je viens de créer un exemple rapidementVous trouverez çà là : http://dl.free.fr/u7jTbR7Vv A+ [Edité le 4/2/2009 par jeefreeze]
(gile) Posté(e) le 2 février 2009 Posté(e) le 2 février 2009 Salut, Je te propose un LISP qui fonctionne avec les fichiers .csv ou .txt (à enregistrer à partir de ton fichier .xls)Si tu veux traiter plusieurs fichiers, tu peux l'utiliser dans un script (voir Super Auto Script) dans ce cas, il faut mettre dans ton script l'expression LISP suivante : (nomedit "C:\\Test-changement-Texte\\Test changement texte.csv" ",") en remplaçant le chemin par celui du fichier (avec des doubles anti-slashes (\\) et le séparateur par celui de ton fichier :"," --> virgule";" --> point-virgule" " --> espace"\t" --> tabulation (defun nomedit (filename sep / file line lst ss str) (vl-load-com) (setq file (open filename "r")) (while (setq line (read-line file)) (setq lst (cons (str2lst line sep) lst)) ) (close file) (if (ssget "_X" '((-4 . "[b] (0 . "MTEXT,TEXT") (-4 . "[b] (0 . "INSERT") (66 . 1) (-4 . "AND>") (-4 . "OR>") ) ) (progn (vlax-for obj (setq ss (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) (if (= (vla-get-ObjectName obj) "AcDbBlockReference") (foreach att (vlax-invoke obj 'GetAttributes) (setq str (vla-get-TextString att)) (foreach pair lst (setq str (vl-string-subst (cadr pair) (car pair) str)) ) (vla-put-TextString att str) ) (progn (setq str (vla-get-TextString obj)) (foreach pair lst (setq str (vl-string-subst (cadr pair) (car pair) str)) ) (vla-put-TextString obj str) ) ) ) (vla-delete ss) ) ) ) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) Si tu veux lancer le LISP ci-dessus de puis un fichier (pour test ou autre) charge aussi le LISP suivant et entre nomedit à la ligne de commande. (defun c:nomedit (/ filename sep) (if (and (setq filename (getfiled "Choisir le fichier" "" "csv;txt" 0)) (setq sep (optionbox "Séparateur" nil '(("," . "Virgule") (";" . "Point-virgule") (" " . "Espace") ("\t" . "Tabulation") ) nil ) ) ) (nomedit filename sep) ) (princ) ) (defun OptionBox (title msg keylab mult / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "OptionBox:dialog{label=\"" title "\";") file ) (write-line (strcat (if mult ":boxed_column{" ":boxed_radio_column{key=\"choice\";" ) ) file ) (if (and msg (/= msg "")) (write-line (strcat "label=\"" msg "\";") file) ) (mapcar (function (lambda (p) (write-line (strcat (if mult ":toggle{key=\"" ":radio_button{key=\"" ) (car p) "\";label=\"" (cdr p) "\";}" ) file ) ) ) keylab ) (if mult (write-line "spacer;:button{label=\"Tout sélectionner\"; key=\"all\";fixed_width=true;alignment=centered;}" file ) ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "OptionBox" dcl_id)) (exit) ) (if mult (progn (action_tile "all" "(foreach k (mapcar 'car keylab) (set_tile k\"1\"))" ) (action_tile "none" "(foreach k (mapcar 'car keylab) (set_tile k\"0\"))" ) (action_tile "accept" "(foreach k (mapcar 'car keylab) (if (= \"1\" (get_tile k)) (setq choice (cons k choice)))) (setq choice (reverse choice)) (done_dialog)" ) ) (progn (set_tile "choice" (caar keylab)) (action_tile "accept" "(setq choice (get_tile \"choice\")) (done_dialog)" ) ) ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jeefreeze Posté(e) le 3 février 2009 Auteur Posté(e) le 3 février 2009 Bonjour (Gile)je te remercie pour ton aide, je testerai dès mon retour au bureau JeudiBen oui je suis au lit avec la maladie à la mode ... la GASTRO Pour être honnête j'ai pas tout compris à ta manip. J'suis vraiment pas bon dans ce domaine.Le lien Super auto scritp n'est plus dispo A+ et merci[Edité le 3/2/2009 par jeefreeze] [Edité le 4/2/2009 par jeefreeze]
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 Bonjour (gile)Je viens de faire un test, mais j'ai le retour suivant: ; erreur: no function definition: NOMEDIT Je expliquer ce que j'ai fais:J'ai créer un fichier csv depuis mon fichier excel, avec le ";" (point virgule) come séparateurJ'ai donc le résultat suivant:Joe;Jo Emilie;Milou Stéphane;Steph Christian;Christobald Thibault;Titi Caroline;La Ka Joseph;Mario Martin;Pépé Sylvain;The Best 285;1120 780;78.5 Mégane;879 Fabrice;Фабрис Simon;Chief Estève;Giuseppe Robert;Roberto J'ai ensuite fais un copier coller du second lisp propsé, sans aucune modification, dans le bloc note et enregister le fichier sous nomedit.lsp J'ai lancé AutoCad, puis j'ai chargé (Appload) le lisp nomedit.J'ai ensuite taper nomedit pour lancer le programmeAutoCad me demande de choisir mon fichier csv, ce que j'ai faisPuis ensuite il me demande le type de séparateur, J'ai choisi le ";" (point virgule) et là .... CraK ça bug Bon c'était peut-être pas la bonne manip !! Tiens moi au courantA+ [Edité le 4/2/2009 par jeefreeze]
Patrick_35 Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 Salut Je te propose une version un peu différente de celle de (gile)Le principe est de regarder dans un fichier texte, de remplacer un texte par un autre sans faire sauter le format des Mtext, de traduire d'une langue A vers une langue B, inversement de B vers A, d'inverser (si des textes appartiennent à A, ils deviennent B et les Textes B deviennent A) ainsi qu'une sélection (argument tout lors de la sélection pour prendre tous les objets).Tu peux aussi remplacer qu'une partie d'un mot par un autre. Principe du fichier TexteUn,OneMot,WordTraduire,Translate Le lisp(defun c:trad(/ choix doc fic file lig lst_A lst_B pos sel sep val changer_texte rech_txt selection) (defun rech_txt(ent lst / tro) (foreach txt lst (and (wcmatch (strcase (vla-get-textstring ent)) (strcat "*" (strcase (car txt)) "*")) (setq tro T) (vla-put-textstring ent (vl-string-subst (cadr txt) (car txt) (vla-get-textstring ent))) ) ) tro ) (defun changer_texte(ent / txt) (cond ((eq choix "A") (rech_txt ent lst_A) ) ((eq choix "B") (rech_txt ent lst_B) ) (T (or (rech_txt ent lst_A) (rech_txt ent lst_B)) ) ) ) (defun selection() (initget 1 "A B Inversion") (getkword "A -> B, B -> A, Inversion [A/B/I] : ") ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) sep [surligneur]","[/surligneur] lig 1 ) (vla-startundomark doc) (and (setq fic (getfiled "Choisissez le fichier de traduction" (getvar "dwgprefix") "txt" 2)) (ssget) (setq choix (selection)) (progn (setq file (open fic "r")) (while (setq val (read-line file)) (if (setq pos (vl-string-search sep val)) (setq txt (list (substr val 1 pos) (substr val (+ pos 2))) lst_A (cons txt lst_A) lst_B (cons (reverse txt) lst_B) ) (princ (strcat "\nErreur à la ligne " (itoa lig) " ,séparateur manquant.")) ) (setq lig (1+ lig)) ) (close file) (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (cond ((member (vla-get-objectname ent) '("AcDbMText" "AcDbText")) (changer_texte ent) ) ((eq (vla-get-objectname ent) "AcDbBlockReference") (foreach txt (vlax-invoke ent 'getattributes) (changer_texte txt) ) ) ) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) ps : tu remarqueras dans le lisp que la variable sep a comme valeur de séparateur la virgule. A toi de la changer si elle ne te convient pas. nb : C'est aussi faisable avec Excel, mais je trouve la méthode du fichier texte plus approprié à ton besoin. Néanmoins, si tu veux vraiment travailler avec Excel, fais le nous savoir. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 Bonjour Patrick Je viens de tester, j'ai le renvoi systématique Erreur à la ligne 1 ,séparateur manquantErreur à la ligne 2 ,séparateur manquant.... Erreur à la ligne 30 ,séparateur manquant. J'ai essayé avec virgule, point virgule, dans le fichier txt, dans le lisp ... sans succés Je dois merdouiller qqpart !!! Tu trouveras mes fichiers de travail ICI (Fichier AutoCad, Trad.lsp, Bases txt avec virgule et point virgule) A+Nb: Bravo pour ton LXL, il marche nickel .... la base que je t'avais envoyé à encore grandie .... et aucun ralentissment en vue. Par contre désolé pour le tuto, j'ai peu de temps :exclam:
Patrick_35 Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 Re J'ai trouvé l'origine du bug. C'est la police de caractère qui fausse tout.Pas facile de convertir les caractères étendus ps : Merci pour LXL, j'essaye dans la mesure du possible que mes lisps soient les plus rapide possible.Content qu'il te serve. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 J'ai ensuite fais un copier coller du second lisp propsé Il faut absolument charger le premier LISP (c'est lui qui fait la "traduction") le second LISP sert juste d'interface utilisateur et lance le premier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 Aîe !!! Et tu as une autre solution ?? A+
Eric Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 Le lien Super auto scritp n'est plus dispo Gile avait seulement oublié une lettre dans le lien. ;) L'adresse exact est : http://www.caderix.com/crbst_2.html En tout cas merci à Gile pour avoir donné le lien. Eric est formateur, revendeur sur AutoCAD LT, DraftSight, ZWCAD, SketchUp et PDF2CAD
Patrick_35 Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 jeefreeze :Tu as comme texte ceci : ФабрисA la lecture du fichier, je trouve "$\0040\0041\004@\0048\004A\004"Ton texte traduit en lisp (vl-string->list "Фабрис") donne (92 85 43 48 52 50 52 92 85 43 48 52 51 48 92 85 43 48 52 51 49 92 85 43 48 52 52 48 92 85 43 48 52 51 56 92 85 43 48 52 52 49) J'ai 6 caractères d'origine, j'en trouve 42 (6 x 7), soit une table qui donne Ф --> 92 85 43 48 52 50 52 --> \0040 --> \U+0424а --> 92 85 43 48 52 51 48 --> \0041 --> ??б --> 92 85 43 48 52 51 49 --> \004@ --> ??р --> 92 85 43 48 52 52 48 --> \0048 --> ??и --> 92 85 43 48 52 51 56 --> \004A --> ??с --> 92 85 43 48 52 52 49 --> \004 --> ?? Reste à trouver la logique. Par contre, à la lecture d'un texte comme Фабрис, autocad me retourne comme info ?????? (gile)En testant ton lisp, j'ai ceci comme erreur; erreur: type d'argument incorrect: (or stringp symbolp): nil EricTu as vu ton nouveau concurent ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 J'ai ensuite fais un copier coller du second lisp proposé Il faut absolument charger le premier LISP (c'est lui qui fait la "traduction") le second LISP sert juste d'interface utilisateur et lance le premier. Bonjour Gile Ben écoutes, j'ai un peu tout essayé sans succésFaire un seul lips avec tes 2 codesFaire 2 lips séparés ..... J'ai bien une base avec ; et je sélectionne le ;Bref Je patauge grave :mad: J'ai une erreur ; erreur: type d'argument incorrect: (or stringp symbolp): nil Donc peux-tu, si cela t'es possible, me donner la manip pas à pasJe l'ai dit ... j'suis mauvais ... Mais mauvais comme tu l'imagine pas !! A+
Eric Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 EricTu as vu ton nouveau concurent ? Nouveau, nouveau, faut le dire vite. Ca n'a pas visiblement pas beaucoup évolué depuis quelques années. Bon faut dire que moi aussi ça fait quelques temps que je n'ai pas bossé sur le mien, donc je ne la ramènerais pas trop quand même :D Mais dès que j'ai un peu le temps je me replongerais dans tes suggestions. Eric est formateur, revendeur sur AutoCAD LT, DraftSight, ZWCAD, SketchUp et PDF2CAD
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 jeefreeze :Tu as comme texte ceci : Фабрис Ben voui !! C'est volontaire, dans les traductions à fairer, faut intégrer le russe. J'en aurai besoin pour le boulot que j'ai .... :mad2: PAS GLOP !!! Фабрис = fabriceTout simple ... m'enfin vite dit !! Ceci dit mêm en virant ces signes cabalistiques ... A l'exécution j'ai toujours:Erreur à la ligne 1 ,séparateur manquant.Erreur à la ligne 2 ,séparateur manquant.Erreur à la ligne 3 ,séparateur manquant....etc ......etc ......Erreur à la ligne 30 ,séparateur manquant. C'est sûr, je dois pas faire la bonne manip :mad: :mad: A+[Edité le 4/2/2009 par jeefreeze] [Edité le 4/2/2009 par jeefreeze]
Patrick_35 Posté(e) le 4 février 2009 Posté(e) le 4 février 2009 Non, tu ne fais pas de fausse manip.J'ai indiqué qu'il y avait un bug à cause de la police de caractère Si tu remplaces (while (setq val (read-line file)) (if (setq pos (vl-string-search sep val)) Par (while (setq val (read-line file)) (setq val (vl-list->string (vl-remove 0 (vl-string->list val)))) (and (eq lig 1) (eq (substr val 1 2) "ÿþ") (setq val (substr val 3)) ) (if (setq pos (vl-string-search sep val)) Cela fonctionne sauf pour les caractères cyrilliques, et je cherche la logique de ce que j'ai indiqué plus haut @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jeefreeze Posté(e) le 4 février 2009 Auteur Posté(e) le 4 février 2009 Re PatrickEffectivement ta modification fonctionne J'ai également essayer avec les caractère russes, histoire de ....Pour la traduction de Fabrice = ФабрисJ'ai obtenu : $?0?1?@?8?A? décidement PAS GLOP !! le russe !! SI tu parviens à trouver une solution à ce problème particulier .... je suis prenneur !! Merci pour ton aideA+ /!\ Les caractères Minuscules et Majuscules sont prient en compte. si la syntahxe n'est pas exate, ça marche pas ... Normal [Edité le 4/2/2009 par jeefreeze]
(gile) Posté(e) le 5 février 2009 Posté(e) le 5 février 2009 Salut, Désolé pour le lien non valide vers Super Auto Script (merci à Eric d'avoir corrigé). Le LISP que j'ai donné fonctionne avec le premier exemple donné par jeefreeze (qui ne contient pas de caractères spéciaux).L'introduction (à posteriori) de caractères spéciaux (alphabet russe) nécessite un codage unicode du fichier. Ceci qui demande une lecture en LISP différente et plus complexe que pour les traditionnels fichiers ascii. L'erreur : "; erreur: type d'argument incorrect: (or stringp symbolp): nil" correspond au message : "Erreur à la ligne 1 ,séparateur manquant." du LISP de Patrick_35.Elle est due au caractère "\000" que le codage unicode ajoute à chaque ligne. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
jeefreeze Posté(e) le 5 février 2009 Auteur Posté(e) le 5 février 2009 Le LISP que j'ai donné fonctionne avec le premier exemple donné par jeefreeze (qui ne contient pas de caractères spéciaux). Bonjour GileJe viens de regarder les premiers éléments proposés à l'étude ( http://dl.free.fr/u7jTbR7Vv )J'avais bien mis les caractères cyrilliques dans la base, mais pas dans le fihcier AutoCad, d'ou mon erreur initiale. Il n'en reste pas moins que si vous avez une solution .... je prends !! A+ Nb: Je n'ai pas réussi à faire fonctionner ton lisp. J'aurai bien voulu le tester. Peux-tu m'expliquer pas à pas la manip à faire STP.
(gile) Posté(e) le 5 février 2009 Posté(e) le 5 février 2009 Salut, J'avais séparé le code en 2 parties parce que seule la première est nécessaire pour l'utilisation dans un script (.La seconde partie ne sert qu'à récupérer des entrées utilisateurs : le chemin du fichier et le séparateur. Pour un test, tu peux charger les 2 parties dans un dessin, et lancer nomedit à la ligne de commande. Une première boite de dialogue te permet de spécifier le fichier .txt ou .csv, une seconde de spécifier le séparateur de données utilisé dans le fichier.Le reste est automatique.Tu peux aussi, éviter les interfaces en entrant directement à la ligne de commande l'expression à mettre dans le script (après avoir remplacé le chemin du fichier et le séparateur).(nomedit "C:\\Test-changement-Texte\\Test changement texte.csv" ",") PS : si le premier exemple a fonctionné chez moi, c'est parce que, quand j'ai enreistré le fichier xls ent txt et csv j'ai choisi un codage ascii, j'ai donc perdu, dans les deux fichiers créés les caractères spéciaux. Je n'ai pas trop le temps de chercher, mais la lecture et la traduction des codes unicode en LISP n'est pas du tout évidente. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 5 février 2009 Posté(e) le 5 février 2009 Bon, il faut utiliser les activex pour lire les fichiers unicode J'ai bien trouvé un exemple. J'ai réussi à lire le fichier unicode, mais les caractères Фабрис donnent ?????? Il va falloir chercher une autre piste @+ [Edité le 5/2/2009 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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