XREF в блок

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

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
XREF в блок
« : 31-01-2017, 13:08:47 »
Существует ли какой-нибудь относительно простой способ преобразования внешних ссылок (не используя bind) в обычный блок для последующего разбора на примитивы?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #1 : 31-01-2017, 13:24:56 »
Существует ли какой-нибудь относительно простой способ преобразования внешних ссылок (не используя bind) в обычный блок для последующего разбора на примитивы?
Зачем? Внешняя ссылка - это тот же AcDbBlockTableRecord, её вставка AcDbBlockReference. Зачем ещё какие-то манипуляции?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #2 : 31-01-2017, 13:28:50 »
... её вставка AcDbBlockReference. Зачем ещё какие-то манипуляции?
Хотелось бы применить к этому AcDbBlockReference метод AcDbEntity::explode(AcDbVoidPtrArray& entitySet)...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #3 : 31-01-2017, 13:32:50 »
Ну тогда тебе придётся самому эмулировать BIND. Не вижу в этом смысла.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #4 : 31-01-2017, 13:35:11 »
Не вижу в этом смысла.
Не понял в чем? В эмулировании?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #5 : 31-01-2017, 13:58:35 »
Не понял в чем? В эмулировании?
Почему не воспользоваться альтернативой AcDbEntity::explode? Я когда-то делал аналог NCOPY из Express Tools:

Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "dbsymutl.h"
  6. #include "resource.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. #define szRDS _RXST("")
  10. //-----------------------------------------------------------------------------
  11. //----- ObjectARX EntryPoint
  12. class CXrefEntityCloneApp : public AcRxArxApp {
  13. public:
  14.   CXrefEntityCloneApp() : AcRxArxApp() {}
  15.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  16.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  17.     return (retCode);
  18.   }
  19.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  20.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  21.     return (retCode);
  22.   }
  23.   virtual void RegisterServerComponents() {}
  24.  
  25.   static void RivilisNCopy2() {
  26.     AcDbObjectId idCurrentModelSpace =
  27.       AcDbSymbolUtilities::servicesPtr()->blockModelSpaceId(acdbCurDwg());
  28.     AcGePoint3d p;  ads_name en; AcGeMatrix3d mat;  resbuf *rb = nullptr;
  29.     Acad::ErrorStatus es;
  30.     if (acedNEntSelP(L"\nSelect XREF for clone: ", en, asDblArray(p), FALSE, mat.entry, &rb) == RTNORM)
  31.     {
  32.  
  33.       if (!rb) {
  34.         acutPrintf(L"\nIt is not XREF!");
  35.         return;
  36.       }
  37.       AcDbObjectId idSel; acdbGetObjectId(idSel, en);
  38.  
  39.       for (resbuf *rbstart = rb; rbstart->rbnext != nullptr; rbstart = rbstart->rbnext) {
  40.         acdbGetObjectId(idSel, rbstart->resval.rlname);
  41.       }
  42.  
  43.       if (idSel.database() == acdbCurDwg()) {
  44.         acutPrintf(L"\nIt is not XREF!");
  45.         return;
  46.       }
  47.       AcDbObjectIdArray ids;
  48.       AcDbDatabase *pTempDb = new AcDbDatabase(false);
  49.       AcDbHandle hand = idSel.handle();
  50.       AcString filepath = idSel.database()->originalFileName();
  51.       if ((es = pTempDb->readDwgFile(filepath)) == Acad::eOk) {
  52.         if (pTempDb->getAcDbObjectId(idSel, false, hand) == Acad::eOk) {
  53.           ids.append(idSel);
  54.         }
  55.         if (ids.length() > 0) {
  56.           AcDbIdMapping idMapping;
  57.           if ((es = acdbCurDwg()->wblockCloneObjects(ids, idCurrentModelSpace, idMapping, AcDb::kDrcIgnore)) == Acad::eOk) {
  58.             AcDbIdMappingIter iter(idMapping);
  59.             for (iter.start(); !iter.done(); iter.next()) {
  60.               AcDbIdPair pair;
  61.               if (iter.getMap(pair) && pair.isPrimary()) {
  62.                 AcDbEntityPointer pEnt(pair.value(), AcDb::kForWrite);
  63.                 if (pEnt.openStatus() == Acad::eOk) {
  64.                   pEnt->transformBy(mat);
  65.                 }
  66.               }
  67.             }
  68.           }
  69.         }
  70.       }
  71.       if (pTempDb) delete pTempDb;
  72.     }
  73.   }
  74.  
  75. };
  76.  
  77. //-----------------------------------------------------------------------------
  78. IMPLEMENT_ARX_ENTRYPOINT(CXrefEntityCloneApp)
  79.  
  80. ACED_ARXCOMMAND_ENTRY_AUTO(CXrefEntityCloneApp, Rivilis, NCopy2, NCopy2, ACRX_CMD_MODAL, NULL)

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

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #6 : 31-01-2017, 14:20:43 »
Возможно это будет тебе полезно.
Да, это будет мне, в общем-то, полезно. Но всё-таки как-то это тяжеловато получается... В идеале я хотел получить некий AcDbVoidPtrArray клонов примитивов (без добавления их в рекорд и базу), чтобы в них поковыряться да и удалить с миром...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #7 : 31-01-2017, 14:49:11 »
Но всё-таки как-то это тяжеловато получается...
Легче точно не будет. Ты можешь пройтись итератором по всем примитивам в AcDbBlockTableRecord, создать их клоны и выполнить трансформацию по blockTransform для AcDbBlockReference. Но думаю, что будет очень много нюансов при простом клонировании.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #8 : 31-01-2017, 14:54:59 »
Но думаю, что будет очень много нюансов при простом клонировании.
Я это предвидел - хотелось простого и надёжного решения...

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #9 : 01-02-2017, 14:29:14 »
Продолжая "ковыряться" с внешними ссылками выясняется ещё один неприятный момент, связанный с методом AcDbEntity::transformBy, который способен корректно преобразовывать только примитивы с "равномерным масштабированием". В противном случае - ошибка. В то время как AcDbEntity::explode легко справляется с подобными преобразованиями...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #10 : 01-02-2017, 16:16:19 »
В то время как AcDbEntity::explode легко справляется с подобными преобразованиями...
Далеко не всегда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: XREF в блок
« Ответ #11 : 01-02-2017, 19:50:27 »
Далеко не всегда.
Что является камнем преткновения? Версия AutoCAD? Содержимое блока? Какая-то флуктуация?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: XREF в блок
« Ответ #12 : 01-02-2017, 20:05:08 »
Что является камнем преткновения? Версия AutoCAD? Содержимое блока? Какая-то флуктуация?
Содержимое блока. Хотя возможно и версия AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение