Переключение между листами чертежа

Автор Тема: Переключение между листами чертежа  (Прочитано 8766 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
Добрый день!
Вопрос как программно переключаться между листами чертежа, а точнее как менять активный лист(active layout)?
В данном коде создается новый лист и становится активным. А как сделать если второй лист уже существует?
Код - C++ [Выбрать]
  1. AcDbDatabase *curDocDB = acdbHostApplicationServices()->workingDatabase();
  2.  AcApLayoutManager *pLayoutMngr = dynamic_cast<AcApLayoutManager *> (  acdbHostApplicationServices()->layoutManager() );
  3.  
  4.  if(pLayoutMngr != NULL)
  5.  {
  6.      ACHAR* nextLayoutName  = pLayoutMngr->getNextNewLayoutName(NULL);
  7.      AcDbObjectId layoutId = AcDbObjectId::kNull;
  8.      AcDbObjectId btrId = AcDbObjectId::kNull;
  9.      pLayoutMngr->createLayout(nextLayoutName, layoutId, btrId);
  10.      // initialises AcDbLayout with appropriate defaults
  11.      pLayoutMngr->setDefaultPlotConfig(btrId);
  12.      // setting as current layout
  13.      pLayoutMngr->setCurrentLayout(nextLayoutName);
  14.      pLayoutMngr->updateLayoutTabs();
  15.  }

Получить имя всех листов получается, но setCurrentLayout() не переводит второй layout в активный. То есть findActiveLayout
все равно показывает имя текущего листа а не второго...

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

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

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

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
То же самое. Переключение на следующий лист не происходит.

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

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

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

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
2018, в paperspace, первый лист
Код - C++ [Выбрать]
  1. void listLayouts(void)
  2. {
  3.         Acad::ErrorStatus es;
  4.         AcDbDatabase *curDocDB = acdbHostApplicationServices()->workingDatabase();
  5.         AcApLayoutManager *pLayoutMngr = dynamic_cast<AcApLayoutManager *>(acdbHostApplicationServices()->layoutManager());
  6.         if (pLayoutMngr != NULL)
  7.         {
  8.                 AcDbObject *pObj;
  9.                 ACHAR *pLayName;
  10.                 AcDbDictionary *pDict = NULL;
  11.                 if (Acad::eOk == curDocDB->getLayoutDictionary(pDict, AcDb::kForRead)) {
  12.  
  13.                         AcDbDictionaryIterator *pIter = pDict->newIterator();
  14.                         //Iterate through all the items in the dictionary
  15.                         for (; !pIter->done(); pIter->next())
  16.                         {
  17.                                 pIter->getObject(pObj, AcDb::kForRead);
  18.                                 AcDbLayout *pLayout = AcDbLayout::cast(pObj);
  19.                                 es = pLayout->getLayoutName(pLayName);
  20.                                 pLayoutMngr->setCurrentLayout(pLayName);
  21.                                 pLayoutMngr->updateLayoutTabs();
  22.  
  23.                                 CString st = pLayoutMngr->findActiveLayout(Adesk::kTrue);
  24.                                 MessageBox(L"Active Layout is : %s " + st);
  25.                         }
  26.                 }
  27.         }
  28. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
alsh,
Сейчас не могу проверить, но чувствую, что ошибка в том, что у тебя LayoutDictionary открыта для чтения в тот момент, когда ты пытаешься её изменять. Сразу после AcDbDictionaryIterator *pIter = pDict->newIterator(); вызови pDict->close();
Ну и не хватает вызова delete pIter;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
Не помогло... setCurrentLayout выдает "eSetFailed"

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

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

Отмечено как Решение alsh 05-02-2019, 16:39:05

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis


Код - C++ [Выбрать]
  1. //-----------------------------------------------------------------------------
  2. //----- acrxEntryPoint.cpp
  3. //-----------------------------------------------------------------------------
  4. #include "StdAfx.h"
  5. #include "axlock.h"
  6. #include "resource.h"
  7.  
  8. //-----------------------------------------------------------------------------
  9. #define szRDS _RXST("")
  10.  
  11. //-----------------------------------------------------------------------------
  12. //----- ObjectARX EntryPoint
  13. class CTestSetLayoutApp : public AcRxArxApp {
  14.  
  15. public:
  16.   CTestSetLayoutApp() : AcRxArxApp() {}
  17.  
  18.   virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
  19.     AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
  20.     return (retCode);
  21.   }
  22.  
  23.   virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
  24.     AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
  25.     return (retCode);
  26.   }
  27.  
  28.   virtual void RegisterServerComponents() { }
  29.  
  30.   static void RivilisSetNextLayout() {
  31.     Acad::ErrorStatus es;
  32.     AcDbDatabase *db = acdbHostApplicationServices()->workingDatabase();
  33.     AcApLayoutManager *pLayoutMngr = dynamic_cast<AcApLayoutManager *>(acdbHostApplicationServices()->layoutManager());
  34.     AcAxDocLock loc(db);
  35.     if (pLayoutMngr != NULL)
  36.     {
  37.       AcDbObject *pObj;
  38.       ACHAR *pLayName;
  39.       AcDbDictionary *pDict = NULL;
  40.       if (Acad::eOk == db->getLayoutDictionary(pDict, AcDb::kForRead))
  41.       {
  42.         AcDbDictionaryIterator *pIter = pDict->newIterator();
  43.         pDict->close();
  44.         //Iterate through all the items in the dictionary
  45.         for (; !pIter->done(); pIter->next())
  46.         {
  47.           pIter->getObject(pObj, AcDb::kForRead);
  48.           AcDbLayout *pLayout = AcDbLayout::cast(pObj);
  49.           es = pLayout->getLayoutName(pLayName);
  50.           pLayout->close();
  51.           pLayoutMngr->setCurrentLayout(pLayName);
  52.           pLayoutMngr->updateLayoutTabs();
  53.           const ACHAR * st = pLayoutMngr->findActiveLayout(Adesk::kTrue);
  54.           acutPrintf(L"\nActiveLayout=%s\n", st);
  55.         }
  56.       }
  57.     }
  58.  
  59.  
  60.   }
  61. };
  62.  
  63. //-----------------------------------------------------------------------------
  64. IMPLEMENT_ARX_ENTRYPOINT(CTestSetLayoutApp)
  65.  
  66. ACED_ARXCOMMAND_ENTRY_AUTO(CTestSetLayoutApp, Rivilis, SetNextLayout, SetNextLayout, ACRX_CMD_SESSION, NULL)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
Спасибо огромное!   :) Я уже поиском увидел что были похожие проблемы в .NET на форуме, а в ObjectARX пока еще нет.