Как измерить площадь поверхности заплатки (ISurfacePatch)?

Автор Akew, 05.11.15, 19:34:30

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

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

Akew

И еще один вопрос:
как можно получить площадь поверхности, например, заплатки (ISurfacePatch)?

Непосредственного интерфейса в мануале найти не удалось, кроме упоминаний prMeasureArea и prMeasureArea3D, все в том же списке процессов ProcessTypeEnum.
В Компасе можно получить площадь у любой поверхности (меню Сервис - Измерить - Площадь), но хотелось бы реализовать это программно.

Спасибо!


Akew

Цитировать
ISurface.GetArea - получить площадь поверхности.

Спасибо, но как получить ISurface из ISurfacePatch?
В мануале перечислены интерфейсы, из которых можно получить ISurface, и ISurfacePatch среди них нет :(.

Самого древнего и основного, тоже нет?
Грань (Интерфейсы ksFaceDefinition, IFaceDefinition).

Akew

ЦитироватьГрань (Интерфейсы ksFaceDefinition, IFaceDefinition
Понял Вашу мысль. Но реализовать этот вариант тоже пока не удалось.
Интерфейс ksEntity от ISurfacePatch получил, но выйти на ksFaceDefinition - пока не смог: не отрабатывает ksEntity::GetDefinition() (и вариации).
"Цитирую" свой проблемный код:

//----
// Вычислить площадь заплатки.
// Возвращается true/false при успехе/не успехе; при успехе площадь сохраняется в &areaPatch.
// ---
bool getAreaOfSurfacePatch( ISurfacePatchPtr surfacePatch, double &areaPatch) {
CString title_dialog; title_dialog.Format(_T("Функция %s"), _T("MakeHolesInParentContour"));
CString tmpstr;

areaPatch = 0.0;

// 1. Получить ksEntity поверхности заплатки surfacePatch - НОРМАЛЬНО
ksEntityPtr entitySurfacePatch( ksTransferInterface( surfacePatch, ksAPI5Auto, o3d_entity ) ); // Отрабатывает
if (!entitySurfacePatch) {
tmpstr.Format(_T("не получен entitySurfacePatch (1)"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return false;
}
tmpstr.Format(_T("entitySurfacePatch получен (1)"));
MessageBox( NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );


// 2. Получить ksFaceDefinition - пока НЕ ПРОХОДИТ
// LPDISPATCH faceDefinitionSurfacePatch = entitySurfacePatch->GetDefinition(); // *** НЕ ОТРАБАТЫВАЕТ
// ksFaceDefinitionPtr faceDefinitionSurfacePatch = entitySurfacePatch->GetDefinition(); // *** НЕ ОТРАБАТЫВАЕТ

ksFaceDefinitionPtr faceDefinitionSurfacePatch( ksTransferInterface( entitySurfacePatch, ksAPI5Auto, o3d_face ) ); // *** НЕ ОТРАБАТЫВАЕТ
if (!faceDefinitionSurfacePatch) {
tmpstr.Format(_T("не получен faceDefinitionSurfacePatch (2)"));
MessageBox(NULL, tmpstr, title_dialog, MB_OK | MB_ICONERROR);
return false;
}
tmpstr.Format(_T("faceDefinitionSurfacePatch получен (2)"));
MessageBox( NULL, tmpstr, title_dialog, MB_OK|MB_ICONINFORMATION );

// 3. Вычислить площадь заплатки (в квадратных миллиметрах)
areaPatch = faceDefinitionSurfacePatch->GetArea( ST_MIX_MM );

return true;
}

Прилагаю также полный код своего проекта на Visual C++ 2005. Он создает "заплатку" как контур по заданным точкам, и пытается определить его площадь. Проблемное место - функция getAreaOfSurfacePatch в конце файла ProcessContour.cpp (каталог sources\ExperimentalFolder\).

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

Заплаток в API5 - не было, по этому ks, можно забыть.
ISurfacePatch, есть IModelObject - получаем сначала его, затем трансформируем в IFaceDefinition.
PS. Это было моё предложение, но я работоспособность не проверял.

Akew

Sabahs,
ЦитироватьЗаплаток в API5 - не было, по этому ks, можно забыть
- не означает ли это, что целесообразно отказаться от интерфейсов "ks*", а вместо них использовать "I*" аналоги (если они есть)?

Зачем отказываться, нужно использовать все возможности, просто в одном случае, есть альтернативы, а в другом, их нет.