Aller au contenu

Changer les textes d\'une nomenclature depuis une BD??


Messages recommandés

Posté(e)

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 ça

Mais 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]

Posté(e)

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 @)

Posté(e)

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]

Posté(e)

Bonsoir Christian,

Je n'ai pas à proprement parler les fichiers dispos

C'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]

Posté(e)

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

Posté(e)

Bonjour (Gile)

je te remercie pour ton aide, je testerai dès mon retour au bureau Jeudi

Ben 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]

Posté(e)

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éparateur

J'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 programme

AutoCad me demande de choisir mon fichier csv, ce que j'ai fais

Puis 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 courant

A+

 

[Edité le 4/2/2009 par jeefreeze]

Posté(e)

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 Texte

Un,One

Mot,Word

Traduire,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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour Patrick

 

Je viens de tester, j'ai le renvoi systématique

 

Erreur à la ligne 1 ,séparateur manquant

Erreur à 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:

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

 

Eric

Tu as vu ton nouveau concurent ?

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)
J'ai ensuite fais un copier coller du second lisp propo

 

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és

Faire un seul lips avec tes 2 codes

Faire 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 à pas

Je l'ai dit ... j'suis mauvais ... Mais mauvais comme tu l'imagine pas !!

 

A+

Posté(e)

Eric

Tu 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.

 

Posté(e)
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 !!!

 

Фабрис = fabrice

Tout 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]

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Re Patrick

Effectivement 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 aide

A+

 

/!\ 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]

Posté(e)

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

Posté(e)
Le LISP que j'ai donné fonctionne avec le premier exemple donné par jeefreeze (qui ne contient pas de caractères spéciaux).

 

Bonjour Gile

Je 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.

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é