Существует не некой поверхности кривая (в контексте примера interect_curve1). Есть набор точек, относительно которых делаются некоторые построения в привязке к этой кривой. Точки объединены в список, построения выполняются средствами Knowledge pattern. Основной инструмент построения - CreateOrModifyDatum.
Относительно каждой точки строится некая кривая (для простоты пусть окружность), которая проецируется на заданную целевую поверхность (в моем случае target_surf). Ищется пересечение заданной кривой с каждой такой проекцией. Код на этом этапе выглядит так:
- Код: Выделить всё
for p inside `Points Lo `
{
/*
set l=CreateOrModifyDatum("Line", gs2 , `Relations\Knowledge Pattern.1\Lines` , i)
l.Name = "Line." + ToString(i)
l.Show = false */
l = linenormal(target_surf ,p,0mm,2mm,true)
/*
set Crc = CreateOrModifyDatum("Circle",gs2,`Relations\Knowledge Pattern.1\circles` ,i)
Crc.Show = false
Crc.Name = "Crc." + ToString(i) */
Crc = circleCtrAxis(l, p, 0.825mm , 0, 0, false , 1)
set Proj_curve = CreateOrModifyDatum("Curve",gs2, `Relations\Knowledge Pattern.1\ProjCurvs` ,i)
Proj_curve .Name = "Proj_curve." + ToString(i)
Proj_curve = project(Crc , target_surf , direction(l) )
Interect_point = intersect(Proj_curve, interect_curve1)
Закомментированные фрагменты служат отладочным целям. На данном этапе я получаю множественное пересечение. Оно может состоять из двух CATVertex-ов, одного, может вообще не иметь пересечения. В моем случае необходимо выделить все такие точки (вершины) для создания дальнейших построений. На самом деле мне удалось это сделать при помощи
- Код: Выделить всё
near_point = near(Interect_point, zero_point)
,где zero_point - некая наперед заданная точка. Понятно, что невозможно найти (придумать) 2-х универсальных точек, чтоб функционал near "цеплял" каждый раз разные вершины в таком наборе. Соответственно, для корректной работы такого алгоритма требуется:
- дополнительная проверка на количество полученных вершин
- дополнительное формирование пары точек, для которых near будет возвращать разные вершины
Намного более приятным подходом к решению мне видится конструкция с перебором полученных вершин, которые, как оказалось, располагаются в списке GetSubElements(0)
- Код: Выделить всё
For v inside Interect_point.GetSubElements(0)
{
Trace(1," v = #",v.Name)
w = extract(v)
Trace(1," w = #",w.Name)
}
Трассировки для отладки. В данном контексте определены v (CATVertex), w (wireframe). Собственно, не работает этот метод extract. Я его пробовал с аргументами и без. Прямое (set p1= ) создание точки результатов также не дает. Дополнительных субэлементов не содержит :
- Код: Выделить всё
Message(" SubElements_Size= #",w.GetSubElements(0)->Size() )
-возвращает 0. В качестве параметра пробовал
- Код: Выделить всё
let g_e (GSMExtract)
....
set g_e = extract(v)
Тоже по нулям.
Катя выдает две ошибки:
Update failed :
Not Connex Specification
A BRep has become not connex.
Please, edit the related Extract in update error,
and redefine the specification.
Update failed :
Invalid, empty or missing input element.
One mandatory input element is invalid, empty or missing.
There is no solution for this operation.
Вторая, видимо, при попытке использовать не инициализированной точки в дальнейшем построении. Так что ключевая ошибка - в первом сообщении.
Файл не прикрепляю, ситуацию можно смоделировать построением любой пары кривых на некоторой поверхности с дальнейшим извлечением их пересечения. Я пробовал, результат тот же. Вертексы есть, Катя исправно их укладывает в виде субэлементов, Их можно извлечь, прочесть параметры, а хотелось бы получить точки. С Катей работаю второй месяц, увы оф. документация на эту тему очень скудная. Других источников информации пока не нашел. С VBA пока не связывался. Надеюсь, моя задача решается средствами Knowledge языка. Заранее спасибо!