Некорректное разбиение блока

Автор Тема: Некорректное разбиение блока  (Прочитано 16732 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Некорректное разбиение блока
« Ответ #15 : 05-11-2020, 15:18:04 »
... не пользоваться этим методом ...
Вы намекаете на написание собственного метода? Или есть готовое решение?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Некорректное разбиение блока
« Ответ #16 : 05-11-2020, 15:19:18 »
... не пользоваться этим методом ...
Вы намекаете на написание собственного метода? Или есть готовое решение?
Намекаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Некорректное разбиение блока
« Ответ #17 : 05-11-2020, 15:28:48 »
А в чём особенность этих ассоциативных массивов? Почему они капризничают?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Некорректное разбиение блока
« Ответ #18 : 05-11-2020, 15:37:27 »
А в чём особенность этих ассоциативных массивов? Почему они капризничают?
Это не они капризничают, а просто их какие-то особенности не учли при написании метода explodeToOwnerSpace.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Некорректное разбиение блока
« Ответ #19 : 05-11-2020, 20:39:09 »
Создал свой метод на основе deepCloneObjects + трансформации. Результат абсолютно идентичный работе explodeToOwnerSpace - все вложенные в блок массивы при таком расчленении разбегаются. Обычные вложенные блоки разбиваются корректно. Вопрос: возможно надо влезать куда-то в AcDbAssocArrayActionBody и брать оттуда какие-то трансформации? Оговорка: я оперирую массивом как AcDbBlockReference.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Некорректное разбиение блока
« Ответ #20 : 05-11-2020, 23:10:30 »
Debalance,
А это тебе не подходит: AcDbAssocArrayActionBody::explode() ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Некорректное разбиение блока
« Ответ #21 : 05-11-2020, 23:21:21 »
Вопрос: возможно надо влезать куда-то в AcDbAssocArrayActionBody и брать оттуда какие-то трансформации?
AcDbAssocArrayItem::getTransform возвращают матрицы трансформации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Некорректное разбиение блока
« Ответ #22 : 06-11-2020, 12:41:39 »
Тут какая-то забавная фигня получается. Короче проблему я, вроде, решил. Получается, что сам ассоциативный массив разбивается корректно. Некорректно разбивается материнский блок, содержащий данный массив. Причём некорректность разбиения выражается исключительно в смещении вставки блока ассоциативного массива (все остальные объекты внутри материнского блока разбиваются корректно). Собственно решение заключается в следующем: матрицу преобразования (полученную из материнского блока) надо инвертировать при трансформации ассоциативного массива. А для всех остальных объектов нужна исходная неинверсная матрица. С чем это связано - для меня загадка, но это факт.

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Некорректное разбиение блока
« Ответ #23 : 06-11-2020, 12:58:11 »
Вот такой кусок код получается:

Код - C++ [Выбрать]
  1. //Исходный материнский блок
  2. AcDbBlockReference* pBref = AcDbBlockReference::cast(pRx);
  3. AcDbBlockTableRecordPointer pRecord2(pBref->blockTableRecord(), AcDb::kForRead);
  4. if (pRecord2.openStatus() == Acad::eOk)
  5. {
  6.         // Получаем матрицу
  7.         AcGeMatrix3d xform = pBref->blockTransform();
  8.         AcGePoint3d pt3dBlkOrigin = pRecord2->origin();
  9.         // Учитываем возможность ненулевой базовой точки блока (Block Definition)
  10.         if (pt3dBlkOrigin != AcGePoint3d::kOrigin)
  11.         {
  12.                 AcGeVector3d xformOrigin = xform.translation();
  13.                 AcGeVector3d vectorOrigin(pt3dBlkOrigin.x, pt3dBlkOrigin.y, pt3dBlkOrigin.x);
  14.                 vectorOrigin.transformBy(xform);
  15.                 xformOrigin -= vectorOrigin;
  16.                 xform.setTranslation(xformOrigin);
  17.         }
  18.  
  19.         // Получаем инверсную матрицу
  20.         AcGeMatrix3d xform2 = xform;
  21.         xform2.invert();
  22.  
  23.         // Считываем объекты из материнского блока
  24.         AcDbObjectIdArray  objList2;
  25.         AcDbBlockTableRecordIterator* TmpIter2 = NULL;
  26.         pRecord2->newIterator(TmpIter2);
  27.         if (TmpIter2)
  28.         {
  29.                 TmpIter2->start();
  30.                 while (!TmpIter2->done())
  31.                 {
  32.                         AcDbObjectId TmpId;
  33.                         if (TmpIter2->getEntityId(TmpId) == Acad::eOk)
  34.                         {
  35.                                 objList2.append(TmpId);
  36.                         }
  37.                         TmpIter2->step();
  38.                 }
  39.         }
  40.         pRecord2.close();
  41.  
  42.         // Выполняем клонирование
  43.         AcDbIdMapping idMap2;
  44.         CurDB->deepCloneObjects(objList2, InputBtrId, idMap2);
  45.  
  46.         // Делаем трансформации
  47.         AcDbIdMappingIter iter(idMap2);
  48.         for (iter.start(); !iter.done(); iter.next())
  49.         {
  50.                 AcDbIdPair idPair;
  51.                 iter.getMap(idPair);
  52.                 if (idPair.isCloned())
  53.                 {
  54.                         AcDbObjectPointer<AcDbEntity> pClone(idPair.value(), AcDb::kForRead);
  55.                         if (pClone.openStatus() == Acad::eOk)
  56.                         {
  57.                                 if (AcDbAssocArrayActionBody::isAssociativeArray(pClone))
  58.                                 {
  59.                                         // Если объект массив - применяем инверсную матрицу
  60.                                         AcDbAssocArrayActionBody* pArrayActionBody = NULL;
  61.                                         AcDbObjectId actionBodyId = AcDbAssocArrayActionBody::getControllingActionBody(pClone, NULL);
  62.                                         if ((acdbOpenAcDbObject((AcDbObject*&)pArrayActionBody, actionBodyId, AcDb::kForWrite)) == Acad::eOk)
  63.                                         {
  64.                                                 pArrayActionBody->transformBy(xform2);
  65.                                                 pArrayActionBody->close();
  66.                                         }
  67.                                 }
  68.                                 else
  69.                                 {
  70.                                         // Для всех остальных случаев применяем исходную матрицу
  71.                                         if (pClone->upgradeOpen() == Acad::eOk)
  72.                                         {
  73.                                                 pClone->transformBy(xform);
  74.                                         }
  75.                                 }
  76.                         }
  77.                 }
  78.         }
  79. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Некорректное разбиение блока
« Ответ #24 : 06-11-2020, 13:10:25 »
Debalance,
Странно конечно, хотя возможно какая-то логика в этом есть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение