Author Topic: Object ID and Entity  (Read 19501 times)

0 Members and 1 Guest are viewing this topic.

Helsinki_Dave

  • Guest
Re: Object ID and Entity
« Reply #15 on: May 13, 2011, 09:52:24 AM »
Well, I went back to some code that Jeff put out some place; I thought it might clarify the problem in my head and with you guys.
I believe that what is below will get a single Classification on a single Entity (thanks Jeff) but what I can't understand is how to pull a value off this. I can get as far as finding the ObjectID of exactly one classification on exactly one entity. Very cool.

But now it is not clear to me how to find the assigned value of the Classification. This value is assigned within ACA by the user. As you know, there is no such thing as ObjectID.Value

To be concise - how can I can determine what Category each AecDbSpace has. I can get each AecDbSpace's 'Category', but I can't see where I can read what the actual Category is (eg Building, Block etc)

Code: [Select]
'many thanks to Jeff H
Imports System
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.EditorInput

Imports ObjectId = Autodesk.AutoCAD.DatabaseServices.ObjectId


Imports AecDbSrvcs = Autodesk.Aec.DatabaseServices
Imports ArchDbSrvcs = Autodesk.Aec.Arch.DatabaseServices

Imports Autodesk.Aec.PropertyData.DatabaseServices
Imports Autodesk.Aec.DatabaseServices


<Assembly: CommandClass(GetType(MEPExamplesVB.MyCommands))>
Namespace MEPExamplesVB
    Public Class MyCommands
        <CommandMethod("GetSpaceDataVB")> _
        Public Sub GetSpaceDataVB()
            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            Using trx As Transaction = db.TransactionManager.StartTransaction()

                Dim mdlSpace As BlockTableRecord = SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject(OpenMode.ForRead)

                For Each objId As ObjectId In mdlSpace

                    If objId.ObjectClass.Name = "AecDbSpace" Then

                        Dim spce As ArchDbSrvcs.Space = trx.GetObject(objId, OpenMode.ForRead)

                        Dim Ret_TClass As ObjectId = GetClassifID("Category")

                        Dim RetrClassID As ObjectId = Autodesk.Aec.DatabaseServices.ClassificationDefinition.GetClassification(spce, Ret_TClass)

                        'I dont what to do from here. I need to find the value of this Classficiation.

                        Dim spceStyle As ArchDbSrvcs.SpaceStyle = trx.GetObject(spce.StyleId, OpenMode.ForRead)

                        'ed.WriteMessage(String.Format("{0}This Space Name: {1} Area: {2} and is on Stlye?: {3}", _
                        'vbCrLf, spce.Name, spce.Area, spceStyle.Name))

                        Dim spc_ownerID As ObjectId = spce.OwnerId

                        If spc_ownerID.ObjectClass.Name = "AecDbSpace" Then

                            Dim plg As AecDbSrvcs.Polygon = trx.GetObject(spc_ownerID, OpenMode.ForRead)

                        End If
                    End If

                Next
            End Using
        End Sub


#Region "GetClassficationId"
    'we need to
    'takes the AecDbSpace object <id>
    'takes the ClassficiationName <TargClasName>
    'returns the objectid for the targeted classification
    Public Function GetClassifID(ByVal TargClasName As String) As ObjectId

        Dim doc As Document = Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Dim TargetClassID As ObjectId
            Dim ed As Editor = doc.Editor

        Using trx As Transaction = db.TransactionManager.StartTransaction()

                Dim classDefDictionary As New DictionaryClassificationDefinition(db)

            Dim objectIds As Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection = classDefDictionary.Records

            For Each objId As ObjectId In objectIds

                Dim classDef As ClassificationDefinition = trx.GetObject(objId, OpenMode.ForRead)

                If classDef.AppliesToFilter.Contains("AecDbSpace") Then
                        'ed.WriteMessage(vbCrLf & classDef.Name)
                    If classDef.Name = TargClasName Then
                        TargetClassID = classDef.ObjectId
                        'GetClassifications(classDef.ClassificationTree)
                    End If
                End If
            Next
            trx.Commit()
        End Using
        Return TargetClassID
    End Function
#End Region
    End Class
End Namespace

Jeff H

  • Needs a day job
  • Posts: 6144
Re: Object ID and Entity
« Reply #16 on: May 13, 2011, 07:57:21 PM »
This is probably not the best way I was just looking at it with AECMgd and the function you were trying to use.

Since the classifications are set with style it seems there will be a easy way to grab it using the style.


Here is what this does it searches the DictionaryClassificationDefinition for "Category" and once found assigns the ObjectID to a variable that will be used as ClassificationDefinition ID.

Then it iterates through model space and if it is a space object it gets the classification using GetClassification() with the space object and ClassificationDefinition ObjectId as its arguments

Code: [Select]
        <CommandMethod("GetClassificationWithDefinition")> _
        Public Sub GetClassificationWithDefinition()

            Dim doc As Document = Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor

            Dim classficationDefId As ObjectId

            Using trx As Transaction = db.TransactionManager.StartTransaction()

                Dim classDefDictionary As New DictionaryClassificationDefinition(db)

                Dim objectIds As Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection = classDefDictionary.Records

                For Each objId As ObjectId In objectIds

                    Dim classDef As ClassificationDefinition = trx.GetObject(objId, OpenMode.ForRead)

                    If classDef.Name = "Category" Then
                        classficationDefId = classDef.ObjectId
                        Exit For
                    End If

                Next


                Dim mdlSpace As BlockTableRecord = SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject(OpenMode.ForRead)

                For Each objId As ObjectId In mdlSpace

                    If objId.ObjectClass.Name = "AecDbSpace" Then
                        Dim spce As ArchDbSrvcs.Space = trx.GetObject(objId, OpenMode.ForRead)

                        Dim cls As Classification = trx.GetObject(ClassificationDefinition.GetClassification(spce, classficationDefId), OpenMode.ForRead)

                        ed.WriteMessage(String.Format("{0}This Classification is: {1} ", vbCrLf, cls.Name))

                    End If

                Next



                trx.Commit()

            End Using
        End Sub



Output from your drawing

Quote

This Classification is: Block
This Classification is: Block
This Classification is: Block
This Classification is: Block
This Classification is: Block
This Classification is: Block
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Building
This Classification is: Block
This Classification is: Block
« Last Edit: May 14, 2011, 09:26:48 PM by Jeff H »

Helsinki_Dave

  • Guest
Re: Object ID and Entity
« Reply #17 on: May 16, 2011, 05:17:40 AM »
Gents,

It works.
 
with many thanks to mohnston, kaefer and special thanks to Jeff H