Тема: Загрузка VBA макросов из ObjectARX

Возможно ли из программы на С работать с VBA-макросами?

Re: Загрузка VBA макросов из ObjectARX

> Makar
Можно. Есть несколько способов, но в конечном итоге они сводятся к одному и тому же - а именно посылке в AutoCAD строки, которая загружает (или выполняет) VBA-программу. Например, так:

extern "C" int ads_queueexpr(LPCSTR str);
char *fullVBApath = "C:\\VBA\\firstVba.dvb";
char buf[512];
sprintf(buf,"(command _.-vbaload \"%s\")",fullVBApath);
ads_queueexpr(buf);

Можно и так:

char *fullVBApath = "C:\\VBA\\firstVba.dvb";
acedCommand(RTSTR,"_.-vbaload",RTSTR,fullVBApath,RTNONE);

Re: Загрузка VBA макросов из ObjectARX

А как быть в случае, если пользователь выбирает произвольный проект и надо выполнить один из макросов? Как узнать какие макросы он содержит?

Re: Загрузка VBA макросов из ObjectARX

Аналогично. Только команда другая. Например, VBARUN.

Re: Загрузка VBA макросов из ObjectARX

Как использовать vbarun? когда заранее не известно имя макроса?

Re: Загрузка VBA макросов из ObjectARX

В самом ObjectARX нет средств для получения информации о именах загруженных проектов и именах макросов в них. Но средствами ActiveX кое-что получить можно.

Re: Загрузка VBA макросов из ObjectARX

В этом и вопрос! Как?

Re: Загрузка VBA макросов из ObjectARX

// Следующие классы импортированы из
// "Microsoft Visual Basic for Applications Extensibility"
// внути MS Visual Studio:
// Project->Add Class...->MFC->MFC Class from TypeLIB
#include "CVBE.h"
#include "CVBProject.h"
#include "CVBProjects.h"
#include "CVBComponent.h"
#include "CVBComponents.h"
#include "CCodeModule.h"
// Импортируем tlb-библиотеку AutoCAD
#import "acax16enu.tlb" no_namespace
//
// Команда печатает список всех
// загруженных в AutoCAD VBA-проектов,
// модулей и процедур в них. Алгоритм не оптимальный.
// Ошибки не проверял - наверняка есть, но Главное - идея!!!
//
static void ListLoadedVba(void)
{
  // Add your code for command GetLoadedVba.ListLoadedVba here
  IAcadApplicationPtr pApp = NULL;
  pApp = acedGetAcadWinApp()->GetIDispatch(TRUE);
  CVBE vbe(pApp->GetVBE());
  CVBProjects vbps(vbe.get_VBProjects());
  long n_vbs = vbps.get_Count();
  for (long i=1; i<=n_vbs; i++) {
    CVBProject vbp(vbps.Item(_variant_t(i)));
    CString name = vbp.get_FileName();
    acutPrintf("\nProject[%d] = \"%s\"",i,LPCSTR(name));
    CVBComponents vbcmps(vbp.get_VBComponents());
    long n_cmps = vbcmps.get_Count();
    for (long j=1; j <= n_cmps; j++) {
      CVBComponent vbcmp(vbcmps.Item(_variant_t(j)));
      CCodeModule cmodule(vbcmp.get_CodeModule());
      long total_line = cmodule.get_CountOfLines();
      CString cname = cmodule.get_Name();
      acutPrintf("\n\tModule[%d] = %s  Total lines=%d",j,LPCSTR(cname),total_line);
      CString procLast;
      long nprocLast=0;
      for (long k=1; k<=total_line; k++) {
        long proctype = 0;
        CString proc = cmodule.get_ProcOfLine(k,&proctype);
        if (procLast != proc) {
          acutPrintf("\n\t\tProcedure Name[%d] = %s",++nprocLast,LPCSTR(proc));
          procLast = proc;
        }
      }
    }
  }
}

Результат работы:

Command: listloadedvba
Project[1] = "G:\add_ref.dvb"
 Module[1] = ThisDrawing  Total lines=9
   Procedure Name[1] = f_t
 Module[2] = frm_test  Total lines=22
   Procedure Name[1] = cmd_list_Click
   Procedure Name[2] = cmd_ref_Click
   Procedure Name[3] = cmd_test_Click
   Procedure Name[4] = UserForm_Initialize
 Module[3] = mod_test  Total lines=42
   Procedure Name[1] = f_link
   Procedure Name[2] = f_show_all_refernces
   Procedure Name[3] = f_add_reference
Project[2] = "G:\mod_ext.dvb"
 Module[1] = ThisDrawing  Total lines=1
 Module[2] = mod_showname  Total lines=3
   Procedure Name[1] = f_showName
Project[3] = "G:\Project.dvb"
 Module[1] = ThisDrawing  Total lines=3
   Procedure Name[1] = Test
 Module[2] = UserForm1  Total lines=3
   Procedure Name[1] = Label1_Click