leemao2 发表于 2019-7-17 15:05:32

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 ()) ;
}



leemao2 发表于 2019-7-19 08:20:49

经过这几天的琢磨,大概搞清了是什么情况,原因应该是cad的undo操作执行undo filer文件的读写造成的

实测显示,移动时会不断执行Out,In,filer类型为kCopyFiler,直到确定移动完成,最后执行Out filer类型为kUndoFiler。Undo移动,执行Out kUndoFiler和In kUndoFiler。
In kUndoFiler会将dwgIn函数中的修改对象属性的语句执行一遍,若函数中append了数组型成员,则该成员的元素被重新添加。

leemao2 发表于 2019-7-19 08:39:37

将dwgIn添加如下语句
                                if(pFiler->filerType()==AcDb::kUndoFiler)
                                {//undo filer重设数组元素
                                        m_InFlow.setAt(i,id);
                                }
                                else
                                {//其他filer添加数组元素               
                                        m_InFlow.append(id);
                                }
页: [1]
查看完整版本: undo move自定义实体调用dwgInFields