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