明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 92277|回复: 160

ObjectARX工作日志

    [复制链接]
发表于 2004-7-1 11:01 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 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

评分

参与人数 2威望 +1 金钱 +20 贡献 +5 激情 +5 收起 理由
2005anjob + 10
mccad + 1 + 10 + 5 + 5 【精华】好文章

查看全部评分

发表于 2004-7-1 16:40 | 显示全部楼层
很好,可以给我一份吗?


yindb@163.com
发表于 2004-7-1 19:30 | 显示全部楼层
请给我一份,先谢了 mingoldfish@163.com
 楼主| 发表于 2004-7-2 11:19 | 显示全部楼层

回复

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

源程序上传:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

点评

9个程序,先学习一下  发表于 2012-6-8 16:35
发表于 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程序可以加载的所有文档中!
我的项目也可以在这样的框架下,做写具体的事了!!! 总停留在表面上,领导会着急的,
还是别拿自己的命运开玩笑!!!???

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1威望 +2 金钱 +2 激情 +1 收起 理由
zfbj + 2 + 2 + 1 【好评】好程序

查看全部评分

发表于 2004-7-8 10:16 | 显示全部楼层
斑竹真是热心啊,希望一切都顺利,领导加薪水!活活^_^
 楼主| 发表于 2004-7-20 11:59 | 显示全部楼层

回复

又加入了实现右键快捷菜单例子: dispbbs.asp?boardID=14&ID=23492&page=1 我希望最后能把所有组织好的程序发上来. 也需要一定时间积累,给我时间...
 楼主| 发表于 2004-7-27 12:13 | 显示全部楼层

回复

最近不太愉快,工作进度慢多了... Asdk_Config.arx实现读取ini配置文件,初始化设置AutoCAD; 我想知道ini文件在程序中有什么重要的作用?怎么让它发挥更大,更有效的作用? //////////////////////////////////////////// 12. 如何在自己的程序中有效地利用ini文件? GetPrivateProfileSection( LPCTSTR lpAppName, // section name
LPTSTR lpReturnedString, // return buffer
DWORD nSize, // size of return buffer
LPCTSTR lpFileName // initialization file name
);
取得指定section下面的所有key和value, 存储在一个字符串变量中,要得到每一组key=value是不是很不方便,
有什么好方法可以得到?还是用其它函数?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-8-3 10:41 | 显示全部楼层
真好,这位老兄!有源码就更好的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2018-6-26 01:27 , Processed in 0.287219 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表