stephan35 Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 Bonjour, J'ai tenté, pour me faire plaisir, de taper quelques lignes en vlisp afin de remplacer certaines de mes vieilles fonctions Lisp. Cette fonction est simple, je scrute toutes les entités de mon dessin, et je remplace le texte "." des attributs et des textes par rien "".J'en ai un autre qui fait l'inverse ... Je me trouve maintenant devant un dilem, - mon programme vlisp est mal contruit ?- Le vlisp n'est pas prévu pour ça ?- Je continue mon ptit bonhomme de chemin en lisp .... Je traite 22600 entités Version Lisp: (3 secondes) :D (if (setq @&ssget (ssget "X" (list (cons 8 (strcat "*"))))) (progn (setq @#val1 0) (print (sslength @&ssget)) (repeat (sslength @&ssget) ; Cas du texte (if (= (cdr (assoc 0 (setq &entget (entget (setq @#ssname (ssname @&ssget @#val1)))))) "TEXT" ) (if (= (cdr (assoc 1 &entget)) ".") (entmod (setq &entget (subst (cons 1 "") (assoc 1 &entget) &entget))) ) ) ; Cas du symbole (if (and (=(cdr (assoc 0 &entget))"INSERT") (assoc 66 &entget) ) (progn (while (/= "SEQEND" (cdr (assoc 0 &entget))) (if (=(cdr (assoc 0 &entget))"ATTRIB") (if (= (cdr (assoc 1 &entget)) ".") (entmod(setq &entget (subst (cons 1 "") (assoc 1 &entget) &entget))) ) ) (setq &entget (entget (setq @#ssname (entnext @#ssname)))) ) ) ) (setq @#val1 (1+ @#val1)) ) ) ) Version Vlips (J'ai breaké au bout d'une minute !) :mad: (if (setq @&ssget (ssget "X" (list (cons 8 (strcat "*"))))) (progn (setq @#val1 0) (print (sslength @&ssget)) (repeat (sslength @&ssget) ; Cas du texte (setq @#object (vlax-ename->vla-object (setq @#ssname (ssname @&ssget @#val1)))) ; Peut-on modifier du texte ? (if (vlax-property-available-p @#object 'TextString) (if (= (vla-get-textstring @#object) ".") (vla-put-textstring @#object "") ) ) ; Peut-on modifier les attributs ? (if (vlax-property-available-p @#object 'hasattributes) (progn (setq @&object (vlax-invoke @#object 'getattributes)) (foreach @#for @&object (if (vlax-property-available-p @#for 'TextString) (if (= (vla-get-textstring @#for) ".") (vla-put-textstring @#for "") ) ) ) ) ) (setq @#val1 (1+ @#val1)) ) ) )
Bred Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 Salut,j'ai jeté un coup d'œil sur ton lisp,à part qu'il soit particulièrement dur à lire (à cause des "@&.." devant des noms de commandes qui deviennent alors de variables...) je ne vois pas d'erreur.il n'y a pas de raison que ça plante.Pour vérifier qu'il tourne sur ton poste, fait un compteur : (...) (repeat (sslength @&ssget) [b] (princ (strcat "\n - Objet N° " (rtos (- (sslength @&ssget) @#val1)) " traité !"))[/b] ; Cas du texte (...) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
stephan35 Posté(e) le 4 juin 2008 Auteur Posté(e) le 4 juin 2008 Merci bred, Milles excuses pour le nom de mes variables .... il n'y a pas de déclaration possible, alors j'utilise une espèce de protocole de signe pour me faciliter la tâche , et en théorie la relecture .... ;) Sinon, Oui le code vlisp fonctionne ..... !!!! Mais, c'est super long !!! 72 secondes contre 3 en Lisp !!!!! C'est pas top ! mais doit y avoir un truc pas correcte dans mon vlisp !
Patrick_35 Posté(e) le 4 juin 2008 Posté(e) le 4 juin 2008 Salut Je suis comme Bred, j'ai du mal à te lire Un exemple d'après ce que j'ai pu comprendre. (and (ssget "x" (list (cons 0 "insert,text,mtext"))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) (cond ((and (member (vla-get-objectname ent) '("AcDbText" "AcDbMText")) (eq (vla-get-textstring ent) ".") ) (vla-put-textstring ent "") ) ((eq (vla-get-objectname ent) "AcDbBlockReference") (foreach att (vlax-invoke ent 'getattributes) (if (eq (vla-get-textstring att) ".") (vla-put-textstring att "") ) ) ) ) ) (vla-delete sel) ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
stephan35 Posté(e) le 4 juin 2008 Auteur Posté(e) le 4 juin 2008 Merci pour la seconde couche sur la lecture de mon code patrick .... ;) Sinon, rien à dire, sinon, qu'une fois de plus, je dois me plier et te faire une courbette ... ;) Ton code fonctionne parfaitement bien, et tourne à 4 secondes..... Donc c'était le mien qui à un soucis ... Encore Merci et à plus !
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