Как получить рамку Bounds для RotatedDimension?

Автор Тема: Как получить рамку Bounds для RotatedDimension?  (Прочитано 6545 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Здравствуйте! Пожалуйста, помогите разобраться.        (AutoCAD 2016 -64, ObjectArx 2016)
Дело такое:  в пространстве модели в ходе выполнения программы образмеривается чертеж детали ( количество и расположение размеров заранее неизвестно ), после этого требуется определить рамку внутри которой расположен чертеж  со всеми размерами и зуммировать по ней эту картинку в видовом экране листа.
Проблема в том, что свойство Bounds для объекта RotatedDimension не работает =Nothing и свойство GeometricExtents тоже ="eInvalidExtents". Пробовал взорвать размер на составные части и по ним определить рамку, но при попытке взрыва выдается ошибка eInvalidInput (т.е. получается метод Explode для RotatedDimension тоже не работает?)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Приложи пример чертежа, чтобы было легче понять о чем идёт речь.
На всякий случай сообщаю, что у меня в AutoCAD 2016 для  RotatedDimension нормальное значение GeometricExtents:



Возможно у тебя некорректный размер. Или размер в блоке, вставка которого имеет неодинаковые масштабные коэффициенты по X, Y, Z
« Последнее редактирование: 17-06-2016, 17:16:07 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Александр, выявилась закономерность: если размер УЖЕ был в документе, то все работает Ок. Но если он создается по-новой (это как раз мой случай), то свойства Bounds и GeometricExtents, а также метод Explode для него не работают.

Вот пример кода:

(Прошу прощение, что он не отформатирован - действовал строго по видеоролику - вставил из студии через Clipboard, выделил, кнопка была отжата, установил код в VB.NET - предварительный просмотр - получилось то, что получилось)


Код - vb.net [Выбрать]
  1. <CommandMethod("Test")> _
  2.         Public Sub RotatedDimension()
  3.             Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.             Dim db As Database = doc.Database
  5.             Using myTrans As Transaction = db.TransactionManager.StartTransaction()
  6.                 Dim bt As BlockTable = myTrans.GetObject(db.BlockTableId, OpenMode.ForRead)
  7.                 Dim btr As BlockTableRecord = myTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  8.                 Dim x As Double
  9.                 ''выбираем существующий размер
  10.                 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  11.                 Dim ss As Autodesk.AutoCAD.EditorInput.SelectionSet = doc.Editor.GetSelection().Value
  12.                 Dim Ent As Entity
  13.                 For Each id As ObjectID In ss.GetObjectIds()
  14.                     Ent = myTrans.GetObject(id, OpenMode.ForRead, True)
  15.                     If Mid(Ent.ToString, 35) = "RotatedDimension" Then
  16.                         x = Ent.Bounds.Value.MinPoint.X  ''''' обращаемся к свойству Bounds - работает прекрасно
  17.                     End If
  18.                 Next id
  19.                 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  20.                 '' создаем размер
  21.                 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  22.                 Dim RotDim As RotatedDimension = New RotatedDimension()
  23.                 RotDim.XLine1Point = New Point3d(0, 0, 0)
  24.                 RotDim.XLine2Point = New Point3d(50, 0, 0)
  25.                 RotDim.Rotation = 0
  26.                 RotDim.DimLinePoint = New Point3d(25, 10, 0)
  27.                 RotDim.DimensionStyle = db.Dimstyle
  28.  
  29.                 btr.AppendEntity(RotDim) : myTrans.AddNewlyCreatedDBObject(RotDim, True)
  30.  
  31.                 x = RotDim.Bounds.Value.MinPoint.X  ''''' обращаемся к свойству Bounds - не работает
  32.                 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  33.                 myTrans.Commit()
  34.             End Using
  35.         End Sub
« Последнее редактирование: 18-06-2016, 12:03:22 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
(Прошу прощение, что он не отформатирован - действовал строго по видеоролику - вставил из студии через Clipboard, выделил, кнопка была отжата, установил код в VB.NET - предварительный просмотр - получилось то, что получилось)
Не получилось ничего. Я исправил (вошел в режим редактирования и сделал то, что в видеоролике). Не знаю, что у тебя за проблемы с браузером.
Теперь смотри как код работает:
Код - vb.net [Выбрать]
  1. <CommandMethod("Test")> _
  2. Public Sub RotatedDimension()
  3.     Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.     Dim db As Database = doc.Database
  5.     Dim idDim As ObjectId = ObjectId.Null
  6.     Dim Ent As Entity
  7.     Dim x As Double
  8.     Using myTrans As Transaction = db.TransactionManager.StartTransaction()
  9.         Dim bt As BlockTable = myTrans.GetObject(db.BlockTableId, OpenMode.ForRead)
  10.         Dim btr As BlockTableRecord = myTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  11.         ''выбираем существующий размер
  12.         '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  13.         Dim ss As Autodesk.AutoCAD.EditorInput.SelectionSet = doc.Editor.GetSelection().Value
  14.         For Each id As ObjectId In ss.GetObjectIds()
  15.             Ent = myTrans.GetObject(id, OpenMode.ForRead, True)
  16.             If TypeOf Ent Is RotatedDimension Then
  17.                 x = Ent.Bounds.Value.MinPoint.X  ''''' обращаемся к свойству Bounds - работает прекрасно
  18.             End If
  19.         Next id
  20.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  21.         '' создаем размер
  22.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  23.         Dim RotDim As RotatedDimension = New RotatedDimension()
  24.  
  25.         RotDim.SetDatabaseDefaults(db)
  26.         RotDim.DimensionStyle = db.Dimstyle
  27.  
  28.  
  29.         RotDim.XLine1Point = New Point3d(0, 0, 0)
  30.         RotDim.XLine2Point = New Point3d(50, 0, 0)
  31.         RotDim.Rotation = 0
  32.         RotDim.DimLinePoint = New Point3d(25, 10, 0)
  33.  
  34.         idDim = btr.AppendEntity(RotDim)
  35.         myTrans.AddNewlyCreatedDBObject(RotDim, True)
  36.  
  37.         'x = RotDim.Bounds.Value.MinPoint.X  ''''' обращаемся к свойству Bounds - не работает
  38.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  39.         myTrans.Commit()
  40.     End Using
  41.     ' В другой транзакции получаем габариты размеров
  42.     Using myTrans As Transaction = db.TransactionManager.StartTransaction()
  43.         Ent = myTrans.GetObject(idDim, OpenMode.ForRead, True)
  44.         Dim x1 As Double = Ent.Bounds.Value.MinPoint.X
  45.         Dim x2 As Double = Ent.Bounds.Value.MaxPoint.X
  46.         myTrans.Commit()
  47.     End Using
  48. End Sub
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Vns 19-06-2016, 08:01:20

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А это вариант с одной транзакцией и использованием метода RecomputeDimensionBlock:

Код - vb.net [Выбрать]
  1. <CommandMethod("Test1")> _
  2. Public Sub RotatedDimension1()
  3.     Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  4.     Dim db As Database = doc.Database
  5.     Dim ed As Editor = doc.Editor
  6.  
  7.     Using myTrans As Transaction = db.TransactionManager.StartTransaction()
  8.         Dim bt As BlockTable = myTrans.GetObject(db.BlockTableId, OpenMode.ForRead)
  9.         Dim btr As BlockTableRecord = myTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
  10.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  11.         '' создаем размер
  12.         ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  13.         Dim RotDim As RotatedDimension = New RotatedDimension()
  14.  
  15.         RotDim.SetDatabaseDefaults(db)
  16.         RotDim.DimensionStyle = db.Dimstyle
  17.         RotDim.XLine1Point = New Point3d(0, 0, 0)
  18.         RotDim.XLine2Point = New Point3d(50, 0, 0)
  19.         RotDim.Rotation = 0
  20.         RotDim.DimLinePoint = New Point3d(25, 10, 0)
  21.  
  22.         ' Заставляем AutoCAD пересчитать размерный блок
  23.         RotDim.RecomputeDimensionBlock(True)
  24.  
  25.         btr.AppendEntity(RotDim)
  26.         myTrans.AddNewlyCreatedDBObject(RotDim, True)
  27.  
  28.         Dim x1 As Double = RotDim.Bounds.Value.MinPoint.X
  29.         Dim x2 As Double = RotDim.Bounds.Value.MaxPoint.X
  30.         ed.WriteMessage("x1 = {0} x2 = {1}", x1, x2)
  31.  
  32.         myTrans.Commit()
  33.     End Using
  34. End Sub
  35.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн VnsАвтор темы

  • ADN OPEN
  • Сообщений: 34
  • Карма: 0
Заработало!

Первый вариант хорош, а второй - супер! Теперь я знаю, что такое RecomputeDimensionBlock.

Спасибо Мэтр, очень выручили!!!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо Мэтр, очень выручили!!!
А почему не отметил ни один из вариантов как Решение? Смотри у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение