下面代码,让用在图上选择实体,然后把实体做成一个图块,然后插入到图上。
C#代码如下:
// 把aryId中的实体,做成一个图块.
private long MakeEntitysToBlock(
AxMxDrawXLib.AxMxDrawX mxdraw,
List<Int64> aryId
)
{
// 得到当前数据库.
MxDrawDatabase curDatabase = (MxDrawDatabase)(mxdraw.GetDatabase());
// 选择实体的最外矩形外包.
double dMinX = 0, dMinY = 0, dMaxX = 0, dMaxY = 0;
bool isFirstEnt = true;
// 遍历每个实体,计算外包。
for (int l = 0; l < aryId.Count; l++)
{
// 根据id得到实体对象.
MxDrawMcDbObject pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;
MxDrawEntity pEnt = (MxDrawEntity)pObj;
if (pEnt == null)
continue;
// 得到实体的最小外包.
MxDrawPoint pt1Ob, pt2Ob;
pEnt.GetBoundingBox(out pt1Ob, out pt2Ob);
MxDrawPoint minPt = (MxDrawPoint)pt1Ob;
MxDrawPoint maxPt = (MxDrawPoint)pt2Ob;
if (minPt != null && maxPt != null)
{
if (isFirstEnt)
{
dMinX = minPt.x;
dMinY = minPt.y;
dMaxX = maxPt.x;
dMaxY = maxPt.y;
isFirstEnt = false;
}
else
{
if (dMinX > minPt.x)
dMinX = minPt.x;
if (dMinY > minPt.y)
dMinY = minPt.y;
if (dMaxX < maxPt.x)
dMaxX = maxPt.x;
if (dMaxY < maxPt.y)
dMaxY = maxPt.y;
}
}
}
if (isFirstEnt)
{
// 没有实体
return 0;
}
// 计算外包的中心点。
MxDrawPoint pos = new MxDrawPoint();
pos.x = dMinX + (dMaxX - dMinX) / 2.0;
pos.y = dMinY + (dMaxY - dMinY) / 2.0;
// 检查新创建的块名,在当前数据库是否已经存在.
// 得到块表.
MxDrawBlockTable blkTable = curDatabase.GetBlockTable();
// 得到当前空间的块表记录。
MxDrawBlockTableRecord curSpace = curDatabase.CurrentSpace();
String sNewBlakName;
// 添加一个匿名块,
MxDrawBlockTableRecord blkNewRec = blkTable.Add("");
// 得到系统分配的块名。
sNewBlakName = blkNewRec.Name;
// 修改新增加的块表记录的插入基点,到外包的中心点。
blkNewRec.Origin = pos;
// 遍历所有实体,把实体添加块表记录中。
for (int l = 0; l < aryId.Count; l++)
{
// 复制对象,然后添加块表记录.
blkNewRec.AddCloneEntity(aryId[l]);
// 把以前实体删除 。
MxDrawMcDbObject pObj = curDatabase.ObjectIdToObject(aryId[l]);
if (pObj == null)
continue;
pObj.Erase();
}
if (blkNewRec != null)
{
// 在当前空间中,创建一个块引对象,然后引用刚才创建的块表记录。
MxDrawBlockReference blkRef = curSpace.InsertBlock(pos.x, pos.y, sNewBlakName, 1.0, 0.0);
// 为块引用对象,添加一个属性。
MxDrawAttribute attrib = blkRef.AppendAttribute();
attrib.Position = pos;
attrib.AlignmentPoint = pos;
attrib.Oblique = 0.0;
attrib.Rotation = 0.0;
attrib.Height = 2.0;
attrib.TrueColor.SetRGB(255, 0, 0);
attrib.TextString = "这是一个属性文字的测试";
attrib.Tag = "TestTag";
attrib.IsInvisible = false;
blkRef.Position = blkRef.Position;
// 返回创建 的块引用对象的id.
return blkRef.ObjectID;
}
return 0;
}
调用代码:
// 创建一个选择集对象.
MxDrawSelectionSet ss = new MxDrawSelectionSet();
// 让用户在图上选择对象.
ss.Select(MCAD_McSelect.mcSelectionSetUserSelect, null, null, null);
// 得到用户选择的对象,把对象的id放入aryID
List<Int64> aryId = new List<Int64>();
for (Int32 i = 0; i < ss.Count; i++)
{
MxDrawEntity ent = ss.Item(i);
if (ent != null)
{
aryId.Add(ent.ObjectID);
ent.Close();
}
}
// 调用函数,把选择的对象做成一个块。
MakeEntitysToBlock(axMxDrawX1,aryId);
来源:https://www.cnblogs.com/yzy0224/p/12023096.html