
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}");
}
}