Сопряжение "Совпадение" с точкой

Автор chum, 21.06.11, 18:53:21

« назад - далее »

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

chum

Здравствуйте, форумчане!
Застряла на таком моменте:мне необходимо программно в сборке сделать сопряжение "совпадение".
Только в качестве сопрягаемых объектов выступают, не грани, а точки.
Например, во впомогательной плоскости нарисована окружность, а на окружности отмечена точка.
Вот к этой точке нужно сопряжением присоединить центр детали "шар".
Без программирования всё получается ОК, но нужно именно создавать программно.
Если создавать по аналогии с сопряжением "Совпадение двух граней", допустим, и,если обозначить нужные мне точки, как

iPoint1, iPoint2: ksEntity;

то я их должна передать в метод, создающий сопряжение

iDocument3D.AddMateConstraint(mc_Coincidence,iPoint1,iPoint2,0,0,0);

Каким образом получить доступ к точке на эскизе?
Пробовала в коллекции вершин детали оставить только нужную мне точку
с помощью SelectByPoint, но КОМПАС на такой ход ответил мне "Access violation......"))))))

Эскиз не поможет.
SelectByPoint тоже не верно, если хотите помощь, кусок кода в студию.

chum

Кусок кода.... сейчас попробую.
У меня сборка подшипника. Три детали :
1. внешнее кольцо.
2. внутреннее кольцо.
3. шарик.
Чтобы "привязать" шарик сопряжением собиралась использовать такой прием из нашей методички (простого, не программного построения):
"Мы проведем плоскость по середине толщины подшипника (если, конечно, одна из координатных плоскостей уже не проходит по его середине), построим на ней эскиз, нарисуем в нем окружность, проходящую точно посередине и на ней поставим точку. К этой точке мы привяжем центр шарика, зафиксировав его на нужном месте «в воздухе» . К этой точке мы привяжем начало координат шарика сопряжением «Совпадение»".
Теперь собственно, сами мои пробы:

var
  PartColl1,PartColl2: ksPart;
  EColl:ksEntityCollection;
  Entity1,Entity2:ksEntity;//
  E0Def:ksFaceDefinition;
begin
//Добавить сопряжение совпадение
     PartColl1:=ksPart(iDocument3D.GetPart(2));//шарик третья деталь, поставлена точка в центре эскиза
    EColl:= ksEntityCollection(PartColl1.EntityCollection(o3d_vertex));
    EColl.SelectByPoint(XPoint1,YPoint1,ZPoint1);
    Entity1:=ksEntity(EColl.GetByIndex(0));
    E0Def:=ksFaceDefinition(Entity1.GetDefinition);

    PartColl2:=ksPart(iDocument3D.GetPart(3));// смещенная плоскость с эзкизом, где точка
    EColl:= ksEntityCollection(PartColl2.EntityCollection(o3d_vertex));
    EColl.SelectByPoint(XPoint2,YPoint2,ZPoint2);
    Entity2:=ksEntity(EColl.GetByIndex(0));
    E0Def:=ksFaceDefinition(Entity2.GetDefinition);

    iDocument3D.AddMateConstraint(mc_Coincidence,Entity1,iEntity2,0,0,0);
    iDocument3D.RebuildDocument;
end;

Пробовала еще вот так, но смысл тот же:
begin
PartColl1:=ksPart(iDocument3D.GetPart(2));
     //Получаем коллекцию вершин
     //В неё попадут все вершины, образованные пересечением граней
     //и точки в эскизах.
     iCollection_1:=ksEntityCollection(PartColl1.EntityCollection(o3d_vertex));

     //Очищаем её, чтобы далее добавлять в неё только нужные нам точки
     iCollection_1.Clear;

     //Ещё раз получаем коллекцию вершин
     iCollection_2:=ksEntityCollection(PartColl1.EntityCollection(o3d_vertex));

     //Исключаем из коллекции все точки, кроме той, координаты которой
     //равны (XPoint1,YPoint1,ZPoint1)
     //Координаты надо предварительно проинициализировать
     iCollection_2.SelectByPoint(XPoint1,YPoint1,ZPoint1);

     //Добавляем в итоговую коллекцию отфильтрованную точку
      iCollection_1.Add(ksEntity(iCollection_2.First));
      iPoint1:=ksEntity(iCollection_1.GetByIndex(0));
   
     PartColl2:=ksPart(iDocument3D.GetPart(3));
     
     iCollection_1:=ksEntityCollection(PartColl2.EntityCollection(o3d_vertex));

     //Очищаем её, чтобы далее добавлять в неё только нужные нам точки
     iCollection_1.Clear;

     //Ещё раз получаем коллекцию вершин
     iCollection_2:=ksEntityCollection(PartColl2.EntityCollection(o3d_vertex));

     //Исключаем из коллекции все точки, кроме той, координаты которой
     //равны (XPoint2,YPoint2,ZPoint2)
     //Координаты надо предварительно проинициализировать
     iCollection_2.SelectByPoint(XPoint2,YPoint2,ZPoint2);

     //Добавляем в итоговую коллекцию отфильтрованную точку
      iCollection_1.Add(ksEntity(iCollection_2.First));
      iPoint2:=ksEntity(iCollection_1.GetByIndex(0));
   
     iDocument3D.AddMateConstraint(mc_Coincidence,iPoint1,iPoint2,0,0,0);
     iDocument3D.RebuildDocument;
