王咣生 发表于 2004-7-1 11:01

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程序;





        注: 在&lt;程序日志&gt;中的一些疑问,请您提供意见,谢谢!


        源程序,见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-&gt;numVerts() = 2, 这样再删除removeVertexAt(0) 和removeVertexAt(pLSource-&gt;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-&gt;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-&gt;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-&gt;AddToolbarButton(index, L"PALETTEON", L"打开工具选项板", L"_PALETTEON ", vtFalse, &amp;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-&gt;SetBitmaps(smallIconName, largeIconName);<BR>                       //button1-&gt;SetBitmaps(L"IDB_BITMAP1", L"IDB_BITMAP1");        <BR>                       //为什么不可以,有没有办法可以利用资源文件中位图,而不必指定位图的绝对路径,这样才更合理!<BR>                       button1-&gt;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-&gt;addCommand添加的命令的方法:<BR>                               用acedCommand()是不行的!<BR>                               acDocManager-&gt;sendStringToExecute(acDocManager-&gt;curDocument(), "命令 ", false, true);<BR>                               或者<BR>                               extern Adesk::Boolean acedPostCommand(const char *pCmd);        //在cpp文件开头声明<BR>                               acedPostCommand("(load \"lisp.lsp\") ");                        //我没试,至少加载程序可以!<BR>

hzyhzjjzh 发表于 2022-9-20 13:11

{:1_1:}有源码就更好{:1_1:}

yindb 发表于 2004-7-1 16:40

很好,可以给我一份吗?


yindb@163.com

cag 发表于 2004-7-1 19:30

请给我一份,先谢了


<A href="mailto:mingoldfish@163.com" target="_blank" >mingoldfish@163.com</A>

王咣生 发表于 2004-7-2 11:19

回复

本帖最后由 作者 于 2004-7-4 17:24:55 编辑

源程序上传:



boaosun 发表于 2004-7-2 21:48

好东西,研究研究!吸收消化!

王咣生 发表于 2004-7-7 18:39

回复

更新了一些:




asdk_loadlsp.arx加载lsp目录下的所有lsp程序,并对所有后来打开的文档有效:
本来想用文档反映器, 效果不好, 现在就借用了Vlisp的功能
(vl-load-com)
(vl-load-all "lisp程序路径")
使得放在lsp目录下的任何lsp程序可以加载的所有文档中!
我的项目也可以在这样的框架下,做写具体的事了!!! 总停留在表面上,领导会着急的,
还是别拿自己的命运开玩笑!!!???

spaceh 发表于 2004-7-8 10:16

斑竹真是热心啊,希望一切都顺利,领导加薪水!活活^_^

王咣生 发表于 2004-7-20 11:59

回复

又加入了<A href="dispbbs.asp?boardID=14&amp;ID=23492&amp;page=1" target="_blank" >实现右键快捷菜单例子</A>:


<A href="dispbbs.asp?boardID=14&amp;ID=23492&amp;page=1" target="_blank" >dispbbs.asp?boardID=14&amp;ID=23492&amp;page=1</A>


我希望最后能把所有组织好的程序发上来.


也需要一定时间积累,给我时间...

王咣生 发表于 2004-7-27 12:13

回复

最近不太愉快,工作进度慢多了...









       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>


tsindong 发表于 2004-8-3 10:41

真好,这位老兄!有源码就更好的!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: ObjectARX工作日志