ObjectARX工作日志
本帖最后由 作者 于 2004-7-4 17:23:54 编辑 <br /><br /> <BR> 为AutoCAD 2004添加支持路径support目录,启动AutoCAD 2004:<BR> 要点:<BR> 1. 选项版制作;<BR> 2. Tooltip与ini文件实现地物查询;<BR> 3. Menu和Toolbar实现;<BR> 4. loading界面实现;5.自动加载support\dvb目录下的dvb程序;
6.自动加载support\lsp目录下的lsp程序;
注: 在<程序日志>中的一些疑问,请您提供意见,谢谢!
源程序,见4楼;
//-----------------------------------------------------------------------------------------------------------
编辑日期: Jul 02st, 2004 ( 一 ) 知识
类型转换函数:<BR> atoi<BR> _ecvt - Converts a double number to a string<BR> CString.Format<BR> HWND hWnd = adsw_acadMainWnd();
( 二 ) 功能
1. 程序所用到的辅助数据置于support\data目录下;
2. Asdk_Custom.arx改变AutoCAD窗口的Icon和Title;
3. Asdk_AdUiPalette.arx 定义工具模板;<BR> 目前只添加了"设置"和"拼图"两个选项卡;
4. Asdk_InsertMap.arx执行图幅载入操作;
5. Asdk_AdUiJMap.arx执行图幅接拼操作; <BR> 拼接原则: <BR> a. 编码相同的拼接;<BR> b. 所有与图廓线相交的线的Elevation均被设置为0.0;<BR> c. 图廓线上结点: <BR> 对于[直立路堤] 6460100.000,两侧线的角度差限制在0.1度,其它情况角度差设置为7.0度,大于限差保留结点,反之删除结点;<BR> 对于[依比例尺斜坡式土堤] 6460600.000,同理;<BR> d. 拼接过程中,一个特殊情况,pLSource->numVerts() = 2, 这样再删除removeVertexAt(0) 和removeVertexAt(pLSource->numVerts()-1)就错了,<BR> 所以要限定一下,排除此类情况; 并且这样的实体是已经拼接(并删除结点)之后的,否则不会出现这种情况;
6. Asdk_QueryIPM.arx地物属性查询;<BR> 所有地物编码与地物名称的对应信息存储在Support目录下的coding.ini文件中,可以编辑该文件;<BR> 如果查询为[未知地物],可以在coding.ini文件中,在[图层名]记录后面加一条记录: 地物编码=地物名称,即可正确查询地物名称;
7. Asdk_LoadDvb.arx自动加载dvb目录下的所有dvb程序;
8. Asdk_UiDlgSplash.arx显示Splash界面(要用256色位图,用24色的会出错);
9. Asdk_LoadLsp.arx自动加载lsp目录下的所有lsp程序;<BR> <BR>( 三 ) 注意
1. 打开后要适时关闭指针;
AcDbEntity *pEntity;<BR> acdbOpenAcDbEntity(pEntity, objId, AcDb::kForRead);<BR> pEntity->close();
( 四 ) 问题
1. VB.NET编译的exe文件需要.net的dll库的支持,所以可移植性差,考虑用MFC来完成;
<BR>( 五 ) 用法解释
1. AcGeTol的用法;
下列代码不正确?AcGeTol如何使用?<BR> AcGePoint3dArray vertexArrayA;<BR> AcGePoint3dArray vertexArrayB;
//vertexArrayA和vertexArrayB已经存储了两条AcDbPolyline的结点坐标<BR> //我想判断两条线的起点或终点是否重合
//容差设置<BR> AcGeTol tol = AcGeContex::gTol;<BR> tol.setEqualPoint(0.2);<BR> <BR> if (Adsk::kTrue == vertexArrayA.first().isEqualTo(vertexArrayB.first(), tol) )<BR> acedAlert("起点重合");<BR> else<BR> acedAlert("起点不重合");
2. AcDbLine, AcDb2dPolyline 可以直接转换为AcDbPolyline吗?应该怎么实现?
3. 我对一个实体执行了erase()后,为什么isErased()结果为Adesk::kFalse?而通过实体id的isErase()函数<BR> 才得到true的结果?
AcDbObjectId objId;<BR> AcDbEntity *pEntity;<BR> acdbOpenAcDbEntity(pEntity, objId, AcDb::kForRead);<BR> 可能是AcDb::kForRead的原因吧!
4. AcGePoint3dArray verticsArray;<BR> ...<BR> 第一点: verticsArray<BR> 末一点: verticsArray
5. 关于实体的打开状态:<BR> acdbOpenAcDbEntity(pEnt, apertureEntities, AcDb::kForRead))<BR> //最后应该关闭pEnt<BR> pEnt->close();<BR> 当我打开很多实体,如何判断一个实体是否已经close()?<BR> Reply: <BR> I would check the return value Acad::Errorstatus and see what happen if I close an already closed object.<BR> 例如:<BR> AcDbEntity *pEnt = NULL;<BR> Acad::Errorstatus err = acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);<BR> if ( pEnt ) // err == 0 ?<BR> {}<BR> else<BR> {}
6. 在AcApDocManagerReactor与AcEdInputPointMonitor的联合使用时, 显示实体的TooltipString, 会使curDocument产生未保存的编辑, <BR> 是acdbOpenAcDbEntity( pEnt, objId, AcDb::kForRead)语句使用的结果吗?
7. ToolbarItem的Bitmap不能用资源文件中的Bitmap,
<BR> CComBSTR smallIconName;<BR> CComBSTR largeIconName;
hr = tlbr->AddToolbarButton(index, L"PALETTEON", L"打开工具选项板", L"_PALETTEON ", vtFalse, &button1);<BR> smallIconName = strBmpPath + "<A href="file://paletteon.bmp/" target="_blank" >\\paletteon.bmp</A>";<BR> largeIconName = strBmpPath + "<A href="file://paletteon.bmp/" target="_blank" >\\paletteon.bmp</A>";<BR> <BR> button1->SetBitmaps(smallIconName, largeIconName);<BR> //button1->SetBitmaps(L"IDB_BITMAP1", L"IDB_BITMAP1"); <BR> //为什么不可以,有没有办法可以利用资源文件中位图,而不必指定位图的绝对路径,这样才更合理!<BR> button1->Release();
<BR> 8. 得到当前ARX模块所在路径的方法1, 2:<BR> 方法1: --------------------------------------------------------------<BR> CString g_appPath; //全局变量,存储ini文件路径<BR> //取得ARX模块路径<BR> TCHAR appFullPath;<BR> int len = GetModuleFileName(_hdllInstance, appFullPath, MAX_PATH); // 可以得到ARX模块的路径, 如果第1个参数设置为NULL, 将返回acad.exe的路径!
g_appPath = appFullPath;<BR> g_appPath = g_appPath.Left(g_appPath.ReverseFind('\\'));
方法2: --------------------------------------------------------------<BR> CString appFileName = acedGetAppName();
char dir, drive, path;<BR> _splitpath(appFileName, drive, dir, NULL, NULL);<BR> _makepath(path, drive, dir, NULL, NULL);<BR> g_appPath = path;
9. 执行一个acedRegCmds->addCommand添加的命令的方法:<BR> 用acedCommand()是不行的!<BR> acDocManager->sendStringToExecute(acDocManager->curDocument(), "命令 ", false, true);<BR> 或者<BR> extern Adesk::Boolean acedPostCommand(const char *pCmd); //在cpp文件开头声明<BR> acedPostCommand("(load \"lisp.lsp\") "); //我没试,至少加载程序可以!<BR> {:1_1:}有源码就更好{:1_1:} 很好,可以给我一份吗?
yindb@163.com 请给我一份,先谢了
<A href="mailto:mingoldfish@163.com" target="_blank" >mingoldfish@163.com</A>
回复
本帖最后由 作者 于 2004-7-4 17:24:55 编辑源程序上传:
好东西,研究研究!吸收消化!
回复
更新了一些:asdk_loadlsp.arx加载lsp目录下的所有lsp程序,并对所有后来打开的文档有效:
本来想用文档反映器, 效果不好, 现在就借用了Vlisp的功能
(vl-load-com)
(vl-load-all "lisp程序路径")
使得放在lsp目录下的任何lsp程序可以加载的所有文档中!
我的项目也可以在这样的框架下,做写具体的事了!!! 总停留在表面上,领导会着急的,
还是别拿自己的命运开玩笑!!!??? 斑竹真是热心啊,希望一切都顺利,领导加薪水!活活^_^
回复
又加入了<A href="dispbbs.asp?boardID=14&ID=23492&page=1" target="_blank" >实现右键快捷菜单例子</A>:<A href="dispbbs.asp?boardID=14&ID=23492&page=1" target="_blank" >dispbbs.asp?boardID=14&ID=23492&page=1</A>
我希望最后能把所有组织好的程序发上来.
也需要一定时间积累,给我时间...
回复
最近不太愉快,工作进度慢多了...Asdk_Config.arx实现读取ini配置文件,初始化设置AutoCAD;
我想知道ini文件在程序中有什么重要的作用?怎么让它发挥更大,更有效的作用?
////////////////////////////////////////////
12. 如何在自己的程序中有效地利用ini文件?
GetPrivateProfileSection( LPCTSTR lpAppName, // section name<BR> LPTSTR lpReturnedString, // return buffer<BR> DWORD nSize, // size of return buffer<BR> LPCTSTR lpFileName // initialization file name<BR> );<BR> 取得指定section下面的所有key和value, 存储在一个字符串变量中,要得到每一组key=value是不是很不方便,<BR> 有什么好方法可以得到?还是用其它函数?<BR>
真好,这位老兄!有源码就更好的!