Aller au contenu

[Résolu] Ajout automatique d'une constante aux nombres dans les textes (objets ligne de repère multiple)


G_P_TP

Messages recommandés

Bonjour.

 

j'ai un plan avec beaucoup de textes contenant des nombres, des altitudes ex 459.22, que je dois modifier en ajoutant 0.04. Je cherche un moyen d'automatiser le processus qui n'est pas très passionnant à faire à la 'main' et surtout source d'erreur.

 

Ces nombres sont toujours formatés de la même manière : 3 chiffres, un point, deux chiffres.

Ces nombres se trouvent dans des lignes de repères multiple, en fin de ligne. seul cas particulier des lignes qui se finissent par un nombre et une * mais au besoin je peux supprimer ces *.

 

Toute routine faisant le job sur des texte multiple ou pas m'intéresse aussi.

 

ci-joint un extrait du plan à traiter.

AUTOCAD 2019 + COVADIS 17c + MENSURA 9 & 10 sous Windows 10 64bit

Lien vers le commentaire
Partager sur d’autres sites

Bonjour.

 

Je vois que tu as Covadis. Tu devrais pouvoir t'en sortir avec : Covadis 2D\Points topographiques\Modification des altitudes...

 

En bas à droite de la fenêtre, il y a la constante à ajouter aux altitudes.

 

A condition bien sûr que ce sont bien des points topo...

 

PS : je viens d'ouvrir le fichier Alti.dwg... Ce se sont pas des points topo et je ne vois pas comment automatiser cette opération.

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Je ne pense pas que ce soit possible avec un rechercher/remplacer.

 

Ce sont plusieurs altitudes dans différents textes multi-lignes...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Je ne pense pas que ce soit possible avec un rechercher/remplacer.

 

Ce sont plusieurs altitudes dans différents textes multi-lignes...

Si c'est juste une altitude à changer, rechercher/remplacer fera l'affaire.

Si il faut ajouter 0.04 sur plusieurs altitudes, il faut passer par un lisp.

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

OUI c'est une ligne de repere multiple (MLeader Style = perso) avec un magnifique Multi-Texte sur 2-5 lignes !

 

Donc il faudrait un Lisp/VLisp qui demanderait

- La valeur numerique (A ajouter)

- Quelle fin de ligne traitee : 1ere/2eme/etc ou Toutes

 

Bye, lecrabe

 

PS: malgre plus de 2000 routines, je n'ai pas en stock !

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Oui, mais les lignes ne sont pas toutes "identiques", elles ne sont pas toutes au même endroit, et il y a d'autres cotes qu'il ne faut pas changer, exemple : les diamètres...

 

Sans compter qu'il y a des altitudes avec des astérix, exemple : "T=459.21*"

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Oui, mais les lignes ne sont pas toutes "identiques", elles ne sont pas toutes au même endroit, et il y a d'autres cotes qu'il ne faut pas changer, exemple : les diamètres...

 

Sans compter qu'il y a des altitudes avec des astérix, exemple : "T=459.21*"

 

En fait, si je supprime les * (ce qui est possible), les textes à mettre à jour sont toujours en fin de ligne et formatés de la même manière : xxx.xx

AUTOCAD 2019 + COVADIS 17c + MENSURA 9 & 10 sous Windows 10 64bit

Lien vers le commentaire
Partager sur d’autres sites

Sans les * de fin de ligne, je pense que c'est faisable, mais pas par moi, je débute en Lisp et c'est trop complexe pour moi...

 

Désolé...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Sans les * de fin de ligne, je pense que c'est faisable, mais pas par moi, je débute en Lisp et c'est trop complexe pour moi...

 

Désolé...

 

merci déjà d'avoir réfléchi à mon problème.

AUTOCAD 2019 + COVADIS 17c + MENSURA 9 & 10 sous Windows 10 64bit

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Essayes ceci (vérifier que le résultat est bien attendu)

