Sujet: probleme avec lisp legende


defrai - 18/7/2008 à 08:47

bonjour,
Voila j’utilise un lisp pour faire mes légendes
Mais depuis que je suis passé en 2008,
J’ai un problème sur la première ligne elle n'est pas comptabiliser.
Je suis juste utilisateur et pas programmeur.

Merci d’avance pour votre aide

voici le lisp que j'utilise


(if col
(vlax-for i (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
(if (and (/= (substr (vla-get-name i) 1 1) "*")
(= :vlax-false (vla-get-IsXref i))
)
(setq libloc (append libloc (list (vla-get-name i)))
liidbloc (append liidbloc (list (vla-get-ObjectID i)))
)
)
)
(setq libloc (remove_doubles liref)
liidbloc (mapcar
'(lambda (x)
(vla-get-ObjectID
(vla-item
(vla-get-Blocks
(vla-get-activedocument
(vlax-get-acad-object)
)
)
x
)
)
)
libloc
)
)
)
(initget 1)
(setq ptins (trans (getpoint "\nPoint d'insertion: ") 1 0))
(setq tableVL (vla-addtable
(vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
(vlax-3d-point ptins)
(length libloc)
3
20
100
)
)
(vla-put-TitleSuppressed tableVL :vlax-true)
(setq cont -1)
(repeat (vla-get-Rows tableVL)
(vla-settext
tableVL
(setq cont (1+ cont))
0
(nth cont libloc)
)
(vla-settext
tableVL
cont
1
(length (vl-remove-if-not
'(lambda (n) (= n (nth cont libloc)))
liref
)
)
)
(vla-SetBlockTableRecordId
tableVL
cont
2
(nth cont liidbloc)
:vlax-true
)
(vla-setcellalignment tableVL cont 0 5)
(vla-setcellalignment tableVL cont 1 5)
)
(princ)
)

;;; REMOVE_DOUBLES - Suprime tous les doublons d'une liste

(defun REMOVE_DOUBLES (lst)
(cond
((atom lst) lst)
(T
(cons (car lst) (REMOVE_DOUBLES (vl-remove (car lst) lst)))
)
)
)


[Edité le 18/7/2008 par defrai]


Patrick_35 - 18/7/2008 à 08:50

Salut

Ton lisp n'est pas complet

@+


defrai - 18/7/2008 à 08:56

ok

(if col
(vlax-for i (vla-get-Blocks
(vla-get-activedocument (vlax-get-acad-object))
)
(if (and (/= (substr (vla-get-name i) 1 1) "*")
(= :vlax-false (vla-get-IsXref i))
)
(setq libloc (append libloc (list (vla-get-name i)))
liidbloc (append liidbloc (list (vla-get-ObjectID i)))
)
)
)
(setq libloc (remove_doubles liref)
liidbloc (mapcar
'(lambda (x)
(vla-get-ObjectID
(vla-item
(vla-get-Blocks
(vla-get-activedocument
(vlax-get-acad-object)
)
)
x
)
)
)
libloc
)
)
)
(initget 1)
(setq ptins (trans (getpoint "\nPoint d'insertion: ") 1 0))
(setq tableVL (vla-addtable
(vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
(vlax-3d-point ptins)
(length libloc)
3
20
100
)
)
(vla-put-TitleSuppressed tableVL :vlax-true)
(setq cont -1)
(repeat (vla-get-Rows tableVL)
(vla-settext
tableVL
(setq cont (1+ cont))
0
(nth cont libloc)
)
(vla-settext
tableVL
cont
1
(length (vl-remove-if-not
'(lambda (n) (= n (nth cont libloc)))
liref
)
)
)
(vla-SetBlockTableRecordId
tableVL
cont
2
(nth cont liidbloc)
:vlax-true
)
(vla-setcellalignment tableVL cont 0 5)
(vla-setcellalignment tableVL cont 1 5)
)
(princ)
)

;;; REMOVE_DOUBLES - Suprime tous les doublons d'une liste

(defun REMOVE_DOUBLES (lst)
(cond
((atom lst) lst)
(T
(cons (car lst) (REMOVE_DOUBLES (vl-remove (car lst) lst)))
)
)
)


defrai - 18/7/2008 à 09:03

Pour plus de précision la première ligne du tableau comprend qu’une colonne.
Je ne comprends pas car avec la 2007 ca fonctionnais très bien.

[Edité le 18/7/2008 par defrai]


Patrick_35 - 18/7/2008 à 09:30

Re,

