Aller au contenu

supprimer dynamisme des blocs


Messages recommandés

Posté(e)

Bonjour,

 

Je cherche un LISP qui supprime tout paramètre dynamique d'un dwg.

 

En clair, j'aimerais éviter d'avoir à "exploser" les blocs dynamiques et/ou rentrer dans l'éditeur de bloc de chaque bloc fixe qui contiennent eux-même des blocs dynamiques à exploser ...

 

En vous remerciant

Posté(e)

Bonjour,

 

J'ai cela qui traine sur mon bureau.

 

(defun c:ConvertDyn	(/ ActiveDoc taken)

   (vl-load-com)

   (setq ActiveDoc (vla-get-ActiveDocument(vlax-get-acad-object)))

   (foreach taken (vl-remove-if
	   'listp
	   (mapcar 'cadr (ssnamex (ssget "taken" '((0 . "INSERT")))))
       )

(if (equal (vla-get-IsDynamicBlock (vlax-ename->vla-object taken))
	   :vlax-true
    )

    (vla-ConvertToAnonymousBlock (vlax-ename->vla-object taken))
)

   )

   (princ)

)

 

Je ne sais plus d'ou j'l'ai eu?

 

Mais c'est dommage d'en arriver a renommer ensuite les blocs.... :exclam:

Posté(e)

Re,

 

Une sélection de tous les blocs insérés (dans les espaces objet et papier) ne permet pas de traiter les blocs imbriqués (insérés dans des définitions de bloc).

 

L'expression suivante traite toutes les références de blocs qu'elles soient insérées directement dans un espace ou dans une définition de bloc.

 

