Перейти к публикации

UIStyler Library


Jetto

Рекомендованные сообщения

CAD – NX 4,5

Задача:

Выдать пользователю список тел текущего Part’a , дать ему сделать выбор из списка, для выбранных тел произвести некую операцию и выдать результат в том же диалоге.

Опыт программирования под NX – нулевой.

Читаю доки, изучаю API.

С помощью Styler создаю диалог, с помощью советов в сгенеренном .с файле вызываю этот диалог из NX, всё хорошо.

Хотел начать программировать собственно диалог – и сразу затык. Нужно проинициализировать элементы управления в диалоге, например списки.

Хочется сделать это через Open C++ UIStyler Library, через Open C как-то всё не очень удобно. Смотрю в документации по API, как работать со списком – всё вроде понятно. А вот как получить указатель на этот список – нигде не нашел.

Подскажите чайнику, как получить указатели на элементы диалога?

Может, у кого есть пример работы с диалогами через UIStyler Library – создание диалога, инициализация его элементов, опрос состояния элементов итд?

Ссылка на сообщение
Поделиться на других сайтах


Для начала создадим свой класс, отнаследованный от UgUIDialog и определим чистую виртуальную ф-цию void initializeThis ();

Насколько я помню, void initializeThis (); должен вызываться из void initialize ( int dialog_id ); у базового класса UgUIDialog.

В этот класс можно напихать твои контроллы и использовать доступ к ним через объект твоего класса ( но в этом примере мы поступим совсем по-простому ).

#include <ug_ui_dialog.hxx>

//--------------------------------------------

class MyCoolDialog : public UgUIDialog {

	public:

		void initializeThis () {

		}

};

Далее, во всех колбеках ( ф-циях, которые тебе сгенерил визард UiStyler-a ) мы сможем использовать наш класс.

Далее будем считать, что в диалоге у нас есть single select list контрол.

#include <ug_ui_single_select_list.hxx>

//--------------------------------------------

int MY_dialog_ctor_acb ( int dialog_id, void *client_data, UF_STYLER_item_value_type_p_t callback_data )

{

	try 

	{



		UgSession sess(true);



		// создаем объект диалога

		MyCoolDialog my_dialog;



		// привязываемся к нашему диалогу

		my_dialog.initialize ( dialog_id );



		//создаем объект листа и привязываемся к нашему контролу в нашем диалоге

		UgUISingleSelectList my_list ( MY_LIST_CONTROL_ID, &my_dialog );





		// Запрашиваем список, который есть в листе ( если он вообще есть )

		std::vector <std::string> list = my_list.getList();



		// добавляем в конец some added value

		list.push_back("some added value");



		//обновляем список в диалоге

		my_list.setList( list );

			   

		return UF_UI_CB_CONTINUE_DIALOG;

	}

	catch (const UgException &erc) { /*report ug error*/ }

	catch (...) { /* report unhandled exception*/ }

	return UF_UI_CB_CONTINUE_DIALOG;

}

PS Поправил форматирование.

Regardzzz ...

Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответ!

Правда, приведенный пример вызывает изумление. Видимо, это от непонимания, как внутри все эти классы устроены.

Т.е получается, можно унаследовать от UgUIDialog класс, в котором нужно только переопределить initializeThis (); не задавая никаких членов класса,

для него вызываем initialize от dialog_id и получаем тот диалог, который нам Styler создал?

Потом динамически цепляем к нему элементы управления и дергаем их методы?

Чудеса!

А зачем тогда вообще создавать свой наследник от UgUIDialog, а не воспользоваться объектом класса UgUIDialog напрямую?

Т.е.

UgUIDialog my_dialog;

// привязываемся к нашему диалогу

my_dialog.initialize ( dialog_id );

В общем, у меня есть колбек, который вызывается при создании диалога, определенный как

{UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0, MyProject_init_cb},

В нем видимо и надо делать инициализацию контролов. Сейчас буду пробовать.

Ссылка на сообщение
Поделиться на других сайтах

Чудеса!

А зачем тогда вообще создавать свой наследник от UgUIDialog, а не воспользоваться объектом класса UgUIDialog напрямую?

Т.е.

UgUIDialog my_dialog;

// привязываемся к нашему диалогу

my_dialog.initialize ( dialog_id );

А затем, что инстанцировать объект класса UgUIDialog напрямую не получится ... так как у него есть чисто виртуальный метод virtual void initializeThis ( ) =0;

Regardzzz ...

Ссылка на сообщение
Поделиться на других сайтах

2 Jetto

Чтобы сразу направить тебя на правильный путь, объясню поподробнее...

1. Все что ты видишь в UiStyler Library ( для С++ ) это всего лишь классовые обертки над UgOpen ф-циями.

2. Используя UiStyler ты не получишь динамического создания диалога. Все равно сначала генерим *.dlg файл а потом "работаем с ним" через С++ методы.

