Определение обьёма 3D детали

Автор дедушка, 06.06.06, 20:32:32

« предыдущая - следующая »

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

дедушка

Собственно сабж, если раскрыто, то перерыв прилагающийся SDK к КОМПАС 5.11 не нашёл функции возвращающей объём и прочие хар-ки для 3D детали. Всё что удалось найти, это функцию ksCalcMassInertiaProperties, но возвращает она "объемные массо-центровочные характеристики кривой или  группы кривых". Хех, и ещё хотелось бы задать вопрос есть ли такие функции в КОМПАС 8 ?

Спасибо.

дедушка

В чём загвоздка в вопросе не так поставлен? Или действительно слишком прост? Или может она не имеет решения? ;)

дедушка

В десятый раз прочитал доку

function ksCalcMassInertiaProperties( p         : Reference;
                                                   properties: PMassInertiaParam;
                                                   bitVector : Cardinal;           // набор флагов
                                                  density   : Double;             // плотность в г/см3
                                                  param     : Double ) : Integer; // если тело вращения
                                      pascal;

Со всеми параметрами окромя p, непонятно, как заполучить эту кривую? Т.е. кривую которая бы охватывала весь 3D чертёж, текущий естественно?

Gek

Деда, попробуй через ksBody.ksMassInertiaParam.m. Там же сказано, что ksCalcMassInertiaProperties работает для тел вращения или выдавливания, заданных кривой или группой кривых. А не вообще для любых тел.

дедушка

Делаю так:


  ...

  kompas:= KompasAutomation(CreateOleObject('KOMPAS_Graphic.Application.5'));

  if kompas <> nil then
    begin
      if kompasApi = nil then
        begin
          kompasApi := KompasObject(Kompas.KompasAPI);
        end;

      if KompasApi <> nil then
        begin

          kompas.OpenAutoDocument(ExtractFilePath(Application.Exename)+'\s.m3d',true,AppDisp);

          if kompas.ActivateKompasAPI then
            begin
              doc := ksDocument3D(KompasAPI.ActiveDocument3D);

              // ....
              // ....

            end;
        end;
    end;

  if kompas <> nil then
  begin
    kompas.Quit;
    kompas := nil;
  end;

  ...


Где же здесь есть ksBody, не в одном из юнитов не нашёл ksBody?
Спасибо Gek ;)

333

можно использовать ksPart::CalcMassInertiaProperties

дедушка

вот моё описание ksPart  

ksPart = dispinterface
   ['{5CA1D3A1-EE06-11D3-A30E-00C026EE094F}']
   function Update: WordBool; dispid 7;
   function VariableCollection: IDispatch; dispid 6;
   function GetUserParam(const userPars: IDispatch): WordBool; dispid 18;
   function GetDefaultEntity(objType: Smallint): IDispatch; dispid 11;
   function UpdatePlacement: WordBool; dispid 9;
   function GetUserParamSize: Integer; dispid 8;
   function ColorParam: IDispatch; dispid 5;
   function RebuildModel: WordBool; dispid 10;
   function SetPlacement(const placement: IDispatch): WordBool; dispid 17;
   function GetAdvancedColor(var color: Integer; var ambient: Double; var diffuse: Double;
                             var specularity: Double; var shininess: Double;
                             var transparency: Double; var emission: Double): WordBool; dispid 14;
   function NewEntity(objType: Smallint): IDispatch; dispid 12;
   function SetAdvancedColor(color: Integer; ambient: Double; diffuse: Double;
                             specularity: Double; shininess: Double; transparency: Double;
                             emission: Double): WordBool; dispid 15;
   function GetPlacement: IDispatch; dispid 16;
   function SetMateConstraintObjects(const collection: IDispatch): WordBool; dispid 21;
   function SetUserParam(const userPars: IDispatch): WordBool; dispid 19;
   function EntityCollection(objType: Smallint): IDispatch; dispid 13;
   function GetMateConstraintObjects: IDispatch; dispid 20;
   property standardComponent: WordBool dispid 4;
   property fixedComponent: WordBool dispid 3;
   property marking: WideString dispid 2;
   property name: WideString dispid 1;
 end;

не вижу здесь CalcMassInertiaProperties ;)

Спасибо.

Gek

Дед, не тормози  ;) Используется следующая связка
iPart := ksPart(doc.GetPart(n));        { n - номер модели в документе }
iBody := ksBody(iPart.GetMainBody);
вот и все  :)

дедушка

Попытался не тормозить  :o:

описал так:

var
iPart: ksPart;
iBody: ksBody;

Delphi ругнулась

[Error] _________.pas(301): Undeclared identifier: 'ksBody'

