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}");
        }
    }
相关推荐
哥不想学算法3 小时前
【C++】字符串字面量拼接
开发语言·c++
gugucoding4 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
Brookty4 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
F20226974865 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding5 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW6 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php
阿里嘎多学长7 小时前
2026-07-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管
cookies_s_s8 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
盐焗鹌鹑蛋9 小时前
【C++】继承
开发语言·c++