XDSoft 发表于 2021-1-13 02:39:19

AcDb: ePermanentlyErased when open cloned object during wblock-entire DWG


问题:
Is it possible to open cloned objects in
AcEditorReactor::beginDeepCloneXlation() or endDeepClone() callbacks when WBLOCK
- entire database is performed?

Trying to open them in AcEditorReactor::beginDeepCloneXlation( AcDbIdMapping&
idMap, Acad::ErrorStatus* pRetStatus ) or endDeepClone( AcDbIdMapping& idMap ),
results in getting "ePermanentlyErased" return code. We need to access them in
kForWrite mode to make some processing as we do in other options of WBLOCK
command corresponding to beginWblock( AcDbDatabase* pTo, AcDbDatabase* pFrom,
const AcGePoint3d*& insertionPoint ) and beginWblock( AcDbDatabase* pTo,
AcDbDatabase* pFrom, AcDbObjectId blockId ) notification.

解答:

The problem is that in the context of doing a wblock on the entire database,
AutoCAD does a fast wblock operation, which means that AutoCAD does not really
clone the objects but simulates doing it because the goal is to save the
'clones' to a file. In order to prevent other users from modifying the clone
objects (since the clone and original object are the same object in memory),
AutoCAD returns "ePermanentlyErased" error code when an application tries to
open and modify a clone.

You have two options for opening the clone object. The first one is to open the
original object instead of the clone, and to read information from it. But if
you want to modify the object, be aware that both the original and the clone
will be affected.

The second option is to disable the fast wblock mechanism by calling
AcDbDatabase::forceWblockDatabaseCopy(). Doing this will force AutoCAD to create
real clones of the objects. You will then be able to open and modify the clone
objects and only them. See the ObjectARX online help for

forceWblockDatabaseCopy() usage instructions.

页: [1]
查看完整版本: AcDb: ePermanentlyErased when open cloned object during wblock-entire DWG