下面代码,让用在图上选择实体,然后把实体做成一个图块,然后插入到图上。

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);
12-20 07:02
查看更多