Aller au contenu

Blocs dynamiques Génial !!mais!!


dfbiagio

Messages recommandés

Bonsoir à tous,

Depuis peu j'utilise (à temps partiel) autocad2006. J'ai même modifié quelques blocks pour les étirer et pour les faire pivoter en un clin d’œil. C'est vraiment génial. :D

Mais, j'ai créé un petit lisp qui me permet de calculer la longueur d'un réseau d'égouttage. En effet j'ai un bloc, que j'ai appelé tuyau, de largeur et de longueur variable. Ce qui me permet avec mon lisp d'en extraire les échelles d'insertions X et Y que j'additionne pour en obtenir la longueur totale suivant leur diamètres.

Lorsque j'insère le bloc avec un delta Y de 1.75 et je fait appelle à la fonction (setq a (cdr (assoc 42 (entget (car (entsel)))))) elle donne comme réponse "1.75".

Je prends le même bloc, que j'étire façon autocad 2006, jusqu'a obtenir la longueur de 1.75 m. Et lorsque je fait appelle à la fonction (setq a (cdr (assoc 42 (entget (car (entsel)))))) elle donne comme réponse "1.0" ce qui ne m'arrange pas du tout.:casstet:

Comment puis-je faire pour en extraire sa nouvelle longueur. En fait c'est la propriété distance dans la fenêtre des propriétés.

Je ne suis pas un expert de la langue française, mais j'espère que vous avez pigé.

Merci de pouvoir m'aider pour modifier mon lisp.

A+

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

La technologie des blocs dynamiques n'est pas à appliquer dans ton cas,

en effet elle devient utile dès qu'il faut déplacer une entité du bloc

sans toucher à son intégrité.

si tu ne touches qu'au facteur d'insertion en X, Y ou Z,

continue avec les blocs non dynamiques.

ne perds pas de vue que le mieux est l'ennemi du bien

 

Toujours est il qu'il est vrai que je n'ai pas encore vu comment, en Lisp

faire varier un paramètre de bloc dynamique.

Dès que j'ai un moment, je regarderai avec le VBA.

 

amicalement

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

enfin quelqu'un au bout du fil.

C'est dommage car au niveau du dessin proprement dit cela va nettement plus vite. Mais pour mes métrés cela pose un problème.

J'espe qu'en VBA tu trouveras une solution. En tout cas, je pense qu'il suffirait d'extraire la valeur distance dans la fenêtre des propriétés. Mais comment faire? En lisp, malheureseusement je vois pas.

Si tu as quoi que ce soit tiens moi au courant, merci

 

A+

Lien vers le commentaire
Partager sur d’autres sites

En VBA il y a la piste : BlockRef.GetDynamicBlockProperties

(entre 2004 et 2006 il y 13 et 20 "properties", dont certaines semblent avoir rapport avec les blocs dynamiques).

 

En lisp, il n'y a rien, de mémoire, juste un nouveau code DXF qui indique si le block est dynamique ou non.

 

J'ajoute que -BEDIT est possible à la ligne de commande suivi de _BActionTool ou _BParameter, on peut au moins programmer dans ce sens.

 

 

[Edité le 30/7/2005 par Tramber]

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

(defun c:tdb () 
       (setq obj (vlax-ename->vla-object (car (entsel)))) 
       (setq v (vla-getdynamicblockproperties obj)) 
       (setq vval (vlax-variant-value v)) 
       (setq sal (vlax-safearray->list vval)) 
       (setq salnth (length sal)) 
       (setq count 0) 
       (while (/= count salnth) 
               (vlax-dump-object (nth count sal)) 
               (setq count (+ count 1)) 
       ) 
       (setq count nil) 
       (princ) 
) 
; 
; alteration code, to change a given variable in your block 
(defun c:sdb (/ esb v vval sal salnth count) 
       (vl-load-com) 
       (setq esb nil) 
       (while (= esb nil) 
               (setq esb (entsel)) 
               (if (/= (vlax-get-property (vlax-ename->vla-object (car esb)) "effectivename") "YOUR BLOCK NAME HERE") 
                       (setq esb nil) 
               ) 
       ) 
       (setq obj (vlax-ename->vla-object (car esb))) 
       (setq v (vla-getdynamicblockproperties obj)) 
       (setq vval (vlax-variant-value v)) 
       (setq sal (vlax-safearray->list vval)) 
       (setq salnth (length sal)) 
       (setq count 0) 
       (while (                (if (= (vlax-get-property (nth count sal) "PropertyName") "YOUR VARIABLE NAME HERE") 
                       (progn 
                               (vlax-put-property (nth count sal) "Value" "YOUR SETTING HERE")(princ) 
                               (setq count salnth) 
                       ) 
                       (setq count (+ count 1)) 
               ) 
       ) 
       (princ) 
)

 

Je l'ai trouvé

 

Et je regarde tout de suite.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Cool, c'est faisable.

 

J'ai honteusement détourné ce lisp pour faire celui-ci :

 

(defun c:gdb (/ esb v vval sal salnth count result) 
       (vl-load-com) 
       (setq esb nil) 
       (while (= esb nil) 
               (setq esb (entsel)) 
               (if (/= (vlax-get-property (vlax-ename->vla-object (car esb)) "effectivename") "Fenêtre - Métrique") 
                       (setq esb nil) 
               ) 
       ) 
       (setq obj (vlax-ename->vla-object (car esb))) 
       (setq v (vla-getdynamicblockproperties obj)) 
       (setq vval (vlax-variant-value v)) 
       (setq sal (vlax-safearray->list vval)) 
       (setq salnth (length sal)) 
       (setq count 0) 
       (while (                (if (= (vlax-get-property (nth count sal) "PropertyName") "Largeur") 
                       (progn 
                               (setq result(vlax-get-property (nth count sal) "Value"))
                               (setq count salnth) 
                       ) 
                       (setq count (+ count 1)) 
               ) 
       ) 
       (princ(strcat"\nLe valeur de votre paramètre est : "(vl-princ-to-string(vlax-variant-value result))))  
)

 

Celui-ci est basé sur le bloc "Fenêtre - Métrique" que l'on trouve dans les Sample du design center dans le bloc "Architectural - Métrique" qu'il faut exploser.

 

Remplacer par tes valeurs comme dans le lisp sdb pour ton cas perso mais attention aux majuscules, les chaines sont sensibles à la casse.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Voilà j'ai essayé ton lisp pas à pas

 

Command: !a

 

Command: (vlax-get-property (vlax-ename->vla-object a) 'effectivename)

"tuyau-100"

 

Command: (setq obj (vlax-ename->vla-object a))

#

 

Command: (setq v (vla-getdynamicblockproperties obj))

#

 

Command: (setq vval (vlax-variant-value v))

#

 

Command: (setq sal (vlax-safearray->list vval))

(# #

IAcadDynamicBlockReferenceProperty 0e5ef784>)

 

Command: (setq salnth (length sal))

2

 

Command: (vlax-get-property (nth 0 sal) 'propertyname)

"Distance"

 

Command: (setq result (vlax-get-property (nth 0 sal) 'value))

#

 

Command: !result

#

 

Command: (vlax-variant-value result)

117.885 <----- VOILA MA DISTANCE RECHERCHEE

 

Je vais l'adapter à mon lisp, mais si tu savais me renseigner au sujet du visuallisp cela m'aiderai à comprendre.

Encore merci

Lien vers le commentaire
Partager sur d’autres sites

mais si tu savais me renseigner au sujet du visuallisp cela m'aiderai à comprendre.

Encore merci

 

Ben faut que t'achètes l'excellent ouvrage de Serge, à vendre sur ebay par Patrick

 

J'ai commancé le Vlisp et l'utilise. Je comprends bien le code dont je parle mais ne serais te l'apprendre comme ca.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Salut,

Grâce à Tramber mon problème de recherche des distances est résolu.

Mais, j'ai un autre petit souci. C'est lorsque j'interrogeais mon dessin avec la fonction

(setq Objets (ssget (list (cons 2 “tuyau-100”)))) Il mettait tous les blocs dans la variable Objets

Maintenant ce n'est plus possible car il renomme tous les blocs qui ont été modifiés, du type *U199 *U200 etc... :mad:

J'ai déjà ma petite idée pour contourner ce problème, mais ce n'est pas très académique.

D'avance merci pour votre précieuse collaboration.

 

A+

 

Lien vers le commentaire
Partager sur d’autres sites

C'est l'astuce des blocs dynamiques, ils sont dessinés dans le dessin avec des noms de blocs anonymes.

 

C'est pour ca qu'on va recherche la propriété "effectivename"

 

Il faut mieux faire (setq Objets (ssget (list (cons 0 “INSERT”))))

et parcourir en boucle pour filtrer sur effectivename

 

Je sais, c'est galère

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
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é