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

Автор gin, 21.03.06, 09:43:54

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

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

gin

есть сборка упрощенно следующего вида(смотрите вложение), внутри сборки есть разъемный инструмент и заготовка, представлены упрощено, могут быть любой формы и сложности. Необходимо проверить касание заготовки инструмента.
Selectintersecwithbody дает есть касание или нет но точек касания получить невозможно, поэтому разбил заготовку на полигоны с помощью tesselation и записал в динамический массив координаты узлов, затем с помощью selectbypoint проверяю принадлежит или нет точка инструменту отдельно верхнему и нижнему. Но есть загвоздка все вычисления производятся в системе координат детали, той с которой в данный момент работаю, например во время разбиения выдаются координаты в системе координат заготовки, а когда я эти точки проверяю на касание то системы координат не совпадают, используется система координат инструмента. Пробовал использовать transforpoint но ничего мне это не дало потому что перевод координат из системы заготовки в систему инструмента совсем другое чем я ожидал, получилось так что заготовка внедрилась в инструмент т.е. просто всело обе системы координат в одну точку. Хочу узнать как делать все рассчеты в системе координат сборки, и при разбиении и при проверке что бы не переводить координаты, потому что это уязвимое место и тут всегда появляются недочеты и решение задачи сильно зависит от правильности подготовки данных и действий производящихся на этом шаге. Буду очень признателен если подскажете куда двигаться, или даже можно свои соображения высказать а то моя фантазия исчерпалась и не знаю что делать. Спасибо


вот может код что то даст

  begin


    //определение касаний заготовки инстумента
    //получить указатель на заготовку
    iPartBillet := PartCollection.GetByName('заготовка', true, true) as ksPart;

    //получить указатель на верхний инструмент
    iPart1 := PartCollection.GetByName('верхняя половина штампа', true, true) as ksPart;

    //получить указатель на нижний инструмент
    iPart2 := PartCollection.GetByName('нижняя половина штампа', true, true) as ksPart;

    for i := 0 to length(BEMBillet) do
    begin

      //заполнить массив элементов
      iEntityCollection1 := iPart1.EntityCollection(o3d_unknown) as ksEntityCollection;

      //заполнить массив элементов
      iEntityCollection2 := iPart2.EntityCollection(o3d_unknown) as ksEntityCollection;

      //перевести координаты точки в систему координат верхней половины штампа
      x := BEMBillet.x;
      y := BEMBillet.y;
      z := BEMBillet.z;
      iPartBillet.TransformPoint(x, y, z, iPart1);

      //проверяем касание точки верхней половины инструмента
      iEntityCollection1.SelectByPoint(x, y, z);
      Memo1.Lines.Add(inttostr(iEntityCollection1.GetCount));

      //перевести координаты точки в систему координат нижней половины штампа
      x := BEMBillet.x;
      y := BEMBillet.y;
      z := BEMBillet.z;
      iPartBillet.TransformPoint(x, y, z, iPart2);

      //проверяем касание точки нижней половины  инструмента
      iEntityCollection2.SelectByPoint(x, y, z);
      Memo1.Lines.Add(inttostr(iEntityCollection2.GetCount));

      //проверка касания точки верхей и нижней половин штампа
      if (iEntityCollection1.GetCount = 0) and (iEntityCollection2.GetCount = 0) then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + 'не касается штампа');
      end;

      //проверка касания точки верхей половины штампа
      if (iEntityCollection1.GetCount > 0) then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + ' касается верха');
      end;

       //проверка касания точки нижей половины штампа
      if (iEntityCollection2.GetCount > 0) then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + ' касается низа ');
      end;
    end;
  end;

Gek

Попробуй получить переменную сборки

   Assembly := ksPart(iDoc.GetPart(pTop_Part));    { iDoc - документ, в котором все происходит }

А затем ее используй в трансформации СК

   iPartBillet.TransformPoint(x, y, z, Assembly);

Честно скажу, трансформацию как функцию еще не юзал, но по идее должно работать.


gin

ну это  я уже пробовал координаты трансформируются, но когда эти координаты проверяешь на принадлежность к инструменту то всё это проверяется в локальной системе координат инструмента. если переводить в систему координат инструмента то какая то лажа получается заготовка перемещается вверх на величину разницы координат локальных систем координат. Может кто либо уже пользовался трансформацией и есть какой нить нюанс в использовании????

333

Если это нужно для отрисовки в OpenGL то не обязательно делать TransformPoint
Можно в OpenGL включить матрицу преобразования координат соответствующую смещению детали в сборке

