Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

Dans le cadre de mon travail j'utilise, une petite comande me permettant de renommer toute une sélection de texte ne comportant que des chiffres avec une incrémentation donné.

 

Voici mon lisp:

 

 

(defun c:aze ()

(debut)

(setq js (ssget (list (cons 0 "TEXT"))))

(if (not js) (exit))

(setq var 0.0)

(setq var (mgetreal var "\nDépart ........ : "))

(setq pre 0)

;(setq pre (mgetint pre "\nPrecision ........ : "))

(setq incre 1)

(setq incre (mgetint incre "\nincrémentation ........ : "))

(setq pre (fix pre))

(setq nb (sslength js))

(setq i 0)

(while (< i (sslength js))

(setq e (entget (ssname js i)))

(setq r (distof (cdr (assoc 1 e))))

(if r

(progn

(setq r (+ var (* incre (- (- nb 1) i))))

(entmod (subst (cons 1 (rtos r 2 pre)) (assoc 1 e) e))

)

)

(setq i (+ i 1))

)

(fin)

)

 

Bien que ça marche un petit problème subsiste qui est parfois génant:

Les textes qui sont incrémentés sont traiter dans l'ordre où ils ont été créé, or cela me convient pas.

Je voudrais que ce soit les textes qui soit le plus à gauche du dessin qui soit traité en premier et ainsi de suite en allant vers la droite!

 

Auriez vous une idée sur la manière de paramétrer ça? ou de savoir quel fonction fait que l'ordre d'execution est ainsi...

 

Merci par avance amis lispeur ;)

Posté(e)

J''en déduis qu'il faut que j'utilise:

 

(setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))))

 

mais je ne vois pas comment l'intégrer.

 

Si ça me trie les texte en fonction de leur coordonné (ce qui est exactement ce que je cherche merci bcp à toi Patrick_35 ;) ) Je dois donc les extraires de la liste que j'ai créé à partir de ma selection? puis cette ligne de code les classera dans l'ordre afin de les traiter de la droite à la gauche?

 

Si déjà cela est correct, comment puis-je extraire a partir de ma premiere liste mes coordonées?

Posté(e)

Voici un exemple plus épuré en copiant des parties du lisp que j'ai donné.

La numérotation commence à 1 et s'incrémente de 1.

 

(defun c:test(/ i lst res sel txt)
 ; fonctions vl dispo
 (vl-load-com)
 ; sélection des textes
 (ssget (list (cons 0 "MTEXT,TEXT")))
 ; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie)
 (vlax-map-collection (setq sel
		 (vla-get-activeselectionset
		   (vla-get-activedocument
		     (vlax-get-acad-object)
		   )
		 )
	       )
	       '(lambda (x)
		 (setq lst
		   (cons
		     (list
		       x
		       (if (eq (vla-get-objectname x) "AcDbMText")
			 (vlax-get x 'insertionpoint)
			 (vlax-get x 'textalignmentpoint)
		       )
		     )
		     lst
		   )
		 )
	       )
 )
 ; effacer la sélection
 (vla-delete sel)
 ; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base)
 (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x))
i 1
 )
 ; boucle pour incrémenter les textes
 (foreach txt res
   (vla-put-textstring (car txt) (itoa i))
   (setq i (1+ i))
 )
 (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

Posté(e)

heu non

 

J'ai aussi testé et le lisp fonctionne correctement.

 

Tu dis

Je voudrais que ce soit les textes qui soit le plus à gauche du dessin qui soit traité en premier et ainsi de suite en allant vers la droite!

Donc de gauche à droite

puis

afin de les traiter de la droite à la gauche

L'ordre inverse ?

 

Choisis l'ordre de trie dans le lisp de base.

 

- DG veut dire de Droite vers la Gauche

- HB veut dire du Haut vers le Bas

- HDG veut dire du coin Haut-Droite vers la Gauche

- BGH veut dire du coin Bas-Gauche vers le 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)

Oui autant pour moi c'est bien de la gauche vers la droite comme tu l'as fait dans ton programme.

 

Cependant chez moi lorsque je créé 3 textes par exemple, puis que je lance ta comand test => Pas de souci

 

Par contre si je recrée 2 textes suplémentaires positionné à gauche de mes 3 premiers textes, et bien lorsque je lance ta comande "test" il me traite d'habord les 3 premiers texte créés puis les deux créé ensuite .....

 

Ce qui fait que de gauche à droite il m'affiche dans l'ordre: "4" "5" "1" "2" "3"

 

alors que je voudrais bien "1" "2" "3" "4" "5"

 

Alors cela vien-t-il du fait que je sois sous 2009?

Posté(e)

NOn non ben j'ai juste copier le tien ... mais voici le mien également:

 