(defun string-subst (nam_obj new_string old_string / value_string nbs tmp_nbs)
 (setq value_string (vlax-get nam_obj 'TextString) nbs 0)
 (while nbs
   (if (setq nbs (vl-string-search old_string value_string (setq tmp_nbs nbs)))
     (setq
       value_string (vl-string-subst new_string old_string value_string tmp_nbs)
       nbs (1+ nbs)
     )
   )
 )
 (vlax-put nam_obj 'TextString value_string)
)
(defun vl-position-multi (el l / n l_id l_n)
 (setq
   n 0
   l_id (mapcar '(lambda (x) (equal x el)) l)
 )
 (repeat (length l_id)
   (if (car l_id) (setq l_n (cons n l_n)))
   (setq n (1+ n) l_id (cdr l_id))
 )
 (reverse l_n)
)
(defun c:test ( / doc sel val_text l_val l_new-val indx)
 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)) l_val nil l_new-val nil)
 (ssget "_X" (list '(0 . "MULTILEADER") (cons 410 (getvar "ctab"))))
 (vlax-for el (setq sel (vla-get-activeselectionset doc))
   (cond
     ((setq val_text (vla-get-TextString el))
       (cond
         ((eq (type (read val_text)) 'REAL)
           (setq
             l_val (cons val_text l_val)
             l_new-val (list (rtos (+ 0.04 (read val_text)) 2 2))
           )
         )
         (T
           (setq indx (vl-position-multi 61 (vl-string->list val_text)))
           (foreach n indx
             (setq
               l_val (cons (substr val_text (+ 2 n) 6) l_val)
               l_new-val (cons (rtos (+ 0.04 (read (substr val_text (+ 2 n) 6))) 2 2) l_new-val)
             )
           )
         )
       )
     )
   )
   (if (and l_val l_new-val)
     (repeat (setq nb (length l_val))
       (string-subst el (car l_new-val) (car l_val))
       (setq l_new-val (cdr l_new-val) l_val (cdr l_val))
     )
   )
 )
 (prin1)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

C'est mon tour

(defun c:ajt(/ doc ele lst tag val split)
 (defun split(txt tag / loc lst pos str val)
   (setq str 1
  loc 0
   )
   (while (setq pos (vl-string-search "." txt loc))
     (if (and (> pos (1- (vl-string-search "." tag))) (wcmatch (setq val (substr txt (- pos (- (strlen tag) (vl-string-search "." tag) 1)) (strlen tag))) tag))
(setq deb (substr txt str (- pos str (- (strlen tag) (vl-string-search "." tag) 1)))
      str (+ pos (- (strlen tag) (vl-string-search "." tag)) 1)
      lst (cons (read val) (cons deb lst))
)
     )
     (setq loc (1+ pos))
   )
   (reverse (cons (substr txt str) lst))
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object))
tag "###.##" ; Modèle de recherche --> 3 valeurs numérique + "." + 2 valeurs numérique
 )
 (vla-startundomark doc)
 (initget 3)
 (and (setq val (getreal "\nValeur à ajouter : "))
      (ssget)
   (vlax-for ele (setq sel (vla-get-activeselectionset doc))
     (and (vlax-property-available-p ele 'textstring)
(setq lst (mapcar '(lambda(x)(if (eq (type x) 'STR) x (rtos (+ x val)))) (split (vla-get-textstring ele) tag)))
(vla-put-textstring ele (apply 'strcat lst))
     )
   )
   (vla-delete sel)
 )
 (vla-endundomark doc)
)

 

@+

 

ps : attention à la précision des unités (ddunits)

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

Lien vers le commentaire
Partager sur d’autres sites

vraiment super.

 

Cela fonctionne sur les lignes de repères multiples et les textes (simple ou multiple) quelque soit la position du chiffre dans le texte.

 

merci beaucoup.

 

:) :) :)

AUTOCAD 2019 + COVADIS 17c + MENSURA 9 & 10 sous Windows 10 64bit

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Allez c'est jour de fête !!!!

 

j'explique ma vision des choses :

