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

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

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

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

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

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

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

Управление КОМПАСом из приложения

Автор Sanchez.d, 30.04.12, 06:54:28

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

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

Sanchez.d

Здравствуйте, уважаемые форумчане. Есть вопрос  :um:
Можно ли из своего приложения управлять КОМПАСом?
Например: запустил приложение и нажал кнопку --> запускается КОМПАС, в нём создается чертёж, в чертеже рисуется отрезок --> чертёж сохраняется и закрывается.
Возможно у кого-то есть пример?
Делал аналогичное приложение для AutoCAD, хочу попробовать с КОМПАС.
Пишу на Delphi 7.

Sanchez.d

Спасибо за интересный пример, возможно у меня получится реализовать свою задумку таким способом.
Только я имел ввиду немного другое.
На примере автокада: http://www.vr-online.ru/content/izuchaem-autocad-s-pomoshhju-delphi-319

т.е. у меня есть запущенный компас и запущенное приложение. И я командами приложения управляю компасом. Как-то так  :~

Sanchez.d

Ну тогда буду отталкиваться от того, что есть. Спасибо  :)

chelkar

Еще есть пример в дистрибутиве КОМПАСа.
Вот тут ...\SDK\Pascal\DELPHIAUTO\ksContrl

Альянс

Пример на C++Builder по твоему вопросу, если что не понятно спрашивай:
...
//---------------------------------------------------------------------------
DWORD dwProcessId, dwThreadId;
HWND hGridSetup[2];
LPDISPATCH ActiveDocument2D = NULL, pdispKompasObject = NULL;
LPUNKNOWN punkKompasObject = NULL;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if (pdispKompasObject)
pdispKompasObject->Release();
  if (punkKompasObject)
punkKompasObject->Release();
  CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  CoInitialize(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  if (!GetKompasObject())
return;
  if (pdispKompasObject)
pdispKompasObject->Release();
  if (punkKompasObject)
punkKompasObject->Release();
  pdispKompasObject = NULL; punkKompasObject = NULL;
}
//---------------------------------------------------------------------------
BOOL CALLBACK EnumChildWindowsProc(HWND hwnd, LPARAM lParam)
{
  bool result = true;
  char lpClassName[8] = {0};
  DWORD dwProcessId, dwThreadId;
  int nMaxCount;
  LPTSTR lpString[2];
  if (lParam == 0) {
lpString[1] = "Настройка сетки";
  }
  nMaxCount = GetWindowTextLength(hwnd);
  if (nMaxCount > 0) {
lpString[0] = (LPTSTR)GlobalAlloc(GPTR, nMaxCount + 2);
GetWindowText(hwnd, lpString[0], nMaxCount + 1);
if (strstr(lpString[0], lpString[1])) {
  if (lParam == 0) {
RealGetWindowClass(hwnd, lpClassName, 7);
if (strstr(lpClassName, "#32770")) {
  hGridSetup[1] = hwnd;
  result = false;
}
  }
}
GlobalFree(lpString[0]);
  }
  return result;
}
//---------------------------------------------------------------------------
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
  bool result = true;
  DWORD dwProcessId, dwThreadId;
  int nMaxCount;
  LPTSTR lpString[2];
  if (lParam == 0) {
lpString[1] = "КОМПАС-3D LT V";
  } else if (lParam == 1) {
lpString[1] = "Параметры";
  }
  nMaxCount = GetWindowTextLength(hwnd);
  if (nMaxCount > 0) {
lpString[0] = (LPTSTR)GlobalAlloc(GPTR, nMaxCount + 2);
GetWindowText(hwnd, lpString[0], nMaxCount + 1);
if (strstr(lpString[0], lpString[1])) {
  if (lParam == 0) {
dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == ::dwProcessId && dwThreadId != ::dwThreadId) {
  SendMessage(hwnd, WM_CLOSE, 0, 0);
  result = false;
}
  } else if (lParam == 1) {
hGridSetup[1] = NULL;
EnumChildWindows(hwnd, &EnumChildWindowsProc, 0);
if (hGridSetup[1]) {
                  hGridSetup[0] = hwnd;
  result = false;
}
  }
}
GlobalFree(lpString[0]);
  }
  return result;
}
//---------------------------------------------------------------------------
bool __stdcall GetKompasObject()
{
  bool result[3] = {false, false, false};
  //HRESULT hr = 0;
  CLSID clsid = IID_NULL;
  VARIANT propValSrc;
  if (SUCCEEDED(CLSIDFromProgID(L"KOMPASLT.Application.5", &clsid)))
if (SUCCEEDED(GetActiveObject(clsid, NULL, &punkKompasObject)))
  if (SUCCEEDED(punkKompasObject->QueryInterface(IID_IDispatch, (void**)&pdispKompasObject)))
result[0] = true;
  else
punkKompasObject->Release();
else if (SUCCEEDED(CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pdispKompasObject))) {
  pdispKompasObject->QueryInterface(IID_IUnknown, (void**)&punkKompasObject);
  result[0] = true; result[1] = true;
}
  if (!result[0]) {
punkKompasObject = NULL; pdispKompasObject = NULL;
  } else {
propValSrc.vt = VT_BOOL;
propValSrc.boolVal = true;
SetProperty(pdispKompasObject, L"Visible", propValSrc);
if (result[1]) {
  HWND hChildWnd;
  LPCTSTR _05 = "0.5";
  VARIANT hMainWnd, Application7, ksDocument2D, ksDocumentParam, propValDest, propValSrc[2];
  propValSrc[0].vt = VT_UINT;
  propValSrc[0].uintVal = ko_DocumentParam;
  InvokeHelper(pdispKompasObject, L"GetParamStruct", &ksDocumentParam, propValSrc, 1);
  InvokeHelper(ksDocumentParam.pdispVal, L"Init", &propValDest, NULL, 0);
  propValSrc[0].vt = VT_UINT;
  propValSrc[0].uintVal = lt_DocFragment;
  InvokeHelper(ksDocumentParam.pdispVal, L"type", &propValDest, propValSrc, 1);
  InvokeHelper(pdispKompasObject, L"Document2D", &ksDocument2D, NULL, 0);
  InvokeHelper(ksDocument2D.pdispVal, L"ksCreateDocument", &propValDest, &ksDocumentParam, 1);
  GetProperty(pdispKompasObject, L"ksGetHWindow", &hMainWnd, NULL, 0);
  ksDocument2D.pdispVal->Release();
  ksDocumentParam.pdispVal->Release();
  dwThreadId = GetWindowThreadProcessId((HWND)hMainWnd.lVal, &dwProcessId);
  EnumWindows(&EnumWindowsProc, 0);
  GetProperty(pdispKompasObject, L"ksGetApplication7", &Application7, NULL, 0);
  // Включить/выключить отображение сетки
  propValSrc[1].vt = VT_UINT;
  propValSrc[1].uintVal = ksCMGridOnOf;
  propValSrc[0].vt = VT_BOOL;
  propValSrc[0].boolVal = false;
  InvokeHelper(Application7.pdispVal, L"ExecuteKompasCommand", &propValDest, propValSrc, 2);
  // Настроить параметры сетки <-> SendMessage((HWND)hMainWnd.lVal, WM_COMMAND, MAKELONG(6090, 0), 0);
  propValSrc[1].vt = VT_UINT;
  propValSrc[1].uintVal = ksCMGridSetup;
  propValSrc[0].vt = VT_BOOL;
  propValSrc[0].boolVal = false;
  InvokeHelper(Application7.pdispVal, L"ExecuteKompasCommand", &propValDest, propValSrc, 2);
  EnumWindows(&EnumWindowsProc, 1);
  SendDlgItemMessage(hGridSetup[1], 0x265, BM_CLICK, 0, 0);
  SendDlgItemMessage(hGridSetup[1], 0x26F, CB_INSERTSTRING, 0, (long)_05);
  SendDlgItemMessage(hGridSetup[1], 0x26F, CB_SETCURSEL, 0, 0);
  SendDlgItemMessage(hGridSetup[1], 0x270, CB_INSERTSTRING, 0, (long)_05);
  SendDlgItemMessage(hGridSetup[1], 0x270, CB_SETCURSEL, 0, 0);
  SendDlgItemMessage(hGridSetup[0], 1, BM_CLICK, 0, 0);
  // Включить/выключить действие глобальных привязок
  propValSrc[1].vt = VT_UINT;
  propValSrc[1].uintVal = ksCMSnapSuspend;
  propValSrc[0].vt = VT_BOOL;
  propValSrc[0].boolVal = false;
  InvokeHelper(Application7.pdispVal, L"ExecuteKompasCommand", &propValDest, propValSrc, 2);
  //
}
  }
  return result[0];
}
//---------------------------------------------------------------------------
bool __stdcall GetProperty(LPDISPATCH pDisp, wchar_t *szName, VARIANT *propValDest, VARIANT propValSrc[], unsigned int cpropValSrc)
{
  bool result = false;
  long rgDispId[1];
  wchar_t *rgszNames[1] = {szName};
  if (SUCCEEDED(pDisp->GetIDsOfNames(IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId))) {
DISPPARAMS DispParams = {0};
DispParams.rgvarg = propValSrc;
DispParams.cArgs = cpropValSrc;
if (SUCCEEDED(pDisp->Invoke(rgDispId[0], IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &DispParams, propValDest, NULL, NULL)))
  result = true;
  }
  return result;
}
//---------------------------------------------------------------------------
bool __stdcall InvokeHelper(LPDISPATCH pDisp, wchar_t *szName, VARIANT *propValDest, VARIANT propValSrc[], unsigned int cpropValSrc)
{
  bool result = false;
  long rgDispId[1];
  wchar_t *rgszNames[1] = {szName};
  if (SUCCEEDED(pDisp->GetIDsOfNames(IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId))) {
DISPPARAMS DispParams = {0};
DispParams.rgvarg = propValSrc;
DispParams.cArgs = cpropValSrc;
if (SUCCEEDED(pDisp->Invoke(rgDispId[0], IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &DispParams, propValDest, NULL, NULL)))
  result = true;
  }
  return result;
}
//---------------------------------------------------------------------------
bool __stdcall SetProperty(LPDISPATCH pDisp, wchar_t *szName, VARIANT propValSrc)
{
  bool result = false;
  long rgDispId[1];
  wchar_t *rgszNames[1] = {szName};
  if (SUCCEEDED(pDisp->GetIDsOfNames(IID_NULL, rgszNames, 1, LOCALE_SYSTEM_DEFAULT, rgDispId))) {
DISPPARAMS DispParams = {0};
VARIANT rgvarg[1] = {0};
rgvarg[0] = propValSrc;
DispParams.rgvarg = rgvarg;
DispParams.cArgs = 1;
if (SUCCEEDED(pDisp->Invoke(rgDispId[0], IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &DispParams, NULL, NULL, NULL)))
      result = true;
  }
  return result;
}
//---------------------------------------------------------------------------
...