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

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

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

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

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

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

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

Получить вид чертежа - развертка для листового тела.

Автор IgorRUtver, 01.11.13, 12:24:42

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

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

IgorRUtver

Здравствуйте. Пытаюсь вывести на чертёж развертку листового тела.
В пользовательском интерфейсе это получается путем установки в параметрах вида "развертка" и тыканием на соответствующий значёк. Создал вид с модели

doc2.ksCreateSheetStandartViews(iAssociationViewParam,VIEW_ISO,10,10);

Поидеи  надо указать вместо VIEW_ISO -  развертка, но такого в списке нет.

В SDK нашел IAssociationView у данного интерфейса есть свойство Unfold. Но я никак не могу добраться до самого интерфейса  IAssociationView. Подскажите каким путём мне идти. Программирую в Delphi.

Unfold - данное свойство ставит только значок.
Нужно установить параметры развёртки, а данный интерфейс в API вроде, как не реализован, я по крайней мере не нашёл, хотя возможно плохо искал.
AssociationView:=View as IAssociationView;

IgorRUtver

Блин, нигде не написано даже, что это простановка значка только.
Есть ли еще возможность решить задачу. Имею много листовых гнутых деталей. Хотел с каждой получать развертку, копировать основные линии,вставлять в фрагменты контуры и сохранять как dxf, из них потом делают карты раскройки для ЧПУ раскройщиков. В общем мне нужно получить контур разогнутой детали. Может есть идеи как мне програмно это выполнить, а то рутина убивает.

Как вариант, открыть файл, получить указатель на листовое тело, установить свойство разогнуть и сделать вид с разогнутого состояния. Для этого вроде всё есть в API7. 
+ Благодарностей: 1

IgorRUtver

Хм, идея, спасибо, вроде нашел в SDK, щас попробую, спасибо за направление.

IgorRUtver

Не могу добраться до iSheetMetalBody.
По поводу операции "разогнуть тело", в SDK есть интерфейс ISheetMetalBody, имеющий свойство Straighten (разогнуть тело).  Импортировал в проект своей библиотеки kAPI7.tlb, в нём нашел описание ISheetMetalBody. Сам интерфейс работает, а вот как получить его для моей детали не могу разобрать.

Если я правильо понял SDK то нужно следовать следующей цепочке:

ISheetMetalBody - Интерфейс можно получить с помощью метода коллекции операций выдавливания ISheetMetalBodies::Add

ISheetMetalBodies - Получить интерфейс можно, используя свойство контейнера тел гибки ISheetMetalContainer::SheetMetalBodies

ISheetMetalContainer - ISheetMetalContainer является дополнительным к интерфейсу IPart7 и позволяет работать с коллекциями объектов гибки (листовые тела, сгибы и т.д). Данный интерфейс можно получить от IPart7 посредством вызова метода IUnknown::QueryInterface (const GUID far& iid, void** pif).

В итоге изысканий получил

var

   doc3    : ksDocument3D;
   iPart : ksPart;
   SheetMetalBody : iSheetMetalBody;
   SheetMetalBodies : ISheetMetalBodies;
   SheetMetalContainer : ISheetMetalContainer

begin

     doc3 := ksDocument3D(ks.Document3D());
     doc3.Open('d:\PAK.m3d',false);
     iPart := ksPart(doc3.GetPart(pNew_Part));//Открыл листовое тело "PAK.m2d"

     SheetMetalContainer := iPart.QueryInterface(  );
     SheetMetalBodies := SheetMetalContainer.SheetMetalBodies;
     SheetMetalBody := ISheetMetalBodies.Add;

end;

А вот как использовать метод "QueryInterface" не могу понять, и вобще сомневаюсь что иду правильным путём. Помогите добраться до iSheetMetalBody.

05.11.13, 12:23:33 #6 Последнее редактирование: 05.11.13, 12:38:03 от Sabahs
Сразу начинайте работать в API7, у Вас iPart интерфейс API5.
pDocuments:=KompasApi7.Documents;
pDocument:=pDocuments.Open('d:\PAK.m3d',True,False);
Doc3D:=pDocument as IKompasDocument3D;
pPart7:=Doc3D.TopPart;
pSheetMetalContainer:=pPart7 as ISheetMetalContainer;
pSheetMetalBodies:=pSheetMetalContainer.SheetMetalBodies;
if pSheetMetalBodies.Count<>0 then
pSheetMetalBody:=pSheetMetalBodies.SheetMetalBody[0]; или так pSheetMetalBody:=pSheetMetalBodies.Item[0] as ISheetMetalBody;
...

IgorRUtver

Мне для этого надо импортировать kAPI7.TLB? А то если заменять kAPI7.TLB вместо kAPI5.TLB теряю описание kompas : KompasObject;
Или kAPI7 как дополнение к kAPI5?

Вообще TLB регистрируются при установке Компаса.
Если не зарегистрированы, то запустите Компас с ключом KOMPAS.Exe /registred
У меня во всех библиотеках подключены модули:
- KsTLB.pas - API5,
- ksAPI7.pas - API7.
+ Благодарностей: 1

IgorRUtver

А, угу, все понял, спасибо, буду разбираться дальше.

IgorRUtver

Не стал создавать новую тему. Подключил к своей библеотеки  ksAPI7.pas Выполнил Import a Type Library -> Create Unit. Получил 4 файла, скопировал в проект. Все вроде ок. При попытке открыть документ средствами API7 выдат ошибку. Мне нужно както подключать API7? Или почему ему не наравиться?

  public

    ks : KompasObject;
    ks7 : IKompasAPIObject;

var
     pApplication : IApplication;
     pDocuments : iDocuments;

begin

      pApplication := ks7.Application;//на этой строке выдаёт ошибку
      pDocuments:=pApplication.Documents;//тоже не пашет, таже ошибка

end;

Откройте любой пример с использованием API7, там есть процедура приведённая ниже.
// Получить доступ к новому API
// ---
procedure GetNewKompasAPI;
var
  disp : IDispatch;
begin
   if newKompasAPI = nil then
    begin
      disp := IDispatch(CreateKompasApplication);
      newKompasAPI := disp As IApplication;
  end;
end;

P.S. Не забывайте проверять интерфейс на nil перед его использованием, на картинке видно, что ks7=nil, вы его объявили, но не получили.
+ Благодарностей: 1

IgorRUtver


IgorRUtver

Что -то не получается, игнорирует команду "разогнуть"
var

   newKompasAPI : IApplication;
   disp : IDispatch;
   pDocuments : iDocuments;
   pDocument : IKompasDocument;
   Doc3D : IKompasDocument3D;
   pPart7 : IPart7;
   SheetMetalBody : iSheetMetalBody;
   pSheetMetalBodies : ISheetMetalBodies;
   pSheetMetalContainer : ISheetMetalContainer;
   pSheetMetalBody : iSheetMetalBody;

begin
    disp := IDispatch( CreateKompasApplication );
    newKompasAPI := disp As IApplication;
    pDocuments := newKompasAPI.Documents;
    pDocument := pDocuments.Open('d:\PAK.m3d',true,false);
    Doc3D:=pDocument as IKompasDocument3D;
    pPart7:=Doc3D.TopPart;
    pSheetMetalContainer := pPart7 as ISheetMetalContainer;
    pSheetMetalBodies:=pSheetMetalContainer.SheetMetalBodies;
    pSheetMetalBody:=pSheetMetalBodies.SheetMetalBody[0];
    pSheetMetalBody.Straighten := true;
end;


Получилось разогнуть только через интерфес самого сгиба

    pSheetMetalBends := pSheetMetalContainer.SheetMetalBends;
    pSheetMetalBend := pSheetMetalBends.SheetMetalBend[1];
    pSheetMetalBend.Straighten := true;

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


IgorRUtver

Хм. точно, не внимательно смотрел) спасибо!

IgorRUtver

Думал обойдусь разгибанием каждого сгиба отдельно, ан нет, все было хорошо пока не попались детали которые необходимо разогнуть именно командой "развертка".
SDK гласит
ISheetMetalBody::Straighten - Позволяет разгибать и сгибать тело

Делаю
var
   newKompasAPI : IApplication;
   disp : IDispatch;
   pDocuments : iDocuments;
   pDocument : IKompasDocument;
   Doc3D : IKompasDocument3D;
   pPart7 : IPart7;

    pSheetMetalContainer : ISheetMetalContainer;
     pSheetMetalBodies : ISheetMetalBodies;
      pSheetMetalBody : iSheetMetalBody;

begin
  ks := KompasObject(GetActiveOleObject ('Kompas.Application.5'));
    disp := IDispatch( CreateKompasApplication );
    newKompasAPI := disp As IApplication;
    pDocuments := newKompasAPI.Documents;
    pDocument := pDocuments.Open(OpenFile,true,false);//(rod-file,visible-regim,reed only)
    Doc3D:=pDocument as IKompasDocument3D;
    pPart7:=Doc3D.TopPart;
    pSheetMetalContainer := pPart7 as ISheetMetalContainer;
      pSheetMetalBodies := pSheetMetalContainer.SheetMetalBodies;
        pSheetMetalBody := pSheetMetalBodies.SheetMetalBody[0];
         pSheetMetalBody.Straighten:= true;
      Doc3D.RebuildDocument;
end;
Но ничего не происходит. Есть ли возможность вообще разогнуть все тело целиком?

Неплохо было бы, ещё проблемную деталь прикрепить, а то пока непонятно с какими деталями проблемы есть, а с какими нет.

IgorRUtver

Если разгибать сам сгиб, то слетают вырезы в теле. Сгиб согнут: Сгиб разогнут:
Деталь приложил, сохранил для компаса V13

28.11.13, 15:10:10 #19 Последнее редактирование: 28.11.13, 16:02:22 от Sabahs
if newKompasAPI.IsKompasCommandCheck(40794)=0 then newKompasAPI.ExecuteKompasCommand(40794,False);
На Компас V15 разгибает, процесс был найден методом научного тыка.
+ Благодарностей: 3