Aller au contenu

Sommaire automatique LISP


gras_s

Messages recommandés

PLANET-NICOLAS m'a gentiement donné une LISP sur le forum officiel Autodesk.

Cette LISP récupère, dans plusieurs présentations, le contenu des cartouches (titres et indices), et dessine un sommaire en implantant des lignes et des textes remplis avec le contenu des cartouches.

J'ai essayé de l'adapter à mon cartouche, mais j'ai du mal.

J'ai essayé de supprimer la récupération d'un attribut que je n'ai pas (numplan) et de supprimer la partie de l'indice (qui est un attribut constant dans son exemple, je ne sais pas l'utilité du constant).

 

Je suis novice en LISP, et ça me dit "erreur: type d'argument incorrect: stringp nil".

 

Si je peux la simplifier côté indice en récupérant simplement le contenu de l'attribut comme pour les titres, ça me suffira bien.

Si quelqu'un peut me commenter un peu cette LISP pour que j'apprenne à la modifier, ça me sera d'un grand secours.

 

Ci-dessous la LISP d'origine.

En surligné, ce que je pense supprimer ou modifier pour l'adapter à mon bloc.

 

(defun c:som(/ att doc ent fol ind js ef lay lign lst n old rec rect saut y)

 

(defun rect(x y pas)

(entmake (list (cons 0 "LWPOLYLINE")

(cons 100 "AcDbEntity")

(cons 100 "AcDbPolyline")

(cons 90 4)

(cons 70 1)

(cons 10 (list x y 0.0))

(cons 10 (list (+ x 130) y 0.0))

(cons 10 (list (+ x 130) (- y pas) 0.0))

(cons 10 (list x (- y pas ) 0.0))

(cons 6 "BYLAYER")

(cons 8 "CARTOUCHES")

(cons 62 256)

(cons 67 1)

(cons 370 -1)

(cons 410 "000-1")

)

)

)

 

(defun text(x y txt att)

(entmake (list (cons 0 "MTEXT")

(cons 100 "AcDbEntity")

(cons 100 "AcDbMText")

(cons 1 txt)

(cons 6 "BYLAYER")

(cons 7 "ROMAND")

(cons 8 "CARTOUCHES")

(cons 10 (list x y 0.0))

(cons 11 (list 0.0 0.0 0.0))

(cons 40 2.0)

(cons 50 0.0)

(cons 62 256)

(cons 67 1)

(cons 71 att)

(cons 72 1)

(cons 370 -1)

(cons 410 "000-1")

)

)

)

 

(defun lign(x x1 y y1)

(entmake (list (cons 0 "LINE")

(cons 100 "AcDbEntity")

(cons 100 "AcDbLine")

(cons 10 (list x y 0.0))

(cons 11 (list (+ x x1) (+ y y1) 0.0))

(cons 6 "BYLAYER")

(cons 8 "CARTOUCHES")

(cons 62 256)

(cons 67 1)

(cons 370 -1)

(cons 410 "000-1")

)

)

)

 

(if (setq js (ssget "x" (list (cons 0 "INSERT") (cons 2 " [surligneur] cartouche[/surligneur]"))))

(progn

(setq ef (ssget "x" (list (cons 410 "000-1")

)

)

doc (vla-get-activedocument (vlax-get-acad-object))

lay (vla-item (vla-get-layers doc) "CARTOUCHES")

old (vla-get-lock lay)

n 0

)

(vla-startundomark doc)

(vla-put-lock lay :vlax-false)

(if ef

(while (setq ent (ssname ef n))

(if (not (eq (cdr (assoc 2 (entget ent))) " [surligneur] cartouche[/surligneur]"))

(entdel ent)

(setq ind (vlax-ename->vla-object ent))

)

(setq n (1+ n))

)

)

[surligneur] (if ind

(foreach n (vlax-invoke ind 'getconstantattributes)

(if (eq (vla-get-tagstring n) "IND")

(setq ind (vla-get-textstring n))

)

)

)[/surligneur]

(setq n 0 lst '())

(while (setq ent (ssname js n))

(setq fol '())

(foreach att (vlax-invoke (vlax-ename->vla-object ent) 'getattributes)

(cond

[surligneur] ((eq (vla-get-tagstring att) "NUMPLAN")

(setq rec (cons 0 (vla-get-textstring att)))

)[/surligneur]

((eq (vla-get-tagstring att) "NUMFOLIO")

(setq rec (cons 1 (vla-get-textstring att)))

)

((eq (vla-get-tagstring att) "TITRE1")

(setq rec (cons 2 (vla-get-textstring att)))

)

((eq (vla-get-tagstring att) "TITRE2")

(setq rec (cons 3 (vla-get-textstring att)))

)

)

(setq fol (cons rec fol))

)

(setq fol (list [surligneur] (cdr (assoc 0 fol))[/surligneur]

(cdr (assoc 1 fol))

(cdr (assoc 2 fol))

(cdr (assoc 3 fol))

)

)

(if (not (member fol lst))

(setq lst (cons fol lst))

)

(setq n (1+ n))

)

(setq lst (vl-sort lst '(lambda (a b) (if (= (car a) (car b))

(< (cadr a) (cadr b))

(< (car a) (car b))

)

)

)

x 137.0

y (+ (/ (- (* (+ (length lst) 3) 4) 236) 2) 279)

)

(rect x y 8)

(foreach n (list 86 98 106)

(lign (+ x n) 0 y -8)

)

(text (+ x 2.5) (- y 4) "LISTE DES DOCUMENTS" 4)

(text (+ x 92) (- y 4) "N° PLAN" 5)

(text (+ x 102) (- y 4) "FOLIO" 5)

(text (+ x 118) (- y 2) "INDICE" 5)

(foreach n (list 1 2 3 4 5 6)

(text (+ x 104 (* n 4)) (- y 6) (itoa n) 5)

)

(setq y (- y 12))

(rect x y (* (length lst) 4))

(foreach n (list 86 98 106 110 114 118 122 126)

(lign (+ x n) 0 y (- (* (length lst) 4)))

)

(foreach txt lst

(text (+ x 2.5) (- y 2) (if (not (member (cadddr txt) (list "" "-")))

(strcat (caddr txt) " - " (cadddr txt))

(caddr txt)

)

4

)

(text (+ x 92) (- y 2) (car txt) 5)

(text (+ x 102) (- y 2) (cadr txt) 5)

[surligneur] (text (+ x 104 (* (atoi ind) 4)) (- y 2) "X" 5)[/surligneur]

(if saut

(lign x 130 y 0)

)

(setq y (- y 4) saut T)

)

(vla-put-lock lay old)

(vla-endundomark doc)

(princ "\nSommaire effectué.")

)

(princ "\nPas de plans.")

)

(princ)

)

 

(setq nom_lisp "SOM")

(if (/= app nil)

(if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp)

(princ (strcat "..." nom_lisp " chargé."))

(princ (strcat "\n" nom_lisp ".LSP Chargé.....Tapez " nom_lisp " pour l'éxecuter.")))

(princ (strcat "\n" nom_lisp ".LSP Chargé......Tapez " nom_lisp " pour l'éxecuter.")))

(setq nom_lisp nil)

(princ)

 

[Edité le 22/10/2009 par gras_s]

Lien vers le commentaire
Partager sur d’autres sites

Re

 

L'exemple donné fonctionne bien avec le lisp.

Tu aurais pas plutôt un exemple avec tes propres cartouches (avec 4/5 feuilles pas exemple) et un exemple du résultat que tu souhaites

 

@+

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

En fait, dans le zip il y a un répertoire avec l'exemple, et un répertoire contenant mon cartouche pour lequel je veux adapter le lisp.

Mon cartouche contient un attribut de moins (numplan), et l'attribut "IND" n'est pas constant par rapport à l'exemple.

Lien vers le commentaire
Partager sur d’autres sites

Oui, mais ton bloc est décomposé et en espace Objet

Donc, je ne sais pas si le sommaire doit se dessiner en EP, sur quel onglet (si EP), à partir de quel élément (nom cartouche), des infos à récupérer (sommaire exemple car certains veulent un indice par folio, d'autres pas) ni dans quel espace sont les éléments (EO ou EP).

Cela commence à faire beaucoup de questions, d'où l'intérêt d'un exemple.

 

@+

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

Ah et bien en fait il suffit de créer plusieurs onglet présentation en insérantmon fichier en tant que bloc.

La LISP d'origine dessine sur la présentation active, ça me convient.

Quand je fais un carnet, je fais comme dans l'exemple: une présentation par folio, aucun cartouche dans l'espace objet.

C'est vrai que j'aurais pu poster un fichier avec les présentations toutes faites...

Lien vers le commentaire
Partager sur d’autres sites

  • 7 ans aprè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 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é