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}");
        }
    }
相关推荐
码途行者13 分钟前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光36 分钟前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字1 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构
1-1=01 小时前
C# 数据结构和特殊类型
数据结构·c#·.net·.netcore
老秦包你会2 小时前
计算机网络第二课 ----Socket(套接字)编程预备
开发语言·计算机网络·php
旖旎夜光2 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Wang's Blog11 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain12 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67812 小时前
深挖C++:类和对象(中)
开发语言·c++