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}");
        }
    }
相关推荐
雪豹阿伟1 小时前
21.Winfrom —— 定时器、日期选择器、进度条、表格、DataTable
c#·上位机·winfrom
z落落1 小时前
C#WinForm控件实战:Panel与单选框动态创建
开发语言·c#
ptc学习者1 小时前
python 中描述符@property property 大概的样子
开发语言·python
zmzb01031 小时前
Python课后习题训练记录Day129
开发语言·python
张忠琳1 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
Vertira1 小时前
如何对QT开发的软件进行打包[已解决]
开发语言·qt
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第110题】【并发篇】第10题:CAS 存在哪些问题?
java·开发语言·面试
石一峰6991 小时前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
sitellla1 小时前
Pydub:用 Python 处理音频,不写废话
开发语言·python·其他·音视频
xingyuzhisuan2 小时前
缓存命中率提升方案:从 30% 优化至 82% 全流程优化记录
java·开发语言·缓存·ai