Aller au contenu

Purge de bloc : je cherche mon erreur


Tramber

Messages recommandés

Re,

 

J'me disais aussi,...

 

J'avais rajouté en début de lisp "defun c:PurgeBlock",....

 

Si je colle "(gc:PurgeBlock "*")" en ligne de commande, j'ai =>

 

Commande: (gc:PurgeBlock "*")

; erreur: Erreur Automation Objet référencé

 

Ou définit toi une commande en utilisant cette fonction :

 

Comment ? En début de lisp par exemple ?

 

Car, en faisant ça, j'ai =>

 

Commande: (LOAD "C:/Users/Lilian/Desktop/URB.lsp") GC:PURGEBLOCK

Commande: urb

; erreur: Erreur Automation Objet référencé

 

Surement un truc que je n'ai pas pigé, désolé,...

 

Merci encore,

 

PS: Je n'arrive pas à éditer les smileys, c'est pénible ce truc,...

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

En recommençant le chargement du lisp comme ceci (je ne sais toujours pas si la syntaxe est ok,...)

 

(defun c:URB () (gc:PurgeBlock "*") (princ))

;; gc:PurgeBlock
;; Purge les blocs dont le nom correspond au modèle (insensible à la casse)
;;
;; Argument
;; pat : un modèle pour le nom de bloc, accepte les caractères génériques ("*" pour tous)

