• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

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

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Вопрос про удаленную операцию "Удалить грани"

Автор Akew, 26.11.15, 19:02:42

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

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

Akew

Добрый вечер!

Еще один технический вопрос.
В документе имеется операция удаления граней. Моя программа получает ее указатель (IFaceRemover), и удаляет эту операцию.
Внешне (в редактируемом документе) все получается отлично.

Вопрос: после удаления операции указатель этой операции должен автоматически обнулиться?

У меня не обнуляется. И не понятно, - это так и должно быть (это мне представляется сомнительным), или требуются какие-то дополнительные действия (программные). Пробовал делать разные Update на интерфейсы, из которых получил этот указатель, - ничего не помогло.

Прилагаю код.
void TestDeletingFaceRemover() {
CString title_dialog = _T("Функция TestDeletingFaceRemover");
CString tmpstr;

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

IKompasDocument3DPtr kompasDocument3D = IUnknownPtr(ksTransferInterface(document3D, ksAPI7Dual, 0), false);
if (!kompasDocument3D) {
MessageBox( NULL, _T("kompasDocument3D не получен (2)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

IPart7Ptr topPart7 = kompasDocument3D->TopPart;
if (!topPart7) {
MessageBox( NULL, _T("topPart7 не получен (3)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

// 02. Получить набор поверхностей модели
ISurfaceContainerPtr surfaceContainer = topPart7;
if(!surfaceContainer) {
MessageBox( NULL, _T("surfaceContainer не получен (4)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

// 03. Получить массив операций удаления граней
IFaceRemoversPtr allRemoversFaces = surfaceContainer->GetFaceRemovers();
if(!allRemoversFaces) { // throw( _T("removedFaces не получен (5)") );
MessageBox( NULL, _T("allRemoversFaces не получен (5)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

// 04. Получить первую операцию удаления граней
IFaceRemoverPtr firstFaceRemover = allRemoversFaces->GetFaceRemover( 0 );
if(!firstFaceRemover) { // throw( _T("removedFaces не получен (5)") );
MessageBox( NULL, _T("firstFaceRemover не получен (6)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

// 05. Удалить первую операцию удаления граней
IFeature7Ptr faceRemoverFeature7 = firstFaceRemover->Owner;
if (!faceRemoverFeature7) {
MessageBox( NULL, _T("faceRemoverFeature7 не получен (7)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}
BOOL resultDelete = faceRemoverFeature7->Delete();
if(!resultDelete) {
MessageBox( NULL, _T("Не удалось удалить операцию удаления граней (8)"), title_dialog, MB_OK|MB_ICONERROR );
return;
}

// 06. Проверить указатель операции удаления firstFaceRemover после ее удаления
if(firstFaceRemover != NULL ) {
MessageBox( NULL, _T("BAD: после удаления firstFaceRemover не обнулился (9a)"), title_dialog, MB_OK|MB_ICONERROR );
// Принудительное обнуление
firstFaceRemover = NULL;
if(firstFaceRemover != NULL )
MessageBox( NULL, _T("BAD: после принудительного обнуления firstFaceRemover все равно не обнулился (10a)"), title_dialog, MB_OK|MB_ICONERROR );
else
MessageBox( NULL, _T("OK: после принудительного обнуления firstFaceRemover обнулился (10b)"), title_dialog, MB_OK|MB_ICONINFORMATION );
} else {
MessageBox( NULL, _T("OK: после удаления firstFaceRemover обнулился (9b)"), title_dialog, MB_OK|MB_ICONINFORMATION );
}

return;
}


У меня выводится сообщение под номером 10b (т.е., после принудительного обнуления указателя).

Спасибо!

#1
Я обычно принудительно обнуляю, после удаления, т.к у меня везде проверки на nil, что предотвращает ошибки.
За полученным указателем, должен следить его хозяин.