diff --git a/src/Utils/SectionClipHelper.cs b/src/Utils/SectionClipHelper.cs index 9e8bd55..f9770fd 100644 --- a/src/Utils/SectionClipHelper.cs +++ b/src/Utils/SectionClipHelper.cs @@ -285,6 +285,7 @@ namespace NavisworksTransport.Utils // === Box 模式:提取包围盒,用 ApplyClipBox 重建(已知能显示指示器) === if (jObj["OrientedBox"] != null) { + LogManager.Debug($"[剖面盒] 重建: 检测到 Box 模式,OrientedBox 内容: {jObj["OrientedBox"].ToString()}"); var boxArr = jObj["OrientedBox"]?["Box"]; if (boxArr != null && boxArr.Count() >= 2) { @@ -292,36 +293,43 @@ namespace NavisworksTransport.Utils if (TryParseJArrayToPoint3D(boxArr[0], out min) && TryParseJArrayToPoint3D(boxArr[1], out max)) { + LogManager.Debug($"[剖面盒] 重建: 提取 Box min=({min.X}, {min.Y}, {min.Z}), max=({max.X}, {max.Y}, {max.Z})"); ApplyClipBox(new BoundingBox3D(min, max)); LogManager.Info("[剖面盒] 已通过 Box 模式重建剖面状态(含指示器)"); return true; } + else + { + LogManager.Warning("[剖面盒] 重建: Box 数组解析失败"); + } + } + else + { + LogManager.Warning("[剖面盒] 重建: OrientedBox 中缺少 Box 数组"); } } - // === Planes 模式:提取平面数据,重建 Planes JSON === + // === Planes 模式:先清除再恢复,确保 UI 指示器刷新 === if (jObj["Planes"] != null) { bool enabled = jObj["Enabled"]?.Value() ?? true; double range = jObj["Range"]?.Value() ?? 0.0; + bool linked = jObj["Linked"]?.Value() ?? false; - string planesJson = BuildClipPlaneSetPlanesJson(jObj["Planes"] as JArray, enabled, range); + // 先发 Planes 模式 + Enabled:false(保持模式不变,仅禁用) + string planesDisabledJson = BuildClipPlaneSetPlanesJson(jObj["Planes"] as JArray, false, range, linked); var view = Application.ActiveDocument.ActiveView; - bool success = view.TrySetClippingPlanes(planesJson); + view.TrySetClippingPlanes(planesDisabledJson); - if (success) - { - LogManager.Info("[剖面盒] 已通过 Planes 模式重建剖面状态(含指示器)"); - return true; - } + // 再发 Planes 模式 + Enabled:true(仅切换 Enabled,模式没变) + string planesEnabledJson = BuildClipPlaneSetPlanesJson(jObj["Planes"] as JArray, enabled, range, linked); + view.TrySetClippingPlanes(planesEnabledJson); - // Try 失败则尝试 Set 版本 - view.SetClippingPlanes(planesJson); - LogManager.Info("[剖面盒] 已通过 Planes 模式重建剖面状态(含指示器,Set 路径)"); + LogManager.Info("[剖面盒] 已通过 Planes 模式重建剖面状态(含指示器)"); return true; } - LogManager.Warning("[剖面盒] 无法识别保存的剖面 JSON 结构"); + LogManager.Warning($"[剖面盒] 无法识别保存的剖面 JSON 结构。完整 JSON: {savedJson}"); return false; } catch (Exception ex) @@ -357,9 +365,9 @@ namespace NavisworksTransport.Utils /// /// 构建 Planes 模式的 ClipPlaneSet JSON, - /// 用与 BuildClipPlaneSetJson 一致的格式风格确保指示器显示。 + /// 保留原始 JSON 的所有字段(含 Linked),确保与 Navisworks 期望的格式一致。 /// - private static string BuildClipPlaneSetPlanesJson(JArray planesArray, bool enabled, double range) + private static string BuildClipPlaneSetPlanesJson(JArray planesArray, bool enabled, double range, bool linked = false) { // 逐个提取平面数据 var planeJsons = new List(); @@ -402,11 +410,12 @@ namespace NavisworksTransport.Utils string planesArrayStr = string.Join(",", planeJsons); string rangeStr = range > 0 ? $",\"Range\":{range.ToString("G17")}" : ""; + string linkedStr = $",\"Linked\":{linked.ToString().ToLowerInvariant()}"; return string.Format( "{{\"Type\":\"ClipPlaneSet\",\"Version\":1," + - "\"Planes\":[{0}]{1},\"Enabled\":{2}}}", - planesArrayStr, rangeStr, enabled.ToString().ToLowerInvariant()); + "\"Planes\":[{0}]{1}{2},\"Enabled\":{3}}}", + planesArrayStr, rangeStr, linkedStr, enabled.ToString().ToLowerInvariant()); } ///