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

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

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

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

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

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

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

Определение МЦХ модели (КОМПАС V7)

Автор дедушка, 13.02.07, 15:13:50

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

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

дедушка

1) Из SDK копирую: LibTool.pas, LIBdb.pas, LDefin.pas (этого файла нет), LDefin2D.pas, LDefin3D.pas в C:\Program Files\Borland\Delphi7\Lib\

2) Подключаю библиотеку kAPI5.tlb (Project - Import type library - Add)

3) Пишу следующий текст:

unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  LDefin3d, LDefin2d, KSauto, KsTLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Get_V;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Get_V;
var
    myPart: ksPart;
    MPar: ksMassInertiaParam;
    doc: ksDocument3D;
    Kompas: KompasObject;
begin
  Kompas := KompasObject(CreateKompasObject);
  if Kompas <> nil then
  begin
    Doc := ksDocument3D(Kompas.ActiveDocument3D);
    if Doc <> nil
    then begin
           myPart := ksPart(doc.GetPart(-1));
           MPar := ksMassInertiaParam(myPart.CalcMassInertiaProperties(ST_MIX_M));
           kompas.ksMessage(FloatToStr(MPar.v));
         end;
    Doc := nil;
    Kompas := nil;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Get_V;
end;

end.

4) Получаю по нажатию CTRL-F9 на строчке (getv.dpr):
...
Application.Initialize;
...
[Error] getv.dpr(11): Object or class type required

5) Просмотр файла KsTLB, дал такую строчку:
...
Application = KompasObject;
...

Что не так? И как же всё таки можно получить МЦХ. %)

дедушка

И всё таки где я не прав? %)
Если есть возможность, наставте на путь исправления.

Judzhin

В библиотеке kAPI5.tlb переопределяется системна переменная Application. В файле проекта в секции uses модуль Forms поставьте после выше названной библиотеке либо перед переменную Application использовать явно из модулю Forms:  Forms.Application.Initialize и т.д.

дедушка

В таком виде программа стала запускаться, но при нажатии на SpeedButton1, вылетает с Access Violation.
Пытался скомпилировать примеры из SDK (например ksContrl), Delphi зависает.
Переустановил Delphi, не помогло.
...
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  LDefin3d, LDefin2d, KSauto, KsTLB,
  Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Grids, DBGrids, DB, DBTables,
  Mask, DBCtrls, Buttons, OleCtnrs, ComObj, ActiveX;
...
procedure TMainForm.SpeedButton1Click(Sender: TObject);
var
  myPart: ksPart;
  MPar: ksMassInertiaParam;
  Doc: ksDocument3D;
  Kompas: KompasObject;
begin
  Kompas:= KompasObject(CreateOleObject('Kompas.Application.5'));
  if Kompas <> nil then
    begin
      Doc := ksDocument3D(Kompas.ActiveDocument3D);
      Doc.Open('111.m3d',false);     
      if Doc <> nil then
        begin
          myPart := ksPart(doc.GetPart(-1));
          MPar := ksMassInertiaParam(myPart.CalcMassInertiaProperties(ST_MIX_M));
          Kompas.ksMessage(FloatToStr(MPar.v));
        end;
      Doc := nil;
      Kompas := nil;
    end;
end;
...

Judzhin

Строку
Doc := ksDocument3D(Kompas.ActiveDocument3D);
исправить на
Doc := ksDocument3D(Kompas.Document3D);
Открытых документов еще нет, по тому и Access Violation по nil указателю.

После
  if Kompas <> nil then
      begin
наверное надо добавить
  Kompas.Visible := true;
:)

И совет, старайтесь проверять выполнение всех функций API на предмет ошибок и нулевых указателей.

дедушка

Спасибо Judzhin!
В таком виде заработало.
Есть ещё пара вопросов: 1) как указать свою плотность; 2) проверить является ли предлагаемый для определения обьёма файл Компас-Деталью, а не Фрагментом, Сборкой и т.п.
...
procedure TMainForm.SpeedButton1Click(Sender: TObject);
var
  myPart: ksPart;
  MPar: ksMassInertiaParam;
  Doc: ksDocument3D;
  Kompas: KompasObject;
begin
  Kompas:= KompasObject(CreateOleObject('Kompas.Application.5'));
  if Kompas <> nil then
    begin
      Kompas.Visible := true;   
      Doc := ksDocument3D(Kompas.Document3D);
      Doc.Open('111.m3d',false);
      if Doc <> nil then
        begin
          myPart := ksPart(doc.GetPart(-1));
          MPar := ksMassInertiaParam(myPart.CalcMassInertiaProperties(ST_MIX_M));
          Kompas.ksMessage(FloatToStr(MPar.v));
        end;
      Kompas.Quit;
      Doc := nil;
      Kompas := nil;
    end;
end;
...

Judzhin

Установить материал, плотность ksPart::SetMaterial
Определить является ли документ деталью ksDocument3D::IsDetail
См. справочник по API Компаса.

дедушка

Спасибо Judzhin, разобрался, тему можно считать закрытой.