- 积分
- 12459
- 明经币
- 个
- 注册时间
- 2003-5-28
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 作者 于 2004-7-4 17:23:54 编辑
为AutoCAD 2004添加支持路径support目录,启动AutoCAD 2004: 要点: 1. 选项版制作; 2. Tooltip与ini文件实现地物查询; 3. Menu和Toolbar实现; 4. loading界面实现;
5.自动加载support\dvb目录下的dvb程序;
6.自动加载support\lsp目录下的lsp程序;
注: 在<程序日志>中的一些疑问,请您提供意见,谢谢!
源程序,见4楼;
//-----------------------------------------------------------------------------------------------------------
编辑日期: Jul 02st, 2004 ( 一 ) 知识
类型转换函数: atoi _ecvt - Converts a double number to a string CString.Format HWND hWnd = adsw_acadMainWnd();
( 二 ) 功能
1. 程序所用到的辅助数据置于support\data目录下;
2. Asdk_Custom.arx改变AutoCAD窗口的Icon和Title;
3. Asdk_AdUiPalette.arx 定义工具模板; 目前只添加了"设置"和"拼图"两个选项卡;
4. Asdk_InsertMap.arx执行图幅载入操作;
5. Asdk_AdUiJMap.arx执行图幅接拼操作; 拼接原则: a. 编码相同的拼接; b. 所有与图廓线相交的线的Elevation均被设置为0.0; c. 图廓线上结点: 对于[直立路堤] 6460100.000,两侧线的角度差限制在0.1度,其它情况角度差设置为7.0度,大于限差保留结点,反之删除结点; 对于[依比例尺斜坡式土堤] 6460600.000,同理; d. 拼接过程中,一个特殊情况,pLSource->numVerts() = 2, 这样再删除removeVertexAt(0) 和removeVertexAt(pLSource->numVerts()-1)就错了, 所以要限定一下,排除此类情况; 并且这样的实体是已经拼接(并删除结点)之后的,否则不会出现这种情况;
6. Asdk_QueryIPM.arx地物属性查询; 所有地物编码与地物名称的对应信息存储在Support目录下的coding.ini文件中,可以编辑该文件; 如果查询为[未知地物],可以在coding.ini文件中,在[图层名]记录后面加一条记录: 地物编码=地物名称,即可正确查询地物名称;
7. Asdk_LoadDvb.arx自动加载dvb目录下的所有dvb程序;
8. Asdk_UiDlgSplash.arx显示Splash界面(要用256色位图,用24色的会出错);
9. Asdk_LoadLsp.arx自动加载lsp目录下的所有lsp程序; ( 三 ) 注意
1. 打开后要适时关闭指针;
AcDbEntity *pEntity; acdbOpenAcDbEntity(pEntity, objId, AcDb::kForRead); pEntity->close();
( 四 ) 问题
1. VB.NET编译的exe文件需要.net的dll库的支持,所以可移植性差,考虑用MFC来完成;
( 五 ) 用法解释
1. AcGeTol的用法;
下列代码不正确?AcGeTol如何使用? AcGePoint3dArray vertexArrayA; AcGePoint3dArray vertexArrayB;
//vertexArrayA和vertexArrayB已经存储了两条AcDbPolyline的结点坐标 //我想判断两条线的起点或终点是否重合
//容差设置 AcGeTol tol = AcGeContex::gTol; tol.setEqualPoint(0.2); if (Adsk::kTrue == vertexArrayA.first().isEqualTo(vertexArrayB.first(), tol) ) acedAlert("起点重合"); else acedAlert("起点不重合");
2. AcDbLine, AcDb2dPolyline 可以直接转换为AcDbPolyline吗?应该怎么实现?
3. 我对一个实体执行了erase()后,为什么isErased()结果为Adesk::kFalse?而通过实体id的isErase()函数 才得到true的结果?
AcDbObjectId objId; AcDbEntity *pEntity; acdbOpenAcDbEntity(pEntity, objId, AcDb::kForRead); 可能是AcDb::kForRead的原因吧!
4. AcGePoint3dArray verticsArray; ... 第一点: verticsArray[0] 末一点: verticsArray[verticsArray.length()-1]
5. 关于实体的打开状态: acdbOpenAcDbEntity(pEnt, apertureEntities[0], AcDb::kForRead)) //最后应该关闭pEnt pEnt->close(); 当我打开很多实体,如何判断一个实体是否已经close()? Reply: I would check the return value Acad::Errorstatus and see what happen if I close an already closed object. 例如: AcDbEntity *pEnt = NULL; Acad::Errorstatus err = acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead); if ( pEnt ) // err == 0 ? {} else {}
6. 在AcApDocManagerReactor与AcEdInputPointMonitor的联合使用时, 显示实体的TooltipString, 会使curDocument产生未保存的编辑, 是acdbOpenAcDbEntity( pEnt, objId, AcDb::kForRead)语句使用的结果吗?
7. ToolbarItem的Bitmap不能用资源文件中的Bitmap,
CComBSTR smallIconName; CComBSTR largeIconName;
hr = tlbr->AddToolbarButton(index, L"PALETTEON", L"打开工具选项板", L"_PALETTEON ", vtFalse, &button1); smallIconName = strBmpPath + "\\paletteon.bmp"; largeIconName = strBmpPath + "\\paletteon.bmp"; button1->SetBitmaps(smallIconName, largeIconName); //button1->SetBitmaps(L"IDB_BITMAP1", L"IDB_BITMAP1"); //为什么不可以,有没有办法可以利用资源文件中位图,而不必指定位图的绝对路径,这样才更合理! button1->Release();
8. 得到当前ARX模块所在路径的方法1, 2: 方法1: -------------------------------------------------------------- CString g_appPath; //全局变量,存储ini文件路径 //取得ARX模块路径 TCHAR appFullPath[MAX_PATH]; int len = GetModuleFileName(_hdllInstance, appFullPath, MAX_PATH); // 可以得到ARX模块的路径, 如果第1个参数设置为NULL, 将返回acad.exe的路径!
g_appPath = appFullPath; g_appPath = g_appPath.Left(g_appPath.ReverseFind('\\'));
方法2: -------------------------------------------------------------- CString appFileName = acedGetAppName();
char dir[_MAX_DIR], drive[_MAX_DRIVE], path[_MAX_PATH]; _splitpath(appFileName, drive, dir, NULL, NULL); _makepath(path, drive, dir, NULL, NULL); g_appPath = path;
9. 执行一个acedRegCmds->addCommand添加的命令的方法: 用acedCommand()是不行的! acDocManager->sendStringToExecute(acDocManager->curDocument(), "命令 ", false, true); 或者 extern Adesk::Boolean acedPostCommand(const char *pCmd); //在cpp文件开头声明 acedPostCommand("(load \"lisp.lsp\") "); //我没试,至少加载程序可以!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|