Aller au contenu

Lisp Sommaire ne fonctionne pas au delà de 20 onglets de présentation


Dominique974

Messages recommandés

Bonjour,

Il y fort longtemps, Patrick_35 m'avait bricoler un bout de lisp pour créer un sommaire automatique, ce LISP me fait gagner un temps fou ! Le Lisp créé un Mtext en allant chopper des données dans des attributs de mes cartouches.

Je le bricole moi aussi en l'adaptant au divers bloc de cartouche que j'ai, mais j'arrive avec un problème, le LISP ne semble pas gérer plus de 20 onglets de présentation (après plusieurs tests).

Pouvez vous m'aguiller sur le soucis ? Je travail actuellement sur des plans avec jusqu'à une 50aine de phases.

Je vous mets en pièce jointe le LISP. Je vous ferez un export du dwg avec les présentations si besoin par la suite.

Citation

(defun c:som(/ ent doc lst sel txt)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(and (ssget "x" (list (cons 0 "insert") (cons 2 "CART003") (cons 66 1) (cons 67 1)))
(progn
(vlax-for ent (setq sel (vla-get-activeselectionset doc))
(setq lst (cons (cons (cdr (assoc 410 (entget (vlax-vla-object->ename ent)))) (vla-get-textstring (nth 2 (vlax-invoke ent 'getattributes)))) lst))
)
(vla-delete sel)
(setq lst (vl-sort lst '(lambda(a B)(< (car a) (car B)))))
(and (ssget "x" (list (cons 0 "mtext") (cons 410 "01")))
(progn
(vlax-for ent (setq sel (vla-get-activeselectionset doc))
(and (wcmatch (vla-get-textstring ent) "*LSommaire :*")
(vla-delete ent)
)
)
(vla-delete sel)
)
)
(setq txt (strcat "{\\LSommaire :\\P\\P\\pxsm1.5;\\fArial|b1|i0|c0|p34;\\H0.71429x;\\lFOLIO "
(caar lst)
" : \\fArial|b0|i0|c0|p34;"
(cdar lst)
"\\P\\fArial|b1|i0|c0|p34;\\H1.00001x;FOLIO "
(caadr lst)
" : \\fArial|b0|i0|c0|p34;"
(cdadr lst)
)
)
(foreach ent (cddr lst)
(setq txt (strcat txt
"\\P\\fArial|b1|i0|c0|p34;FOLIO "
(car ent)
" : \\fArial|b0|i0|c0|p34;"
(cdr ent)
)
)
)
(setq txt (strcat txt "}"))
(entmake (list    (cons 0 "MTEXT")
(cons 100 "AcDbEntity")
(cons 100 "AcDbMText")
(cons 410 "01")
(cons 10 '(20.0000 133.5000 0.0))
(cons 40 3.5)
(cons 1 txt)
)
)
)
)
(vla-endundomark doc)
(princ)
)

Peace !

Lien vers le commentaire
Partager sur d’autres sites

J'ai regardé un peu de mon coté et j'ai trouvé ça concernant "assoc" :

Citation

Une liste d'association n'est certainement pas la façon la plus efficace de construire une table indexée. Mais pour des tables de petite taille, c'est une méthode simple car Common Lisp fournit plusieurs fonctions permettant de la manipuler.

Est ce que ça peut venir de la ? Si oui, y a t-il une solution pour palier au problème ?

Peace.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je pense que le problème vient du (entmake) concernant le MTEXT au niveau du (cons 1 txt)

En effet si la variable txt contient une chaîne supérieur à 250 caractères, la chaîne doit être divisée par bloc de 250 caractères qui seront placé dans liste avec la clé 3 (autant de foi que nécessaire)

Voir l'aide DXF sur le MTEXT

 

  • Like 1

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

Pour faire plus simple (surtout que le lisp proposé par Patrick_35 utilisait déjà les fonction (vla-), serait de remplacer:

(entmake (list    (cons 0 "MTEXT")
(cons 100 "AcDbEntity")
(cons 100 "AcDbMText")
(cons 410 "01")
(cons 10 '(20.0000 133.5000 0.0))
(cons 40 3.5)
(cons 1 txt)
)
)

par cette ligne:

(vla-AddMText (vla-get-ModelSpace doc) (vlax-3d-point 20.0 133.5 0.0) 3.5 txt)

car dans ce cas la fonction (vla-AddMText) s'occupe de gérer les blocs par 250 caractères en créant les blocs (3 . "xxxxxx") nécessaires.

Je n'ai pas testé, mais cela devrait fonctionner, par contre je ne sais pas dans quel espace cela doit être écrit (dans la ligne donnée c'est dans l'espace Objet)

  • Like 1

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

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é