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

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

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

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

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

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

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

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

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

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

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

Gek


дедушка

Access Violation...

Извиняюсь за задержку с ответом!

Спасибо, Gek.

Gek

Вот процедура, она работает - зуб даю

var doc: ksDocument3D; Kompas: KompasObject;

procedure Get_V;
var myPart: ksPart; MPar: ksMassInertiaParam;
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;

размерность объема можешь поменять как нужно. Вопросы?  :o:

Petrovich

Вообще-то можно определить МЦХ и в Компас 5.11,  но несколько необычным образом. Для этого надо Компасу послать несколько сообщений типа WM_COMMAND и поймать необходимые данные.
.
Вот код отдельной программы (написанной  вообще без использования Компас API) которая получает МЦХ детали или сборки, которая является активной (работает только под Компас 5.11). Естественно это только заготовка которую можно кардинально улучшить но это затмит принцип работы.

project1.dpr

program Project1;
uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$H+}
{$R *.DFM}
//Процедура получения расчета МЦХ под Компас 5.11
procedure TForm1.Button1Click(Sender: TObject);
const KompasclassName:Pchar='GraphicMainWindow';
     ApPanelName:pchar='ApCommandPanel';
     SwPanelName:pchar='ApSwitchpanel';
var kompas,
   appcommandpanel,     //панель команд
   appswitchpanel,      //панель переключателя команд
   MchDialog,           //окно МЦХ
   MchDialogText  :HWND;//текст МЦХ
   Atext:string;
   ALength:integer;
begin
 //Ищем Компас
 kompas:=findwindow(KompasClassName,nil);
 //Ищем панель команд
 appcommandpanel:=findwindowEx(kompas,0,'OWL_Window:F',ApPanelName);
 //Ищем панель переключателей
 appswitchpanel :=findwindowEx(kompas,0,'OWL_Window:F',SwPanelName);
 //Избавляемся от возможного Popup вычисления МЦХ переключаясь на ненужную
 //панель команд
 sendmessage(appswitchpanel,WM_COMMAND,$3C1f,$1);
 //включаем панель кнопок вычисления МЦХ
 sendmessage(appswitchpanel,WM_COMMAND,$3C20,$1);
 //команда рассчета МЦХ. Повторное послание выключает popup
 postmessage(appcommandpanel,WM_COMMAND,$3BF9,$1);
 (*Тут Компас задумывается - расчитывает МЦХ мы можем делать что-то еще      *)
 repeat
   application.ProcessMessages;
   //Получаем HWND от последнего созданного Popup а -  т.е. окна с МЦХ
   Mchdialog:=GetLastActivePopup(kompas);
   //Проверяем на соответствие
   setlength(Atext,8192);
   if (Mchdialog<>0) then
     begin
       ALength:=GetClassName(Mchdialog,@Atext[1],2048);
       setlength(Atext,Alength);
     end;
 until not((Mchdialog=0) or (Atext<>'#32770'));//Проверяем создался ли
 //Берем HWND от первого по порядку элемента окна типа Edit - это текст МЦХ
 MchDIalogText:=findwindowEx(MchDialog,0,'Edit','');
 //Предоставляем буфер (8К наверно хватит)
 setlength(Atext,8192);
 //Посылаем команду скопировать содержимое в представленный буфер
 ALength:=sendmessage(MchDIalogText,WM_gettext,8192,integer(@Atext[1]));
 //Устанавливаем правильно длину строки
 setlength(Atext,Alength);
 //Еще раз посылаем команду расчета МЦХ что выключает Popup
 sendmessage(appcommandpanel,WM_COMMAND,$3BF9,$1);
 //Получили текст МЦХ
 //и используем по своему усмотрению
 //Например длину текста запишем на кнопке, а сам текст засунем в Мемо1
 button1.caption:=inttostr(ALength);
 Memo1.Lines.Text:=Atext;
end;
//Команды определены с помощью WinSight (файл WS32.exe в каталоге
// Borland\delphiXXX\bin)
end.

PS На форме должны быть компоненты
Memo1 типа TMemo
Button1 типа TButton

IronMaxxx

Нехило придумано... Respect!  :fr:

Gek

Мощно  :beer: Но напоминает скорее ассемблер  :o

IronMaxxx

Цитата: Gek от 21.07.06, 00:19:45
Мощно  :beer: Но напоминает скорее ассемблер  :o

Неа, никакой не ассемблер, чистой воды Visual C++!  :)

Petrovich

Рассылка сообщений типа WM_COMMAND,  WM_USER панелям и главному окну Компаса весьма мощная вещь, так как через них можно организовать выполнение практически любой доступной команды, в том числе такой, которой нет в API, но я, к сожалению, нигде не могу найти списка сообщений типа WM_COMMAND и WM_USER на которые реагирует Компас.
Может кто-нибудь видел такой список?

Гость

Исследование экспортный  частей dll  Компаса 5.11 показало, что и в  этой версии существуют функции получения МЦХ, получения тесселяции поверхности, но в интерфейс приложений они почему-то не выведены, хоть и постоянно вызываются в процессе работы Компаса. Возникает вопрос зачем Аскон тратил деньги на развитие некоего интерфейса ksAuto если можно было просто задокументировать функции внутреннего API?