gin

нет пока это не нужно но потом конечно пригодится, буду иметь ввиду

мне сейчас важно проверить принадлежность точек одной детали другой детали в сборке для определения их касания(не просто есть оно или нет а какими точками касаются)

333

Все координаты нужно перевести в общую систему координат.
Проще всего в систему координат сборки.
Для того чтобы перевести координаты в систему координат сборки нужно
Assembly := ksPart(iDoc.GetPart(pTop_Part)); // Получить Part сборки
Assembly.TransformPoint(x, y, z, iPartBillet );   // перевести координаты из системы координат iPartBillet в сборку

Можно также переводить точки и из одной детали в другую
Но подозреваю что нужно делать наоборот
не iPartBillet.TransformPoint(x, y, z, iPart2);
а iPart2.TransformPoint(x, y, z, iPartBillet);

gin

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

333


gin

да я вчера успел уже посмотреть, пока ничего не вышло
но есть кое какие идеи

gin

сделал всё и проверил, нашёл следующие недочёты во вложении привожу пример

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

вот как я это теперь делаю

    //получить указатель на заготовку
    iPartBillet := PartCollection.GetByName('заготовка', true, true) as ksPart;

    //получить указатель на верхнюю половину штампа
    iPartDoc := PartCollection.GetByName('верхняя половина штампа', true, true)  as  ksPart;

    //получить указатель на нижнюю половину штампа
    iPartDoc := PartCollection.GetByName('нижняя половина штампа', true, true)  as  ksPart;

    for i := 0 to length(BEMBillet) do
    begin

      //заполнить массив элементов верхней половины штампа
      iEntityCollection1 := iPart1.EntityCollection(o3d_unknown) as  ksEntityCollection;

      //заполнить массив элементов нижней половины штампа
      iEntityCollection2 := iPart2.EntityCollection(o3d_unknown) as  ksEntityCollection;

      //перевести координаты точки в систему координат верхней половины штампа
      x := BEMBillet.x;
      y := BEMBillet.y;
      z := BEMBillet.z;

      if iPart1.TransformPoint(x, y, z, iPartBillet) then
      begin
        write(f1, format('%g %g %g ', [x, y, z]));
        writeln(f1);
      end
      else
        iKompasObject.ksMessage('ошибка в переводе координат точки в систему координат верхней половины штампа');

      //проверяем касание точки верхней половины инструмента
      if iEntityCollection1.SelectByPoint(x, y, z) then
        Memo1.Lines.Add(inttostr(iEntityCollection1.GetCount))
      else
        iKompasObject.ksMessage('ошибка проверки касания точки верхней половины штампа');

      //перевести координаты точки в систему координат нижней половины штампа
      x := BEMBillet.x;
      y := BEMBillet.y;
      z := BEMBillet.z;

      if iPart2.TransformPoint(x, y, z, iPartBillet) then
      begin
        write(f2, format('%g %g %g ', [x, y, z]));
        writeln(f2);
      end
      else
        iKompasObject.ksMessage('ошибка в переводе координат точки в систему координат нижней половины штампа');

      //проверяем касание точки нижней половины  инструмента
      if iEntityCollection2.SelectByPoint(x, y, z) then
        Memo1.Lines.Add(inttostr(iEntityCollection2.GetCount))
      else
        iKompasObject.ksMessage('ошибка проверки касания точки нижней половины штампа');

      //проверка касания точки верхей и нижней половин штампа
      if (iEntityCollection1.GetCount = 0) and (iEntityCollection2.GetCount = 0)
        then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + 'не касается штампа');
      end;

      //проверка касания точки верхей половины штампа
      if (iEntityCollection1.GetCount > 0) then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + ' касается верха');
        iKompasObject.ksMessage('верх')
      end;

      //проверка касания точки нижей половины штампа
      if (iEntityCollection2.GetCount > 0) then
      begin
        //задаем начальные условия
        Memo1.Lines.Add(inttostr(i) + ' касается низа ');
        iKompasObject.ksMessage('низ')
      end;
    end;



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

gin

посмотрел вложение без деталей не понятно смысла(а вкладывать и их нет смысла) поэтому скриншот прикрепить решил

gin

до меня дошло в чем было дело, проверку в виде считывания координат трансформированных в локальную систему координат я вырисовывал с системе координат сборки, поэтому и считал что не правильно идет трансформация, случайно заметил эту ошибку.
Но вопрос о том почему заведомо лежащие точки на поверхности инструмента при вызове selectbypoint не дает никакого результата?

gin