一、自动加载Base.arx
-
功能:测试时不用频繁的打开关闭cad 去 加载 卸载 Base.arx
-
模板:以第(三)篇文件结构为基础
-
Commands.h
#include "StdAfx.h" void AddCommands(); void lapp(); void uapp();
-
Commands.cpp
#include "StdAfx.h" #include "Commands.h" #include "Editor.h" #include "acedCmdNF.h" void AddCommands() { // 加载arx Editor::AddCommand(L"lapp", ACRX_CMD_MODAL, lapp); // 卸载arx Editor::AddCommand(L"uapp", ACRX_CMD_MODAL, uapp); } void lapp() { // 加载arx,acedCommandS模拟人工输入,注意添加头文件,注意加载文件位置 if(acedCommandS(RTSTR, _T("arx"), RTSTR, _T("l"), RTSTR, _T("D:\\CPP\\Base\\x64\\Debug\\Base.arx"), RTNONE) ==RTNORM) acutPrintf(_T("\n加载成功")); } void uapp() { if (acedCommandS(RTSTR, _T("arx"), RTSTR, _T("u"), RTSTR, _T("D:\\CPP\\Base\\x64\\Debug\\Base.arx"), RTNONE) == RTNORM) acutPrintf(_T("\n卸载成功")); }
注意:
- 组名:修改Editor.cpp和acrxEntryPoint.cpp中的命令组名(去看代码),不可与Base.arx相同
- 保存位置:生成后改名为luapp.arx,文件单独保存
二、文件选择
2.1 CAD风格
-
打开文件对话框
// 创建文件的结果缓冲区节点 resbuf *fileName = NULL; // 函数:对话框标题、默认路径、默认后缀名、默认名字、标识符(0打开)、文件的结果缓冲区节点 if (acedGetFileNavDialog(_T("文件选择"), NULL, _T("arx;dwg"), _T("test"), 0, &fileName) == RTNORM) { if (acedArxLoad(fileName->resval.rstring) != RTNORM) { acutPrintf(_T("\n无法加载应用程序%s"), fileName->resval.rstring); } else acutPrintf(_T("\n加载%s应用程序成功!"), fileName->resval.rstring); } acutRelRb(fileName);
-
效果
-
查找文件绝对路径
ACHAR *fileName = _T("123.dwg"); // 接收返回值: ACHAR fullPath[128]; // 返回结果类型码:RTNORM 或 RTERROR acedFindFile(fileName, fullPath, 128);
查找范围:当前文件所在文件夹、acad.exe所在文件夹、CAD环境变量内的路径
2.2 windows原生风格
2.2.1 单选
- 代码
void singleSel() { // 构造函数:true为打开,false为存储,也可CFileDialog dlg(true); CFileDialog dlg(true, NULL, NULL, NULL, _T("全部文件|*.*|dwg文件| *.dwg||")); // 设置初始目录 CString path("C:\\Users\\Administrator\\Desktop"); dlg.m_ofn.lpstrInitialDir = path; dlg.m_ofn.lpstrTitle =_T("此处为对话框标题"); if (dlg.DoModal() == IDOK) { // 返回 C:\Users\Administrator\Desktop\123.dwg acutPrintf(L"\n%s", dlg.GetPathName()); // 返回 123.dwg acutPrintf(L"\n%s", dlg.GetFileName()); // 返回 123 acutPrintf(L"\n%s", dlg.GetFileTitle()); // 返回 dwg acutPrintf(L"\n%s", dlg.GetFileExt()); } }
- 效果
2.2.2 多选
- 代码示例
void MultiSel() { // TODO: 在此添加控件通知处理程序代码 // 构造函数:第四个参数为允许多选,不包括文件夹 CFileDialog dlg(true, NULL, NULL, OFN_ALLOWMULTISELECT); // 调整缓冲区大小:存储选择到的文件路径 dlg.m_ofn.lpstrFile = new TCHAR[1024]; // 最多存储文件个数 dlg.m_ofn.nMaxFile = 1024; // 循环获取文件名 CString pathName; if (dlg.DoModal() == IDOK) { POSITION mpos = dlg.GetStartPosition(); while (mpos != NULL) { pathName = dlg.GetNextPathName(mpos); acutPrintf(_T("\n文件名为:%s"), pathName); } } // new与delete对应 delete[] dlg.m_ofn.lpstrFile; }
- 效果(不含筛选器)
2.2.3 只选文件夹
- 代码示例
void folderSel() { //存放选择的目录路径 ACHAR szPath[MAX_PATH]; CString str; ZeroMemory(szPath, sizeof(szPath)); // bi为结构体 BROWSEINFO bi; bi.hwndOwner = m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szPath; bi.lpszTitle = _T("请选择目录:"); bi.ulFlags = 0; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; //弹出选择目录对话框 LPITEMIDLIST lp = SHBrowseForFolder(&bi); // 选择成功 if (lp && SHGetPathFromIDList(lp, szPath)) AfxMessageBox(szPath); // 选择失败 else AfxMessageBox(_T("\n无效的目录,请重新选择")); }
- 效果