Aller au contenu

nettoyage bloc 3D


philsogood

Messages recommandés

hello

je souhaiterai savoir si vous savez comment effacer tous les objets non-3D que l'on peut trouver dans un bloc en 3D.

par objet 3D j'entends : ligne, polyligne, arc, cercle, point, ellipse, spline, texte, attribut... enfin je pense que vous voyez ce que je veux dire

d'habitude je me servais de je ne sais plus quelle fonction qui eprmet de sélectionner des éléments avec des AND ou des OR et qui était plutot pratique mais je ne sais plus comment cette fonction s'appelle et de toute façon elle serait inadaptée car le bloc que je souhaite traiter contient plusieurs blocs.... ce fichier envoyé par un fournisseur qui représente un placard dirons nous, doit comporter à peu près 30 blocs... pas envie de rentrer dans chaque bloc pour effacer tous les objets surperflus... je ne souhaite cependant pas effacer tout ce qui se rapporte à la 3D (car tout n'est pas que des solides 3D - face3D...)

Phil

Projeteur Revit Indépendant - traitement des eaux/CVC

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Du coup en LISP je vois que ça...

 

->Dans ta sélection

->Ouvre le bloc "Toto1"

->Sélection multiple

->Supprime tout les objets qui ne sont pas des SOLID,FACE, SURFACE

->Enregistre le bloc

->Ouvre le bloc "Toto2"

->etc

 

Mais alors comment écrire ça en LISP...

"98% des soucis informatiques sont assis entre la chaise et le bureau !"

 

"C'est parce que la vitesse de la lumière est supérieure à celle du son que tant de gens paraissent brillants avant d'avoir l'air con."
Lien vers le commentaire
Partager sur d’autres sites

du coup je le colle

 


(defun c:dsh (/ AcDoc listBlocs vlalistbloc blocks)

 (vl-load-com)

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

       blocks (vla-get-blocks AcDoc)

 )

 (vla-StartUndoMark AcDoc)

 (and (ssget  (list (cons 0 "INSERT")))

   (progn

     (vlax-for b (setq vlalistbloc (vla-get-activeselectionset AcDoc))

       (or (member (vla-get-effectivename B) listBlocs)

         (setq listBlocs (cons (vla-get-effectivename B) listBlocs))

       )

     )

     (vla-delete vlalistbloc)

     (mapcar '(lambda(e)

               (vlax-for e (vla-item blocks e)

                 (and  (/= "3D*" (vla-get-ObjectName e))

                       (/= "*3D" (vla-get-PatternName e))

                   (vla-delete e)

                 )

               )

             )

             listBlocs

     )

     (vla-regen AcDoc acActiveViewport)

   )

 )

 (vla-EndUndoMark AcDoc)

 (princ)

)


 

normalement tu n'as plus qu'a remplacer les *3D et 3D* par les objets que tu veux garder.

Lien vers le commentaire
Partager sur d’autres sites

Salut Fraid,

 

Est ce que je peux t'embêter et te demander de mettre des commentaires?

Car j'ai un peu de mal à lire ce que font les fonctions :)

Un genre de pas à pas via les commentaires, si t'a un peu de temps bien sur ;)

 

Cordialement

"98% des soucis informatiques sont assis entre la chaise et le bureau !"

 

"C'est parce que la vitesse de la lumière est supérieure à celle du son que tant de gens paraissent brillants avant d'avoir l'air con."
Lien vers le commentaire
Partager sur d’autres sites

Hello Fraid

 

SNIFF SNIFF je viens de tester ton LSP sur 2 DWGs 3D et j'ai une belle (la meme) erreur :

 

Sélectionner des objets:

; erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: PatternName !!

 

Que se passe t-il ? ... Desole le Decapode est "enquiquineur" !!

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Erreur typique d'un copier/coller avec modifications sans faire de tests...

Faudrait voir à écouter didier un peu !

 

(defun c:d2d (/ doc blocks lst ss)
 (vl-load-com)
 ;; obtenir le document actif et sa collection de définitions de bloc
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
       blocks (vla-get-blocks doc)
 )
 ;; démarrer un groupe d'annulation
 (vla-StartUndoMark doc)
 ;; si l'utilisateur sélectionne des block
 (if (ssget  (list (cons 0 "INSERT")))
   (progn
     ;; collecter les noms des blocs sans doublons
     (vlax-for b (setq ss (vla-get-activeselectionset doc))
       (or (member (vla-get-effectivename B) lst)
           (setq lst (cons (vla-get-effectivename B) lst))
       )
     )
     ;; supprimer le jeu de sélection
     (vla-delete ss)
     ;; pour chaque nom de bloc de la liste
     (foreach name lst
       ;; pour chaque entité contenue dans la définition de bloc
       (vlax-for ent (vla-item blocks name)
         ;; si l'objet n'est pas un solide 3d, une surface ou un maillage
         (if (not (wcmatch (vla-get-ObjectName ent) "*3dSolid,*Surface,*SubDMesh"))
             ;; supprimer l'objet
              (vla-delete ent)
         )
       )
     )
     ;; régénérer la fenêtre active
     (vla-regen doc acActiveViewport)
   )
 )
 ;; terminer le groupe d'annulation
 (vla-EndUndoMark doc)
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Hello Gilles

 

1) MERCI c parfait ! ... Super Nettoyage 2D (et aussi 3D)

 

2) MAIS SVP quel serait la Modif (Nouvelle version) pour garder (si necessaire) aussi :

- 3D Faces

- 3D Polys

- 3D PolyMesh (Assemblages de 3DFaces)

 

3) Merci d'avance, car j'ai des Blocs 3D avec un JOLI melange dans les entites 3D !

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Ahahah !

Hihihihi!

J'ai failli écrire un message tout à l'heure, sur un autre forum, à propos des effets pervers du copier-coller, mais la peur de me faire sermonner par la vindicte des utilisateurs de cette manie photocopieuse m'a fait reculer.

 

Et vla-t'y pas que quelques heures après (gile), lui-même, entonne mon antienne pour morigéner ceux qui s'y adonnent !

Moi je dis : je suis un prophète,

Il a un gourou sur le site, grand gourou même, maintenant il y a un pro-fête ce qui est toujours mieux que pro-s'tâte.

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Hello Gilles

 

1) MERCI c parfait ! ... Super Nettoyage 2D en gardant TOUS les Types d'objet 3D !!

= MAGNIFIQUE

 

2) **** OOPS SORRY : nouvelle demande ****

MAIS SVP j'aurais eventuellement besoin de traiter les Sous-Blocs

qui sont eux-memes des assemblages d'elements 2D et 3D ...

( Et la routine actuelle supprime automatiquement les Sous-Blocs )

 

3) Merci d'avance, car j'ai des Blocs 3D avec un JOLI melange dans les entites 3D !

et aussi MALHEUREUSEMENT de Sous-Blocs avec de la 2D et 3D ...

 

ARBRE 3D : = n Blocs de Tronc/Branches 3D + N Blocs de Feuilles = Blocs de 3DFaces

+ parfois N Elements 2D (parfois dans les Sous-Blocs) que je ne veux pas garder !?

 

Bon WE a TOUS et La Sante, Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Cette version traite récursivement les blocs imbriqués

 

EDIT: version corrigée, il y avait une faute d'orthographe ("AcDbblockReference" au lieu de "AcDbBlockReference")

 

(defun c:Block_3D_Only (/ doc blocks lst ss)
 (vl-load-com)

 ;; obtenir le document actif et sa collection de définitions de bloc
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
       blocks (vla-get-blocks doc)
 )

 ;; supprimer récursivement de la définition de bloc tous les objets autres que :
 ;; solide 3d, surfaces, maillages, polylignes 3d, faces 3d.
 (defun remove2dobjects (block)
   (vlax-for ent block
     (if
       (not
         (wcmatch
           (vla-get-ObjectName ent)
           "*3dSolid,*Surface,*Mesh,*3dPolyline,*Face"
         )
       )
        (if (= (vla-get-ObjectName ent) "AcDbBlockReference")
          (remove2dobjects
            (vla-Item blocks (vla-get-EffectiveName ent))
          )
          (vla-delete ent)
        )
     )
   )
 )
 
 ;; démarrer un groupe d'annulation
 (vla-StartUndoMark doc)
 ;; si l'utilisateur sélectionne des block
 (if (ssget  (list (cons 0 "INSERT")))
   (progn
     ;; collecter les noms des blocs sans doublons
     (vlax-for br (setq ss (vla-get-activeselectionset doc))
       (or (member (vla-get-effectivename br) lst)
           (setq lst (cons (vla-get-effectivename br) lst))
       )
     )
     ;; supprimer le jeu de sélection
     (vla-delete ss)
     ;; pour chaque nom de bloc de la liste
     (foreach name lst
       ;; pour chaque entité contenue dans la définition de bloc
       (remove2dobjects (vla-Item blocks name))
     )
     ;; régénérer la fenêtre active
     (vla-regen doc acActiveViewport)
   )
 )
 ;; terminer le groupe d'annulation
 (vla-EndUndoMark doc)
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

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é