iumike 发表于 2009-7-3 04:29:31

以编程方式删除表块记录

您好!
我尝试以编程方式删除现有的块表记录,包括它所拥有的所有引用。
作为起点,我有一个OdDbObjectId块引用变量,如下代码所示:
OdDbBlockReector cePtr MyBlockRefId=m_MyObjectID.safeOpenObject(OdDb::kForWrit);
OdDbObjectId BlockTableId=MyBlockRefId->block TableRecord();
OdDbBlockTableRecordPtr BlockTableRecord=BlockTableId.safeOpenObject(OdDb::kForWrit);
BlockTableRecord->erase();
问题:
1.从数据库的角度来看,上面的代码有多安全?还有另一种更安全的选择吗?
2.我如何以这种方式重新生成工作空间,该块将自动从屏幕上删除(在代码执行后,该块仍然可见,但如果我调用任何重新生成命令(如regen、pan等),则会消失)
任何想法都会受到赞赏!
Mike
**** Hidden Message *****

iumike 发表于 2009-7-3 11:36:41

关于第二个问题...也许他们在那里有无证ads_regen();函数可用
,如果它在那里,那么你可以用:
void ads_regen();

iumike 发表于 2009-7-5 04:37:57

我不知道,我可能会调用BlockTableRecord->GetBlockReferenceId(…);并在擦除记录之前擦除所有引用
sds_regen()将重新生成图形

iumike 发表于 2009-7-5 10:44:59

如果您这样做(对于第一个问题)-如果您调用撤消-则也会出现重新生成问题。

iumike 发表于 2009-7-7 08:11:32

你好!
我这样试试:
OdDbDatabase * pDb = odapDocManager()-> curDocument()-> database();
pDb-> disableUndoRecording(false);
pDb-> startUndoRecord();
oddblockreferenceptr pMyBlockRef = m _ my objectid . safe open object(OdDb::kForWrite);
pMyBlockRef-> erase();//首先在erase reactor函数中擦除选中的引用
在此之后:
void db reactor::object erased(const OdDbDatabase * pDb,const OdDbObject * pObject,bool erased)
{
if(!process undo(po object))
{
call callback(SDS _ CBENTDEL,po object);
//......测试块引用是否是我试图擦除的块引用的附加代码
// if(yes) do...{下面的代码}
OdDbObjectIdArray aObjIds
aobjids . push _ back(po object-> objectId());
pDb-> purge(aObjIds);//清除所有引用
oddblocktablerecordptr pBlockTable = oddblockreferenceptr(po object)-> blockTableRecord()。safeOpenObject(OdDb::kForWrite);
pBlockTable-> erase();//擦除块表容器

}
}
如果disableUndoRecording和startundorecording不存在,似乎无法撤消!
我没有对上面的代码进行广泛的测试,但是它似乎是有效的;它还自动解决屏幕刷新。迈克
页: [1]
查看完整版本: 以编程方式删除表块记录