восстановить предыдущую СК

Автор Тема: восстановить предыдущую СК  (Прочитано 6277 раз)

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
вот прям жудко захотелось избавиться от acedCommand :):):). Ну если не полностью, то хоть от большей части вызовов.
пока не могу разобраться в такой функции:
acedCommand(RTSTR,_T("_ucs"),RTSTR,_T("_p"),0);а вопрос звучит так: где хранятся данные о предыдущей системе координат (верней о всех системах координат, которые пользователь клацал в чертеже за текущий сеанс) и как к ним добраться?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: восстановить предыдущую СК
« Ответ #1 : 20-01-2014, 18:33:27 »
Цитировать
C++
Acad::ErrorStatus acedRestorePreviousUCS();
File
aced.h

Description
Sets the previous UCS to be the current UCS. This function operates on the document currently displayed in the editor.

Returns Acad::eOk if successful. Returns Acad::eNotApplicable if there is no previous UCS to restore, or if there is no current document.

 

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

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: восстановить предыдущую СК
« Ответ #2 : 20-01-2014, 19:02:15 »
:) так просто. спасибо а помощь.
а я уже приготовился лазить по бд чертежа или что-то в этом роде.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: восстановить предыдущую СК
« Ответ #3 : 20-01-2014, 19:03:52 »
А я еще удивлялся чего это ты в том примере с неправильными блоками используешь командные методы, но постеснялся спросить...  ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: восстановить предыдущую СК
« Ответ #4 : 20-01-2014, 19:11:19 »
:) это всё от лени. но во избежание будущих проблем решил перебрать код :):):)
в новом проекте хорошо, мало мусора, а вот к 15-летнему даже подходить страшно

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: восстановить предыдущую СК
« Ответ #5 : 20-01-2014, 19:15:15 »
Ну тогда подскажу, что есть еще функции: acedGetCurrentUCS и acedSetCurrentUCS - это чтобы совсем избавится от командных методов работы с UCS.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: восстановить предыдущую СК
« Ответ #6 : 20-01-2014, 19:28:23 »
всё было б хорошо, если б только этими функциями можно было менять пск. в голом виде, увы, не работает как хочется. то регенерацию подавай, то на экране черт знает что творится. вот какую каку мастерил сегодня, чтоб пск по виду поставить, чтоб работало правильно и в модели и в листе.
Код - C++ [Выбрать]
  1. Acad::ErrorStatus UCS_V()
  2. {
  3.         Acad::ErrorStatus es = Acad::eInvalidView;
  4.         bool isPaperSpace = false;
  5.         resbuf cvport;
  6.         acedGetVar(_T("CVPORT"), &cvport);
  7.  
  8.         if (!acdbHostApplicationServices()->workingDatabase()->tilemode() && cvport.resval.rint == 1)
  9.                 isPaperSpace = true;
  10.  
  11.         AcGsView::RenderMode eMode;
  12.         AcGsView * view;
  13.         view = acgsGetGsView(cvport.resval.rint, false);
  14.         eMode = (view)? view->mode(): AcGsView::k2DOptimized;
  15.         if (!view)
  16.         {
  17.                 view = acgsGetGsView(cvport.resval.rint, true);
  18.                 view->setMode(eMode);
  19.         }
  20.         AcGePoint3d ptOrigin = AcGePoint3d(0.0,0.0,0.0);
  21.         acdbUcs2Wcs(asDblArray(ptOrigin),asDblArray(ptOrigin),false);
  22.  
  23.         AcGeVector3d direction = (view->target() - view->position());
  24.         direction *=  (1.0 / direction.length());
  25.  
  26.         AcGeVector3d upVector = view->upVector();
  27.         upVector *= (1.0 / upVector.length());
  28.  
  29.         AcGeVector3d xAxis = direction.crossProduct(upVector);
  30.  
  31.         AcGeMatrix3d matUcs;
  32.         matUcs.setCoordSystem(ptOrigin,xAxis, upVector, direction);
  33.  
  34.         es = acedSetCurrentUCS(matUcs);
  35.         if (isPaperSpace)
  36.         {
  37.                 CView* pActiveView = acedGetAcadFrame()->GetActiveFrame()->GetActiveView();
  38.                 CRect rect;
  39.                 pActiveView->GetClientRect(&rect);
  40.                 rect.InflateRect(1,0,16,0);
  41.                 pActiveView->MoveWindow(rect, TRUE);
  42.                 acgsSetViewParameters(cvport.resval.rint, view, false, true);
  43.         }
  44.         else
  45.                 acgsSetViewParameters(cvport.resval.rint, view, true, true);
  46.  
  47.         return es;
  48. }
  49.  

чувствую, что RenderMode там лишний, но лучше пусть будет :):):)

PS: так что на этом фоне возврат в предыдущую ск меня порадовал :)
« Последнее редактирование: 25-01-2014, 17:01:58 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: восстановить предыдущую СК
« Ответ #7 : 20-01-2014, 20:39:10 »
Для регенерации есть функция попроще. ads_regen() называется. Хотя мне не очень понятно зачем она нужна. Может достаточно acedUpdateDisplay() ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай ГорловАвтор темы

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: восстановить предыдущую СК
« Ответ #8 : 21-01-2014, 12:14:32 »
увы, но ни ads_regen ни acedUpdatedisplay не помогли. в модели получалось, что слетал визуальный стиль (ну как слетал. он то оставался тем же, только возвращался после mousewheel. лениво было хакать это дело). и еще само новое положение пск было расположено рандомно (хоть привязка к нулю и стояла. верней, сам череж улетал от нуля) до тех пор, пока не начинал рисовать что-либо. а в листе - сам лист улетал (белый прямоугльник листа). да это легко проверить. убейте всё что идет после
es = acedSetCurrentUCS(matUcs); и получите тот же результат.

и вся беда была завязана на AcGsView * view = acgsGetGsView(cvport.resval.rint, true);. а т.к. параметры для установки пск по виду берутся из AcGsView, то по другому даже и пытаться не стал делать. можно было б и по другому. "рисовать" вектора горизонтальный и вертикальный в экранных координатах, потом переносить их начало в текущее начало координат, лепить матрицу. но я пошел путем AcGsView.
потом полазил по adn-овскому сайту и нашел строки
... This is a limitation of AcGsView that is generated from the acgsGetGsView(). The view parameters are calculated properly, but the view is not updated by the setView(), update() and acgsSetViewParameters(). Nor will it be updated by acedUpdateDisplay(). Therefore, the workaround is to calculate the view window client area size and move the window just slightly to force AutoCAD to update the paper space viewport.
ну и к строкам был еще исходный код. чуток переделал под себя, вставил и начало работать :)