(vlax-for blk (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
 (vlax-for obj	blk
   (if	(and (= (vla-get-ObjectName obj) "AcDbBlockReference")
     (= (vla-get-IsDynamicBlock obj) :vlax-true)
)
     (vla-ConvertToAnonymousBlock obj)
   )
 )
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

MERCI !

tout simplement parfait, comme d'habitude ...

ça me semblait très difficile, et vous résolvez le prb en quelques lignes ...

c'est à se demander si vous avez des limites :D

 

encore merci, j'adore ce site :)

  • 7 ans après...
Invité eklundh80
Posté(e)

Salut,

 

La commande fonctionne très bien.

 

Question: j'ai des blocs avec des attributs renseignés par des paramètres de distance. Et donc lorsque l'on passe en statique les attributs deviennent des ####. Est--il possible de convertir en 1er lieu les attributs dans le bloc en texte avec la valeur du paramètre avant de retirer le dynamisme du bloc?

Invité eklundh80
Posté(e)

Oui ,sauf que ça explose. Je préfère nburst de Lee Mac qui explose en n'affichant que la visibilité en cours.

Le but étant de conserver les blocs et ne pas avoir des lignes et textes en pagaille.

Peut en faisant un vlax-for (vla item attribute ...)??

Invité eklundh80
Posté(e)

Exact mais j'aurais souhaité que l'attribut devienne un texte tout en restant dans le bloc.

Posté(e)

Bonjour,

 

2 petits liens à regarder sur une discussion similaire, à la nuance prés que nous cherchions à verrouiller le dynamisme des blocs plutôt qu'a le supprimer, ce qui devrait éviter d'avoir à modifier les champs de tes attributs

 

A voir si cela peut te convenir:

 

L'explication du procédé:

http://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/page__view__findpost__p__232073

 

L'automatisation

http://cadxp.com/topic/41229-verrouiller-un-bloc-dynamique/page__view__findpost__p__232105

 

A+ Bruno

Apprendre => Prendre => Rendre

Invité eklundh80
Posté(e)

Merci Bruno mais cela ne fonctionne pas non plus sur tout. C'est un peu mieux cependant.

Voici le lien d'un bloc pour exemple.

 

essai blocs

 

 

Sur les blocs ou les attributs ne dépendent pas des paramétres mais d'objets (cercle ou ligne) cela fonctionne à la différence du lisp ci dessus pour rendre le bloc anonyme (il met les 2 blocs avec ###).

 

Cela vient peut être de la construction de mon bloc.

 

Lorsqu'on régénère les ### apparaissent seulement sur le bloc semelle qui a l'attribut lié au paramètre de distance.

Peut-on en lisp basculer les poignées des paramétres ( de 1 ou 2 à 0)??

  • 2 mois après...
Invité eklundh80
Posté(e)

Salut à tous,

 

Finalement, avec du recul pendant la période estivale j'ai adopté le lisp de VDH Bruno en faisant une modif sur le seul bloc qui me posait un souci (renseignement d'un champs à partir d'un paramètre de distance, je suis passé par la longueur d'une polyligne non imprimable et voila). Sinon j'ai crée un lisp pour reprendre les valeurs du paramètre de distance et le passer en texte, ça marche aussi. Merci à VDH Bruno qui m'a fait chercher plusieurs pistes de réflexion.

 

Voici mes lisp (vlisp et autolisp avec getpropertyvalue) si cela peut aider (même moi si vous avez des remarques pour améliorer mes connaissances en lisp). J'ai dû passer avant la mise à jour de l'attribut par la mise à 0 afin de forcer la prise en compte de la modification et supprimer la copie du paramètre dans la nouvelle valeur de l'attribut (pas compris mais là ça marche :) ).

 


(defun c:UndynSemelle (/ ssx ssf c en *error* acdoc l val1 val2 val3)
(vl-load-com)
(setq acdoc (vla-get-activedocument (vlax-get-acad-object))); active l'espace de travail

(defun *error* (msg)
(if (or (= msg "Fonction annulée")
(= msg "quitter / sortir abandon"))
(princ)
(princ (strcat "\nErreur: " msg))
)
)
(vla-regen acdoc acallviewports)
(setq ssx (ssget "_X" '((0 . "INSERT") (2 . "`*U*,Semelle")))
;; créer une liste des objets avec un nom anonyme et Semelle
ssf (ssadd)
;; met à 0 la selection finale
c 0)
;; met à 0 le compteur
(if ssx; si création de la liste
(repeat (sslength ssx); répète pour la longueur de la liste
(setq en (ssname ssx c); récupère le nom d'objet avec son rang
c (1+ c); incrémente le compteur +1
)
(if (= (vla-get-effectivename (vlax-ename->vla-object en)) "Semelle"); si l'objet a son nom = à Semelle
(ssadd en ssf); l'ajouter à la liste
)
)
)
ssf
(if ssf; si création de la liste
(repeat (setq i (sslength ssf)) ; répéte jusqu'à la fin de la liste de chaque nom bloc en ename
(setq l (cons (vlax-ename->vla-object (ssname ssf (setq i (1- i)))) l)); crée la liste vla-object de chaque bloc
)
)
(foreach blc l; Pour chaque bloc de la liste
(vl-some '(lambda (att)
(if (= "SF80" (strcase (vla-get-tagstring att)));;si l'étiquette de l'attribut = ...
(progn
(setq val1 (vla-get-textstring att));;récupére la valeur de l'attribut
(vla-put-textstring att 0);; la passer à 0
(vla-put-textstring att val1);; et lui remettre la valeur sauvegardée (annule dynamisme)
)
)
(if (= "60" (strcase (vla-get-tagstring att)));;si l'étiquette de l'attribut = ...
(progn
(setq val2 (vla-get-textstring att));;récupére la valeur de l'attribut
(vla-put-textstring att 0);; la passer à 0
(vla-put-textstring att val2);; et lui remettre la valeur sauvegardée (annule dynamisme)
)
)
(if (= "X80" (strcase (vla-get-tagstring att)));;si l'étiquette de l'attribut = ...
(progn
(setq val3 (vla-get-textstring att));;récupére la valeur de l'attribut
(vla-put-textstring att 0);; la passer à 0
(vla-put-textstring att val3);; et lui remettre la valeur sauvegardée (annule dynamisme)
)
)
)
(vlax-invoke blc 'getattributes)
)
(princ)
(setq *error* nil)
(setq ssx nil
ssf nil
l nil)
)
(princ)
)

 

Voici la variante avec les get et set Propertyvalue


(defun c:Undyn2semelle (/ ssx ssf c en *error* l val1 val2 val3)

(defun *error* (msg)
(if (or (= msg "Fonction annulée")
(= msg "quitter / sortir abandon"))
(princ)
(princ (strcat "\nErreur: " msg))
)
)
(vla-regen acdoc acallviewports)
(setq ssx (ssget "_X" '((0 . "INSERT") (2 . "`*U*,Semelle")))
;; créer une liste des objets avec un nom anonyme et Semelle
ssf (ssadd)
;; met à 0 la selection finale
c 0)
;; met à 0 le compteur
(if ssx; si création de la liste
(repeat (sslength ssx); répète pour la longueur de la liste
(setq en (ssname ssx c); récupère le nom d'objet avec son rang
c (1+ c); incrémente le compteur +1
)
(if (= (vla-get-effectivename (vlax-ename->vla-object en)) "Semelle"); si l'objet a son nom = à Semelle
(ssadd en ssf); l'ajouter à la liste
)
)
)
ssf
(if ssf; si création de la liste
(repeat (setq i (sslength ssf)) ; répéte jusqu'à la fin de la liste de chaque nom bloc en ename
(setq l (cons (ssname ssf (setq i (1- i))) l)); crée la liste ename de chaque bloc
)
)

(foreach blc l; Pour chaque bloc de la liste
(setq val1 (getpropertyvalue blc "SF80"));;récupére la valeur de l'étiquette
(setpropertyvalue blc "SF80" "0");;la passe à 0
(setpropertyvalue blc "SF80" val1);; puis remet la valeur sauvegardée

(setq val2 (getpropertyvalue blc "60"))
(setpropertyvalue blc "60" "0")
(setpropertyvalue blc "60" val2)

(setq val3 (getpropertyvalue blc "X80"))
(setpropertyvalue blc "X80" "0")
(setpropertyvalue blc "X80" val3)

(princ)
(setq *error* nil)
(setq ssx nil
ssf nil
l nil)
)
(princ)
)

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é