Как получить точки касания двух компонентов в сборке?

Автор ~gin~, 24.01.06, 13:29:08

« предыдущая - следующая »

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

~gin~

есть метод ksBody:  checkintersecwithbody позволяет определять пересечение или касание двух компонентов при перемещении их относительно друг друга, можно получить количество пересечений и тип пересечения а как получить сами точки???????

333

Может ребра и грани по пересекать.
Можно еще поиспользовать IMeasurer
Он работает для граней, ребер, и вершин

~gin~

слишком громоздкий алгоритм получится, как нибудь просто нельзя получить точки касания двух компонентов в сборке

~gin~

хотя это намного лучше чем я раньше использовал

~gin~

посмотрел на досуге методы ksMeasurer но ничего подходящего не нашел, поясните пожалуста как по вашему это можно реализовать?

Gek

Меня тоже волнует вопрос. Ведь когда мы в самом Компасе проверяем пересечения, он подсвечивает проблемные участки! А значит, он их локализует. Подозреваю, что в API решили это не реализовывать - надо же приберечь какие-нить новинки для Компаса 9  ;) :-)))

333

Да через IMeasurer рассчитывать пересечения довольнотоки трудоемко.
поэтому сначала лучше проверить есть ли пересечения с помощью checkIntersectionWithBody
а потом запускать расчет растояний между гранями двух тел.
если расстояние 0 то пересекаются если >0 то нет.
Если пересекаются то можно запускать поиск пересечения ребер одного тела с гранью другого.

~gin~

А нельзя получить указатель на элементы которые компас подсвечивает при столкновении?

~gin~

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

Slaviation

Цитата: ~gin~ от 21.02.06, 09:25:12
можно ли определить принадлежит точка модели или компоненту сборки, т.е. взяв любую точку узнать лежит ли она на поверхности или внутри какого либо элемента???

На поверхности наверное можно так (если известны коортинаты точки):
1.Взять коллекцию всех поверхностей.
2.Вызвать ksEntityCollection::SelectByPoint
3.Если после этого в коллекции что-то осталось, то точка лежит на поверхности детали.




~gin~


~gin~

не могу понять где ошибка вот часть кода

    //получить указатель на верхнюю половину штампа
    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 в помощи описан а в коде его нет, это его забыли туда включить или .....????

333

может быть координаты точек передаете не в той системе кооординат?

IronMaxxx

Цитата: ~gin~ от 28.02.06, 09:34:31
еще вопрос насчет ksfacet:tesselation в помощи описан а в коде его нет, это его забыли туда включить или .....????


Нет, может и не забыли. Он может просто как-нибудь по-другому называется в API под Delphi, тогда как хэлп писался для С++. Я когда-то с чем то похожим сталкивался, но тогда "не было" целого интерфейса (по-моему, какой-то из вспом. осей), а потом оказалось, что у него название отличается всего несколькими символами от приведенного в справке.

~gin~

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

а насчет tesselation, ошибся ksSurface а не ksFacet искал фаром в файлах sdk компаса не нашел его и при описании методов ksSurface нет его

Сколько не тестировал всегда в зависимости от того какой устанавливаешь тип объекта при формировании массива объектов в элементе сборки, скажем o3d_unknown   или  o3d_face получаются совсем разные результаты в первом случае 13 элементов в массиве во втором 40 это для одной и той же детали, а после проверки принаждлежности точки детали в массиве в одном случае всегда пусто а в другом говорит что точка одновременно принадлежит двум деталям когда эти детали деже не касаются друг друга:(

~gin~

забыл написать заготовка разбивается на полигоны триангуляцией возможностями компаса а инструмент нет, точки проверяю методом selectbypoint

~gin~

Доа посмотрел и действительно itesselation.getpoint даёт координаты точки single а при вызове selectpoint надо задавать в double, подправил код в kstlb.pas результат немного изменился но не то что я хотел получить. Стал проверять триангуляцию т.е. полученные точки при разбиении на полигоны записал в текстовый файл и потом считал их в ломанную геометрия детали похожа но при этом есть смещения по двум осям т.е. вырисовываю ломанную поверх своей детали и она не совпадает, помоему по оси x и у есть смещение а вот по z всё совпадает в чем может быть дело?

Gek

Может, в нестыковке между координатными системами детали и сборки?

gin

незнаю это не проверял еще хотя думал об этом, пока просто все детали сопрягал таким образом что начало координат заготовки совмещал с началом координат сборки

gin

Как сделать чтобы координаты триангуляционной сетки компонента были согласованы с началом координат сборки?