(defun c:test(/ i lst res sel txt)

; fonctions vl dispo

(vl-load-com)

; sélection des textes

(ssget (list (cons 0 "MTEXT,TEXT")))

; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie)

(vlax-map-collection (setq sel

(vla-get-activeselectionset

(vla-get-activedocument

(vlax-get-acad-object)

)

)

)

'(lambda (x)

(setq lst

(cons

(list

x

(if (eq (vla-get-objectname x) "AcDbMText")

(vlax-get x 'insertionpoint)

(vlax-get x 'textalignmentpoint)

)

)

lst

)

)

)

)

; effacer la sélection

(vla-delete sel)

(setq var (mgetreal var "\nDépart ........ : "))

(setq var (fix var))

(setq incre (mgetint incre "\nincrémentation ........ : "))

(setq incre (fix incre))

; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base)

(setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x))

i var

)

; boucle pour incrémenter les textes

(foreach txt res

(vla-put-textstring (car txt) (itoa i))

(setq i (+ incre i))

)

(princ)

)

 

J'ai beau essayé ça me les traite pas dans l'ordre ... i d'ont understand !

Posté(e)

Je vais tirer des oreilles ;)

 

remplace dans ton lisp

(setq var (mgetreal var "\nDépart ........ : "))

par

(setq var (getreal "\nDépart ........ : "))

puis

(setq incre (mgetint incre "\nincrémentation ........ : "))

par

(setq incre (getint "\nincrémentation ........ : "))

 

@+

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)

Ca ne change rien du tout si ce n'est de ne plus avoir la valeur précédente en mémoire ...

 

Sinon l'ordre de traitement est toujours pas bon :P c'est a devenir fou si chez toi ça fonctione....

 

Pour toi le code te semble bon?

Posté(e)

ben oui, ça fonctionne chez moi :casstet:

Et sur plusieurs postes.

 

Fais les lignes du lisp une par une pour comprendre, jusqu'au (vla-delete ...)

Tu fais le trie. Si les coordonnées sont bien triés dans la liste res, le problème est ailleurs.

 

@+

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 d'habord tenter de tout fermé et réouvrir, cela fonction! comme quoi parfois ...

 

En tout cas c'est nikel, un grand merci à toi et a ta patience !

 

Juste une derniere question qu'est qui te gene dans le fait d'utiliser les fonctions "mgetreal "et "mgetint"? (c'est pour plus me faire tirer les oreilles ;) )

Posté(e)

Ah si y a une anguille sous roche :D

 

Le code fonctionne avec les "textmult" mais pas les "texte" ...

 

Et-ce qu'il ne manquerai pas quelque chose au niveau de la condition "if" ?

 

[Edité le 17/7/2009 par jarod34]

Posté(e)

Rien, c'est juste que ce ne sont pas des fonctions lisp (mais sûrement des persos) et comme ça ne fonctionnait pas, je pensais que c'était des fautes de frappes, que le lisp plantait et que c'est pour ça que tu n'avais pas le bon résultat.

De plus, comme il devait y avoir un mélange entre ton lisp et le mien, totocad ne retrouvait plus ses petits.

Le principal c'est que cela fonctionne maintenant, mais surtout, que tu ais compris mes lignes de codes.

 

@+

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)

Si je viens de trouver ce qui me bloc:

 

c'est "AcDbMText", car lorsque je met AcDbText' il me traite les textes, me manque plus à coupler les deux pour que mes deux sorte de texte soit traiter de la bonne manière....

Posté(e)

Voilà mon code final qui fonctione avec une petite modif qui va bien :

 

 (defun c:test(/ i lst res sel txt)
 ; fonctions vl dispo
 (vl-load-com)
 ; sélection des textes
 (ssget (list (cons 0 "MTEXT,TEXT")))
 ; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie)
 (vlax-map-collection (setq sel
		 (vla-get-activeselectionset
		   (vla-get-activedocument
		     (vlax-get-acad-object)
		   )
		 )
	       )
	       '(lambda (x)
		 (setq lst
		   (cons
		     (list
		       x
		       (if (member (vla-get-objectname x) '("AcDbMText" "AcDbText"))
			 (vlax-get x 'insertionpoint)
			 (vlax-get x 'textalignmentpoint)
		       )
		     )
		     lst
		   )
		 )
	       )
 )
 ; effacer la sélection
 (vla-delete sel)
(setq var (getreal "\nDépart ........ : "))
(setq var (fix var))
(setq incre (getint "\nincrémentation ........ : "))
 (setq incre (fix incre))
 ; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base)
 (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x))
i var
 )
 ; boucle pour incrémenter les textes
 (foreach txt res
   (vla-put-textstring (car txt) (itoa i))
   (setq i (+ incre i))
 )
 (princ)
)

 

Encore merci Patrick

 

[Edité le 17/7/2009 par jarod34]

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é