Точки пересечения объектов

Автор antigrav, 07.05.25, 12:17:53

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

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

antigrav

Здравствуйте, коллеги!
Пытаюсь найти точки пересечения поверхности и оси. Для этого использую следующий код (даю фрагмент):

var
  top_part: IPart7; // считаем, что инициализирован
  aux_cont: IAuxiliaryGeomContainer;
  surs_cont: ISurfaceContainer;
  sur_tmp, sur: IEquidistantSurface;
  ax: IModelObject;
  I: Integer;
  points: IPoints3D;
  сross_point: IPoint3D;
  b_sur,b_ax, b_point: boolean;
begin
  ...

  // Пересекающиеся объекты построены через приложение Компас и в документе есть!
  aux_cont := top_part as IAuxiliaryGeomContainer; // контейнер вспом. геометрии
  surs_cont := top_part as ISurfaceContainer; // контейнер поверхностей документа

  // ищем поверхность среди эквидистантных
  sur := nil;
  for I := 0 to Pred(surs_cont.EquidistantSurfaces.Count) do
  begin
    sur_tmp := surs_cont.EquidistantSurfaces.EquidistantSurface;
    if sur_tmp.Name = 'Нужная поверхность' then
    begin
      sur := sur_tmp;
      break;
    end;
  end;
  if not Assigned(sur) then Exit; // продолжаем, если поверхность нашлась

  // ищем ось
  ax := nil;
  for I := 0 to Pred(aux_cont.Axes3D.Count) do
  begin
    if aux_cont.Axes3D.Name = 'Нужная ось' then
    begin
      ax := aux_cont.Axes3D;
      break;
    end;
  end;
  if not Assigned(ax) then Exit; // продолжаем, если ось нашлась

  // в этот массив будем добавлять точки
  points := (top_part as IModelContainer).Points3D;

  // точка пересечения (на самом деле точек пересечения должно быть две!)
  сross_point := points.Add;
  сross_point.ParameterType := ksPIntersect;
  with сross_point.Parameters as IPoint3DParamIntersect do
  begin
    b_sur := SetSurfaceObject(sur); // возвращает TRUE
    b_ax := SetCurveObject(ax); // возвращает FALSE!!!
  end;
  if b_sur and b_ax then b_point := сross_point.Update;
  ...
end;

Поверхность sur и ось ax находятся. Однако, команда SetCurveObject(ax) возвращает False и пересечения нет. Если порядок установки объектов поменять, то есть написать

  b_ax := SetCurveObject(ax);
  b_sur := SetSurfaceObject(sur)

то b_ax вернет True, a b_sur вернет False.

В приложении Компас, при работе через графический интерфейс, точки пересечения находятся.
Уважаемые эксперты, в чем может быть ошибка?

UU

Возможно нужно сначала указать IPoint3DParamIntersect.Index - Индекс точки пересечения, а потом уже поверхность и кривую.

p3452

Что возвращает массив CartPointArray ?

UU

Цитата: p3452 от 07.05.25, 13:26:59Что возвращает массив CartPointArray ?
Что он может вернуть если, один из пересекающихся объектов не устанавливается?

p3452

Цитата: UU от 07.05.25, 13:28:57то он может вернуть если, один из пересекающихся объектов не устанавливается?
Самая частая "ошибка API" (ИМХО) - неверный флаг возврата!
- Выполнить и проигнорировать флаги возврата для SetCurveObject() и SetSurfaceObject(), проверить массив CartPointArray...

UU

#5
Цитата: p3452 от 07.05.25, 13:33:42Самая частая "ошибка API" (ИМХО) - неверный флаг возврата!
- Выполнить и проигнорировать флаги возврата для SetCurveObject() и SetSurfaceObject(), проверить массив CartPointArray...
Самая частая ошибка, кода поверхность в одну сторону отсекается, а в другую уже Компас не видит пересечение, ну и тому подобные.
А IPoint3DParamIntersect.Index:=0; - я бы поставил, т.к. в IPoint3D, массив не запихнёшь.
И у IPoint3D установить - Опорный объект - IPoint3D.AssociationObject(sur);

antigrav

Спасибо за ответы! Проведу несколько экспериментов, и отпишусь.

antigrav

Цитата: UU от 07.05.25, 13:06:22Возможно нужно сначала указать IPoint3DParamIntersect.Index - Индекс точки пересечения, а потом уже поверхность и кривую.

