Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Олег от 20-08-2023, 05:10:52

Название: AcDbViewport не работает
Отправлено: Олег от 20-08-2023, 05:10:52
Приветствую всех.
Столкнулся с проблемой.
Генерируем листы на которых создаем AcDbViewport для просмотра кусков чертежей.
Нужно установить режим Realistic. В результате получается какая-то ерунда.
Если посмотреть то в свойствах указано что режим Realistic.
Приходится руками менять на любой другой режим а потом снова выбирать Реалистик и тогда отображает правильно.
Кто-нибудь знает как решить это недоразумение?
Спасибо за любую идею.
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 20-08-2023, 15:14:00
Приходится руками менять на любой другой режим а потом снова выбирать Реалистик и тогда отображает правильно.
Думаю что требуется регенерация.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 20-08-2023, 20:02:45
пробовал метод updateDisplay(). 
пробовал несколько раз в разных местах ставить. никакого эффекта.
какая регенерация может быть  еще ?

кроме того вот что нашел
https://help.autodesk.com/view/OARX/2023/ENU/?guid=OARX-RefGuide-AcDbViewport
процитирую
 Notes
Do not derive from this class. Attempting to do so will cause your application to halt AutoCAD.
Most AcDbViewport properties are reset to default values when the viewport is appended to a database. Therefore, you should always wait until you have added a new AcDbViewport object to the database before you change its property values.


как бы мне все это организовать? может есть идеи ?
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 20-08-2023, 22:28:28
акая регенерация может быть  еще ?
ads_regen();
Most AcDbViewport properties are reset to default values when the viewport is appended to a database. Therefore, you should always wait until you have added a new AcDbViewport object to the database before you change its property values.
Сначала добавляешь в базу, а потом (не закрывая AcDbViewport) меняешь его свойства, а затем уже закрываешь. Или сначала добавляешь в базу, закрываешь, а потом открываешь его по AcDbObjectId и меняешь его свойства. Вот пример:
https://forums.autodesk.com/t5/objectarx/acdbviewport-setvisualstyle-do-not-work/m-p/7406173#M36285

Название: Re: AcDbViewport не работает
Отправлено: Олег от 21-08-2023, 16:31:15
спасибо за ответы.
для ads_regen() какой файл нужно подключить ? не могу ее вызвать. не находит ни в документации ни в коде.
Название: Re: AcDbViewport не работает
Отправлено: Raikoz от 22-08-2023, 05:46:07
спасибо за ответы.
для ads_regen() какой файл нужно подключить ? не могу ее вызвать. не находит ни в документации ни в коде.
Можно через команду REGENALL
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 22-08-2023, 17:32:18
спасибо за ответы.
для ads_regen() какой файл нужно подключить ? не могу ее вызвать. не находит ни в документации ни в коде.
Ничего подключать не нужно. Линкуется он из accore.lib. Просто вставь описание в любой испольемый .h- или .cpp-файл:
Код - C++ [Выбрать]
  1. void  ads_regen(void);
И вызывай ads_regen(); где нужно.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 25-08-2023, 18:44:13
Сначала добавляешь в базу, а потом (не закрывая AcDbViewport) меняешь его свойства, а затем уже закрываешь. Или сначала добавляешь в базу, закрываешь, а потом открываешь его по AcDbObjectId и меняешь его свойства. Вот пример:
https://forums.autodesk.com/t5/objectarx/acdbviewport-setvisualstyle-do-not-work/m-p/7406173#M36285
никак не хочет работать
Название: Re: AcDbViewport не работает
Отправлено: Олег от 25-08-2023, 18:49:36

