Aller au contenu

Valeur dynmique et d'attribut


Messages recommandés

Posté(e)

Bonsoir à tous,

 

Je ne suis vraiment pas fort en Visual LISP, et là je bloc un peu.

Mon problème est que j'essaye de récupérer différentes valeurs d'un bloc dynamique.

 

Grace au site, j'ai réussi à récupérer et modifier un code pour récupérer le paramètre de visibilité.

Mais, je ne sais pas comment faire pour dans le même temps récupérer la valeurs des attributs "LG." "A" et "B" du même bloc.

 

Pourriez-vous me venir en aide s'il vous plait ?

Merci d'avance.

 

(defun c:InfoBloc (/ ValeureProp ValeureExtraite)



 (prompt "\nCLIQUEz SUR LE BLOC :")
 (setq bl1 (ssget (list (cons 0 "insert"))));; on sélectionne un bloc

(foreach prop (vlax-invoke (vlax-ename->vla-object (cdr (assoc -1 (entget (ssname bl1 0))))) 'getdynamicblockproperties) ;;; on regarde toutes les propriétées dynamiques
   
(if (= (vla-get-propertyname prop) "Visibilité1") ;; si une propriétée dynamique "Visibilité1"
        (PROGN
          (setq ValeureProp (vla-get-value prop));; on regarde pour info comment c est agencé
          (setq ValeureExtraite (vlax-variant-value (vla-get-value prop)));; on extrait la valeur de la propriété
          )
         )
     )

; ===================================================================================================
;                               Affichage des données extraites
; ===================================================================================================

(princ (strcat "\n...Données extraites :"))
(princ "\n...")
(princ (strcat "\n...Type de Câble.... : " ValeureExtraite))
(princ "\n...")

)

(c:InfoBloc)

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Salut

 

J'ai un peu modifié ton lisp afin de te montrer une bloucle en vl, éviter les vlax-ename->vla-object et les vlax-variant-value

(defun c:InfoBloc(/ doc)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (prompt "\nCLIQUEz SUR LE BLOC :")
 (and (ssget (list (cons 0 "insert")))
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(foreach prop (vlax-invoke ent 'getdynamicblockproperties)
  (and (= (vla-get-propertyname prop) "Visibilité1")
    (setq ValeureExtraite (vlax-get prop 'value))
         )
)
     )
     (vla-delete sel)
     (princ (strcat "\n...Données extraites :"))
     (princ "\n...")
     (princ (strcat "\n...Type de Câble.... : " ValeureExtraite))
     (princ "\n...")
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Pour récuperer les valeurs d'attibuts, utilises (vlax-invoke ent 'getattributes) dans la boucle vlax-for

 

@+

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)

Bonjour Patrick_35,

 

Merci beaucoup pour ta réponse. :D

Comme toujours, c'est effectivement beaucoup plus propre après ton passage.

Grace à tes conseilles, j'ai modifié mon code qui fonctionne très bien.

Par contre comme évoqué, je suis nul en VL donc il n'est peut-être pas beau ? :blink:

 

Maintenant, je me demandais comment faire avec un jeu de sélection ?

En effet, je voudrais éviter la sélection bloc par bloc.

 

(defun c:InfoBloc(/ doc) 

 (setq doc (vla-get-activedocument (vlax-get-acad-object))) 
 (vla-startundomark doc) 
 (prompt "\nCLIQUEz SUR LE BLOC :") 
 (and (ssget (list (cons 0 "insert"))) 
   (progn 
     (vlax-for ent (setq sel (vla-get-activeselectionset doc)) 
       (foreach prop (vlax-invoke ent 'getdynamicblockproperties) 
         (and (= (vla-get-propertyname prop) "Visibilité1") 
           (setq ValeurExtraite (vlax-get prop 'value))
         ) 
       ) 
(setq att (vlax-invoke ent 'getattributes))
;(setq ValeurLong (vlax-dump-object (nth 0 att)))
(setq ValeurLong (vla-get-textstring (nth 0 att)))
     ) 


     (vla-delete sel) 
     (princ (strcat "\n...Données extraites :")) 
     (princ "\n...") 
     (princ (strcat "\n...Type de Câble.... : " ValeurExtraite)) 
     (princ (strcat "\n...Longueur de Câble : " ValeurLong)) 
     (princ "\n...") 
   ) 
 ) 
 (vla-endundomark doc) 
 (princ) 
)

(c:InfoBloc)

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Par exemple

Je lance la ligne de code de sélection et je choisis 2 blocs.

(ssget (list (cons 0 "insert")))

 

Et on retrouve le jeu de sélection ici

(setq sel (vla-get-activeselectionset doc))

Si je traduis "vla-get-activeselectionset"

vla --> fonction vlisp

get --> lire, contraire de put = écrire

active --> active ou actuelle

selection --> sélection

set --> Ensemble ou collection

 

Pour connaitre le nombre de blocs sélectionnés

(vla-get-count sel)

 

Pour trouver le 1er bloc sélectionné

(vla-item sel 0)

 

Et donc, pour parcourir la sélection

(vlax-for ent sel ...)

 

Et pour terminer, effacer le jeu de sélection pour éviter de futures erreurs de sélections

(vla-delete sel)

 

@+

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)

Désolé je suis un vrai boulet ! :wacko:

Je n'y arrive pas malgré tes explications.

 

En fait, normalement, je dois refaire une boucle non ?

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

En fait, je pense, que je me suis mal exprimé.

 

Dans tous les blocs que je sélectionne par une fenêtre,

je voudrais récupérer les valeurs :

 

[code

(progn

(vlax-for ent (setq sel (vla-get-activeselectionset doc))

(foreach prop (vlax-invoke ent 'getdynamicblockproperties)

(and (= (vla-get-propertyname prop) "Visibilité1")

(setq ValeurExtraite (vlax-get prop 'value))

)

)

(setq att (vlax-invoke ent 'getattributes))

(setq ValeurLong (vla-get-textstring (nth 0 att)))

)

 

[/code]

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Salut

 

Je ne sais pas comment tu souhaites traiter les données, mais tu peux dans un 1er temps inclure les résultats (tous les princ ...) dans la boucle.

 

@+

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)

Hello,

 

oui, c'est ce que je vais faire je vais dans un premier temps inclure les princ dans la boucle.

 

Mais, je n'arrive pas à traiter un bloc puis à passer à l'autre.

Je suis vraiment benêt !

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

Posté(e)

Mieux qu'un long discours.

Sélectionnes plusieurs blocs.

 

(defun c:InfoBloc(/ doc) 
 (setq doc (vla-get-activedocument (vlax-get-acad-object))
tot 0
 ) 
 (vla-startundomark doc) 
 (and (ssget (list (cons 0 "insert"))) 
   (progn 
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(terpri)
(princ ent)
(princ " - ")
(princ "Bloc n°")
(princ (setq tot (1+ tot)))
     )
     (vla-delete sel) 
   ) 
 ) 
 (vla-endundomark doc) 
 (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)

Merci Beaucoup Patrick pour ton aide.

Je ne comprenais pas l'architecture qu'il fallait en tête du code.

Désolé pour mon côté boulet.....

 

Pour ceux que cela intéresse, le code fonctionne correctement désormais :

 

(defun c:InfoBloc (/ doc)  


 (setq doc (vla-get-activedocument (vlax-get-acad-object)) 
       tot 0 
 )  
 (vla-startundomark doc)  
 (and (ssget (list (cons 0 "insert")))  
   (progn  
     (vlax-for ent (setq sel (vla-get-activeselectionset doc)) 
(foreach prop (vlax-invoke ent 'getdynamicblockproperties) 
         (and (= (vla-get-propertyname prop) "Visibilité1") 
           (setq ValeurExtraite (vlax-get prop 'value))
         ) 
       ) 
(setq att (vlax-invoke ent 'getattributes))
;(setq ValeurLong (vlax-dump-object (nth 0 att)))
(setq ValeurLong (vla-get-textstring (nth 0 att)))

       (terpri) 
(princ (strcat "\n...Données extraites :"))
       ;(princ ent) 
       ;(princ " - ") 
       (princ "\n...Bloc n°") 
       (princ (setq tot (1+ tot)))
       (princ "\n...") 
       (princ (strcat "\n...Type de Câble.... : " ValeurExtraite)) 
       (princ (strcat "\n...Longueur de Câble : " ValeurLong)) 
       (princ "\n...") 
     ) 
     (vla-delete sel)  
   )  
 )  
 (vla-endundomark doc)  
 (princ)  
)

(c:InfoBloc)

 

Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent.

 

Maréchal Foch

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é