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++ string:从零实现一个简易字符串类
开发语言·c++·算法
秋田君7 分钟前
QT_QT布局常用类QSplitter窗口分割类与QDockWidget窗口停靠类
开发语言·数据库·qt
老王生涯8 分钟前
rust开发环境配置-Windows & GNU
开发语言·windows·rust
Yeauty12 分钟前
自建 HLS 第一问:fMP4 还是 TS?用 Rust 在进程内把两种都跑出来
开发语言·后端·rust
颜x小32 分钟前
[C#]泛型类与泛型方法
开发语言·c++·c#
benben04433 分钟前
大模型之基于PEFT的SFT微调实战篇
开发语言·python
caishenzhibiao42 分钟前
顺势交易矩阵主图 同花顺期货通指标
java·c语言·c#
Lhan.zzZ1 小时前
深入理解 windeployqt:混合 C++/Qt 项目的打包指南
开发语言·c++·qt
我命由我123451 小时前
Android 开发 - 广播组件(标准广播、有序广播、静态注册广播、分钟到达广播、网络变更广播...)
android·java·开发语言·网络·java-ee·android studio·android-studio
TDengine (老段)1 小时前
TDengine Node.js 与 C# 连接器 — Web 服务与 .NET 集成
大数据·数据库·node.js·c#·.net·时序数据库·tdengine