есть метод ksBody: checkintersecwithbody позволяет определять пересечение или касание двух компонентов при перемещении их относительно друг друга, можно получить количество пересечений и тип пересечения а как получить сами точки???????
Может ребра и грани по пересекать.
Можно еще поиспользовать IMeasurer
Он работает для граней, ребер, и вершин
слишком громоздкий алгоритм получится, как нибудь просто нельзя получить точки касания двух компонентов в сборке
хотя это намного лучше чем я раньше использовал
посмотрел на досуге методы ksMeasurer но ничего подходящего не нашел, поясните пожалуста как по вашему это можно реализовать?
Меня тоже волнует вопрос. Ведь когда мы в самом Компасе проверяем пересечения, он подсвечивает проблемные участки! А значит, он их локализует. Подозреваю, что в API решили это не реализовывать - надо же приберечь какие-нить новинки для Компаса 9 ;) :-)))
Да через IMeasurer рассчитывать пересечения довольнотоки трудоемко.
поэтому сначала лучше проверить есть ли пересечения с помощью checkIntersectionWithBody
а потом запускать расчет растояний между гранями двух тел.
если расстояние 0 то пересекаются если >0 то нет.
Если пересекаются то можно запускать поиск пересечения ребер одного тела с гранью другого.
А нельзя получить указатель на элементы которые компас подсвечивает при столкновении?
можно ли определить принадлежит точка модели или компоненту сборки, т.е. взяв любую точку узнать лежит ли она на поверхности или внутри какого либо элемента???
Цитата: ~gin~ от 21.02.06, 09:25:12
можно ли определить принадлежит точка модели или компоненту сборки, т.е. взяв любую точку узнать лежит ли она на поверхности или внутри какого либо элемента???
На поверхности наверное можно так (если известны коортинаты точки):
1.Взять коллекцию всех поверхностей.
2.Вызвать ksEntityCollection::SelectByPoint
3.Если после этого в коллекции что-то осталось, то точка лежит на поверхности детали.
как раз это и нужно было спасибо
не могу понять где ошибка вот часть кода
//получить указатель на верхнюю половину штампа
iPart1 := PartCollection.GetByName('верхняя половина штампа', true, true) as ksPart;
//получить указатель на нижнюю половину штампа
iPart2 := PartCollection.GetByName('нижняя половина штампа', true, true) as ksPart;
//заполнить массив элементов
iEntityCollection1 := iPart1.EntityCollection(o3d_face) as ksEntityCollection;
//заполнить массив элементов
iEntityCollection2 := iPart2.EntityCollection(o3d_face) as ksEntityCollection;
Memo1.Lines.Add(Format('+ %d : %d',[iEntityCollection1.GetCount, iEntityCollection2.GetCount]));
for i := 0 to length(BEMBillet) do
begin
Memo1.Lines.Add(Format('+ %d : %d',[iEntityCollection1.GetCount, iEntityCollection2.GetCount]));
if ((iEntityCollection1.SelectByPoint(BEMBillet.x, BEMBillet.y,
BEMBillet.z)) and (iEntityCollection1.GetCount = 0)) and
((iEntityCollection2.SelectByPoint(BEMBillet.x, BEMBillet.y,
BEMBillet.z)) and (iEntityCollection2.GetCount = 0)) then
begin
....
end;
Memo1.Lines.Add(Format('- %d : %d',[iEntityCollection1.GetCount, iEntityCollection2.GetCount]));
//проверка касания точки верхей половины штампа
if (iEntityCollection1.GetCount <> 0) then
begin
....
end;
if (iEntityCollection2.GetCount <> 0) then
begin
....
end
end;
ни одно условие не выполняется т.е. постоянно в массиве после вызова selectbypoint не остается ниодного элемента когда как подставляемые точки явно касаются повержности, если o3d_face заменить на o3d_unknow при заполнении массива то после проверки массив содержи все точки когда такого не может быть тоже
еще вопрос насчет ksfacet:tesselation в помощи описан а в коде его нет, это его забыли туда включить или .....????
может быть координаты точек передаете не в той системе кооординат?
Цитата: ~gin~ от 28.02.06, 09:34:31
еще вопрос насчет ksfacet:tesselation в помощи описан а в коде его нет, это его забыли туда включить или .....????
Нет, может и не забыли. Он может просто как-нибудь по-другому называется в API под Delphi, тогда как хэлп писался для С++. Я когда-то с чем то похожим сталкивался, но тогда "не было" целого интерфейса (по-моему, какой-то из вспом. осей), а потом оказалось, что у него название отличается всего несколькими символами от приведенного в справке.
да нет с координатами проблем быть не должно их я получаю от компаса же при триангуляции и затем эти координаты и проверяю на касание с другим объектом. т.е. есть инструмент и заготовка и вот я пытаюсь определить какими точками заготовка касается инструмента, инструмент может быть составным
а насчет tesselation, ошибся ksSurface а не ksFacet искал фаром в файлах sdk компаса не нашел его и при описании методов ksSurface нет его
Сколько не тестировал всегда в зависимости от того какой устанавливаешь тип объекта при формировании массива объектов в элементе сборки, скажем o3d_unknown или o3d_face получаются совсем разные результаты в первом случае 13 элементов в массиве во втором 40 это для одной и той же детали, а после проверки принаждлежности точки детали в массиве в одном случае всегда пусто а в другом говорит что точка одновременно принадлежит двум деталям когда эти детали деже не касаются друг друга:(
забыл написать заготовка разбивается на полигоны триангуляцией возможностями компаса а инструмент нет, точки проверяю методом selectbypoint
Доа посмотрел и действительно itesselation.getpoint даёт координаты точки single а при вызове selectpoint надо задавать в double, подправил код в kstlb.pas результат немного изменился но не то что я хотел получить. Стал проверять триангуляцию т.е. полученные точки при разбиении на полигоны записал в текстовый файл и потом считал их в ломанную геометрия детали похожа но при этом есть смещения по двум осям т.е. вырисовываю ломанную поверх своей детали и она не совпадает, помоему по оси x и у есть смещение а вот по z всё совпадает в чем может быть дело?
Может, в нестыковке между координатными системами детали и сборки?
незнаю это не проверял еще хотя думал об этом, пока просто все детали сопрягал таким образом что начало координат заготовки совмещал с началом координат сборки
Как сделать чтобы координаты триангуляционной сетки компонента были согласованы с началом координат сборки?
суть вопроса в том что когда работаешь с деталью в сборке все измерения относительно координат детали производятся а не сборки, как задать чтобы использовались координаты сборки по умолчанию, или как можно перенести начало координат в детали без перемещения самой детали?
с поставленными выше вопросами давно разобрался, а теперь не могу реализовать определение растояние от точки принадлежащей одной детали до другой детали, есть ksMeasurer для определения растояния между двумя телами но в метод SetObject1 можно подсунуть только грань, плоскость, ... и никак не получается сунуть туда трехмерную точку, есть PointParam но там всего 2 координаты как можно затолкать в SelectObject координаты трехмерной точки, что бы потом узнать какое расстояние от нее до другого тела(грани, плоскости ...), перерыл весь хелп, но так и не нашел переменную Idispatch для хранения координат точки. первая деталь хранится в компасе, а вторая в виде точек триангуляционной сетки. Также интересует можно ли подкорректировать деталь в компасе если я получил координаты триангуляционной сетки с помощью ksTesselation затем провел с ними (координатами) некоторые манипуляции и затем хочу изменить или построить деталь уже по точкам новой триангуляционной сетки.
Заранее спасибо, если нет ответов по существу, помогут даже предпложения или догадки как это можно сделать
все еще актуально
В SetObject можно еще затолкать Vertex.
Но он должен существовать в модели. Надо чего-нибуть построить по координатам которые в сетке триангуляционной есть. Ну хотя бы эскиз с одной точкой.
А потом уже мерить от Vertex'а из эскиза до ребра или грани модели.
А если расстояние мерять надо только между точками, то проще взять ломаную (ksPolyLineDefinition) и постоить ее. Первая точка будет вершина модели, вторая координаты триангуляции. Потом берем ребро от ломаной и его длину.
спасибо, с vertexом похоже должно получиться, еле еле 9 компас нашел думал хоть в чем что то новое есть, но похоже sdk из версии к версии не сильно изменяется, нового ничего не добавляют, хотя imeasurer немного подправили
нашел было как сунуть координаты точки в imeasurer
но при компиляции ошибок нет но при запуске библиотеки на строках с iPointParam вылетает
iPointParam.buildingType := 0;
if iPointParam.SetParamVertex(10, 10, 10, 1) then
begin
end;
iMeasurer.SetObject1(iPart1);
iMeasurer.SetObject2(iPointParam);
iMeasurer.Calc;
dist := iMeasurer.Distance;
где я ошибся?
iPointParam - он же вроде как 2D-интерфейс :?: Из за этого и вылетает
если даже iPointParam: ksPolyLineVertexParam то коспас считает 2d методом???
Сдаюсь.
Вот смотрю на iPointParam. Кроме стиля и двух координат, X и Y у него ничего нету.
Другое дело
IPolygonalLineVertexParam
У него и buildingType есть, и SetParamVertex
Только тогда надо Ломаную в 3D создать.
в том то и дело какая разница как я обозвал переменную главное она описана как ksPolyLineVertexParam и ошибка на любой строке где iPointParam может нельзя называть переменные также как и в компасе вот попробую обозвать по другому