посмотрите пожалста на код. может чтото я упустил
Код - C++ [Выбрать]
  1.         void CrtLaVp(double dH, double dW, AcGePoint2d maxExt, AcGePoint2d minExt, bool bInsert)
  2.         {
  3.                 AcApLayoutManager* pLayM = (AcApLayoutManager*)acdbHostApplicationServices()->layoutManager();
  4.                 ACHAR* nextLayoutName = pLayM->getNextNewLayoutName(NULL);
  5.  
  6.                 AcDbObjectId layoutId = AcDbObjectId::kNull;
  7.                 AcDbObjectId btrId = AcDbObjectId::kNull;
  8.  
  9.                 //bCreatViewPort = pLayM->createViewports();
  10.  
  11.                 pLayM->setCreateViewports(Adesk::kFalse);
  12.                 pLayM->createLayout(nextLayoutName, layoutId, btrId);
  13.                 pLayM->setCurrentLayout(nextLayoutName);
  14.  
  15.                 pLayM->updateCurrentPaper();           
  16.  
  17.                 AcDbViewport* pVp = new AcDbViewport;
  18.  
  19.                 // Append new viewport to paper space
  20.                 AcDbBlockTableRecord* pBTR;
  21.                 if (acdbOpenObject(pBTR, btrId, AcDb::kForWrite) != Acad::eOk)
  22.                 {
  23.                         acutPrintf(L"\nCannot access paper space.");
  24.                         delete pVp;
  25.                         return;
  26.                 }
  27.  
  28.                 AcDbObjectId idViewPort = AcDbObjectId::kNull;
  29.                 if (pBTR->appendAcDbEntity(idViewPort, pVp) != Acad::eOk)
  30.                 {
  31.                         acutPrintf(L"\nCannot append viewport to paper space.");
  32.                         pBTR->close();
  33.                         delete pVp;
  34.                         return;
  35.                 }
  36.  
  37.                 pBTR->close();
  38.  
  39.                 AcGePoint3d centerPointPos(120, 100,0);
  40.                 AcGePoint2d ViewCenter(0,0);
  41.                 AcGeVector3d v(-1, -1, 1);
  42.                 AcGePoint3d modelCenter(0, 0, 0);
  43.  
  44.                 pVp->setCenterPoint(centerPointPos);
  45.  
  46.                 pVp->setViewDirection(v);
  47.                 pVp->setViewCenter(ViewCenter);
  48.                 pVp->setViewTarget(modelCenter);
  49.  
  50.                 pVp->setViewHeight(100);
  51.  
  52.                 pVp->setHeight(dH);
  53.                 pVp->setWidth(dW);
  54.  
  55.                 pVp->setOn();
  56.                 pVp->showHiddenLines();
  57.                 pVp->close();
  58.  
  59.                 Acad::ErrorStatus es;
  60.                 AcDbObjectId vsId = AcDbObjectId::kNull;
  61.  
  62.                 const ACHAR* szVisStyleName = acdbGetReservedString(AcDb::kVSRealistic, false);
  63.                 es = AcDbDictUtil::getVisualStyleId(vsId, szVisStyleName, acdbCurDwg());
  64.  
  65.                 int vpNum = -1;
  66.                 AcDbViewport* pViewport;
  67.                 if ((es = acdbOpenObject(pViewport, idViewPort, AcDb::kForWrite)) == Acad::eOk)
  68.                 {
  69.                         vpNum = pViewport->number();
  70.                         pViewport->setViewTarget(modelCenter);
  71.                         pViewport->setVisualStyle(vsId);
  72.                         pViewport->close();
  73.                 }
  74.  
  75.                 void ads_regen();
  76.                 ads_regen();
  77.         }
  78.  
  79.  