Après quelques recherches, car cette fois-ci, il manque le début du lisp, tu as pris le lisp de (gile) ici

Sauf si quelqu'un répond car je n'ai qu'une 2006 actuellement sous la main, je regarde cela ce soir.

@+


defrai - 18/7/2008 à 09:31

merci encore


Oli553 - 18/7/2008 à 11:19

Oui, il y a un souci avec les v2008 et 2009, en fait, le premier bloc apparait Sur la 1ere ligne, celle où est indiqué...légende


(gile) - 19/7/2008 à 10:17

Salut,

Je ne peux pas vraiment tester, je n'ai qu'une 2007.

Il y a eu plusieurs versions de Tabloblo (LISP de Tramber que je n'ai fait qu'adapter).

Une première, dans sa version la plus aboutie ici, qui est sensée supprimer la ligne de titre.
Une seconde ici, qui fait suite à une demande "ducrabe" pour avoir la ligne de titre, la ligne de sous-titres et la taille des symboles un peu réduite par rapport à la cellule.

Est-ce qu'aucune de ces versions ne fonctionne sur les désormais "fameuses" versions 2008/2009 ?

Si aucune ne fonctionne, serait-il possible d'entrer à la ligne de commande l'expression LISP suivante, de sélectionner un tableau et de poster le résultat ?

(vlax-dump-object (vlax-ename->vla-object (car (entsel)))) 


<br><br><font class=edite>[Edité le 19/7/2008 par (gile)]</font>


Patrick_35 - 20/7/2008 à 19:05

Salut

Appararement, on ne peux plus supprimer le titre sur les A2008 et A2009

Pour contourner le problème, il suffit de changer

(vlax-3d-point ptins)
(length libloc)
3
20
100
)
)
;(vla-put-TitleSuppressed tableVL :vlax-true)
(setq cont -1)
(repeat (vla-get-Rows tableVL)
(vla-settext
tableVL
(setq cont (1+ cont))
0
(nth cont libloc)
)
(vla-settext
tableVL
cont
1
(length (vl-remove-if-not
'(lambda (n) (= n (nth cont libloc)))
liref
)
)
)
(vla-SetBlockTableRecordId
tableVL
cont
2
(nth cont liidbloc)
:vlax-true
)


par
(vlax-3d-point ptins)
(1+ (length libloc))
3
20
100
)
)
;(vla-put-TitleSuppressed tableVL :vlax-true)
(setq cont -1)
(repeat (vla-get-Rows tableVL)
(vla-settext
tableVL
(1+ (setq cont (1+ cont)))
0
(nth cont libloc)
)
(vla-settext
tableVL
(1+ cont)
1
(length (vl-remove-if-not
'(lambda (n) (= n (nth cont libloc)))
liref
)
)
)
(vla-SetBlockTableRecordId
tableVL
(1+ cont)
2
(nth cont liidbloc)
:vlax-true
)



@+


(gile) - 20/7/2008 à 19:25

citation extraite du message original:
Appararement, on ne peux plus supprimer le titre sur les A2008 et A2009



Alors, avec la seconde version, ça devrait fonctionner ?


(gile) - 20/7/2008 à 19:38

Merci PHILPHIL, mais c'était sur un tableau que j'aurais aimé avoir la liste.

ou encore, toujours sur un tableau :

(vlax-property-available-p (vlax-ename->vla-object (car (entsel))) 'TitleSuppressed T) 



et

(vlax-property-available-p (vlax-ename->vla-object (car (entsel))) 'HeaderSuppressed T)



Mais Patrick_35 semble avoir trouvé une solution et je suggérais d'utiliser la seconde version.


Patrick_35 - 20/7/2008 à 19:49

Re (gile)

Je n'avais pas vu la seconder version.
Elle fonctionne parfaitement avec une A2009.

La propriété TitleSuppressed existe sur A2009, mais ne semble pas fonctionner.
J'ai essayé en vla-..., vlax-... et aussi avec 0,-1 et vlax-false, vlax-true, que nenni
C'est comme si Autodesk avait oublié cette fonction

Je viens aussi de tomber deux truc :
Le premier est qu' on dirait qu'Autocad ne sait pas gérer une sélection de plus de 256 éléments d'une liste (la variable d'un multiple_select d'une BD)
Le second est qu'autocad se sait pas traduire en vlisp le bit 131072 du code dxf 90 d'un viewport.

Arriverait-on aux limites d'autocad

@+


PHILPHIL - 20/7/2008 à 19:58

hello patrick_35, gile et les autres

sur une version AA2009
voila la réponse gile sur un tableau

 Commande: (vlax-property-available-p (vlax-ename->vla-object (car (entsel))) 
'TitleSuppressed T)
Choix de l'objet: T



 Commande: (vlax-property-available-p (vlax-ename->vla-object (car (entsel))) 
'HeaderSuppressed T)
Choix de l'objet: T



bon a force de test et manip sur autocad mes réponses arrivent apres la bataille


si on selectionne des objets

les deux LISp fonctionnent

premiere version :
la case 1 A/B/C est bien vide

deuxieme version :
la case 1 A/B/C est bien remplit par "block" a toi de remplacer dans le LISp block par autre chose "
case 1/a "Nom"
case 1/b "Nombre"
case 1/c "Symbole"

   (VLA-SETTEXT TABLEVL 0 0 "LEGENDE DES BLOCKS")	; Titre
(VLA-SETTEXT TABLEVL 1 0 "Nom") ; Titre colonne 1
(VLA-SETTEXT TABLEVL 1 1 "Nombre") ; Titre colonne 2
(VLA-SETTEXT TABLEVL 1 2 "Symbole") ; Titre colonne 3





par contre si on fait ca sur les deux versions , ca bug

 Commande: tabloblo 
Sélectionnez les blocs à lister ou < Tous >
Choix des objets: tout
686 trouvé(s)

Choix des objets:
*Annuler*
Erreur Automation Identificateur d’objet nul



phil<br><br><font class=edite>[Edité le 20/7/2008 par PHILPHIL]</font>


(gile) - 20/7/2008 à 20:00

citation extraite du message original:
Elle fonctionne parfaitement avec une A2009.



Je m'en doutais, c'était une demande du crabe qui n'aurait pas manqué de me le signaler si ça ne fonctionnait pas.


(gile) - 20/7/2008 à 20:06

citation extraite du message original:
par contre si on fait ca sur les deux versions , ca bug

 Commande: tabloblo 
Sélectionnez les blocs à lister ou < Tous >
Choix des objets: tout
686 trouvé(s)

Choix des objets:
*Annuler*
Erreur Automation Identificateur d’objet nul



phil



C'est normal, j'essaye de respecter la syntaxe des invites de commandes d'AutoCAD :

"Sélectionnez les blocs à lister ou < Tous >: " Tous est la valeur par défaut qu'on valide en faisant Entrée, Espace ou clic droit.

Quand c'est une option à entrer au clavier elle est placée entre crochets :
"Sélectionnez les blocs à lister ou [Tous] : "


PHILPHIL - 20/7/2008 à 20:19

hello gile

sur aa2009

si tu valides en appuyant sur "Entrée" par défault ca bug

 Commande: tabloblo2
Sélectionnez les blocs à lister ou < Tous >
Choix des objets:
*Annuler*
Erreur Automation Identificateur d’objet nul



si je selectionne des objets en ecrivant "tout"

 Commande:
TABLOBLO
Sélectionnez les blocs à lister ou < Tous >
Choix des objets: tout
686 trouvé(s)

Choix des objets:
*Annuler*
Erreur Automation Identificateur d’objet nul



tabloblo ==> premiere version du lisp
tabloblo2 ==> deuxieme version du lisp

phil


(gile) - 20/7/2008 à 20:38

PHILPHIL,

Au vu de réponse données par Patrick_35, c'est la seconde version qu'il faut utiliser avec 2008/2009.

Je ne comprends pas le pourquoi du *Annuler* dans tes messages.


Petite précision :
- l'option "Tous" validée par Entrée, Espace ou clic droit liste toute la collection de blocs du dessin.
- Entrer "Tout" à la ligne de commande revient à sélectionner tous les blocs insérés dans le dessin.


PHILPHIL - 20/7/2008 à 21:40

hello

ok ca marche

ca demandait un "CONTROL" de mes fichiers test pour eradiquer les erreurs

et une régénérations des fichiers FAS

phil


defrai - 21/7/2008 à 10:09

Merci beaucoup
La seconde version de tabloblo fonctionne impeccable avec autocad 2008


Oli553 - 21/7/2008 à 12:10

Cela fonctionne également sur 2009
Merci bicoup...


(gile) - 22/7/2008 à 11:50

Vu le succès que semble avoir cette version, j'y apporte quelque amélioration :
Les xrefs et les blocs qu'elles peuvent contenir ne sont pas pris en compte quelque soit l'option retenue.

;; TABLOBLO (Tramber)
;; Crée un tableau qui liste les blocs insérés (sélectionnés ou toute la collection)

(defun c:tabloblo
(/ libloc liidbloc ss col liref ptins tableVL cont row)
(vl-load-com)
(or *acdoc*
(setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
)
(prompt "\nSélectionnez les blocs à lister ou <Toute la collection>")
(or (setq ss (ssget '((0 . "INSERT"))))
(setq ss (ssget "_X" '((0 . "INSERT")))
col T
)
)
(if ss
(progn
(vlax-for x
(setq
ss (vla-get-ActiveSelectionSet *acdoc*)
)
(or (vlax-property-available-p x 'Path)
(setq liref
(cons
(if (vlax-property-available-p x 'EffectiveName)
(vla-get-EffectiveName x)
(vla-get-Name x)
)
liref
)
)
)
)
(vla-delete ss)
)
)
(if col
(vlax-for i (vla-get-Blocks *acdoc*)
(if (and (not (wcmatch (setq name (vla-get-Name i)) "`**,*|*"))
(= :vlax-false (vla-get-IsXref i))
)
(setq libloc (append libloc (list (vla-get-name i)))
liidbloc (append liidbloc (list (vla-get-ObjectID i)))
)
)
)
(setq libloc (remove_doubles liref)
liidbloc (mapcar
'(lambda (x)
(vla-get-ObjectID
(vla-item
(vla-get-Blocks *acdoc*)
x
)
)
)
libloc
)
)
)
(initget 1)
(setq ptins (trans (getpoint "\nPoint d'insertion: ") 1 0))
(setq tableVL (vla-addtable
(vla-get-modelspace
(vla-get-activedocument (vlax-get-acad-object))
)
(vlax-3d-point ptins)
(+ 2 (length libloc))
3
20 ; Hauteur cellule
80 ; Largeur cellule
)
)
(vla-put-VertCellMargin tableVL 4.0) ; Marge verticale
(vla-put-TitleSuppressed tableVL :vlax-false)
(vla-put-HeaderSuppressed tableVL :vlax-false)
(vla-setText tableVL 0 0 "Blocs") ; Titre
(vla-setText tableVL 1 0 "Nom") ; Titre colonne 1
(vla-setText tableVL 1 1 "Nombre") ; Titre colonne 2
(vla-setText tableVL 1 2 "Symbole") ; Titre colonne 3
(setq cont -1
row 1
)
(repeat (- (vla-get-Rows tableVL) 2)
(vla-settext
tableVL
(setq row (1+ row))
0
(nth (setq cont (1+ cont)) libloc)
)
(vla-settext
tableVL
row
1
(length (vl-remove-if-not
'(lambda (n) (= n (nth cont libloc)))
liref
)
)
)
(vla-SetBlockTableRecordId
tableVL
row
2
(nth cont liidbloc)
:vlax-true
)
(vla-setcellalignment tableVL row 0 5)
(vla-setcellalignment tableVL row 1 5)
)
(princ)
)

;;; REMOVE_DOUBLES - Suprime tous les doublons d'une liste

(defun REMOVE_DOUBLES (lst)
(if lst
(cons (car lst) (REMOVE_DOUBLES (vl-remove (car lst) lst)))
)
)

<br><br><font class=edite>[Edité le 22/7/2008 par (gile)]</font>


lecrabe - 22/7/2008 à 12:06


Hello

Un petit grain de sel !

Cette version sera t-elle fonctionnelle depuis "disons"
AutoCAD 2004 jusqu'à AutoCAD 2009 ?

Le Decapode "chiant"


Oli553 - 22/7/2008 à 12:10

Encore mieux, merci Ô grand maitre...
Fonctionne sur V2009

[Edité le 22/7/2008 par Oli553]


davidcad01 - 12/1/2010 à 09:16

Merci pour ce LISP !
Une aide précieuse...
je vais avoir encore plus de temps pour aller fouiner sur CADxp.


kkwet - 26/1/2010 à 10:17

Salut tout le monde!!
sur 2004 j'ai : no function definition: VLA-ADDTABLE
cela se passe juste apres la demande du point d'insertion...
comment définir cette fonction?


Tramber - 26/1/2010 à 10:29

La fonction de tableau n'existe pas sur 2004. En tous cas, si je me souviens, pas pour y faire figurer des blocs. Mais le message fait penser que ca n'existe tout simplement pas.


Cette page provient du forum de: CADxp
http://cadxp.cadmag.info/

Dont l'URL est:
http://cadxp.cadmag.info//modules.php?op=modload&name=XForum&file=viewthread&fid=141&tid=20138