Aller au contenu

Messages recommandés

Posté(e)

Bonjour a tous,

mon probleme est de pouvoir decomposer les block imbriques tout en conservant le bloc initial.

Je m'explique:

j'ai un bloc A dans lequel j'ai un bloc B qui lui meme contient un bloc C.

Je voudrai decomposer le bloc C et le bloc B qui se trouvent dans le bloc A. Je me retrouverai avec le bloc A sans aucun bloc imbriqué.

J'espere avoir été clair. Alors si quelqu'un a une solution a me proposer, je suis preneur.

 

Merci.

Imprimez vos Fichiers Autocad par lot

http://www.impression-autocad.fr.nf/

Posté(e)

Salut et bienvenue,

 

La routine suivante décompose tous les blocs imbriqués (à conditions qu'ils soient insérés dans le bloc parent avec des échelle uniformes) dans toutes les définitions de bloc du dessin.

 

(defun c:ExplodeNested ()
 (vl-load-com)
 (vlax-for b (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
   (if (and
         (= (vla-get-IsLayout b) :vlax-false)
         (= (vla-get-IsXref b) :vlax-false)
         (not (wcmatch (vla-get-Name b) "*|*"))
       )
     (vlax-for o b
       (if (= (vla-get-ObjectName o) "AcDbBlockReference")
         (if (not (vl-catch-all-error-p
                    (vl-catch-all-apply 'vla-explode (list o))
                  )
             )
           (vla-delete o)
         )
       )
     )
   )
 )
 (princ)
)

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

Posté(e)

Merci Gile et bravo ca fonctionne nickel.

Mais pourrais tu expliquer un peu ton code car mon but n'est pas seulement d"utiliser une routine que l'on a fait pour moi. J'aimerai aussi comprendre ce que j'utilise.

J'ai fait quelque application en autolisp mais j'avoue que le code que tu as réalisé ne ressemble pas a ce que j'ai pu voir, je n'y comprend pas grand chose (est-ce du visual lisp ?)

 

En tous cas, chapeau et merci encore.

Imprimez vos Fichiers Autocad par lot

http://www.impression-autocad.fr.nf/

Posté(e)

Salut,

 

Le principe est d'agir sur les définitions de bloc, donc de parcourir la table des blocs (collection) et, pour chaque définition de bloc, de parcourir ses composants à la recherche des références de blocs (blocs imbriqués) pour les décomposer.

 

Le choix du Visual LISP s'impose à cause de la décomposition (parcourir la table des blocs et les entités d'un blocs est faisable avec les fonctions AutoLISP tblnext et entnext).

En effet, avec AutoLISP, à moins de définir une fonction de décomposition, le moyen pour décomposer des entités est d'utiliser la fonction command avec la commande native _explode. Hors, on ne peut appeler command que dans l'espace objet ou un espace papier (qui sont des blocs particuliers), pas dans une définition de bloc.

 

Visual LISP utilise l'interface COM/ActiveX (interface utilisée par VB/VBA, mais aussi accessible avec .NET), c'est ce qui va lui donner cette syntaxe un peu plus "Orientée Objet", structurée en objets, méthodes, propriétés (et évènements).

 

(vl-load-com) : cette expression charge l'interface COM indispensable pour que les fonctions Visual LISP vla-*, vlax-* et vlr-* soient reconnues.

 

(vlax-for b (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) :

vlax-for est une fonction Visual LISP qui permet de parcourir une collection d'objets, un peu comme foreach pour une liste.

(vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) : retourne la collection (table) des blocs du dessin courant.

vlax-get-acad-object retourne un objet AutoCADApplication, cet objet a ses propres propriétés et méthodes.

vla-get-ActiveDocument retourne la propriété ActiveDocument de l'objet AutoCADApplication. Cette propriété est elle même un objet avec ses propriétés et méthodes dont un propriété Blocks à laquelle on accède avec vla-get-Blocks.

 

La collection de blocs retournée par vla-get-Blocks contient, en plus des définitions de tous les blocs importés dans le dessin (y compris les blocs imbriqués), les blocs spéciaux que sont les espaces objet et papier, les xrefs et les blocs contenus dans les xrefs.

Une expression test évalue les blocs pour ne pas traiter ceux-ci :

vla-get-IsLayout retourne :vlax-true (vrai) ou :vlax-false (faux) suivant que le block est un "Layout" (espace objet ou papier) ou non.

vla-get-IsXref : évalue su le bloc est une xref

(not (wcmatch (vla-get-Name b) "*|*")) évalue si le nom du bloc contient le caractère "|" réservé aux blocs contenus dnas les xrefs.

 

Une fois le test passé, la définition de bloc (qui est considérée ici comme une collection d'entités graphiques) peut être parcourue avec la même fonction vlax-for.

Pour chaque entité on évalue si la propriété ObjectName (qui correspond à la sous-classe de l'objet) est égale à "AcDbBlockReference", ce qui veux dire que l'objet est une référence de bloc insérée dans la définition du bloc parent (c'est un bloc imbriqué).

Dans ce cas on tente de décomposer la référence de bloc avec la méthode Explode.

vla-Explode retourne les objets composant le bloc sans supprimer celui-ci.

Comme une référence de bloc insérée avec des échelles non uniforme ne peut être décomposer avec vla-Explode, j'utilise les fonctions vl-catch-all-* (voir l'aide) qui permettent de ne pas interrompre le processus si une erreur intervient.

 

PS : Les fonctions vlax-* (et vlr-*) sont renseignées dans l'aide aux développeurs >> AutoLISP reference

Les fonction vla-* ne sont pas directement renseignées, il faut adapter la syntaxe à partir de la rubrique ActiveX and VBA Reference de l'aide aux développeurs.

On peut aussi utiliser l'accès direct à l'aide depuis l'éditeur Visual LISP par Ctrl+F1.

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

Posté(e)

Salut Gile et un grand MERCI.

C'est vraiment sympa d'avoir pris le temps d'ecrire toutes ces explications qui sont on ne peut plus claires. J'ai essayé avec tblnext et entnext mais ensuite quand je veux decomposer ca ne fonctionne pas. Avec tes explications je comprend mieux pourquoi.

Je pense que je vais devoir potasser serieusement Vlisp, il me semble que ses possibilités sont plus étendues qu'autolisp.

 

Continuez,c'est vraiment super de pouvoir avoir de l'aide de gens comme toi lorsqu'on est largué devant son prog qui veut pas tourner. J'espere qu'a mon tour je pourrai aider quelqu'un un jour.(j'en doute vu le niveau sur ce forum, qui sait peut-etre qu'un jour je serai grand).

 

Merci encore et bonne fin de week end.

Imprimez vos Fichiers Autocad par lot

http://www.impression-autocad.fr.nf/

Posté(e)

Bonjour et merci pour ce code-explications

 

Dans la série des blocs il faut ajouter les Cotations et Tableaux qui sont aussi des blocs...

En partant de ce code je suis arrivé à ça (le but est de différencier les types de blocs) :

(vlax-for b (vla-get-blocks *doc)
 (setq n (vla-get-name b))
 (cond
   ((= n "*Model_Space"))                        ; Model_Space
   ((= (vla-get-IsLayout b) :vlax-true))         ; Présentation
   ((or (vl-string-search "*D" n)                ; Dimension / Bloc de Dim
        (member n
                '("_ArchTick"     "_ClosedBlank"  "_Closed"
                  "_Dot"          "_ArchTick"     "_Oblique"
                  "_Open"         "_Origin"       "_Origin2"
                  "_Open90"       "_Open30"       "_DotSmall"
                  "_DotBlank"     "_Small"        "_BoxBlank"
                  "_BoxFilled"    "_DatumBlank"   "_DatumFilled"
                  "_Integral"     "_None"
                 )
        )
    )
   )
   ((vl-string-search "*T" n))                   ; Table
   ((or (wcmatch n "*|*")                        ; XRef / Bloc de XRef
        (= (vla-get-IsXref b) :vlax-true)))      
   (T)                                           ; Bloc normal
 )
)

 

Ce test est loin d'être parfait, notamment pour les Cotations...

 

D'autre part savez vous si il y a d'autres objets "container" codés de cette façon ?

 

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

Bonjour A tous,

 

Je viens de tomber sur cette LISP qui est super merci à toi Gille une fois de plus.

Par contre je voudrais savoir comment la modifier pour que le 1er bloc ce décompose aussi (que tous les blocs soit décomposé)?

J'avoue ne pas très bien comprendre le LISP en générale.

J'ai recherché sur le forum mais n'est pas trouvé.

Merci pour tout par avance

Cordialement

ADDS

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é