Измерения 3D

Автор A.n.d.r.e.w, 17.12.09, 15:55:45

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

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

A.n.d.r.e.w

17.12.09, 15:55:45 Последнее редактирование: 17.12.09, 20:38:07 от A.n.d.r.e.w
Помогите пожалуйста!
Есть две плоские поверхности в сборке, надо вставить деталь и создать сопряжение под "углом" так чтобы базовая плоскость, скажем OXY детали была  средней между тех двух.. Короче надо измерить угол между плоскими поверхностями, поделить на два и задать в сопряжении от любой из них. Вот.
Получил ksEntityCollection с этими поверхностями (индекс 0 и 1), проверил, что они действительно плоские..
что дальше??
Как делать 3D измерения вообще не пойму..

А еще не работает проверка соприкосновения поверхностей.
               
  //проверим что поверхности соприкасаются
   face_1_def:=ksFaceDefinition(iCollection.GetByIndex(0));
   if fase_1_def<>nil then Showmessage('1');
   face_coll:=ksFaceCollection(face_1_def.ConnectedFaceCollection);
   ShowMessage('2');

или так

   face_1_def:=ksFaceDefinition(iCollection.GetByIndex(0));                           
   face_2_def:=ksFaceDefinition(iCollection.GetByIndex(1)); 
   if (fase_1_def<>nil) and (fase_2_def<>nil) then Showmessage('1');
   if face_1_def.IsConnectedWith(face_2_def) then
   ShowMessage('2');
                         

сообщение 1 появляется
а сообщение 2 уже нет
значит ошибка?
что я делаю не так?

Ведун

Цитировать
сообщение 1 появляется
а сообщение 2 уже нет
значит ошибка?
что я делаю не так?

  if face_1_def.IsConnectedWith(face_2_def);
   ShowMessage('2');

then пропущено, может из-за этого?

  if face_1_def.IsConnectedWith(face_2_def) then ShowMessage('2');

A.n.d.r.e.w

Цитировать
then пропущено, может из-за этого?


да не , это я в форуме ошибся, оно б не откомпилировалось так :)

кстате с измерениями разобрался -  ksMeasurer
все просто оказывается..

Ведун

Ну да, точно... А напишите как оно у Вас в unit'е...

A.n.d.r.e.w

да у меня на работе исходники остались к сожалению.
Завтра выложу.

Ведун

Ок.

Вот еще, Вы в SDK смотрели "ksFaceDefinition::IsConnectedWith"?

A.n.d.r.e.w

ну да..
у меня второй пример с этой функцией (см начало)
думаю внутренний функционал у них одинаковый,
поэтому не работает не то не то.

Ведун

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

A.n.d.r.e.w

 в окне открыта сборка в ней созданы две замкнутые пространственные ломаные, на основании которых созданы заплатки 2 штуки, ломаные заданы таким образом что заплатки имеют одно общее ребро и образуют  некоторый угол.
вставляю деталь из файла. не сразу а создаю ksRequestinfo3D, ksPhantom .. назначаю функцию kallback в которой получаю массив элементов rsEntityCollection (обе заплатки типа o3d_face), проверяю тип, проверяю плоскостность. после чего создаю временные сопряжения.. после выхода из функции UserGetPlacementAndEntity вставляю деталь в документ и накладываю сопряжения.
как то так

все вроде работает, кроме вот этого..

Ведун

Я попробывал кое-что сделать:

....
face_1_def:=ksFaceDefinition(iCollection.GetByIndex(1));
face_2_def:=ksFaceDefinition(iCollection.GetByIndex(2));
   if (face_1_def<>nil) and (face_2_def<>nil) then Showmessage('1');
   if face_1_def.IsConnectedWith(face_2_def) = true then ShowMessage('2');
....


1 появляется - 2 нет, но скорее всего это потому что GetByIndex(), что-то с индексом. Я попробывал разные варианты, но необходимые не получил. Вы проверьте те ли поверхности  у Вас выбираются.

A.n.d.r.e.w

Цитата: Ведун от 17.12.09, 21:50:12
Вы проверьте те ли поверхности  у Вас выбираются.


уверен что те. я с ними временные сопряжения устанавливаю
1 - совпадение оси ОУ вставляемой детали с первой поверхностью
2 - совпадение оси ОУ вставляемой детали со второй поверхностью
и использую именно getbyindex

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

A.n.d.r.e.w

Спасибо Ведун за помощь..
завтра выложу исходник, попробуете, если получится у себя..
У меня Компас V11 на Windows7 хотя врядли это важно.  ::)

Ведун

Возможно они не пересекаются... Дело в том, что при вставке "<> True" все работает, т.е. в моем варианте они не перескаются и не имеют общих точек, как и должно быть. Но вообще все должно работать.

Ведун

Цитата: A.n.d.r.e.w от 17.12.09, 22:05:22
Спасибо Ведун за помощь..

Да пока не за что.
Цитата: A.n.d.r.e.w от 17.12.09, 22:05:22
завтра выложу исходник, попробуете, если получится у себя..
У меня Компас V11 на Windows7 хотя врядли это важно.  ::)

Может и важно,  у меня Windows XP Sp3. И мои библиотеки под  Win7 не работают  :(((

A.n.d.r.e.w

обратите внимание на следующее

if face_1_def.IsConnectedWith(face_2_def)  then 
ShowMessage('2');

и

face_1_def.IsConnectedWith(face_2_def) ;
ShowMessage('2');


сообщение не происходит в обоих случаях
хотя во втором примере его появление не должно зависеть от результата функции IsConnectedWith

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

Ведун

Оба ваших варианта у меня идут с ошибками, т.к. в SDK написано:
Цитировать
Проверить, связаны ли грани.

Синтаксис Automation:

BOOL IsConnectedWith (LPDISPATCH other);

Синтаксис COM:

BOOL IsConnectedWith (LPFACEDEFINITION other);

Входные параметры:


указатель на интерфейс ksFaceDefinition или IFaceDefinition другой грани.


Возвращаемое значение:

TRUE
- если грани связаны.

FALSE
- если грани не связаны.


Возвращаемое значение true или false так что в коде нужно писать if face_1_def.IsConnectedWith(face_2_def) = true then ShowMessage('2');

А второй вариант вообще не идет, я сейчас попробую у себя кое что, результат напишу.

Ведун

17.12.09, 23:31:01 #16 Последнее редактирование: 17.12.09, 23:41:05 от Ведун
Что-то вообще не получается, сделал пример в котором точно объекты пересекаются - и все равно ни чего!

Вот исходник покажите, тогда снова подумаю  88))

A.n.d.r.e.w

Ну вобщем вот все в архиве.
Папка Test должна быть в корне С:\ чтобы не исправлять ничего
В ней готовая сборка Test.a3d её открывыем в компасе, потом подключаем библиотеку Test.rtw и выполняем команду "тест 1"

Ведун

19.12.09, 00:06:56 #18 Последнее редактирование: 19.12.09, 00:17:06 от Ведун
Что-то у меня в любом случае строится параллелепипед на стыке двух плоскостей и никаких сообщений вообще  :(((. Так, что пока соображений нет  :`( Буду думать...

A.n.d.r.e.w

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