Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 04-01-2017, 12:49:32

Название: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 04-01-2017, 12:49:32
Всем привет!!!
С наступившим 2017 годом!
Желаю всем добра, успехов и благополучия во всем!

Устал от выходных. Сегодня уже решил поработать.
Вот столкнулся с такой проблемкой.
Когда я открываю базу чертежа через функцию Database.ReadDwgFile(...)
то чтение свойства (Entity as DbText).GeometricExtents выдает исключение eInvalidExtents.

У меня такое подозрение, что свойство GeometricExtents
связано с контекстом графического устройства (hDC),
а т.к. база просто читается, а сам dwg-файл не загружается
в графическую среду AutoCAD, то и свойство не может быть возвращено.

метод открытия базы
Код - vb.net [Выбрать]
  1.     Public Function OPEN_DATABASE(dwgFileName As String) As Database
  2.         Dim db As Database = Nothing
  3.         Dim acadHost As New DwgHost
  4.         Try
  5.             db = New Database
  6.         Catch ex As Exception
  7.             Return Nothing
  8.         End Try
  9.         HostApplicationServices.WorkingDatabase = db
  10.         Try
  11.             db.ReadDwgFile(dwgFileName, IO.FileShare.ReadWrite, False, Nothing)
  12.             Return db
  13.         Catch ex As System.Exception
  14.             MsgBox("Не могу прочесть данные из файла " & dwgFileName & vbCr & ex.Message)
  15.             db.Dispose()
  16.             Return Nothing
  17.         End Try
  18.     End Function
  19.  
  20.     Public Class DwgHost
  21.         Inherits HostApplicationServices
  22.         Public Sub New()
  23.             RuntimeSystem.Initialize(Me, 1033)
  24.         End Sub
  25.         Protected Overrides Sub Finalize()
  26.             RuntimeSystem.Terminate()
  27.             MyBase.Finalize()
  28.         End Sub
  29.         Public Overrides Function FindFile(fileName As String, _
  30.                                            database As CAD_DBS.Database, _
  31.                                            hint As CAD_DBS.FindFileHint) As String
  32.             Return ""
  33.         End Function
  34.     End Class


метод чтения таблицы примитивов:
Код - C# [Выбрать]
  1.         static void acadnet_load_Texts(Database db) {
  2.             if (db != null)  {
  3.                 using (Transaction tr = db.TransactionManager.StartTransaction())  {
  4.                     BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  5.                     BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  6.                     BlockTableRecordEnumerator enu = ms.GetEnumerator();
  7.                     enu.Reset();
  8.                     while (enu.MoveNext()) {
  9.                         DBObject obj = tr.GetObject(enu.Current, OpenMode.ForWrite);
  10.                         if (obj is DBText) {
  11.                             Extents3d Ext3d = (obj as DBText).GeometricExtents; // В этой строке исключение eInvalidExtents
  12.                         }
  13.                     }
  14.                     tr.Commit();
  15.                 }
  16.             }
  17.         }

Тестовая команда
Код - vb.net [Выбрать]
  1. <CommandMethod("TXT_LOAD")> _
  2.         Public Sub COMM_DWG_LOAD()
  3.             Dim db As Database = OPEN_DATABASE("C:\File.dwg")
  4.             If db IsNot Nothing Then
  5.                 acadnet_load_Texts(db)
  6.            End If
  7.         End Sub


Название: Re: eInvalidExtents RealDWG
Отправлено: Александр Ривилис от 04-01-2017, 13:59:52
Такое исключение возникает для пустых текстов, определений атрибутов (они наследники DBText), атрибутов блоков. Проверь тоже самое в AutoCAD - думаю, что будет тоже самое исключение.
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 04-01-2017, 14:25:36
Такое исключение возникает для пустых текстов, определений атрибутов (они наследники DBText), атрибутов блоков. Проверь тоже самое в AutoCAD - думаю, что будет тоже самое исключение.
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 04-01-2017, 14:27:34
возникает для пустых текстов

В том то и дело, что я проверил текст не пустой.
А если файл открыт в среде AutoCAD такого исключения
не возникает всех работает хорошо.
Название: Re: eInvalidExtents RealDWG
Отправлено: Александр Ривилис от 04-01-2017, 16:53:16
А если файл открыт в среде AutoCAD такого исключения
не возникает всех работает хорошо.
Я имел в виду не открывать в редакторе AutoCAD, а также, как и в RealDWG, открыть в AutoCAD через Database.ReadDwgFile.
P.S.: У меня нет лицензии RealDWG, поэтому с ним я помочь не смогу и тебе придётся или создавать case в ADN DevHelp и писать в Tech Soft 3D (http://www.techsoft3d.com/)
Название: Re: eInvalidExtents RealDWG
Отправлено: Александр Ривилис от 04-01-2017, 17:11:07
Кстати, вместо метода GeometricExtents можешь попробовать метод Bounds.

Название: Re: eInvalidExtents RealDWG
Отправлено: Александр Ривилис от 04-01-2017, 17:20:21
У меня такое подозрение, что свойство GeometricExtents
связано с контекстом графического устройства (hDC),
а т.к. база просто читается, а сам dwg-файл не загружается
в графическую среду AutoCAD, то и свойство не может быть возвращено.
Возможно, хотя и маловероятно. Скорее другое - ненаходится файл шрифта. В AutoCAD бывает аналогичная ситуация. Возможно если ты переопределишь для DwgHost метод FindFile так, чтобы он мог возвращать путь к файлу шрифта, а не пустую строку, то это может помочь.
Пример DwgHost: http://adndevblog.typepad.com/autocad/2012/05/fentons-recommended-hostapplicationservices-implementation-for-realdwg-net.html
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 05-01-2017, 11:17:19
Я еще обратил внимание на то что для в оном файле работает хорошо,
а в другом - с ошибкой.
Буду разбираться дальше.
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 05-01-2017, 11:21:30
Скорее другое - ненаходится файл шрифта
Да, действительно не найден файл шрифта RUSSIAN_1251.shx
Сейчас попробую заменить другим шрифтом или или вставить файл шрифта в папку ..\Fonts

Функция
public SizeF MeasureString(string text, Font font)
Связанна же со шрифтом.
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 05-01-2017, 11:59:43
Спасибо, действительно причина была в шрифте.
После того как добавил шрифт. Все заработало.

Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 05-01-2017, 12:11:43
Только мне нужно было по такой схеме тестовую команду TXT_LOAD сделать

Код - C# [Выбрать]
  1.     // 1) Запомнить текущую базу активного документа
  2.     Database old_db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  3.      // 2) создать базу и присвоить ее рабочей    
  4.     Database db = new Database();
  5.     HostApplicationServices.WorkingDatabase = db;
  6.     // 3) открыть базу    
  7.     db.ReadDwgFile(...);
  8.     // 4) ... поработать с ней
  9.     db.Dispose();
  10.     // 5) Вернуть обратно
  11.     HostApplicationServices.WorkingDatabase = old_db;
Название: Re: eInvalidExtents RealDWG
Отправлено: Александр Ривилис от 05-01-2017, 18:07:35
Спасибо, действительно причина была в шрифте.
После того как добавил шрифт. Все заработало.
Так и отметим.
Название: Re: eInvalidExtents RealDWG
Отправлено: Алексей (IdeaSoft) от 08-01-2017, 03:09:39
В продолжение этой темы. У меня такой Вопрос.
Шрифт RUSSIAN_1251.shx в папку c:\windows\Fonts устанавливается конечно же не будет.

А есть ли аналог этого шрифта для ОС Windows?