Программное взаимодействие со сборкой.

Автор vhtksz, 19.10.23, 13:27:49

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

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

vhtksz

Добрый день, работаем с автоматизированной генерацией детали, модель создается. Необходимо добавлять ранее созданные детали/деталь в сборку, с определенным шагом между ними, детали параллельны друг другу. Буду очень благодарен, если дадите информацию об используемых методах для взаимодействия со сборкой. В справочнике Компаса искал информацию, но, в силу небольшого опыта, предоставленная информация не совсем понятна. Спасибо.   

Nipal

#1
Добавляйте - IDocument3D.SetPartFromFile.
Затем с помощью интерфейса IComponentPositioner - управления положением компонентов в сборке, в v22 появился вариант для API7 IComponentPositioner7, ставите в нужное положение.
Интерфейсом IMateConstraint3D - сопряжений 3D, налаживаете сопряжения между деталями.
+ Благодарностей: 1

vhtksz


p3452

Цитата: vhtksz от 19.10.23, 13:27:49Необходимо добавлять ранее созданные детали/деталь в сборку, с определенным шагом между ними, детали параллельны друг другу
А "массивы", то у же отменили, или - "мы легких путей не ищем"?

lavgirb

Цитата: p3452 от 19.10.23, 16:15:16А "массивы", то у же отменили, или - "мы легких путей не ищем"?
Не сказано, что надо разместить с шагом одну и туже деталь  :beer:
+ Благодарностей: 1

p3452

Цитата: lavgirb от 19.10.23, 17:11:37разместить ... одну и туже деталь
Нюанс :embarrassed: , хотя и маловероятный...
Ну, да ладно, ТС не слепой - намек дан на оба варианта, ему решать.
+ Благодарностей: 1

vhtksz

Здравствуйте еще раз, смог разместить две детали в сборке. Но никак не могу изменить их местоположение.
doc3D.ComponentPositioner().Prepare(part, (short)Positioner_Type.pnMove);
                    doc3D.ComponentPositioner().SetPlane((short)Obj3dType.o3d_planeXOZ);               
                    doc3D.ComponentPositioner().SetDragPoint(0, 0, 0);
                    doc3D.ComponentPositioner().MoveComponent(100, 0, 0);
                    doc3D.ComponentPositioner().Finish();

Nipal

ComponentPositioner.SetDragPoint(0,0,0);
ComponentPositioner.SetPlane(IUnknown(PartSB.GetDefaultEntity(o3d_planeXOY)));
if ComponentPositioner.Prepare(pPart,pnMove)=0 then
 begin
   ComponentPositioner.MoveComponent(R,0,0);
   ComponentPositioner.Finish;
   PartSB.Update;
   Document3DSB.RebuildDocument;
end;

vhtksz

Цитата: Nipal от 20.10.23, 15:55:51ComponentPositioner.SetDragPoint(0,0,0);
ComponentPositioner.SetPlane(IUnknown(PartSB.GetDefaultEntity(o3d_planeXOY)));
if ComponentPositioner.Prepare(pPart,pnMove)=0 then
 begin
  ComponentPositioner.MoveComponent(R,0,0);
  ComponentPositioner.Finish;
  PartSB.Update;
  Document3DSB.RebuildDocument;
end;
Переписал под шарпы,к сожалению, не двигает вовсе. Сделал проверку возвращаемого значения у MoveComponent – возвращает False  :(

vhtksz

doc3D.SetPartFromFile(@"G:\Modeling\Modeling\Modeling\bin\Debug\NoEditor\Детал2ыь.m3d", part, false);

doc3D.ComponentPositioner().SetDragPoint(0, 0, 0);
doc3D.ComponentPositioner().SetPlane(part.GetDefaultEntity((short)Obj3dType.o3d_planeXOY));
if (doc3D.ComponentPositioner().Prepare((part)part, (short)Positioner_Type.pnMove) == 0)
{
   if (doc3D.ComponentPositioner().MoveComponent(100, 0, 0) == true)
       MessageBox.Show("Подвинул");
   doc3D.ComponentPositioner().Finish();
                    }

AlHarad

Всем привет. Кто то решил эту проблему? У меня такае же ерунда. Отказывается двигать компонент (FAIL Prepare). Версси 22 нет где уже есть IComponentPositioner так что решать надо ак то через ComponentPositioner.

вот код:
        public static void SetComponentCoordinates2(ksDocument3D document3D, IApplication application, int index) {
            ksPart component = FindComponentByIndex (document3D, index);
            document3D.ComponentPositioner ().SetDragPoint (0, 0, 0);
            document3D.ComponentPositioner ().SetPlane (component.GetDefaultEntity ((short)Obj3dType.o3d_planeXOY));
            if (document3D.ComponentPositioner ().Prepare ((part)component, (short)Positioner_Type.pnMove) == 0) {
                Program.DebugLog ("Prepare");
                if (document3D.ComponentPositioner ().MoveComponent (500, 500, 500) == true) {
                    Program.DebugLog ("MoveComponent");
                    document3D.ComponentPositioner ().Finish ();
                    component.UpdatePlacementEx (true);
                } else {
                    Program.DebugLog ("FAIL MoveComponent");
                }
            } else {
                Program.DebugLog ("FAIL Prepare");
            }
            document3D.RebuildDocument ();
        }