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

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

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

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

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

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

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

Построение точки по пересечению линии и грани

Автор Afanas, 11.02.16, 14:06:26

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

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

Afanas

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

Пытаюсь найти в SDK.chm ( и других источниках ) как построить точку, но найти не получается.
Нужна точка на пересечении грани и осевой линии ( или отрезка ). Всё в трёхмерном пространстве.

Если делать руками - ни малейших затруднений:
Операции - Пространственные кривые - Точка - выбираем способ "Пересечение"
- указываем объект Грань и объект Ось через две вершины
Скриншоты в приложении.

Но как повторить на Delphi через API - не нахожу :(
Вообще не нахожу аналогов и для некоторых других команд.

помимо SDK.chm читаю: Норсеев Разработка приложений под КОМПАС в Delphi
                                       Кидрук Компас-3D V10 на 100%

Примера нет, но есть IPoint3DParamIntersect - интерфейс параметров пространственной точки, заданной на пересечении опорных объектов.

Akew

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

Я решал Вашу подобную задачу в более сложном варианте, направляю фрагменты своего кода:
//-------------------------------------------------------------------------------
// Показать координаты пересечений отрезка a1-a2 граней делалей сборки document3D и отстроить эти точки
// ---
void GetIntersections(
KompasObjectPtr MyKompasObject,
ksDocument3DPtr document3D, // Указатель на документ, в котором ищутся грани
CPoint3D a1, // Начальная точка прямой
CPoint3D a2, // Конечная точка прямой
long color_line // Цвет прямой
) {
CString title_dialog; title_dialog.Format(_T("Функция %s"), _T("GetOuterFacesIntersection")); // Заголовок окна сообщений функции
CString tmpstr;

ksPartPtr toppart = document3D->GetPart(pTop_Part);
if (toppart == NULL) return;
IPart7Ptr part7 = MyKompasObject->TransferInterface(toppart, ksAPI7Dual, o3d_part);
if (part7 == NULL) return;

ksCurve3DPtr myLine3D; // Отрезок - сегмент ломаной
DrawLineTwo3DPoints2(toppart, part7, a1, a2, color_line, myLine3D, auxiliary_elements, count_auxiliary_elements);
if(!myLine3D) {
tmpstr.Format( _T( "*** myLine3D==NULL. Выход" ) );
MessageBox(NULL, tmpstr, title_dialog, MB_OK); return;
}

// В этом месте:
// создан myLine3D - ломаная линия,
// toppart - компонент 3D документа верхнего уровня.
// Получаем точки пересечения компонент документа этой линией.

// 05. Получить пересечения
// 05-1. Подготовка
ksPartCollectionPtr part_collection = document3D->PartCollection(false); // 1. Массив деталей
ksFaceCollectionPtr face_collection = document3D->GetInterface(o3d_faceCollection); // 2. Массив граней
ksCoordinate3dCollectionPtr points_collection = document3D->GetInterface(o3d_coordinate3dCollection); // 3. Массив точек, который будет заполнен

// 05-2. Получение
if (!(toppart->CurveIntersection(
myLine3D,
part_collection,
face_collection,
points_collection
))) {
tmpstr.Format(_T("*** пересечения отсутствуют."));
MessageBox(NULL, tmpstr, title_dialog, MB_OK);
WtiteToLog(log, tmpstr);
return;
}

// 06. Показать точки пересечений
CString tmpstr_0;
tmpstr.Format(_T("Получено точек пересечений в сборке: %ld:\n"), points_collection->GetCount());
for (long i_point = 0; i_point<points_collection->GetCount(); ++i_point) {
double x, y, z;
if (!points_collection->GetByIndex(i_point, &x, &y, &z)) {
tmpstr_0.Format(_T("*** не удалось получить параметры точки %ld"), i_point);
MessageBox(NULL, tmpstr_0, title_dialog, MB_OK);
continue;
}
tmpstr_0.Format(_T("Точка %ld: (%.16f; %.16f; %.16f)\n"),
i_point + 1, x, y, z
);
tmpstr = tmpstr + tmpstr_0;
CString tmpstr_2;
tmpstr_2.Format(_T("Пересечение для детали %ld грани %ld"), i_part, i_face);
WtiteToLog(log, tmpstr_2);
Insert3DpointNew( document3D, x, y, z, _bstr_t(tmpstr_2), ksPlusPoint, RGB( 0, 0, 255 ) ); // Изобразить точку пересечения
}

...

return;
}


//-------------------------------------------------------------------------------
// 3. Отрисовать отрезок по двум точкам и создать ломаную
// ---
void DrawLineTwo3DPoints2(ksPartPtr toppart, IPart7Ptr part7, CPoint3D a1, CPoint3D a2, long color, ksCurve3DPtr &myLine3D ) {
CString title_dialog; title_dialog.Format(_T("Функция %s"), _T("DrawLineTwo3DPoints")); // Заголовок окна сообщений функции
CString tmpstr;

// На myLine3D передается ссылка (&myLine3D), - в этом случае происходит модификация этой переменной

// 1. Создать две точки, через которые будет построен отрезок, параллельный 0Z
ksEntityPtr a1_point = Insert3DpointNew(part7, a1.x, a1.y, a1.z, _T("1 point"), ksDotPoint, RGB(255, 0, 0) );

ksEntityPtr a2_point = Insert3DpointNew(part7, a2.x, a2.y, a2.z, _T("2 point"), ksDotPoint, RGB(255, 0, 0) );

// 2. Создать отрезок
ksEntityPtr axis2Points_entity = toppart->NewEntity(o3d_axis2Points);
if (!axis2Points_entity) return;

// 3. Назначить свой цвет линии
ksColorParamPtr color_axis2Points = axis2Points_entity->ColorParam();
if (color_axis2Points) color_axis2Points->Putcolor(color);
axis2Points_entity->Update();

// 4. Определить точки линии
ksAxis2PointsDefinitionPtr axis2Points_definition = axis2Points_entity->GetDefinition();
if (!axis2Points_definition) return;
axis2Points_definition->SetPoint(1, a1_point);
axis2Points_definition->SetPoint(2, a2_point);
axis2Points_entity->Update(); // Нарисовать линию

// 5. Создать ломаную
myLine3D = axis2Points_definition->GetCurve3D();

return;
}

//-----------------------------------------------------------------------------
// Создание трехмерной точки
//---
ksEntityPtr Insert3DpointNew(ksDocument3DPtr doc, double x, double y, double z, _bstr_t namePoint, ksAnnotationSymbolEnum symbol_point, long color) { //--- Вставить трехмерную точку
ksPartPtr part = doc->GetPart(pTop_Part);
if (part == NULL) return NULL;

IPart7Ptr part7 = MyKompasObject->TransferInterface(part, ksAPI7Dual, o3d_part);
IModelContainerPtr ModelContainer = part7;
IPoints3DPtr Points3D = ModelContainer->Points3D;

IPoint3DPtr pnt0 = Points3D->Add();
pnt0->X = x;
pnt0->Y = y;
pnt0->Z = z;
pnt0->Symbol = symbol_point;
pnt0->Name = namePoint;
// Назначить свой цвет точке
IColorParam7Ptr colorPars(pnt0);
if (colorPars) {
colorPars->put_UseColor(useColorOur);
colorPars->PutColor(color);
}
pnt0->Update();
ksEntityPtr entity_pnt0 = MyKompasObject->TransferInterface(pnt0, ksAPI5Auto, o3d_entity); // Получить указатель на точку

return entity_pnt0;
}


К сожалению, не на Delphi, а на Visual C++.

Для начала Вам нужно построить прямую. Я строю ее по двум точкам, - функция DrawLineTwo3DPoints2.
Чтобы построить прямую, нужно построить две точки этой прямой, - функция Insert3DpointNew.
Чтобы получить точки пересечения этой прямой с Вашей моделью и отобразить их, - функция GetIntersections.

MyKompasObject - это то же самое, что и KompasObject.

Источников действительно "не густо".
Я, кроме SDK.chm, использую примеры в SDK, файлы в Include и данный форум. Но в основном приходится доходить своим умом, - так что привыкайте.

Успехов!

Afanas

ЦитироватьIPoint3DParamIntersect

Это API7. Правильно ли я понимаю, что в API5 отсутствует интерфейс с подобной функциональностью ?

В API5 отсутствует, альтернативный в API5, Вам Akew показал.