请问关于eLockViolation
当pent->upgradeOpen();时返回 eLockViolation时应该怎么办? 对eLockViolation错误应该如何对待? 我觉得这个还是要根据你的上下文环境而定。你是在什么情况下出现上面的错误的? 以前明明是这样用可以的,AcDbEntity *pEntity;
acdbOpenAcDbEntity(pEntity, objId, AcDb::kForRead);
...
AcDbLine *pLine = (AcDbLine*)pEnt;
pLine->upgradeOpen();
pLine->erase();
pLine->close();
这句pLine->upgradeOpen();的返回值以前没有考虑过eLockViolation,
现在我对处理后的图形(从其它dwg clone到当前文档)做同样步骤的操作,
pLine->upgradeOpen();返回值就为eLockViolation了. 我是在DockBar上通过Button调用命令的, 我查了一下,可能需要AcAxDocLock 来Lock文档. 知道了,
如果是DockControBar或modeless窗体, 在调用acdbOpenObject, acdbOpenAcDbEntity等函数时, 要在处理前
acDocManager->lockDocument(curDoc(),AcAp::kWrite,NULL,NULL,true);
调用结束后
acDocManager->unlockDocument(curDoc()); 太棒了,困扰了我两天的问题终于解决了。多谢楼上的回复。我是在无模式对话框中用了wblock函数,结果也是遇到了eLockViolation的错误,我都快绝望了,终于在这找到了解决办法。
对于锁定文档,ARX中是这样解释的,当你要修改一个不是当前文档的数据库时,或者你要阻止别的执行文本来修改该数据库时,你需要锁定文档。如果是以只读方式打开某个对象是不用锁定文档的,但是以写方式打开对象时,最好锁定文档。 當你要修改文檔內容或資料庫時需要以寫入的方式打開,需要先進行圖檔的鎖定
Dim documentLock As DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()
...
documentLock.Dispose()
若只是讀取圖檔的圖檔資訊,就不需要鎖定圖檔。
关于文档的Lock,可以参阅SDK中关于Documet Context和Application Context. 在Application Context下,例如非模态对话框,属性面板(AutCAD封装的非模态对话框), COM环境,如果想对Document进行写操作就需要首先Lock这个文档,在结束的时候解锁这个文档。AutCAD在执行一个命令的时候,在命令开始执行前会自动Lock文档,这就是为什么我们在命令中不用关心Lock 文档的原因。
AcAxDocLock 最好用在COM环境中,因为这个类就是专门为COM环境编写的,在其他的环境下可以使用acDocManager->lockDocument().
原来是这样子啊,学习啦
页:
[1]