啥也不说,放代码

    1. namespace JoinBox
    2. {
    3. public enum XrefEnum
    4. {
    5. /// <summary>
    6. /// 卸载
    7. /// </summary>
    8. UnloadXrefs,
    9. /// <summary>
    10. /// 重载
    11. /// </summary>
    12. ReloadXrefs,
    13. /// <summary>
    14. /// 拆离
    15. /// </summary>
    16. DetachXref,
    17. /// <summary>
    18. /// 绑定
    19. /// </summary>
    20. BindXrefs,
    21. }
    22. public static class XrefTool
    23. {
    24. /// <summary>
    25. /// 修改外部参照
    26. /// </summary>
    27. /// <param name="db">数据库</param>
    28. /// <param name="xe">设置的枚举状态</param>
    29. /// <param name="names">要处理的参照名称,null就处理所有的参照</param>
    30. public static void SetXref(this Database db, XrefEnum xe, IEnumerable<string> names = null)
    31. {
    32. db.ResolveXrefs(false, true);//解析外部参照(使用线性引擎,只做新的)
    33. var ids = new ObjectIdCollection();
    34. var xg = db.GetHostDwgXrefGraph(true);//神马是僵尸参照
    35. for (int i = 0; i < xg.NumNodes; i++)
    36. {
    37. var xNode = xg.GetXrefNode(i) as XrefGraphNode;
    38. // if (xNode.XrefStatus != XrefStatus.Resolved) //状态判断
    39. if (xNode.BlockTableRecordId.IsOk())
    40. {
    41. if (names != null)
    42. {
    43. foreach (var item in names)
    44. {
    45. //只加入名称相同的
    46. if (item.ToUpper() == xNode.Name.ToUpper())
    47. {
    48. if (!xNode.IsNested)//判断不是嵌套参照就添加
    49. {
    50. ids.Add(xNode.BlockTableRecordId);
    51. }
    52. }
    53. }
    54. }
    55. else
    56. {
    57. //每个都加入
    58. ids.Add(xNode.BlockTableRecordId);
    59. }
    60. }
    61. }
    62. // btRec.IsFromOverlayReference //是覆盖?
    63. // XrefStatus 外部参照状态
    64. // GetXrefDatabase 外部参照数据库
    65. if (ids.Count == 0)
    66. {
    67. return;
    68. }
    69. switch (xe)
    70. {
    71. case XrefEnum.BindXrefs://绑定后会自动拆离
    72. {
    73. db.BindXrefs(ids, true);
    74. }
    75. break;
    76. case XrefEnum.DetachXref: //拆离
    77. {
    78. foreach (ObjectId item in ids)
    79. {
    80. db.DetachXref(item);
    81. }
    82. }
    83. break;
    84. case XrefEnum.UnloadXrefs://卸载
    85. {
    86. db.UnloadXrefs(ids);
    87. }
    88. break;
    89. case XrefEnum.ReloadXrefs://重载
    90. {
    91. db.ReloadXrefs(ids);
    92. }
    93. break;
    94. }
    95. }
    96. }
    97. }
    98. /// <summary>
    99. /// id有效,未被删除
    100. /// </summary>
    101. /// <param name="id"></param>
    102. /// <returns></returns>
    103. public static bool IsOk(this ObjectId id)
    104. {
    105. return !id.IsNull && id.IsValid && !id.IsErased && !id.IsEffectivelyErased && id.IsResident;
    106. }