啥也不说,放代码
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()){if (!xNode.IsNested)//判断不是嵌套参照就添加{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;}