3. Практика показала, что использование UiStyler Library упрощает манипуляции с диалоговыми контролами ( не нужно заполнять огроменные структуры

типа UF_STYLER_item_value_type_s ). Но все равно внутри себя методы UiStyler в итоге вызывают UF_STYLER_ask_value / UF_STYLER_set_value и т.д.

4. Я написал свой генератор кода оберток для диалогов для упрощения создания исходного прототипного кода.

4.1 В класс, который наследуется от UgUIDialog я добавил кешированный dialog_id, для того, чтобы в инициализации проверять изменился ли

dialog_id и надо ли нам собственно делать эту инициализацию...

( т.к. dialog_id может смениться в процессе работы приложения ).

4.2 В этот-же класс я добавил публичные указатели на контролы. Они создаются в конструкторе моего класса, уничтожаются в деструкторе и инициализируются или

переинициализируются в методе initializeThis();

4.3 Указатель на класс наследник от UgUIDialog передается во все колбеки через void * client_data, там кастится к нужному типу, инициализируется через initialize ( int dialog_id ) и

через этот указатель доступна работа с диалогом и его контроллами.

Regardzzz...

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • Amiandar
      Народ, а подскажите, почему не получается редактировать (1 раз только получилось спустя 100500 попыток, поэтому я не уловил причину) вот эти значения в момент нанесения линии в эскизе?   
    • Alex1986
      Коллеги, подскажите, пожалуйста, как в имеющемся Компас 3D v20 в как-то сопряженных деталях сделать в одной детали отверстие, а во второй детали отверстие завязать на центр отверстия первой детали, чтоб при перемещении первого и перестроении, автоматически перестраивалось отверстие во второй?
    • Cas
      Это поможет в изготовлении? Вы в этом уверены? Я думаю, что Вы сильно ошибаетесь. Я бы с Вами согласился - если бы Вы мне написали - что вот - фирма по производству отличных мелкомодульных шестеренок. Но Ваши чертежи они понять не могут. Ладно, даже могут, но им дико неприятно (прям фу), потому что там действительно есть некорректная простановка базы, неправильные геометрические допуски и т.д. НО... ситуация то не такая. Чертеж поправить - не сложно, но от этого производитель не найдется, к сожалению.  
    • Shoker
      Конструктора поменяйте на нормального, может будет делаться то, что надо
    • Liga
      Разобрался, реакции можно вытянуть и из МКЭ расчета, но только после правильного закрепления. Сверху - снизу Спс за наводку    
    • Cas
      Вот это дельное предложение. Спасибо. Боюсь, что так и придется делать. Т.к. найти изготовителей мелкомодульных шестерней - прям проблема оказалась. Насчет терпеливого оператора - то точно нет. Не на мелкосерийке. Насчет таблицы - не понял. Ее на чертеже специально нет - она отдельная, что указано в требованиях. Насчет прогресса - то откуда ему взяться то?
    • roiman
      Переделайте конструкцию валов-шестерен, раз проблема с изготовлением. Сделайте шестерни съёмными, на шпонках, хоть с прессовой посадкой. После этого шестерни можно будет изготовить в любой конторе с проволочником. Или тем же проволочником при помощи такой-то матери и терпеливого оператора - с перестановом, с технологическим шестигранником на конце вала для закрепления в тисах, к примеру. Шестигранник после прожига обрезается. Ну или хоть прошивной электроэрозией, если содержимое кошелька позволяет. Но нужна приспособа с поворотом, которая не у каждого есть.   Конструктора найдите другого. Это весёлые картинки, а не чертежи. Хоть бы таблицу с параметрами зацепления привели. Может и дело  было не в разбитом станке, а в способностях конструктора... И кто-то мне говорит, что всё нормально и прогресс. Ни чертежи уже не можем сделать, ни изготовить наипростейшее прямозубое цилиндрическое зацепление...
    • Chuvak
      Я не занимаюсь изготовлением) Но конструктор должен сразу делать нормальные чертежи изделий и знать как их будут изготавливать
    • mmaag
      Допуски на размеры толщины зуба s, w, M имеют допуски в два минуса, т.е. задают гарантированный боковой зазор. Это противоречит требованию об отсуствии люфта. Требование об отсутствии люфта в свою очередь противоречит работоспособности. Оформление сырое. Правильно оформленный чертёж поможет более адекватно оценить трудозатраты и риски и, следовательно, может помочь найти изготовителя. Совет: если у вас есть функциональные требования, то оформляйте их. Это может упростить требования к точности.
    • Cas
      Ну лично я не оформлял.  Соглашусь, что перпендикулярность некорректно поставлена.  Может еще что-то.  Но мне детали нужны для нашего изделия, а не чертежи идеально правильные.  Я себе слабо представляю технолога, который не поймет по этому чертежу, что от него хотят. Я согласен с Вами полностью, что надо оформлять все правильно по ЕСКД. Если Вы мне поможете в изготовлении детали, то заставлю я своего конструктора поставить правильно Базу и перпендикулярность на биение заменить.
×
×
  • Создать...