c# solidworks GetPartBox无法获得正确实体边界框原因

GetPartBox 把草图/参考几何等非实体范围算进包围盒,而 GetBodyBox 与实体一致

csharp 复制代码
    private void DebugGetPartBox()
    {
        var sb = new StringBuilder(1024);

        void Append(string s)
        {
            sb.AppendLine(s);
            Debug.WriteLine(s);
            Console.WriteLine(s);
        }

        static string FmtMmFromUserBox(double[] box, double scaleToMm)
        {
            if (box == null || box.Length < 6)
            {
                return "(无效)";
            }

            double dx = Math.Abs(box[3] - box[0]) * scaleToMm;
            double dy = Math.Abs(box[4] - box[1]) * scaleToMm;
            double dz = Math.Abs(box[5] - box[2]) * scaleToMm;
            return $"dx={dx:F3} dy={dy:F3} dz={dz:F3} mm | min=({box[0]:G9},{box[1]:G9},{box[2]:G9}) max=({box[3]:G9},{box[4]:G9},{box[5]:G9})";
        }

        try
        {
            StartCancelableCommand();
            if (swApp == null)
            {
                Debug.WriteLine("SolidWorks 未初始化");
                return;
            }

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;
            if (swModel == null || swModel.GetType() != (int)swDocumentTypes_e.swDocPART)
            {
                swApp.SendMsgToUser("请先打开一个零件(.sldprt)再运行本命令。");
                return;
            }

            var part = (PartDoc)swModel;
            string title = swModel.GetTitle() ?? "";
            string path = swModel.GetPathName() ?? "";
            string cfg = "";
            try
            {
                cfg = swModel.ConfigurationManager?.ActiveConfiguration?.Name ?? "";
            }
            catch
            {
                cfg = "";
            }

            Append("========== GetPartBox / GetBodyBox ==========");
            Append($"文档: {title}");
            Append($"路径: {path}");
            Append($"活动配置: {cfg}");
            Append("");

            object boxUserObj = part.GetPartBox(true);
            double[] boxUser = boxUserObj as double[];
            Append("GetPartBox(true),×1000→mm:");
            Append("  " + FmtMmFromUserBox(boxUser ?? Array.Empty<double>(), 1000.0));

            object boxSysObj = part.GetPartBox(false);
            double[] boxSys = boxSysObj as double[];
            Append("GetPartBox(false),轴向跨度(系统/模型单位,多为 mm 时勿再×1000):");
            Append("  " + FmtMmFromUserBox(boxSys ?? Array.Empty<double>(), 1.0));
            Append("");

            var pd = PartDimensionHelper.GetPartDimensions(part);
            Append($"PartDimensionHelper(mm,实体并集优先): L={pd.length}  W={pd.width}  H={pd.height}");
            Append("");

            object bodiesObj = part.GetBodies2((int)swBodyType_e.swSolidBody, false);
            object[] bodies = bodiesObj as object[] ?? Array.Empty<object>();
            Append($"实体数: {bodies.Length}");
            for (int i = 0; i < bodies.Length; i++)
            {
                if (bodies[i] is not Body2 body)
                {
                    Append($"  [{i}] (非 Body2)");
                    continue;
                }

                try
                {
                    object bbObj = body.GetBodyBox();
                    double[] bb = bbObj as double[];
                    Append($"  [{i}] GetBodyBox:");
                    Append("      " + FmtMmFromUserBox(bb ?? Array.Empty<double>(), 1000.0));
                }
                catch (Exception ex)
                {
                    Append($"  [{i}] GetBodyBox 异常: {ex.Message}");
                }
            }

            Append("");
            Append("========== 结束 ==========");

            MessageBox.Show(
                sb.ToString(),
                "GetPartBox 测试",
                MessageBoxButtons.OK,
                MessageBoxIcon.Information);
        }
        catch (OperationCanceledException)
        {
            swApp?.SendMsgToUser("命令已中止");
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"测试GetPartBox 失败:{ex.Message}");
            Console.WriteLine($"测试GetPartBox 失败:{ex.Message}");
            swApp?.SendMsgToUser($"测试GetPartBox 失败:{ex.Message}");
        }
    }
相关推荐
bandaoyu1 小时前
【CUDA】store/load普通访存 vs 非临时(Non-Temporal)访存
java·开发语言·redis
天天进步20151 小时前
透视 Mission Control 源码:如何构建高性能的 Agent 实时监控架构?
开发语言
apple爱加油1 小时前
线程相关_线程池原理
开发语言·python
小短腿的代码世界1 小时前
Qt_Qwt深度解析:从源码到工业级性能优化
开发语言·qt·性能优化
charlie1145141911 小时前
基于开源项目的现代C++实战——OnceCallback 实战(五):then 链式组合
开发语言·c++·开源
Anastasiozzzz1 小时前
深入研究Java Agent生态:SpringAI 与 SpringAIAlibaba核心能力、架构演进与全场景对比研究
java·开发语言·架构
Shan12051 小时前
在C++中尝试封装为函数
开发语言·c++·算法
rockey6271 小时前
AScript之匿名类型与动态类型
c#·.net·script·eval·expression·动态脚本
Shadow(⊙o⊙)1 小时前
Linux进程地址空间——钻入Linux内核架构性剖析 硬核手搓!
java·linux·运维·服务器·开发语言·c++