.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to iterate through items of a block reference in Dotnet ?

5 REPLIES 5
SOLVED
Reply
Message 1 of 6
ZeusInfo
1763 Views, 5 Replies

How to iterate through items of a block reference in Dotnet ?

Hi,

 

I'm a newbie in dotnet and want  to now if is possible to iterate through items of a block reference.

 

My problem is the following : I explode a block reference in dotnet (it works well) and I want to change the items layer that compose the bloc reference. It's the reason why i need to browse items of this block.

 

If sombody have another solution, I take it.

 

Thak you in advance for your help...

5 REPLIES 5
Message 2 of 6
_gile
in reply to: ZeusInfo

Hi,

 

It seems to me you do not completely understand what a block reference is an what are the differences and relationship between block definitions (BlockTableRecord object in .NET) and block references (BlockReference).

 

A block reference does not contains entities, it is only a geometric representation of a block definition.

If you want to change the block components layer, you have to do it within the block definition itereting it (without exploding nothing) and the changes will affect all the inserted references.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 3 of 6
ZeusInfo
in reply to: ZeusInfo

Bonjour Gile,

 

Merci de ta réponse si rapide.

 

Je suis tout à fait d'accord sur le fait que je n'ai pas tout à fait compris la notion de block reference et c'est d'ailleurs pour cette raison que je solicite votre aide.

 

J' ai lu plusieurs de vos tutoriaux et j'avoue que cela m'a permis d'avancer sur pas mal de point.

 

Je vais essayer de vous expliquer mon problème en français :

 

1 - J'ai besoin d'exploser un block qui est inséré dans mon desssin (dans mon model_space) , jusqu'ici ça va

2 - mais ce block contient plusieurs solides qui ont des layers différents et pour cela, je voudrais pouvoir leur (solides) attribuer le même layer que celui du block d'origine.

 

voici le code

1 -

Public Sub ExplodeBlockOfSameLayerInModelSpace()
            Dim zDlg As Form_EBL = New Form_EBL()
            Dim zResult As System.Windows.Forms.DialogResult = AcadAp.ShowModalDialog(zDlg)
            Dim zDoc As Document = Application.DocumentManager.MdiActiveDocument
            Dim zDb As Database = zDoc.Database
            Dim zEd As Editor = zDoc.Editor
           
            If zResult = Windows.Forms.DialogResult.OK Then

                Dim i As Integer = 0

                Using zTrans As Transaction = zDb.TransactionManager.StartTransaction()

                    Dim zBlkTbl As BlockTable = zTrans.GetObject(zDb.BlockTableId, OpenMode.ForRead)
                    Dim zBlkTblRec As BlockTableRecord = zTrans.GetObject(zBlkTbl(BlockTableRecord.ModelSpace), OpenMode.ForRead)
                    Dim zBlkCl As RXClass = RXClass.GetClass(GetType(BlockReference))

                    For Each zBlkTblRecId As ObjectId In zBlkTblRec
                        Try

                            If zBlkTblRecId.ObjectClass = zBlkCl Then
                                Dim zBlkRef As BlockReference = TryCast(zTrans.GetObject(zBlkTblRecId, OpenMode.ForWrite, False), BlockReference)

                                If zBlkRef.Layer = zDlg.LstLayer.SelectedItem Then

                                    zEd.WriteMessage(String.Format(vbLf + "Block : {0} -- Id : {1} -- Layer : {2}", zBlkRef.Name, zBlkTblRecId, zBlkRef.Layer))
                                    zBlkRef.ExplodeToOwnerSpace()
                                    zBlkRef.Erase(True)
                                    i = i + 1

                                End If
                            End If
                        Catch ex As SystemException
                            zEd.WriteMessage(vbLf + "Problème rencontré : ", ex.Message())
                        End Try
                    Next
                    zEd.WriteMessage(String.Format(vbLf + "Total des blocs exploxés : {0} ", i))
                    zTrans.Commit()
                End Using
            Else
                zEd.WriteMessage(vbLf + "Opération annulée par l'utulisateur.")
            End If

 En fait un formulaire s'affiche avec la liste de layers spécifiques de blocs que je veux exploser. Une fois les blocs explosés, je voudrais le layer des solides qui composent celui-ci soient le même que le layer du bloc.

J'ai besoin des solides pour une autre utilité.

 

J'espère avoir été suffisament clair dans les détails.

 

Merci d'avance...

 

 

 

Message 4 of 6
_gile
in reply to: ZeusInfo

D'accord, c'est moi qui avait mal compris.

À la place de ExplodeToOwnerSpace(), il faut utiliser la méthode Explode() qui requiert un paramètre de type DBObjectCollection.

 

Pseudo code :

  1. Créer une nouvelle instance de DBObjectCollection
  2. Parcourir l'espace objet comme tu le fais
  3. Appeler Explode() pour chaque bloc à décomposer en lui passant l'intance de DBObjectCollection comme paramètre et effacer le bloc
  4. Pour chaque objet contenu dans l'intance de DBObjectCollection, l'ajouter à l'espace objet et à la transaction (il est impératif d'appeler Dispose() si on ajoute pas l'objet)

 

 



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 5 of 6
ZeusInfo
in reply to: _gile

Merci bcp
Je vais faire ça et je vous tiens au courant.
Merci aussi pour la réactivité.
Message 6 of 6
ZeusInfo
in reply to: _gile

Grâce à vos explications, j'ai réussi à réaliser la 2ème étape de mon projet.

Encore merci pour vos nombreuses contributions.

En passant je me suis inscrit sur cadxp.com mais je ne peux toujours pas répondre ou commencer un sujet. Etant donné que vous faites partie du staff Pourriez-vous me dire le temps d'attente.


Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost