Список форумов Конференция САПР Bentley MicroStation Конференция САПР Bentley MicroStation
www.ustation.ru
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

RotMatrix для компаса AccuDraw

 
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Профессиональное
Предыдущая тема :: Следующая тема  
Автор Сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Чт Июл 05, 2007 10:39 am    Заголовок сообщения: RotMatrix для компаса AccuDraw Ответить с цитатой

Задачка сложная, потому быстрого ответа не жду Smile

Нужно получить RotMatrix для компаса AccuDraw в реальном времени (в функции динамики)

Пробовал добраться до структуры accudrawData, но там почему-то сплошной НУЛЬ Sad

Код:


      CExprResult        result;       /*  Detailed result */
      CExprValue        value;       /*  Similar to result, but easier to      interpret. */
      int res;
      MdlDesc*       mdlDescP ;
      AccudrawData acd;

      mdlDescP = mdlSystem_findMdlDesc("accudraw");

      res = mdlCExpression_restrictedGetValueForApp (
         &value,
         &result,
         "accudrawData",
         VISIBILITY_DIALOG_BOX,
         mdlDescP,
         TRUE);


      if (res != SUCCESS)
      {
         printf("mdlCExpression_restrictedGetValueForApp returns %i\n",res);
      }
      else
      {
         printf("%i %i\n", value.type, result.value.pv);
         memcpy(&acd, result.value.pv, sizeof(AccudrawData));
         printf("             acd.angle = %f\n", acd.angle);
         printf("             acd.distance = %f\n", acd.distance);
         printf("             flags %i\n", acd.flags);
         printf("             acd.origin.x = %f\n", acd.origin.x);
         printf("             acd.origin.y = %f\n", acd.origin.y);
         printf("             acd.origin.z = %f\n", acd.origin.z);
         printf("             acd.delta.x = %f\n", acd.delta.x);
         printf("             acd.delta.y = %f\n", acd.delta.y);
         printf("             acd.delta.z = %f\n", acd.delta.z);
      }



Может у кого есть идеи?
Буду весьма признателен.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
laggi



Зарегистрирован: 07.11.2006
Сообщения: 28
Откуда: WashDC

СообщениеДобавлено: Сб Июл 07, 2007 4:39 pm    Заголовок сообщения: Ответить с цитатой

Можно эту матрицу ориентации AD самому построить - у тебя есть точка привязки и текущие точки (положение мыша)...
Это если считать не получается Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Сб Июл 07, 2007 4:48 pm    Заголовок сообщения: Ответить с цитатой

Я это все собственно из-за чего спрашиваю...
Обычная команда, запускаемая через mdlState_startPrimitive...
там в динамике хотелось бы, чтобы элемент реагировал на изменение ориентации компаса по горячим клавишам, как это происходит при вставке селла
Юзер жмет на клавишу, компас вертится, и элемент за ним,
а мыша тут тово... не при делах кажись Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
laggi



Зарегистрирован: 07.11.2006
Сообщения: 28
Откуда: WashDC

СообщениеДобавлено: Сб Июл 07, 2007 10:15 pm    Заголовок сообщения: Ответить с цитатой

disclaimer: я терпеть не могу AD... один геморрой с ним...

Leonid писал(а):
Я это все собственно из-за чего спрашиваю...
Обычная команда, запускаемая через mdlState_startPrimitive...
там в динамике хотелось бы, чтобы элемент реагировал на изменение ориентации компаса по горячим клавишам, как это происходит при вставке селла
Юзер жмет на клавишу, компас вертится, и элемент за ним,
а мыша тут тово... не при делах кажись Smile


Ок.
А почему бы не отлавливать клаву (события точнее) и самому ориентировать елемент (cell) так как тебе надо?
Я делаю обычно так - у меня элемент вешается на мышь, юзер шлепает его куда хочет (ну там еще ориентация и коннекторы - ну да не суть), после чего юзер его может вращать как хочет вокруг активного коннектора или передвигать по заданному пути (если таковой имеется). Всё это контролируется с отдельного диалога.
Шлепается елемент согласно начальному построению, ориентированный по оси Х. А уж потом - крути как хочешь, ориентируй как хочешь...
А ориентацию AD я в этом случае задаю сам так, как мне надо, ручками. Исключительно в целях совместимости Smile

я понимаю - это лузерство Smile, но в определённый момент времени мне надоело копаться в потрохах микростанции и я начал такие штуки сам писать, отдельно. IMHO удобнее получается, больше контроля.

PS Старую (я бы сказал - древнюю) версию этого можно в Bentley PlantSpace посмотреть, там для некоторых компонент он пользуется до сих пор IMHO.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Вс Июл 08, 2007 1:06 pm    Заголовок сообщения: Ответить с цитатой

А мне AccuDraw нравится. Даже можно сказать - просто тащусь от него (с точки зрения пользователя), особенно это ощущается после работы в Автокаде или каком-нибудь долбаном Смартпланте. Что называется - почувствуйте разницу... Cool
Цитата:

Я делаю обычно так - у меня элемент вешается на мышь, юзер шлепает его куда хочет (ну там еще ориентация и коннекторы - ну да не суть), после чего юзер его может вращать как хочет вокруг активного коннектора или передвигать по заданному пути (если таковой имеется). Всё это контролируется с отдельного диалога.
Шлепается елемент согласно начальному построению, ориентированный по оси Х. А уж потом - крути как хочешь, ориентируй как хочешь...

Все эти вещи конечно сделать можно, это не проблема... если ответа на этот вопрос не будет, то этим путем и пойду...
Но трэба ведь такие вещи делать красиво! Very Happy
Пользователь же привык ставить селлы таким образом, опять же действий меньше, кода...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
laggi



Зарегистрирован: 07.11.2006
Сообщения: 28
Откуда: WashDC

СообщениеДобавлено: Вс Июл 08, 2007 8:48 pm    Заголовок сообщения: Ответить с цитатой

Ок. Если нравится то конечно...

У меня такое ощущение что mdlRMatrix_fromView должна возвращать матрицу уже с наложенными ограничениями AD.
Если я конечно правильно понимаю логику взаимодейсвия AD и MS.
Попробуй - или я могу в понедельник попробовать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
laggi



Зарегистрирован: 07.11.2006
Сообщения: 28
Откуда: WashDC

СообщениеДобавлено: Пн Июл 09, 2007 3:02 am    Заголовок сообщения: Ответить с цитатой

проверил.

RotMatrix matr;
mdlRMatrix_fromView( &matr, 1, TRUE);

при выключенном AD на iso-view даёт iso матрицу. При включенном AD даёт матрицу текущей ориентации AD.
Все остальные локи были выключены.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Leonid
давно здесь сидим


Зарегистрирован: 28.01.2006
Сообщения: 598
Откуда: С.-Петербург

СообщениеДобавлено: Пн Июл 09, 2007 10:05 am    Заголовок сообщения: Ответить с цитатой

Ок! Работат! Good
Я вообще-то и брал матрицу вида, только все дело то и оказалось - в том что надо один аргумент поменять с FALSE на TRUE
Семен Семеныч... Laughing

laggi - тебе респект! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Конференция САПР Bentley MicroStation -> Профессиональное Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group