mercredi 5 juin 2013

Créer un tableau sur ZWCAD, et savoir filtrer des données en fonction des calques

Pour cet exemple, j’ai décidé de faire en sorte que l’on manipule des polylignes. Tout d’abord nous allons rechercher les calques présent dans le dessin ZWCAD.


Lorsque l’on appuie sur le bouton “Choisir Objet”, on récupère tout d’abord la liste des calques présent sur le dessin dans un tableau, pour ensuite les ajouter à notre ComboBox.


Ainsi notre boite de dialogue devra ressembler, à celle présentée ci-dessous:





On créer une classe “Calque” qui recherchera les calques:


Public Class Calque
    Public Function SearchLayer(ByRef TabCal() As String)
       Dim zcDoc As Document = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
       Dim zcDB As Database = zcDoc.Database
       Dim ed As Editor = zcDoc.Editor
       Dim i As Integer = 0
       Using zcTran As Transaction = zcDB.TransactionManager.StartTransaction
           Dim lt As LayerTable
           lt = zcTran.GetObject(zcDB.LayerTableId, OpenMode.ForRead)
           For Each l As ObjectId In lt
               Dim zxlt As LayerTableRecord
               zxlt = zcTran.GetObject(l, OpenMode.ForRead)
               If i <= TabCal.Length Then
                   TabCal(i) = zxlt.Name
               End If
               i = i + 1
           Next
       End Using
       Return TabCal
    End Function
End Class


Ici on définit une variable ‘lt’ de sorte que l’on puisse accéder aux ID des calques du dessin, que l’on stocke dans un tableau (on y enregistre le nom de chaque calques). Ensuite on retourne ce tableau. Une fois ce tableau retourné, on parcourt ce tableau afin de d’ajouter des éléments à la ComboBox en fonction des calques présent dans le tableau.


Ensuite, on donne la possibilité de sélectionner des objets dans un dessin ZWCAD.


On créer alors une classe “Polyligne”,  où on va réutiliser le même principe que celui utilisé avec la classe “Calque”. 


Public Class Polyligne
    Public Shared Function SearchPolyline(ByRef psr As SelectionSet, ByVal aire As Array)
       Dim zcDoc As Document = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
       Dim zcDB As Database = zcDoc.Database
       Dim ed As Editor = zcDoc.Editor
       Dim comp As Integer = 0
       Using zcTran As Transaction = zcDB.TransactionManager.StartTransaction
           For Each zcObj As SelectedObject In psr
               Dim item As Polyline = zcTran.GetObject(zcObj.ObjectId, OpenMode.ForRead)
               'dlg.ListBoxName.Items.Add(item.Name.ToString))
               aire(comp, 0) = item.Area.ToString
               aire(comp, 1) = item.ZcadObject.length.ToString
               aire(comp, 2) = item.Layer.ToString
               comp = comp + 1
           Next
       End Using
       Return aire
       ' Return comp
    End Function
End Class



On  définit une variable ‘item’ de sorte que l’on accède aux polylignes présentes dans le dessin ZWCAD. On enregistre l’aire, la longueur et le calque de chaque polylignes trouvé dans le dessin, dans un tableau à  2 dimensions. On retourne ce tableau.




Dans notre boite dialogue, nous devons avoir un code similaire à celui-ci pour notre bouton “Choisir Objets”:


Public Sub Position_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonObj.Click
       Dim c As Calque = New Calque
       'initialisation du tableau
       Dim TabCal As String() = New String(25) {}
       For i As Integer = 0 To TabCal.Length - 1
           TabCal(i) = ""
       Next
       c.SearchLayer(TabCal)
       'On complete les textbox de notre boite de dialogue par les noms des claques du dessin
       For i As Integer = 0 To TabCal.Length - 1
           If TabCal(i) <> "" Then
               Me.ComboBoxCalque.Items.Add(TabCal(i))
           End If
       Next
       Dim ed As ZwSoft.ZwCAD.EditorInput.Editor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
       Dim psr As PromptSelectionResult = ed.GetSelection()
       If psr.Status = PromptStatus.OK Then
           Dim acSSet As SelectionSet = psr.Value
           Polyligne.SearchPolyline(acSSet, test)
       End If
       Me.Show()
    End Sub

Il faut néanmoins déclarer un tableau dans la classe de notre boite de dialogue.
Dim test(10, 2) As String


