Aller au contenu

[Résolu] Lisp ? Script ? de modification de texte


Messages recommandés

Posté(e)

Bonjour à toutes et à tous,

Je recherche une piste..

Je souhaiterais pouvoir remplacer une donnée d'attribut d'un bloc de plusieurs dwg, sans ouvrir les fichiers ?

Est-ce possible ? Et....comment ?

Je vous remercie. Bonne fin de journée.

 

Posté(e)
Il y a 2 heures, La Lozère a dit :

Merci @William44850 pour le fichier. Je confirme. SuperAutoScript et la commande gatte dans le script est tout à fait adapté à la demande.

Et bien oui.....et non 😁

C'est bien la méthode à utiliser....SuperAutoScript et GATTE. Mais dans leur bloc, l'attribut "Projection" a une valeur par défaut que le script ne doit pas arriver pas à corriger puisqu'il ne se termine pas

Je cherche.

Et merci beaucoup.

Posté(e)

Pas de problème chez moi pour scripter ça.

Dans l'exemple ci-dessous, le nom du bloc est "TATA", et le nom de l'attribut est "NUMERO" et le nouveau texte "Test1". Il faut absolument un retour à la ligne après le "YES"

image.png.bba372fa72c5048e76e614a70fe62fb7.png

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Posté(e)
Il y a 1 heure, La Lozère a dit :

Pas de problème chez moi pour scripter ça.

Dans l'exemple ci-dessous, le nom du bloc est "TATA", et le nom de l'attribut est "NUMERO" et le nouveau texte "Test1". Il faut absolument un retour à la ligne après le "YES"

image.png.bba372fa72c5048e76e614a70fe62fb7.png

Et cela ne marche pas. Le fichier dwg s'ouvre mais aucune modif ne s'opère. J'ai ça dans le script :

gatte
B
Format-A1
PROJECTION
RGF93CC47
yes

Je suis avec le SuperAutoScript 2.6

Là, je sèche.

Posté(e)

Alors, désolé, je n'avais pas testé avec SuperAutoScript. Mais avec superautoscript, il ne faut pas le retour à la ligne après le "Yes".

Peux-tu en dire plus sur le moment où ça bloc ?

 

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Posté(e)

Bonjour @William44850,

Tu peux aussi utiliser le lisp PAT de notre regretté Patrick_35 qui devrait répondre à ton besoin.

Tu ouvres un fichier sur lequel tu souhaites modifier l'attribut en question sans le changer.

Tu lances le lisp PAT, tu sélectionnes le bloc où se trouve l'attribut à modifier, tu sélectionnes l'attribut à modifier,tu mets la nouvelle valeur puis tu choisis le répertoire (dossier) dans lequel sont tous les autres dwg à traiter. Tu cliques sur OK et le tour est jouer.

Ci-joint, le lisp PAT.lsp avec le fichier PAT.dcl à mettre dans le même dossier et une vidéo pour la démo.

PAT.zip

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Pour fabriquer ton script personnalisé, tu peux essayer ceci.

Code à copier coller dans un nouveau dessin (avec aucun fichier à traiter ouvert par Autocad)

(defun c:make_script ( / f_exe ShlObj Folder FldObj Out_Fld file_scr)
	(vl-load-com)
	(setq
		ShlObj (vla-getinterfaceobject (vlax-get-acad-object) "Shell.Application")
		Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0)
	)
	(vlax-release-object ShlObj)
	(if Folder
		(progn
			(setq
				FldObj (vlax-get-property Folder 'Self)
				Out_Fld (vlax-get-property FldObj 'Path)
			)
			(vlax-release-object Folder)
			(vlax-release-object FldObj)
		)
	)
	(setq file_scr (open (strcat Out_Fld "\\" "traiter_dossier.scr") "w"))
	(foreach dwg (vl-directory-files Out_Fld "*.dwg" 1)
		(write-line "_.open" file_scr)
		(write-line (strcat "\"" Out_Fld "\\" dwg "\"") file_scr)
;;
;;debut partie personnalisable
;;
(write-line "((lambda ( / jsel i name)" file_scr)
(write-line "	(defun update_block (block_record / s_e dxf_e)" file_scr)
(write-line "		(if (/= (getvar \"ATTMODE\") 1) (setvar \"ATTMODE\" 1))" file_scr)
(write-line "		(setq s_e block_record)" file_scr)
(write-line "		(while (/= (cdr (assoc 0 (entget (setq s_e (entnext s_e))))) \"SEQEND\")" file_scr)
(write-line "			(setq dxf_e (entget s_e))" file_scr)
(write-line "			(if (eq (cdr (assoc 0 dxf_e)) \"ATTRIB\")" file_scr)
(write-line "				(if (eq (cdr (assoc 2 dxf_e)) \"PROJECTION\")" file_scr)
(write-line "					(entmod (setq dxf_e (subst (cons 1 \"RGF93 cc47\") (assoc 1 dxf_e) dxf_e)))" file_scr)
(write-line "				)" file_scr)
(write-line "			)" file_scr)
(write-line "		)" file_scr)
(write-line "		(entupd block_record)" file_scr)
(write-line "	)" file_scr)
(write-line "	(and" file_scr)
(write-line "		(setq jsel (ssget \"_X\" '((0 . \"INSERT\") (67 . 1) (8 . \"VEP CARTOUCHE\") (66 . 1) (2 . \"Format-A1\"))))" file_scr)
(write-line "		(repeat (setq i (sslength jsel))" file_scr)
(write-line "			(setq name (ssname jsel (setq i (1- i))))" file_scr)
(write-line "			(update_block name)" file_scr)
(write-line "		)" file_scr)
(write-line "	)" file_scr)
(write-line "	(princ)" file_scr)
(write-line "))" file_scr)
(write-line "(command \"_.saveas\" \"_LT2018\" \"\")" file_scr)
;;
;;fin partie personnalisable
;;
		(write-line "_.close" file_scr)
	)
	(close file_scr)
	(princ (strcat "\Vous pouvez lancer le SCRIPT :" Out_Fld "\\" "traiter_dossier.scr"))
	(prin1)
)

Tu lance alors la commande MAKE_SCRIPT

Tu sélectionne ton dossier à traiter.

Une fois le script créé tu lance la commande SCRIPT en sélectionnant le script "traiter_dossier.scr" dans le dossier précédemment sélectionné.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)
Il y a 2 heures, La Lozère a dit :

