Перемещение объекта Ole2Frame во внешнем чертеже

Автор Тема: Перемещение объекта Ole2Frame во внешнем чертеже  (Прочитано 12435 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, когда я проверял вариант с Ole2Frame.Position3d, то обратил внимание, что значения всех угловых точек (0,0,0), что крайне странно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Баг подтвердили в ADN DevHelp и передали команде разработчиков. Похоже никакого способа обойти его нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Сколько "радостных" новостей в один день...

Отмечено как Решение Александр Ривилис 13-08-2015, 01:11:55

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А решение было так близко. Нужно заменить
Код - C# [Выбрать]
  1. Database destDb = new Database(false, true);
на
Код - C# [Выбрать]
  1. Database destDb = new Database(false, false);
Во всяком случае в AutoCAD 2015 это работает.
Наткнулся я на это решение, когда мне сообщили, что в чистом ObjectARX это вроде работает.
Когда я сделал отладочный код на C++:
Код - C++ [Выбрать]
  1. static void TransDb(LPCTSTR pathDwgInput, LPCTSTR pathDwgOutput, AcGeVector3d v)
  2. {
  3.         AcDbDatabase *destDb = new AcDbDatabase(false, true);
  4.         destDb->readDwgFile(pathDwgInput, AcDbDatabase::OpenMode::kForReadAndAllShare);
  5.         destDb->closeInput(false);
  6.         {
  7.                 AcDbObjectId modelId = acdbSymUtil()->blockModelSpaceId(destDb);
  8.                 AcDbBlockTableRecordPointer destModel(modelId, AcDb::kForRead);
  9.                 AcGeMatrix3d mat; mat.setToTranslation(v);
  10.                 if (destModel.openStatus() == Acad::eOk) {
  11.                         AcDbBlockTableRecordIterator *pIter = NULL;
  12.                         destModel->newIterator(pIter);
  13.                         if (pIter) {
  14.                                 for (; !pIter->done(); pIter->step()) {
  15.                                         AcDbObjectId eId;
  16.                                         if (pIter->getEntityId(eId) == Acad::eOk) {
  17.                                                 AcDbObjectPointer<AcDbEntity> pEnt(eId, AcDb::kForWrite);
  18.                                                 if (pEnt.openStatus() == Acad::eOk) {
  19.                                                         pEnt->transformBy(mat);
  20.                                                 }
  21.                                         }
  22.                                 }
  23.                                 delete pIter;
  24.                         }
  25.                 }
  26.                 destDb->saveAs(pathDwgOutput, true);
  27.         }
  28.         delete destDb;
  29. }
  30.  
  31. static void MyGroupMoveDb () {
  32.         TransDb(L"C:\\testOle2Frame.dwg",      // Input file
  33.                 L"C:\\testOle2Frame-new.dwg",  // Output file
  34.                 AcGeVector3d(100, 100, 0)     // Displacement
  35.         );
  36. }
Но код работал точно так же, как и на C#.  И только замена
Код - C++ [Выбрать]
  1.         AcDbDatabase *destDb = new AcDbDatabase(false, true);
на
Код - C++ [Выбрать]
  1.         AcDbDatabase *destDb = new AcDbDatabase(false, false);
принесла положительный результат.

Теперь напишу в ADN DevHelp об этом. Халтурщики. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 5
  • Карма: 0
А решение было так близко. Нужно заменить
Код - C# [Выбрать]
  1. Database destDb = new Database(false, true);
на
Код - C# [Выбрать]
  1. Database destDb = new Database(false, false);
Действительно работает. Проверил на AutoCAD 2010 x64 SP2. И это не может не радовать :) Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Причина оказалась банально простой. Ole2Frame жестко завязан на документ (Document/AcApDocument/MFCDocument) и без него редактироваться не может. А конструктор:
Код - C# [Выбрать]
  1. Database destDb = new Database(false, true);
создает базу без соответствующего документа.
Я не заметил разницы в скорости работы программы при двух вариантах работы конструктора, хотя второй вариант должен быть теоретически несколько медленнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение