.NET

Reply
Member
ZeusInfo
Posts: 4
Registered: ‎04-13-2013
Message 1 of 6 (482 Views)
Accepted Solution

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

482 Views, 5 Replies
04-13-2013 04:04 PM

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...

*Expert Elite*
_gile
Posts: 2,071
Registered: ‎04-29-2006
Message 2 of 6 (458 Views)

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

04-13-2013 11:57 PM 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
Member
ZeusInfo
Posts: 4
Registered: ‎04-13-2013
Message 3 of 6 (451 Views)

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

04-14-2013 03:29 AM 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...

 

 

 

*Expert Elite*
_gile
Posts: 2,071
Registered: ‎04-29-2006
Message 4 of 6 (446 Views)

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

04-14-2013 04:09 AM 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
Member
ZeusInfo
Posts: 4
Registered: ‎04-13-2013
Message 5 of 6 (442 Views)

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

04-14-2013 04:47 AM in reply to: _gile
Merci bcp
Je vais faire ça et je vous tiens au courant.
Merci aussi pour la réactivité.
Member
ZeusInfo
Posts: 4
Registered: ‎04-13-2013
Message 6 of 6 (433 Views)

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

04-14-2013 07:52 AM 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.


You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community