undo move自定义实体调用dwgInFields
问题描述:移动及undo 移动自定义实体,该实体对象的dwgOutFields和dwgInFields被成对调用,先Out后In。且In函数中填充对象的数组成员的语句执行后,导致对象的该数组成员相应填充,即变为原来的两倍。
自定义实体的主要代码如下:
头文件
class DLLIMPEXP CmbdInteractUnit : public CmbdInteract {
public:
ACRX_DECLARE_MEMBERS(CmbdInteractUnit) ;
protected:
static Adesk::UInt32 kCurrentVersionNumber ;
public:
//构造,析构省略...........
virtual Acad::ErrorStatus dwgOutFields (AcDbDwgFiler *pFiler) const ;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler *pFiler) ;
protected:
virtual Adesk::Boolean subWorldDraw (AcGiWorldDraw *mode) ;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d & xform);
public:
void addInFlow(AcDbObjectId id){m_InFlow.append(id);}
AcDbObjectIdArray getInFlow(){return m_InFlow;}
private:
AcDbObjectIdArray m_InFlow;
} ;
cpp文件
Acad::ErrorStatus CmbdInteractUnit::dwgOutFields (AcDbDwgFiler *pFiler) const {
assertReadEnabled () ;
。。。
acutPrintf(_T("\n CmbdInteractUnit::dwgOutFields"));
Adesk::Int32 len=m_InFlow.length();
pFiler->writeItem(len);
if(len!=0)
{
for(int i=0;i<len;i++)
{
pFiler->writeItem((AcDbSoftPointerId&)m_InFlow);
}
}
return (pFiler->filerStatus ()) ;
}
Acad::ErrorStatus CmbdInteractUnit::dwgInFields (AcDbDwgFiler *pFiler) {
assertWriteEnabled () ;
。。。
acutPrintf(_T("\n CmbdInteractUnit::dwgInFields"));
switch(version)
{
case 1:
Adesk::Int32 len;
pFiler->readItem(&len);
if(len!=0)
{
AcDbSoftPointerId id;
for(int i=0;i<len;i++)
{
pFiler->readSoftPointerId((AcDbSoftPointerId*)&id);
m_InFlow.append(id);
}
}
break;
}
return (pFiler->filerStatus ()) ;
}
经过这几天的琢磨,大概搞清了是什么情况,原因应该是cad的undo操作执行undo filer文件的读写造成的
实测显示,移动时会不断执行Out,In,filer类型为kCopyFiler,直到确定移动完成,最后执行Out filer类型为kUndoFiler。Undo移动,执行Out kUndoFiler和In kUndoFiler。
In kUndoFiler会将dwgIn函数中的修改对象属性的语句执行一遍,若函数中append了数组型成员,则该成员的元素被重新添加。 将dwgIn添加如下语句
if(pFiler->filerType()==AcDb::kUndoFiler)
{//undo filer重设数组元素
m_InFlow.setAt(i,id);
}
else
{//其他filer添加数组元素
m_InFlow.append(id);
}
页:
[1]