end;

 PartColl1:=ksPart(iDocument3D.GetPart(2));//шарик третья деталь, поставлена точка в центре эскиза
    EColl:= ksEntityCollection(PartColl1.EntityCollection(o3d_vertex));
Точка на эскизе (центр шара), не может быть вершиной и вобще шар вершин не имеет поэтому "Access violation......".
Скачайте библиотеку подшипников 3D и посмотрите, делается программно. http://www.mariupolsapr.narod.ru/

Алхимик

интересно все программирование в Компас сводится к подшипнику, уже тема 3...10 и все подшипники строим;)

21.06.11, 23:16:27 #5 Последнее редактирование: 21.06.11, 23:48:53 от Sabahs
Предложите свой код сопряжения, разве Вам кто-то мешает?

Попробуйте такую модификацию кода.
var
PartColl1,PartColl2: ksPart;
EColl:ksEntityCollection;
Entity1,Entity2:ksEntity;
E0Def:ksFaceDefinition;
VertexDefinition:ksVertexDefinition;
begin
//Добавить сопряжение совпадение
PartColl1:=ksPart(iDocument3D.GetPart(2));//шарик третья деталь, поставлена точка в центре эскиза
EColl:= ksEntityCollection(PartColl1.EntityCollection(o3d_vertex));
Entity1:=ksEntity(EColl.GetByIndex(0));
VertexDefinition:=ksVertexDefinition(Entity1.GetDefinition);
VertexDefinition.GetPoint(XPoint1,YPoint1,ZPoint1);


PartColl2:=ksPart(iDocument3D.GetPart(3));// смещенная плоскость с эскизом, где точка
EColl:= ksEntityCollection(PartColl2.EntityCollection(o3d_vertex));
Entity2:=ksEntity(EColl.GetByIndex(0));
VertexDefinition:=ksVertexDefinition(Entity2.GetDefinition);
VertexDefinition.GetPoint(XPoint1,YPoint1,ZPoint1);

iDocument3D.AddMateConstraint(mc_Coincidence,Entity1,iEntity2,0,0,0);
iDocument3D.RebuildDocument;
end;

XPoint1,YPoint1,ZPoint1 - желательно проверить на предмет, что это координаты именно той вершины которая Вам нужна.

chum

Обе точки (одна - в центре шарика, другая - во вспомогательной плоскости на эскизе) сдвинуты относительно начала координат только по оси абсцисс. Вернее у них вообще одинаковые координаты (например, 38,0,0).
На вышепредложенный код КОМПАС опять бухтит(((((
Может, совпадение надо строить с началом координат детали "шарик", а не с точкой, которую я в его эскизе поставила  в его центре....
У меня, правда, координаты эскиза , вращением которого я шар получаю, смещены тоже по ОХ на то же расстояние, но это легко вернуть обратно. Только я еще пока не знаю, как получить доступ к началу координат моей детали...

Приведенный код работает для вершин, точка на эскизе вершиной быть не может.

chum

Ох, как же извратиться-то получше с сопряжением шарика.....В Вашей библиотеке (отлично выглядит!!!!!) накладываются сопряженя на шарик и кольца "параллельность" и "на расстоянии". Но может ли шарик при этом вращаться?

obesov

22.06.11, 05:31:50 #9 Последнее редактирование: 22.06.11, 06:06:31 от obesov
 Сопряжение "на расстоянии" одной из базовых осей шарика до базовой оси подшипника. Если хотите убедиться, будет ли шарик вращаться, создайте модель шарика из n-го количества полу(треть -, чет.... и т.д.)сфер и через "Свойства - цвет"  "разукрасьте" его! Удачи! :)
P.S. Не забудьте в свойствах "Наименование" прописать: "Шарик новогодний"! :-)))

Цитата: chum от 22.06.11, 03:08:01
Ох, как же извратиться-то получше с сопряжением шарика.....В Вашей библиотеке (отлично выглядит!!!!!) накладываются сопряженя на шарик и кольца "параллельность" и "на расстоянии". Но может ли шарик при этом вращаться?
Тут Вам Камасутру почитать надо, а лучше SDK, чтобы не было бреда который у Вас во второй версии кода.
Сделайте в ручную то, что Вы хотите и прилепите файл к сообщению, чтобы можно было узнать ход Ваших мыслей.

niklas

Цитата: chum от 22.06.11, 03:08:01
Ох, как же извратиться-то получше с сопряжением шарика.....В Вашей библиотеке (отлично выглядит!!!!!) накладываются сопряженя на шарик и кольца "параллельность" и "на расстоянии". Но может ли шарик при этом вращаться?
Сопряжение "касание" работает ведь для пары "Поверхность шарика-поверхность беговой дорожки". Может это Вам поможет, удачи

chum

 niklas, оно и спасло))))
Лаба сдана!!