fix: 剖面盒关闭时恢复 Planes 剖面不切换模式,修复 UI 指示器不显示

根因:ClearClipBox() 发送的是 Box 模式 JSON + Enabled:false,
将 ClipPlaneSet 模式从 Planes 切到 Box。后续再应用 Planes JSON
时模式又切回来,Navisworks 在该切换过程中未刷新 Planes 指示器。

修复:清除时不调用 ClearClipBox()(Box JSON),改为:
1. 发 Planes 模式 + Enabled:false(保持模式,仅禁用)
2. 发 Planes 模式 + Enabled:true(保持模式,仅切换启用)
全程模式不变,指示器正常显示。

移除已不需要的注释和调试日志。
This commit is contained in:
tian 2026-06-30 20:49:48 +08:00
parent 17d774154d
commit 809df425ee

View File

@ -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<bool>() ?? true;
double range = jObj["Range"]?.Value<double>() ?? 0.0;
bool linked = jObj["Linked"]?.Value<bool>() ?? 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
/// <summary>
/// 构建 Planes 模式的 ClipPlaneSet JSON
/// 用与 BuildClipPlaneSetJson 一致的格式风格确保指示器显示
/// 保留原始 JSON 的所有字段(含 Linked确保与 Navisworks 期望的格式一致
/// </summary>
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<string>();
@ -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());
}
/// <summary>