明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 王咣生

ObjectARX工作日志

    [复制链接]
发表于 2005-3-11 17:38 | 显示全部楼层
老先生,能否给我们原代码参考一下?E-MAIL:lyhnjuct@163.com,qq:78250323
 楼主| 发表于 2005-3-26 22:07 | 显示全部楼层

修改线方向

修改线方向(line, lwpolyline, polyline)





本帖子中包含更多资源

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

x
 楼主| 发表于 2005-3-26 22:35 | 显示全部楼层
请下载rtf文件: //取得POLYLINE结点坐标
void
collectVertices(const AcDb2dPolyline* pline, AcGePoint3dArray& pts, bool asWcsPts)
{
ASSERT(pline != NULL);
ASSERT(pts.isEmpty()); AcDbObjectIterator* vertexIter = pline->vertexIterator();
ASSERT(vertexIter != NULL);
if (vertexIter == NULL)
return; AcDb2dVertex* vertex;
for (; !vertexIter->done(); vertexIter->step()) { if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) {
AcGePoint3d pp(pline->vertexPosition(*vertex));
if (vertex->vertexType() != AcDb::k2dSplineCtlVertex) {
if (asWcsPts)
pts.append(pline->vertexPosition(*vertex)); // return WCS
else
pts.append(vertex->position()); // return ECS
}
vertex->close();
}
}
delete vertexIter; ASSERT(pts.isEmpty() == Adesk::kFalse); if (pline->isClosed()) {
AcGePoint3d tmpPt = pts[0]; // used to be a bug in dynamic arrays (not sure if its still there??)
pts.append(tmpPt);
}
} //取得LWPOLYLINE结点坐标
void
collectVertices(const AcDbPolyline* pline, AcGePoint3dArray& pts)
{
ASSERT(pline != NULL);
ASSERT(pts.isEmpty()); AcGePoint3d pt;
for (int vertexNumber = 0; vertexNumber < pline->numVerts(); vertexNumber++) {
pline->getPointAt(vertexNumber, pt);
pts.append(pt);
} ASSERT(pts.isEmpty() == Adesk::kFalse); if (pline->isClosed()) {
AcGePoint3d tmpPt = pts[0];
pts.append(tmpPt);
}
}

本帖子中包含更多资源

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

x
 楼主| 发表于 2005-4-1 21:41 | 显示全部楼层
 楼主| 发表于 2005-4-17 22:19 | 显示全部楼层

动态查询.swf

通过自定义的窗口显示实体查询信息:




本帖子中包含更多资源

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

x
 楼主| 发表于 2005-5-5 16:01 | 显示全部楼层
本帖最后由 作者 于 2005-5-6 12:22:03 编辑

有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),

仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);

虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,

这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,

显然这不合理.

解决方法:

// 刷新显示屏幕
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
 楼主| 发表于 2005-5-6 10:47 | 显示全部楼层
[整理]

默认状态下AutoCAD2004是多文档应用程序,系统变量SDI=0,

acdbHostApplicationServices()->workingDatabase();

不是指一个文档,而是多个文档.当使用模态对话框时,这个对话框资源属于唯一的一个文档,所以不会产生错误;
而使用非模态对话框时,对话框资源不属于任何一个文档,如果修改往数据库(写操作),就会导致AutoCAD异常.

解决的方法是:

使用非模态对话框时要显式地管理文档的状态,当然,如果不需要多文档,则将系统变量SDI设为1也能解决非模态对话框的问题,
一般以写的方式操作实体时,要将当前文档锁定,操作结束后,解锁文档,而以读的方式打开对象,不需要锁定文档:

acDocManager->lockDocument(acDocManager->curDocument(), AcAp::kWrite, NULL, NULL, true
);

这个函数的使用是锁定文档以便访问它们的资源,这些资源包括与文档相关联的的数据库对象(AcDbDatabases objects associated with a document),以及这些数据库中的实体对象(AcDbObject objects),还有数据库常驻系统变量(all AcDbDatabase resident system variables).
它还包括了基于系统变量的所有文档(all document based system variables),及与文档关联的事务管理器(the Transaction Manager associated with a document).文档在以AcDb::kForRead打开一个AcDbObject对象时不需要锁定,读取系统变量时也不需要锁定文档.
...
acDocManager->unlockDocument(acDocManager->curDocument());


示例:

void lockDocument_Test()
{
AcGePoint3d start(0.0,0.0,0.0), end(10.0,10.0,0.0);
AcDbLine *line = new AcDbLine(start, end);
AcDbBlockTable *pBlockTable;

// 锁定当前文档
acDocManager->lockDocument(acDocManager->curDocument(), AcAp::kWrite, NULL, NULL, true);

acDocManager->curDocument()->database()->getBlockTable(pBlockTable, AcDb::kForRead);
//acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRec;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRec, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId objId;
pBlockTableRec->appendAcDbEntity(objId, line);
line->close();
pBlockTableRec->close();
// 运行完解锁文档
acDocManager->unlockDocument(acDocManager->curDocument());
}
发表于 2005-5-7 13:02 | 显示全部楼层
王咣生: 请看以下这个版本多文档原代码
 楼主| 发表于 2005-5-8 12:35 | 显示全部楼层

回复

代码在哪里?
发表于 2005-5-8 13:51 | 显示全部楼层
向版主致敬!向版主学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 04:38 , Processed in 0.255794 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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