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

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 пользователей

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




×
×
  • Создать...