明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1029|回复: 2

undo move自定义实体调用dwgInFields

[复制链接]
发表于 2019-7-17 15:05:32 | 显示全部楼层 |阅读模式
1明经币
问题描述:
移动及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[i]);       
                }
        }
        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 ()) ;
}



 楼主| 发表于 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了数组型成员,则该成员的元素被重新添加。
回复

使用道具 举报

 楼主| 发表于 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);
                                }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:57 , Processed in 0.130755 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表