ObjectARX中使用非模态对话框的问题(写数据库导致AutoCAD异常问题、刷新显示)
2011-12-21 14:16
495 查看
ObjectARX中使用非模态对话框遇到的两个问题及解决办法
一、写数据库导致AutoCAD异常问题
默认状态下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());
}
二、刷新显示屏幕问题
有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),
仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);
虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,
这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,
显然这不合理.
解决方法:
// 刷新显示屏幕
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
一、写数据库导致AutoCAD异常问题
默认状态下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());
}
二、刷新显示屏幕问题
有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),
仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);
虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,
这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,
显然这不合理.
解决方法:
// 刷新显示屏幕
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
相关文章推荐
- 使用官方API解决Navigation侧滑导致的Navigationbar异常显示和隐藏的问题
- 解决AngualrJS页面刷新导致异常显示问题
- AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题
- AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题
- 解决AngualrJS页面刷新导致异常显示问题
- Oracle 数据库,当列值小于1的小数,小数点前面的0是不显示的异常问题
- 使用AJAX调用数据库不刷新更新页面问题
- 偶遇问题 - - 程序图标显示异常,程序可以正常使用
- SpannableString使用注意(数据重复时,显示异常问题解决)
- 使用nfs共享session文件导致 session_start异常缓慢问题
- 关于CSS中内层使用float导致外层的背景无法显示的问题的解决
- 关于FusionCharts图表宽度width的设置问题导致图表显示异常的解决办法
- 问题描述: 在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常如下:
- ObjectARX中使用非模态对话框遇到的两个问题及解决办法
- QTP 对WebCheckBox对象操作,页面出现刷新导致页面显示不全问题
- ObjectARX中使用非模式对话框进行数据库操作时获取空指针问题
- arcgis 中使用sde数据库 发布服务后 不刷新的问题
- android:maxLines和android:ellipsize同时使用导致显示异常
- IDEA 解决控制乱码问题和数据库JDBC数据显示异常的原因
- jquery ajax因异步设置不当导致页面局部内容(load())刷新不显示的问题总结