Вот пример:
https://forums.autodesk.com/t5/objectarx/acdbviewport-setvisualstyle-do-not-work/m-p/7406173#M36285
это не работает. acgsGetCurrent3dAcGsView - такой функции не находит, ни в коде ( поиск по всем включенным файлам ), ни в документации.  находит acgsGetCurrentAcGsView или acgsGetGsView.  не находит также acgsObtainAcGsView.
это функции с примера по ссылке.
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 26-08-2023, 14:44:26
Олег,
Версия AutoCAD?
Название: Re: AcDbViewport не работает
Отправлено: Олег от 26-08-2023, 14:48:47
Это
Олег,
Версия AutoCAD?
копия AutoCAD - BricsCAD22
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 26-08-2023, 14:50:50
Олег, Для BricsCAD не на этом форуме нужно задавать вопросы.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 26-08-2023, 15:18:25
Олег, Для BricsCAD не на этом форуме нужно задавать вопросы.
Александр, для брикскада нет отдельных форумов потому что там внутри это все копия автокада.
все пасутся на форумах автокада.
по всем вопросам отправляют на форумы автокада.
да и базовые вещи проще спросить на русском чем на англиском.

как я понимаю у меня какаято базовая вещь. чтото пропустил к коде такое простое которое в глаза не бросается.
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 26-08-2023, 15:23:05
потому что там внутри это все копия автокада.
Это глупость. Уже то, что ты не нашел ряда функций из приведенного примера, говорит о том, что это "недокопия". Разбираться почему что-то, что работает в AutoCAD, но не работает в Брикскаде никто не будет.
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 26-08-2023, 15:27:53
И еще я не увидел в коде инициализации листа (AcDbLayout::initialize)
Название: Re: AcDbViewport не работает
Отправлено: Олег от 26-08-2023, 15:30:58
Это глупость. Уже то, что ты не нашел ряда функций из приведенного примера, говорит о том, что это "недокопия". Разбираться почему что-то, что работает в AutoCAD, но не работает в Брикскаде никто не будет.
ну в самом автокаде тоже бывает отверсии к версии они то есть то нету.
в данном случае думаю что это не нюанс брикскада а полная копия работы автокада.

 потому что

кроме того вот что нашел
https://help.autodesk.com/view/OARX/2023/ENU/?guid=OARX-RefGuide-AcDbViewport
процитирую
 Notes
Do not derive from this class. Attempting to do so will cause your application to halt AutoCAD.
Most AcDbViewport properties are reset to default values when the viewport is appended to a database. Therefore, you should always wait until you have added a new AcDbViewport object to the database before you change its property values.

как минимум.
если это упирается в разность работы программ то конечно тогда тема не корректна.
но я всегда спрашивал базовые вещи.  посмотрите по истории моих постов. я уверен что тут также. код с ошибками.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 26-08-2023, 15:33:20
И еще я не увидел в коде инициализации листа (AcDbLayout::initialize)

я собирал код из разный (источников)форумов. 
там менеджер листов создает лист. 
не требует инициализации.
создание листа это пример с форума автокада.
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 26-08-2023, 15:50:11
Пример с форума Autodesk, который я привел, отмечен как решение. Т.е. в AutoCAD он работает. Мне нечего добавить.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 26-08-2023, 15:53:59
Пример с форума Autodesk, который я привел, отмечен как решение. Т.е. в AutoCAD он работает. Мне нечего добавить.
только что установил автокад 2022.
счас попробую. в любом случае спасибо за время и внимание.
Название: Re: AcDbViewport не работает
Отправлено: Олег от 27-08-2023, 04:59:10
Пример с форума Autodesk, который я привел, отмечен как решение. Т.е. в AutoCAD он работает. Мне нечего добавить.
Подтверждаю, в Автокаде работает.
В Брикскаде acgsGetCurrent3dAcGsView и acgsObtainAcGsView не реализованы,
только acgsGetCurrentAcGsView. Как будто ( судя по упоминаниям на форумах) библиотека до 2015 года на Автокад.
Вот здесь упоминание об этом
https://adn-cis.org/dostup-k-acgsview-assocziirovannomu-s-vidom.html


Подскажите как в более ранних версиях Автокада обходились без acgsObtainAcGsView. Что было вместо нее ?
Название: Re: AcDbViewport не работает
Отправлено: Александр Ривилис от 27-08-2023, 16:20:04
Подскажите как в более ранних версиях Автокада обходились без acgsObtainAcGsView. Что было вместо нее ?
acgsGetGsView