да и в iPart нет метода GetMainBody, на что delphi так же ругнулась

[Error] _________.pas(325): Undeclared identifier: 'GetMainBody'

8-)

Gek

проверь раздел Uses. У меня там следующее
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  Math, comObj, ksTLB, LDefin2D, LDefin3D, ksAuto, LibTool, LtDefine, ksConstTLB;
что-то из выделенного требуется вставить, но у тебя нету. Можешь вставить все.

дедушка

Вот мои собственно

LDefin3d, LDefin2d, KSauto, Kompas_TLB;

а где остальные найти?

дедушка

Проше прощенья с утра не сразу вспомнил, но при подключении libtool.pas проект при запуске вылетает... и сделал я по другому взял appautox.olb и с помощью delphi сделал unit... получился Kompas_TLB, а остальные юниты взял из поставки примеров к документации.

Gek

Партизанишь?  :) Делай все как написано в файле "Компиляция библиотек под К***.doc" в папке SDK. Зачем велосипед-то изобретать, тем более с квадратными колесами?  :-)))

дедушка

Не хочу показаться назойливым, но моя структура каталогов с SDK такова:

Basic
C++
Develops
Pascal
appautox.dll
appautox.olb
apptools.cnt
apptools.hlp
atrlnt_r.doc
k5view.olb
kompasw.olb

И такого вордовского файла нет  :) Gek не затруднит выслать или направить на пути истинные, по получению "нормального" SDK ?

Gek

Вот кусок из файла, относящийся к Дельфям

Delphi
Замените файлы LibTool.pas, LIBdb.pas, LDefin.pas, LDefin2D.pas, LDefin3D.pas на новые.
Delphi Automation
1.   Подключите новую библиотеку (файл с расширением tlb). Для этого выполните следующее.
1.1.   Вызовите команду Project - Import type library - Add.
1.2.   Выберите файл kAPI5.tlb.
2.   Укажите путь к корневой папке размещения примеров (Unit dir name).
3.   Нажмите кнопку Create Unit.
4.   Переименуйте полученный файл в KsTLB.pas и отредактируйте его первую строку.

Вообще-то моя прога под 7-8 версии тестировалась. И возможно, в 5.11 таких функций и нет - не помню просто  ::)
Слезай уже с 5.11   ;)

дедушка

Gek спасибо за помощь видимо придётся сбегать на 8 или 7 версию... Потому что и kAPI5.tlb тоже нет.

PS. запустил поиск по всем дискам и случайно нашёл SDK по 8 версии, там всё указанное вами есть!  ::)

дедушка

Перешёл на 7 версию... Делаю так:


...

var
  doc : ksDocument3D;
  iPart: ksPart;
  iBody: ksBody;

begin

  if Kompas = nil then
  begin
{$IFDEF __LIGHT_VERSION__}
    Kompas:= KompasObject( CreateOleObject('KompasLT.Application.5') );
{$ELSE}
    Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
{$ENDIF}
    if Kompas <> nil then
      Kompas.Visible := true;
  end;


  if Kompas <> nil then
    begin
      doc := ksDocument3D(Kompas.Document3D);
      if doc <> nil then
        doc.Open('111.m3d', false);

      iPart := ksPart(doc.GetPart(0));
      iBody := ksBody(iPart.GetMainBody);

//      ksBody.ksMassInertiaParam.m;      // !!!! а здесь Delphi говорит что нет такого метода у iBody !!!!
  end;


  if Kompas <> nil then
  begin
    Kompas.Quit;
    Kompas := nil;
  end;

...


Старость не радость...  8-)

дедушка

И ещё не знаю почему после добавления в Uses:

  ksTLB, LDefin2D, LDefin3D, ksAuto, LibTool, LtDefine, ksConstTLB;

Delphi начинает ругаться на Application, например в таком коде:

  TableSborEd.DataBaseName:=ExtractFilePath(Application.Exename);

Фух...  ::)

дедушка

Понял почему ругается, оказывается в KsTLB.pas есть такая строчка:

  Application = KompasObject;

И зачем это спрашивается нужно??? 8-)

дедушка

Ну так как его это, не понятно всё таки, а именно:

1) попытался сделать так и получил AV:

     var
        myPart: ksPart;
//        myBody: ksBody;

        mipO: IDispatch;

       ...

       myPart := ksPart(doc.GetPart(0));

       mipO := myPart.CalcMassInertiaProperties(ST_MIX_KG);

       MessageDlg(FloatToStr(ksMassInertiaParam(mipO).v),mtConfirmation,[mbYes],0);

       ...

с надеждой получить объём

2) и всё таки зачем в KsTLB

       Application = KompasObject;

или всё таки я неправильный мёд ем? ;)