• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Сборка

Автор Voland1402, 27.04.11, 20:38:11

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

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

Voland1402

Пытаюсь собрать сборку в своей программе. Есть две детали в которых сделаны отверстия по концентрической сетке ( в обоих деталях отверстия выполнены одинакового радиуса и по одинаковой траектории). Задача состоит в том что надо сделать соосность по всем этим отверстиям. подскажите хоть что то! буду благодарен любым идеям. Спасибо!

// Добавить сопряжение соостность
     EntityCollection:=ksEntityCollection(PartCollection1.EntityCollection(o3d_face));
     K:=0;
     while K<>-1 do
      begin
        Entity1:=ksEntity(EntityCollection.GetByIndex(K));
        FaceDef:=ksFaceDefinition(Entity1.GetDefinition);
        FaceDef.GetCylinderParam(H,R);
        if((V[Index].DN/2)=R)then K:=-1
        else
         begin
           K:=K+1;
           if EntityCollection.GetCount=K then K:=-1;
           Entity1.Update;
         end;
      end;
     PartCollection1:=ksPart(iDoc3DSborka.GetPart(1));
     EntityCollection:=ksEntityCollection(PartCollection1.EntityCollection(o3d_face));
     K:=0;
     while K<>-1 do
      begin
        Entity2:=ksEntity(EntityCollection.GetByIndex(K));
        FaceDef:=ksFaceDefinition(Entity2.GetDefinition);
        FaceDef.GetCylinderParam(H,R);
        if((V[Index].DV/2)=R)then K:=-1
        else
         begin
           K:=K+1;
           if EntityCollection.GetCount=K then K:=-1;
           Entity2.Update;
         end;
      end;
     iDoc3DSborka.AddMateConstraint(mc_Concentric,Entity1,Entity2,0,0,0);

Voland1402

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

Достаточно два отверстия найти остальные итак встанут куда нужно. Массив V диаметр элемента.

Voland1402

Это понятно что достаточно две соосности сделать. но их оказалось не так просто сделать. мне бы хотелось перед  созданием самой соосности проверить, а не переопределит ли она сборку? если она все сломает то и создавать ее не надо а если создали то удалить! можно ли так сделать, а если можно то как?

ksDocument3D::DeleteObject
IDocument3D::DeleteObject

Интерфейс...

Справка системы КОМПАС...

Удалить объект: деталь, операцию, сопряжение.

Синтаксис Automation:

BOOL DeleteObject (LPDISPATCH obj);

Синтаксис COM:

BOOL DeleteObject (LPUNKNOWN obj);

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

obj
указатель на интерфейс IDispatch или IUnknown удаляемого объекта.


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

TRUE
- в случае успешного завершения.


Примечания:

1. Удалить можно любой трехмерный объект.

2. Если в качестве входного параметра переданы поверхность ksFaceDefinition,
ребро ksEdgeDefinition, вершина ksVertexDefinition, то будет удален весь формообразующий элемент, которому принадлежит удаляемый объект.

3. Если в качестве входного параметра передано описание объекта, полученное методом ksEntity::GetDefinition, то после удаления недопустимо использование интерфейса описания удаленного объекта, породившего его интерфейса ksEntity и других интерфейсов удаленного объекта.

Voland1402

а как узнать что созданная соосность переопределила сборку? и как потом ее найти чтоб удалить?

ksFaceDefinition
методы
ConnectedFaceCollection

EdgeCollection

GetArea

GetCylinderParam

GetEntity

GetNextFace

GetOwnerEntity

GetSurface

GetTessellation

IsCone

IsConnectedWith

IsCylinder

IsNurbsSurface

IsPlanar

IsRevolved

IsSphere

IsSwept

IsTorus

LoopCollection

Почитайте справку SDK о том, что можно узнать.

IgorRUtver

Вроде тема подходит, так, что новую не создаю, Подскажите пожалуйста как собственно добавить деталь в сборку, в SDK, чёт не нахожу, "prAddDetail 20058 Вставить деталь в сборку" никуда не выводит.
 

Один из вариантов IDocument3D::SetPartFromFile.
Через prAddDetail Вам необходимо замкнуть всю цепочку событий, это событие только добавить, но непонятно, что и куда.
+ Благодарностей: 1

IgorRUtver

ООО, добавилась, спасибо!. Я программно создал деталь, и знал её  указатель на интерфейс, если я буду вставлять другую "стороннюю деталь" мне нужно будет прочитать сначала указатель?

Не обязательно, Вы её можете создать и естественно будете знать её указатель GetPart(pNew_Part) либо создать непосредственно в сборке CreatePartFromFile.
Внимательно присмотритесь к методам IDocument3D.

IgorRUtver

...ммм, буду изучать, спасибо!

IgorRUtver

Подскажите почему не создаёт сопряжение в сборке.

var
iConstraint1 : ksMateConstraint;
AxisOX_a1   : ksEntity;
AxisOY_a1   : ksEntity;
doc3_a1 : ksDocument3D;

begin 
//создана сборка с интерфейсом doc3_a1, добавлены 2 детали
...
     iConstraint1:= ksMateConstraint(doc3_a1.GetMateConstraint);Получить указатель на интерфейс нового временного сопряжения
     iConstraint1.constraintType :=  mc_Coincidence; //совпадение объектов
     iConstraint1.SetBaseObj(1,AxisOX_pl1); //ось системы координат первого тела
     iConstraint1.SetBaseObj(2,AxisOY_rod1); //ось системы координат второго тела
     iConstraint1.Create;
end;

Вы внимательно прочитали примечание к функции GetMateConstraint.
Временные сопряжения, в отличие от постоянных, существуют только в течении процесса указания местоположения или объектов. Процесс запускается методом ksDocument3D::UserGetPlacementAndEntity.

IgorRUtver

Действительно. А мне не надо временного, я хочу постоянное, а как получить интерфейс постоянного? "Постоянные сопряжения создаются с помощью метода ksDocument3D::AddMateConstraint." не создаёт ничего(

А Вы после метода ksDocument3D::AddMateConstraint, перестройте документ ksDocument3D::RebuildDocument.

IgorRUtver

Перестроение ничего не дало. Проблема в том, что у меня собственно сопряжение не создаётся, в дереве сборки ничего кроме 2х деталей нет. Или метод ksDocument3D::AddMateConstraint и не должен ничего создавать?

А, что возвращает функция AddMateConstraint?
Если всё правильно передали, должна создать.
+ Благодарностей: 1

IgorRUtver

Хм, спасибо, щас посмотрю как прочитать возвращаемое значение, буду искать ошибку.