Тема: Загрузка VBA макросов из ObjectARX
Возможно ли из программы на С работать с VBA-макросами?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Загрузка VBA макросов из ObjectARX
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Возможно ли из программы на С работать с VBA-макросами?
> 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);
А как быть в случае, если пользователь выбирает произвольный проект и надо выполнить один из макросов? Как узнать какие макросы он содержит?
Аналогично. Только команда другая. Например, VBARUN.
Как использовать vbarun? когда заранее не известно имя макроса?
В самом ObjectARX нет средств для получения информации о именах загруженных проектов и именах макросов в них. Но средствами ActiveX кое-что получить можно.
// Следующие классы импортированы из // "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
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Загрузка VBA макросов из ObjectARX
Форум работает на PunBB, при поддержке Informer Technologies, Inc