Alors, désolé, je n'avais pas testé avec SuperAutoScript. Mais avec superautoscript, il ne faut pas le retour à la ligne après le "Yes".

Peux-tu en dire plus sur le moment où ça bloc ?

 

là, il vient de m'écrire dans la barre de commande "Invalid attribute name". Comme si le nom de l'attribut "PROJECTION" était faux.

 

Posté(e)

Effectivement, j'ai le même blocage sur ton fichier. Je ne saurais te dire d'où ça vient. Le principe du script est bon, mais il y a un truc avec le fichier...

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas
Posté(e)

Bonjour,

 

Le problème vient des attributs dont les noms inclus des "underscore"  _  car la liste des attributs est utilisée dans un initget du lisp GATTE.LSP et le caractère _ dans un initget est un caractère réservé pour passer des choix locaux (langue du produit) aux choix internationaux (US).

Il suffit de remplacer le caractère  _  par le caractère -  pour corriger le problème.

Par contre étant donné que GATTE est un lisp fourni avec les Express Tools, pas sûr que ça tourne sous une version LT.

 

Olivier

Posté(e)
il y a une heure, William44850 a dit :

Bonjour @Olivier Eckmann, @La Lozère

Ce qui veut dire que le SuperAutoScript ne pourra pas être la solution ?

Parce que (si je comprends bien), il ne fonctionne pas à cause des "Underscore" ....et qu'il me faudrait un SuperAutoScript pour le remplacer par "-".

Je m'attaque aux solutions de @Steven et @bonuscad

Avec un énorme merci pour votre dévouement

 

 

 

Le problème ne vient pas de SuperAutoScript, mais du lisp GATTE qui affiche la liste des noms des attributs pour pouvoir le choisir, mais cette liste ne fonctionne pas si l'un des attributs possède un underscore dans son étiquette.

Il y a 2 solutions :

- Soit modifier le lisp GATTE pour ne pas afficher la liste des nom d'attributs. Je pense qu'un simple ; en début de la ligne 116 devrait suffire.

- Soit renommer les attributs pour supprimer les underscores. Je ne sais pas si c'est automatisable via les commandes natives, mais avec de la programmation oui, mais dans ce cas autant tout faire spécifiquement par le programme.

 

Olivier

Posté(e)

Et bien un petit point d'étape. Et vous allez me trouver BOUCHE

Je n'arrive à pas grand chose....

@Olivier Eckmann j'ai recréé un lisp "gatte" en "gatte2" en ajoutant le ";" à la ligne 116. Cela m'a mis "invalid command"

@Steven Je crois que j'ai tout bien fait (easy avec la vidéo)....Et ça ne marche pas....Jusqu'à ce que me rende compte qu'un même bloc avait un nom quelquefois différent. Donc, CA MARCHE !!!!!

@bonuscad Tout ne marche pas....J'ai pu créer le lisp, générer le script mais la modif des dwg ne se fait pas...Peut être à cause de ça "(command "_.saveas" "_LT2018" "")"  mais ne connaissant rien en code je me garderais bien d'être catégorique.

1 000 mercis pour votre aide même si, pour mon intellect, j'aurais aimé comprendre ce qui a dysfonctionné.

 

Posté(e)
Citation

Jusqu'à ce que me rende compte qu'un même bloc avait un nom quelquefois différent.

J'avais fixé le nom du bloc et l'attribut en DUR dans le script selon l'exemple de DWG que tu as posté. Avec ce fichier ça fonctionne, j'avais testé...

Si les noms sont différents, cela explique que ça n'a rien fait.

Il faut, si tu veux l'utiliser, avoir plus d'info sur les noms possibles.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é