je recherche le signe "="

je note sa position

j'extrais la valeur numérique sachant qu'elle fait 6 caractères (c'est un pré-requis)

j'y ajoute quatre centimètres

et je réinjecte le tout dans la string de l'objet

deux cas de figures :

il n'y a que 6 caractères dans la chaîne et je travaille dessus en direct

il a plus de 6 caractères et je boucle avec le signe "=" en ligne de mire

 

(defun c:da:plus4 ( / jeu_sel n vl_obj valeur pos tempo)
(vl-load-com)
(setq jeu_sel (ssget (list (cons 0 "MULTILEADER"))))
(setq n 0)
(repeat	(sslength jeu_sel)
(setq vl_obj (vlax-ename->vla-object (ssname jeu_sel n)))
(setq valeur (vla-get-textstring vl_obj))
(if	(> (strlen valeur) 6)
	(progn
		(setq pos 0)
		(while (< pos (strlen valeur))
			(if	(= "=" (substr valeur (setq pos (1+ pos)) 1))
				(progn
					(setq tempo (substr valeur (+ 1 pos) 6))
					(setq valeur
						     (vl-string-subst
							     (rtos (+ 0.04 (atof tempo)) 2 2)
							     tempo
							     valeur
							     ) ;_ fin de vl-string-subst
					  	) ;_ fin de setq
					) ;_ fin de progn
				) ;_ fin de if
			) ;_ fin de while
		) ;_ fin de progn
	) ;_ fin de if
(if	(= (strlen valeur) 6)
	(progn
		(setq valeur
		       (vl-string-subst
			       (rtos (+ 0.04 (atof valeur)) 2 2)
			       valeur
			       valeur
			       ) ;_ fin de vl-string-subst
			) ;_ fin de setq
		) ;_ fin de progn
	) ;_ fin de if
	
(vla-put-textstring vl_obj valeur)
) ;_ fin de repeat
)

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

encore une solution ! bravo et merci pour le temps passé.

les commentaires c'est super. Si je peux je vais étudier le code. j'aimerais bien faire mes lisp. en plus c'est un language que j'ai étudié par le passé... mais il y a fort fort longtemps (+de 20ans! quand même!) et j'en ai que de vague souvenirs...

 

a++

AUTOCAD 2019 + COVADIS 17c + MENSURA 9 & 10 sous Windows 10 64bit

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J'ai amélioré la routine pour fonctionner sur n'importe quel réel.

(defun c:ajt(/ dmz doc ele lst split)
 (defun split(txt / deb fin loc lst pos str)
   (setq str 1 loc 0)
   (while (setq pos (vl-string-search "." txt loc))
     (setq deb (1+ pos) fin deb)
     (while (and (> deb 1) (eq (type (read (substr txt (1- deb) 1))) 'INT)) (setq deb (1- deb)))
     (while 		    (eq (type (read (substr txt (1+ fin) 1))) 'INT)  (setq fin (1+ fin)))
     (or (eq deb fin)
(setq lst (cons (read (strcat "0" (substr txt deb (1+ (- fin deb)))))
		(cons (substr txt str (- deb str))
		      lst
		)
	  )
      str (1+ fin)
)
     )
     (setq loc (1+ pos))
   )
   (reverse (cons (substr txt str) lst))
 )

 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (initget 3)
 (and (setq val (getreal "\nValeur à ajouter : "))
      (ssget)
      (setq dmz (getvar "dimzin"))
      (setvar "dimzin" 0)
   (vlax-for ele (setq sel (vla-get-activeselectionset doc))
     (and (vlax-property-available-p ele 'textstring)
(setq lst (mapcar '(lambda(x)(if (eq (type x) 'STR) x (rtos (+ x val)))) (split (vla-get-textstring ele))))
(vla-put-textstring ele (apply 'strcat lst))
     )
   )
   (vla-delete sel)
   (setvar "dimzin" dmz)
 )
 (vla-endundomark doc)
 (princ)
)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

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é