Изменил код следующим образом: 

  // точка пересечения (на самом деле точек пересечения должно быть две!)
  сross_point := points.Add;
  сross_point.ParameterType := ksPIntersect;
  with сross_point.Parameters as IPoint3DParamIntersect do
  begin
    Index := 0;
    b_sur := SetSurfaceObject(sur); // возвращает TRUE
    b_ax := SetCurveObject(ax); // возвращает FALSE!!!
  end;

Результат тот же, b_ax = FALSE.
Флаги возврата я стал проверять только после того, как ничего не обнаружил в массиве CartPointArray.

Сам массив CartPointArray проверяю так:

vr: Variant;
vr := (сross_point.Parameters as IPoint3DParamIntersect).CartPointArray;
vr_count := VarArrayDimCount(vr);

В отладчике vr значится как Unassigned, vr_count = 0.

UU

Цитата: antigrav от 07.05.25, 13:49:12Спасибо за ответы! Проведу несколько экспериментов, и отпишусь.
Сообщение выше внимательно читали?

antigrav

Цитата: UU от 07.05.25, 14:11:57Сообщение выше внимательно читали?

Старался. Что-то упустил?

antigrav

Цитата: UU от 07.05.25, 13:39:59Самая частая ошибка, кода поверхность в одну сторону отсекается, а в другую уже Компас не видит пересечение, ну и тому подобные.
А IPoint3DParamIntersect.Index:=0; - я бы поставил, т.к. в IPoint3D, массив не запихнёшь.
И у IPoint3D установить - Опорный объект - IPoint3D.AssociationObject(sur);

Опорный объект для данной точки установить не могу, так как это точка пересечения. Для другого типа точек можно. Это информация из sdk.

UU

Цитата: antigrav от 07.05.25, 14:38:55Опорный объект для данной точки установить не могу, так как это точка пересечения. Для другого типа точек можно. Это информация из sdk.
Проверил в 24 версии, похоже на глюк, второй объект не хочет устанавливать, получается ошибка "Потеря опорного объекта".
В 23 версии такой глюк был в 2D.
В визуальном режиме строит нормально.
+ Благодарностей: 1

antigrav

Цитата: UU от 07.05.25, 16:14:47Проверил в 24 версии, похоже на глюк, второй объект не хочет устанавливать, получается ошибка "Потеря опорного объекта".
В 23 версии такой глюк был в 2D.
В визуальном режиме строит нормально.

Спасибо за участие!

antigrav

Цитата: UU от 07.05.25, 16:14:47Проверил в 24 версии, похоже на глюк, второй объект не хочет устанавливать, получается ошибка "Потеря опорного объекта".
В 23 версии такой глюк был в 2D.
В визуальном режиме строит нормально.

UU, а как Вам удалось получить сообщение об ошибке "Потеря опорного объекта"? Какими командами? Спасибо!

UU

Цитата: antigrav от 08.05.25, 17:02:24UU, а как Вам удалось получить сообщение об ошибке "Потеря опорного объекта"? Какими командами? Спасибо!
Так он сам об этом пишет, что потерялся.

Lemieux

Цитата: UU от 07.05.25, 16:14:47Проверил в 24 версии, похоже на глюк, второй объект не хочет устанавливать, получается ошибка "Потеря опорного объекта".
В API КОМПАС с опорными объектами точек всё печально. Там всё поломано. Ошибка была начиная с 21 версии, так как начинал работать с 21 версии КОМПАС.

Student2025

Всегда будут велосипеды - в той или иной степени.

UU

Цитата: Lemieux от 08.05.25, 23:51:33В API КОМПАС с опорными объектами точек всё печально. Там всё поломано. Ошибка была начиная с 21 версии, так как начинал работать с 21 версии КОМПАС.
24 версия, ничего не поменялось, подождём 35 версию.

Student2025

Цитата: UU от 09.05.25, 07:40:2324 версия, ничего не поменялось, подождём 35 версию.

А как же баннер на верху сайта ? Тестируем 24 версию -> нашли баги -> пишем о них и получаем призы в виде негатива.

А так вижу вроде как 3 способа решения - велсапед однако.

UU

Цитата: Student2025 от 09.05.25, 09:19:28А как же баннер на верху сайта ? Тестируем 24 версию -> нашли баги -> пишем о них и получаем призы в виде негатива.

А так вижу вроде как 3 способа решения - велсапед однако.
Я у них за банен - в СТП, да и помогать не буду.