Всем привет!!!
С наступившим 2017 годом!
Желаю всем добра, успехов и благополучия во всем!
Устал от выходных. Сегодня уже решил поработать.
Вот столкнулся с такой проблемкой.
Когда я открываю базу чертежа через функцию Database.ReadDwgFile(...)
то чтение свойства (Entity as DbText).GeometricExtents выдает исключение eInvalidExtents.
У меня такое подозрение, что свойство GeometricExtents
связано с контекстом графического устройства (hDC),
а т.к. база просто читается, а сам dwg-файл не загружается
в графическую среду AutoCAD, то и свойство не может быть возвращено.
метод открытия базы
Public Function OPEN_DATABASE(dwgFileName As String) As Database
Dim db As Database = Nothing
Dim acadHost As New DwgHost
Try
db = New Database
Catch ex As Exception
Return Nothing
End Try
HostApplicationServices.WorkingDatabase = db
Try
db.ReadDwgFile(dwgFileName, IO.FileShare.ReadWrite, False, Nothing)
Return db
Catch ex As System.Exception
MsgBox("Не могу прочесть данные из файла " & dwgFileName & vbCr & ex.Message)
db.Dispose()
Return Nothing
End Try
End Function
Public Class DwgHost
Inherits HostApplicationServices
Public Sub New()
RuntimeSystem.Initialize(Me, 1033)
End Sub
Protected Overrides Sub Finalize()
RuntimeSystem.Terminate()
MyBase.Finalize()
End Sub
Public Overrides Function FindFile(fileName As String, _
database As CAD_DBS.Database, _
hint As CAD_DBS.FindFileHint) As String
Return ""
End Function
End Class
метод чтения таблицы примитивов:
static void acadnet_load_Texts(Database db) {
if (db != null) {
using (Transaction tr = db.TransactionManager.StartTransaction()) {
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
BlockTableRecordEnumerator enu = ms.GetEnumerator();
enu.Reset();
while (enu.MoveNext()) {
DBObject obj = tr.GetObject(enu.Current, OpenMode.ForWrite);
if (obj is DBText) {
Extents3d Ext3d = (obj as DBText).GeometricExtents; // В этой строке исключение eInvalidExtents
}
}
tr.Commit();
}
}
}
Тестовая команда
<CommandMethod("TXT_LOAD")> _
Public Sub COMM_DWG_LOAD()
Dim db As Database = OPEN_DATABASE("C:\File.dwg")
If db IsNot Nothing Then
acadnet_load_Texts(db)
End If
End Sub