(defun gc:PurgeBlock (pat / massoc blk name blst loop)
 (vl-load-com)

 (defun massoc	(code alst)
   (if	(setq alst (member (assoc code alst) alst))
     (cons (cdar alst) (massoc code (cdr alst)))
   )
 )

 (while (setq blk (tblnext "BLOCK" (not blk)))
   (if
     (and
(wcmatch (strcase (setq name (cdr (assoc 2 blk)))) (strcase pat))
(< (cdr (assoc 70 (setq elst (entget (tblobjname "BLOCK" name))))) 4)
     )
     (setq blst (cons (cdr (assoc 330 elst)) blst))
   )
 )
 (setq loop T)
 (while (and loop blst)
   (setq loop nil)
   (foreach b blst
     (or (vl-some 'entget (massoc 331 (entget b)))
(progn
  (setq blk (vlax-ename->vla-object b))
  (vlax-for o blk
    (if	(= (vla-get-ObjectName o) "AcDbBlockReference")
      (vla-Delete o)
    )
  )
  (vla-delete blk)
  (setq blst (vl-remove b blst))
  (setq loop T)
)
     )
   )
 )
)

 

, j'ai

maintenant ce message : (Un seul bloc non purgé *U2)

 

Commande:

Commande: (LOAD "C:/Users/Lilian/Desktop/URB.lsp") GC:PURGEBLOCK

Commande: (gc:PurgeBlock "*")

T

 

Cela vient surement d'une mauvaise utilisation de ma part, auquel cas, désolé,...

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Lilian,

 

Il n'y a aucun problème avec le code tel que tu l'as posté.

 

Dans le dessin mis en téléchargement, la collection des blocs contient les blocs suivant (avec le nouveau code :

 

_"niv dalle compact-081114105006-"

_"*U2"

_"e"
|_"*U2"(niv dalle compact-081114105006-)

_"plancher_a"

_"d"
|_"e"
| |_"*U2"(niv dalle compact-081114105006-)
|_"plancher_a"

_"Ligne Arase"

_"surfbloc"

_"TotalArea"

_"TotalPerimeter" 

La commande PURGER donne les blocs "d" et "Ligne Arase" purgeables (curieusement "*U2" n'apparait pas alors qu'il n'est pas référencé).

 

Si je lance URB, je n'ai aucun message et la commande purger ne donne plus aucun bloc puregeble. Les blocs "d" et "Ligne Arase" ont donc bien été purgés ainsi que les blocs "e", "_niv dalle compact-081114105006-" et "plancher_a" imbriqués dans "d".

Si je relance Listblocks (ci dessous) je note que "*U2" a aussi été purgé.

 

(defun c:ListBlocks (/ foo efName name def)
 (defun foo (pref blk)
   (vlax-for o blk
     (if
       (and
         (= (vla-get-ObjectName o) "AcDbBlockReference")
         (setq name   (vla-get-Name o)
               efName (vlax-get o
                                (if (vlax-property-available-p o 'EffectiveName)
                                  'EffectiveName
                                  'Name
                                )
                      )
         )
         (setq def (vla-item *blocks* efName))
         (= (vla-get-IsXref def) :vlax-false)
       )
        (progn
          (princ (strcat "\n"
                         pref
                         "\""
                         name
                         "\""
                         (if (/= name efName)
                           (strcat "(" efName ")")
                           ""
                         )
                 )
          )
          (foo (strcat " |" pref) def)
        )
        ""
     )
   )
 )
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)))
 (vlax-for b *blocks*
   (if (and (= (vla-get-IsXref b) :vlax-false)
            (= (vla-get-IsLayout b) :vlax-false)
       )
     (progn
       (princ (strcat "\n\n_\"" (vla-get-Name b) "\""))
       (foo " |_" b)
     )
   )
 )
 (textscr)
 (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Gilles,

 

Pourtant, suite aux tests réalisés hier sur le fichier joint, quand je passe par la fonction "classique" de purge AutoCAD, j'ai ce fameux bloc *U2 de purgeable

 

http://img.ahst.fr/data/images/purgegille.jpg

 

Et quand je lance "list_blk_children", j'ai :

 

Commande: list_blk_children

Xref trouvé ---> C:\Users\Lilian\Documents\BAC SEMELLES COTATIONS.dwg36

 

Explore le bloc TotalPerimeter

Explore le bloc TotalArea

Explore le bloc surfbloc

Explore le bloc *U2

 

Si je passe par LISTBLOCKS :

 

Commande: LISTBLOCKS

_"*U2"

_"surfbloc"

_"TotalArea"

_"TotalPerimeter"

_"*D|REF12"

Commande:

 

Je n'ai rien touché au fichier posté hier pour voir si tu fais le même constat chez toi en suivant les mêmes opérations,...

 

D'ailleurs pourquoi la xref avec "list_blk_children" porte le nom

 

BAC SEMELLES COTATIONS.dwg36
et avec " LISTBLOCKS"

 

"*D|REF12"

 

?????

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

OK, en ce qui concerne "*U2", j'ai compris c'est le nom du bloc anonyme créé par l'insertion du bloc dynamique "niv dalle compact-081114105006-" dans "e".

Comme il est imbriqué, il n'apparait pas au premier niveau des blocs purgeables.

 

ListBlocks et list_blk_children ne fonctionnent pas exactement pareil, ceci doit pouvoir expliquer les différences, mais pour la xref (et les blocs qu'elle contient), je ne peux pas tester, je n'ai pas le fichier.

 

Dans tout les cas, je ne vois pas de dysfonctionnement de gc:PurgeBlock.

 

PS : J'ai modifié ListBlocks pour qu'il affiche le nom effectif et le "nom du bloc anonyme" pour les blocs anonymes imbriqués

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

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Comme il est imbriqué, il n'apparait pas au premier niveau des blocs purgeables.

 

Que faut-il faire alors dans ce cas ?

 

Relancer URB" ?

 

mais pour la xref (et les blocs qu'elle contient), je ne peux pas tester, je n'ai pas le fichier.

 

Le voici (là aussi, rien d'extraordinaire, un bloc dyn uniquement)

 

Dans tout les cas, je ne vois pas de dysfonctionnement de gcurgeBlock.

 

Moi non plus à priori, c'est juste que je comprenais pas "l'attitude" du bloc "*U2",...

 

J'ai modifié ListBlocks pour qu'il affiche le nom effectif et le "nom du bloc anonyme" pour les blocs anonymes imbriqués

 

Vu !

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

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é