cad.net 外部参照功能

啥也不说,放代码

namespace JoinBox
{
    public enum XrefEnum
    {
        /// <summary>
        /// 卸载
        /// </summary>
        UnloadXrefs,
        /// <summary>
        /// 重载
        /// </summary>
        ReloadXrefs, 
        /// <summary>
        /// 拆离
        /// </summary>
        DetachXref,
        /// <summary>
        /// 绑定
        /// </summary>
        BindXrefs, 
    }

    public static class XrefTool
    {
        /// <summary>
        /// 修改外部参照
        /// </summary>
        /// <param name="db">数据库</param>
        /// <param name="xe">设置的枚举状态</param>
        /// <param name="names">要处理的参照名称,null就处理所有的参照</param>
        public static void SetXref(this Database db, XrefEnum xe, IEnumerable<string> names = null)
        {
            db.ResolveXrefs(false, true);//解析外部参照(使用线性引擎,只做新的) 
            var ids = new ObjectIdCollection();
            var xg = db.GetHostDwgXrefGraph(true);//神马是僵尸参照
            for (int i = 0; i < xg.NumNodes; i++)
            {
                var xNode = xg.GetXrefNode(i) as XrefGraphNode;
                // if (xNode.XrefStatus != XrefStatus.Resolved) //状态判断
                if (xNode.BlockTableRecordId.IsOk())
                {
                    if (names != null)
                    {
                        foreach (var item in names)
                        {
                            //只加入名称相同的
                            if (item.ToUpper() == xNode.Name.ToUpper())
                            {
                                ids.Add(xNode.BlockTableRecordId);
                            }
                        }
                    }
                    else
                    {
                        //每个都加入
                        ids.Add(xNode.BlockTableRecordId);
                    }
                }
            }

            // btRec.IsFromOverlayReference //是覆盖?  
            // XrefStatus 外部参照状态
            // GetXrefDatabase 外部参照数据库
            if (ids.Count == 0)
            {
                return;
            }
            switch (xe)
            {
                case XrefEnum.BindXrefs://绑定后会自动拆离
                    {
                        db.BindXrefs(ids, true);
                    }
                    break;
                case XrefEnum.DetachXref: //拆离
                    {
                        foreach (ObjectId item in ids)
                        {
                            db.DetachXref(item);
                        }
                    }
                    break;
                case XrefEnum.UnloadXrefs://卸载
                    {
                        db.UnloadXrefs(ids);  
                    }
                    break;
                case XrefEnum.ReloadXrefs://重载
                    {
                        db.ReloadXrefs(ids);
                    }
                    break;
            }
        }
    }
}

        /// <summary>
        /// id有效,未被删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public static bool IsOk(this ObjectId id)
        {
            return !id.IsNull && id.IsValid && !id.IsErased && !id.IsEffectivelyErased && id.IsResident;
        }

猜你喜欢

转载自www.cnblogs.com/JJBox/p/12407217.html