Проблема с удалением размеров из ModelSpace

Автор Тема: Проблема с удалением размеров из ModelSpace  (Прочитано 4314 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1702
  • Рыцарь ObjectARX
  • Skype: rivilis
valtur1983,
Похоже ты пока не совсем понимаешь, что делаешь.
1. Что за вложенные транзакции?
2. При копировании копируются не только выбранные примитивы, но и связанные с ними объекты (слои, описания блоков, типы линий и т.д. и т.п). Ты должен проверять obj.Value на Entity и трансформировать только их.
3. Entity - это наследник DBObject. Поэтому преобразование (Entity)dbobj может не выполняться для слоёв, описаний блоков и т.д. Нужно проверять (dbobj as Entity) на null
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 2
valtur1983,
Похоже ты пока не совсем понимаешь, что делаешь.
1. Что за вложенные транзакции?
2. При копировании копируются не только выбранные примитивы, но и связанные с ними объекты (слои, описания блоков, типы линий и т.д. и т.п). Ты должен проверять obj.Value на Entity и трансформировать только их.
3. Entity - это наследник DBObject. Поэтому преобразование (Entity)dbobj может не выполняться для слоёв, описаний блоков и т.д. Нужно проверять (dbobj as Entity) на null

1. С транзакциями конечна беда. Я их всюду использую. В данном контексте я вставленную транзакцию использую для чтения элементов из исходного чертежа, которая вложена в транзакцию вставки в исходный чертеж. Подскажите где можно внятно про эту тему почитать. Я думал, что можно использовать вложенные транзакции и ничего в этом плохого нет.

2 и 3 замечания я так понял связаны. Не пойму в чем отличия проверки obj.Value на Entity и (dbobj as Entity)!=null

Посмотрите пожалуйста код:
Код - C# [Выбрать]
  1. foreach (IdPair obj in iMap)
  2.                 {
  3.                     ObjectId obj1 = obj.Value;
  4.                     DBObject dbobj = tr.GetObject(obj.Value, OpenMode.ForWrite);
  5.                     if (dbobj != null)
  6.                     {
  7.                         Entity ent;
  8.                         if ((dbobj as Entity) != null)
  9.                         {
  10.                             ent = (Entity)dbobj;
  11.                             Vector3d vec = new Vector3d(12000, 594, 0);
  12.                             ent.TransformBy(Matrix3d.Displacement(vec));
  13.                         }
  14.  
  15.                     }
  16.  
  17.                 }
  18.  
  19.  

Ошибка в
Код - C# [Выбрать]
  1. ent.TransformBy(Matrix3d.Displacement(vec));
  2.  

Autodesk.AutoCAD.Runtime.Exception: "eNotApplicable"

obj.Value Name=="AcDbBlockBegin"

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1702
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите где можно внятно про эту тему почитать.
Нигде. Только опыт.
Я думал, что можно использовать вложенные транзакции и ничего в этом плохого нет.
Ничего хорошего в этом нет. Их следует использовать только в крайнем случае, когда без этого не обойтись.
Не пойму в чем отличия проверки obj.Value на Entity и (dbobj as Entity)!=null
(Entity)dbobj вызывает исключение, если dbobj не Entity или его наследник. А (dbobj as Entity) не вызывает исключения, а становится равным null если dbobj не Entity или его наследник.
Ошибка в
Код - C# [Выбрать]

    ent.TransformBy(Matrix3d.Displacement(vec));
     


Autodesk.AutoCAD.Runtime.Exception: "eNotApplicable"

obj.Value Name=="AcDbBlockBegin"
Ага. Ну тут всё понятно. В данном случае ent не в ModelSpace, а в описании блока. Короче говоря тебе нужно проверять, что ent.OwnerId == destBt[BlockTableRecord.ModelSpace]
Лучше всего заранее сохранить это значение:
Код - C# [Выбрать]
  1. ObjectId idModel = destBt[BlockTableRecord.ModelSpace];
и тогда сравнение
Код - C# [Выбрать]
  1. if (ent.OwnerId == idModel) {
  2.  ent.TransformBy(Matrix3d.Displacement(vec));
  3. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 2
Спасибо, все заработало и вставка и удаление

Глюк с удалением размеров был в том что процедура удаления элементов (в том числе и размеров) запускалась внутри транзакции вставки в чертеж. Как только я вынес процедуру за транзакцию все стало работать нормально. Хотя не пойму почему проблема коснулась именно размеров, а все остальное нормально удалилось с чертежа.

Буду впредь внимательнее к транзакциям подходить.

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

  • Administrator
  • *****
  • Сообщений: 13197
  • Карма: 1702
  • Рыцарь ObjectARX
  • Skype: rivilis
Хотя не пойму почему проблема коснулась именно размеров, а все остальное нормально удалилось с чертежа.
Сложный вопрос. Размеры - это сложные примитивы, которые порождают описание связанных с ним блоков. При удалении размеров должны удаляться и описания блоков. Если таблица блоков открыта для чтения, то это может мешать удалению блоков. Вот одна из возможных причин.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение