Как создать НЕМОДАЛЬНЫЙ диалог?

Автор Akew, 18.11.15, 19:59:50

« назад - далее »

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

Akew


Здравствуйте!

От исходной трехмерной модели требуется оставить только отдельные грани, которые выберет пользователь.
Моя программа с помощью операции удаления граней вначале удаляет их все. Затем выполняется интерактивный цикл, в котором пользователь, редактируя эту операцию удаления в КОМПАСе, выделяет грани, которые нужно оставить. После этого в диалоге пользователь выбирает одно из предлагаемых действий (три варианта обработки указанных граней, откат предыдущей операции или завершение обработки). Выбор граней в цикле может быть выполнить несколько раз, пока сам пользователь не захочет его закончить.

Сейчас все работает замечательно, только организация задержки для действий пользователя в этом цикле пока организована слишком громоздко: вначале выводится стандартное немодальное окно сообщения с вариантами дальнейших действий (после его появления пользователь проводит выбор граней, и нажимает OK), а потом выбранный вариант действия нужно ввести как целое число в стандартной функции ksReadInt (это уже модальное окно).

Хочу реализовать эти два окна в одном, т.е., в виде немодального диалога, в котором пользователь мог бы выбрать необходимое действие, а до этого - провел манипуляцию с гранями в КОМПАСе.
Для управления немодальным диалогом нужен класс-предок (у меня есть примеры обычных программ с немодальными диалогами), но как его получить в КОМПАСе, мне пока не понятно.

Прилагаю главный цикл своей программы.
void ReMarkingDeletedFaces() {
CString title_dialog = _T("Функция ReMarkingDeletedFaces");
CString tmpstr;

// 01. Инициализировать интерфейсы сборки
CMyDeletedFaces myDeletedFaces( MyKompasObject->ActiveDocument3D() );
if ( !myDeletedFaces.inited ) {
MessageBox(NULL, _T("*** интерфейс My3DDocument не получен. Выход."), title_dialog, MB_OK|MB_ICONERROR );
return;
}

_variant_t *deletedFacesVARIANTbackup; // Массив удаленных граней предыдущей операции
bool enableBackup = false;

long answer;
do {
// 02. Получить массив удаленных граней и их кол-во до манипуляции
_variant_t deletedFacesVARIANTbefore;
long countDeletedFacesBefore = myDeletedFaces.getDeletedFaces( deletedFacesVARIANTbefore );
if ( countDeletedFacesBefore <= 0 ) {
MessageBox(NULL, _T("Отсутствуют удаленные грани"), title_dialog, MB_OK|MB_ICONINFORMATION); break;
}

// 03. Запрос дальнейших действий. Это сообщение будет ждать, пока пользователь выполняет манипуляцию с гранями
tmpstr.Format( _T("Проведите редактирование операции удаления граней.\nЗатем выберите и укажите в следующем диалоге укажите номер операции:\n\n1 - Ввести грани\n2 - Ввести указанные грани и их ближайших соседей\n3 - Найти ближайших соседей\n4 - Отменить последнюю операцию\n5 - Завершить отбор граней") );
MessageBox( NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );

// Пользователь закончил работать с гранями, и в предыдущем сообщении нажал кнопку OK. Теперь он должен ввести требуемую операцию как число 1...5
long numOperation=0;
if( !MyKompasObject->ksReadInt( _T("Введите номер операции: "), 1, 1, 5, &numOperation ) ) return;

_variant_t deletedFacesVARIANTafter;
long countDeletedFacesAfter = -1;

// Для операций 1-3 получить текущее состояние выделенных граней _variant_t deletedFacesVARIANTafter
if( (numOperation==1) || (numOperation==2) || (numOperation==3) ) { // Получить массив удаленных граней и их кол-во после манипуляции
countDeletedFacesAfter = myDeletedFaces.getDeletedFaces( deletedFacesVARIANTafter );
}

switch( numOperation ) {
case 1 : // 1 - Ввести грани (без дополнительных изменений) - применить к операции удаления массив deletedFacesVARIANTafter
deletedFacesVARIANTbackup = new _variant_t;
myDeletedFaces.getDeletedFaces( *deletedFacesVARIANTbackup ); enableBackup = true;
ApplyToFaceRemoverNewArray( myDeletedFaces, deletedFacesVARIANTafter );
break;
case 2 : // 2 - Ввести указанные грани, и их ближайших соседей
deletedFacesVARIANTbackup = new _variant_t;
myDeletedFaces.getDeletedFaces( *deletedFacesVARIANTbackup ); enableBackup = true;
MarkThisFaceAndHerNeighbours( myDeletedFaces, deletedFacesVARIANTbefore, countDeletedFacesBefore, deletedFacesVARIANTafter, countDeletedFacesAfter );
break;
case 3 : // 3 - Найти ближайших соседей у имеющихся граней
deletedFacesVARIANTbackup = new _variant_t;
myDeletedFaces.getDeletedFaces( *deletedFacesVARIANTbackup ); enableBackup = true;
MarkNeighbours( myDeletedFaces, deletedFacesVARIANTbefore, countDeletedFacesBefore );
break;
case 4 : // 4 - Отменить предыдущую операцию - применить к операции удаления массив *deletedFacesVARIANTbackup
if( !enableBackup ) {
MessageBox( NULL, _T("Откат невозможен"), title_dialog, MB_OK|MB_ICONERROR );
break;
}
ApplyToFaceRemoverNewArray( myDeletedFaces, *deletedFacesVARIANTbackup );
delete deletedFacesVARIANTbackup;
enableBackup = false;
break;
case 5 : // 5 - Завершить отбор граней
break;
}

if( numOperation == 5 ) break; // Выбрано завершение работы

} while ( true );

MessageBox( NULL, _T("Работа закончена"), title_dialog, MB_OK|MB_ICONINFORMATION );
return;
}

Буду признателен за помощь.



Сделайте через интерфейс параметров процесса - IProcessParam и контролируйте.

Akew

Sabahs,
ЦитироватьСделайте через интерфейс параметров процесса
- правильно ли я Вас понял, что мой диалог нужно реализовать в панели свойств, а не использовать обычный механизм взаимодействия немодального диалога с родительским окном? (Я нашел нечто подобное в примере Gayka.)

Да.

Slaviation

Пример с немодальным окном (проект Delphi XE2) во вложении.
rtw собран для КОМПАС-3D x64.

Slaviation

Под КОМПАС-3D V17 пример работать не будет.
Поправки ниже:
1. В MainForm.pas удалить обработчик TMyForm.FormActivate;
2. В Entry.pas в процедуре LIBRARYENTRY после строки 46 (myForm.Show;) добавить строку iKompasObject.ksSystemControlStart('');