CAD修复块中心

(1)在CAD定义图块时,我们在拾取点的时候有时并不在整个块的中心点,也就是说块的基点不在中心点上,那么在插入图块的时候就有一定的误差。下面讲解关于在c#和网页中如何修复图块中心点问题。

(2)实现思路:首先返回控件的数据库中的块表对象,创建一个遍历块表的遍历器,得到图上的图块,获取图块的最小外包,利用最小外包求出图块的中心点,将这个值赋值给Origin。

c#中实现代码如下:


           MxDrawDatabase databae = (MxDrawDatabase)axMxDrawX1.GetDatabase();
            MxDrawBlockTable blkTab = databae.GetBlockTable();
            MxDrawBlockTableIterator mBlockTableiter = blkTab.NewIterator();
 
            for (; !mBlockTableiter.Done(); mBlockTableiter.Step())
 
            {
                MxDrawBlockTableRecord blkRec = mBlockTableiter.GetRecord();
 
                MxDrawBlockTableRecordIterator mBlockTableReciter = blkRec.NewIterator();
 
                MxDrawPoint mMaxPt = new MxDrawPoint();
                MxDrawPoint mMinPt = new MxDrawPoint();
 
                MxDrawPoint mMaxPtTemp = new MxDrawPoint();
                MxDrawPoint mMinPtTemp = new MxDrawPoint();
 
                for (; !mBlockTableReciter.Done(); mBlockTableReciter.Step(true, false))
                {
                    MxDrawEntity ent = mBlockTableReciter.GetEntity();
 
                    ent.GetBoundingBox(out mMinPtTemp, out mMaxPtTemp);
 
                    if ((mMinPtTemp == null) || (mMaxPtTemp == null))
                        break;
 
                    mMaxPt.x = Math.Max(mMaxPt.x, mMaxPtTemp.x);
                    mMaxPt.y = Math.Max(mMaxPt.y, mMaxPtTemp.y);
 
                    mMinPt.x = Math.Min(mMinPt.x, mMinPtTemp.x);
                    mMinPt.y = Math.Min(mMinPt.y, mMinPtTemp.y);
 
                }
 
                if ((mMinPtTemp == null) || (mMaxPtTemp == null))
                    continue;
 
                MxDrawPoint mNewBasePt = new MxDrawPoint();
 
                mNewBasePt.x = mMinPt.x + (mMaxPt.x - mMinPt.x) / 2;
                mNewBasePt.y = mMinPt.y + (mMaxPt.y - mMinPt.y) / 2;
 
                blkRec.Origin = mNewBasePt;
 
                axMxDrawX1.Regen();
            }

网页中代码实现如下:


     //返回控件的数据库对象
    var databae = mxOcx.GetDatabase();
    //返回数据库中的块表对象
    var blkTab = databae.GetBlockTable();
    //创建一个遍历块表中所有记录的遍历器
    var mBlockTableiter = blkTab.NewIterator();
    //移动当前遍历器位置
    for (; !mBlockTableiter.Done(); mBlockTableiter.Step())
 
    {
        //返回遍历器当前位置的记录
        var blkRec = mBlockTableiter.GetRecord();
        //创建一个遍历块表中所有记录的遍历器
        var mBlockTableReciter = blkRec.NewIterator();
 
        var mMaxPt = mxOcx.NewPoint();
        var mMinPt = mxOcx.NewPoint();
 
        var mMaxPtTemp = mxOcx.NewPoint();
        var mMinPtTemp =mxOcx.NewPoint();
        //移动当前遍历器位置
        for (; !mBlockTableReciter.Done(); mBlockTableReciter.Step(true, false))
        {
            //与用户交互在图面上选择一个实体
            var ent = mBlockTableReciter.GetEntity();
            //返回实体的最小矩形框外包
            ent.GetBoundingBox(mMinPtTemp, mMaxPtTemp);
 
            if ((mMinPtTemp == null) || (mMaxPtTemp == null))
                break;
 
            mMaxPt.x = Math.max(mMaxPt.x, mMaxPtTemp.x);
            mMaxPt.y = Math.max(mMaxPt.y, mMaxPtTemp.y);
 
            mMinPt.x = Math.min(mMinPt.x, mMinPtTemp.x);
            mMinPt.y = Math.min(mMinPt.y, mMinPtTemp.y);
 
        }
 
        if ((mMinPtTemp == null) || (mMaxPtTemp == null))
            continue;
 
        var mNewBasePt = mxOcx.NewPoint();
 
        mNewBasePt.x = mMinPt.x + (mMaxPt.x - mMinPt.x) / 2;
        mNewBasePt.y = mMinPt.y + (mMaxPt.y - mMinPt.y) / 2;
        //块表记录的插入原点属性
        blkRec.Origin = mNewBasePt;
        //重新生成图,重新生成所有显示数据
        mxOcx.Regen();
    }
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值