Ensuite, on va créer un tableau au sein de ZWCAD, contenant les polylignes en fonction du calque choisit dans le ComboBox. Dans la classe dela boite de dialogue, nous allons rajouter un évènement lors du clic sur le bouton “Generer un tableau”:


    Public Sub Position_Click_Tab(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTab.Click
       Dim ed As ZwSoft.ZwCAD.EditorInput.Editor = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
       Dim pr As PromptPointResult = ed.GetPoint(vbLf & "Entre le point d insertion du tableau: ")
       If pr.Status = PromptStatus.OK Then
           Dim cb As String = Me.ComboBoxCalque.SelectedItem
           Tableau.CreateTable(test, pr, cb)
       End If
    End Sub

On donne accès au dessin de manière à ce que l’on puisse rentrer un point d’insertion pour notre tableau.


Pour pouvoir créer un tableau sous ZWCAD, nous allons créer une classe “Tableau”. Dans cette classe ‘Tableau’, il faut utiliser un tableau de ‘String’ et utiliser la classe ‘Table’.

Dans les déclarations, j'ai utilisés les variables suivantes:


        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim ed As Editor = doc.Editor
        Dim d As Integer = 0
        Dim r As Double = 0.0
        Dim c As Double = 0.0
        Dim TotalAire As Double = 0
        Dim TotalSH As Double = 0.0
        Dim TotalSNH As Double = 0.0

        Dim pco As PromptCornerOptions = New PromptCornerOptions("Specifiez le premier point :", pr.Value)
        Dim pcr As PromptPointResult = ed.GetCorner(pco)


Nous allons utiliser la classe ‘Table’ de la manière suivante:


       Dim tb As New Table()
       tb.TableStyle = db.Tablestyle
       tb.NumRows = 4
       tb.NumColumns = 2
       tb.SetRowHeight((pr.Value.Y - pcr.Value.Y) / tb.NumRows)
       r = (pr.Value.Y - pcr.Value.Y) / tb.NumRows
       tb.SetColumnWidth((pcr.Value.X - pr.Value.X) / tb.NumColumns)
       c = (pcr.Value.X - pr.Value.X) / tb.NumColumns
       tb.Position = pr.Value


On y définit le nombre de colonnes, le nombre de lignes, la hauteur des lignes et la largeur des colonnes. Pour ce qui concerne la hauteur des lignes et la largeur des colonnes, j’ai essayé de faire en sorte que celle-ci s’adapte en fonction de la taille de notre tableau.


Pour notre tableau de ‘String’, nous allons procéder de la manière suivante:


Tout d’abord, on filtre les calques de notre tableau passé en paramètre, de manière à calculer les aires SH et SNH:


       'initialisation du tableau
       For i As Integer = 0 To Aire.Length / 10
           If Aire(i, 2) = "SH" Then
               TotalSH = TotalSH + Aire(i, 0)
           End If
           If Aire(i, 2) = "SNH" Then
               TotalSNH = TotalSNH + Aire(i, 0)
            End If
       Next

Ensuite, nous allons créer un tableau de sorte qu’il contienne toutes les données que l’on souhaite faire apparaitre dans notre tableau ZWCAD.



   
       Dim str As String(,) = New String(3, 1) {}
       str(0, 0) = ""
       str(0, 1) = "Aire"
       str(1, 0) = "Total SH"
       str(1, 1) = FormatNumber(Convert.ToDouble(TotalSH), 2)
       str(2, 0) = "Total SNH"
       str(2, 1) = FormatNumber(Convert.ToDouble(TotalSNH), 2)
       TotalAire = TotalSH + TotalSNH
       str(3, 0) = "Total :"
       str(3, 1) = FormatNumber(Convert.ToDouble(TotalAire), 2)


Maintenant, il ne nous reste plus qu’à ajouter les éléments de tableau à 2 dimensions à notre ‘Table’.



       For i As Integer = 0 To 3
           For j As Integer = 0 To 1
               tb.SetTextHeight(i, j, (r / 2))
               tb.SetTextString(i, j, str(i, j))
               tb.SetAlignment(i, j, CellAlignment.MiddleCenter)
           Next
       Next
       tb.GenerateLayout()


Enfin, on n'oublie d'ajouter le tableau à la base de donnée du dessin:

 
        Dim tr As Transaction = doc.TransactionManager.StartTransaction()

        Using tr


            Dim bt As BlockTable = DirectCast(tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead), BlockTable)


            Dim btr As BlockTableRecord = DirectCast(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
            btr.AppendEntity(tb)
            tr.AddNewlyCreatedDBObject(tb, True)

            tr.Commit()

        End Using

 Désormais on va essayer de créer un dessin ressemblant à celui-ci, où on a créer 2 calques SH et SNH, et générer un tableau:




Ensuite on clique sur générer notre tableau, et lorsque l'on insert le tableau, on devrait avoir un tableau sous la forme suivante:



Aucun commentaire:

Enregistrer un commentaire