问题背景
使用C#进行SolidWorks二次开发,本功能为获取装配体中的单个零件外包络尺寸,即包围零件最小矩形框(长方体边界框)的尺寸,可通过获取其顶点坐标值计算。
总体思路
利用GetBox()方法,获取外包络,求边界分别在X、Y、Z轴上的最小坐标值,得到对角线上两顶点坐标值,即得到外包络的尺寸与位置。
求最大值和最小值函数
public double GetMax(double Val1, double Val2, double Val3){
double max = 0;
max = Val1;
if (Val2 > max)
{
max = Val2;
}
if (Val3 > max)
{
max = Val3;
}
return max;
}
public double GetMin(double Val1, double Val2, double Val3){
double min = 0;
min = Val1;
if (Val2 < min)
{
min = Val2;
}
if (Val3 < min)
{
min = Val3;
}
return min;
}
求零件外包络
在此进行的是winform开发,通过定义button控件,点击时对已经选中的零件进行外包络求取,也可以将其改为手动输入需要计算外包络的零件名并读取。最终输出的是外包络对角线两顶点坐标值,注释部分为对外包络进行草图绘制,我只需要得到坐标值即可。
private void bt_getBox_Click(object sender, EventArgs e)
{
SldWorks swApp = (SldWorks)Marshal.GetActiveObject("Sldworks.Application");
const double MaxDouble = 1.79769313486231E+308;
const double MinDouble = -1.79769313486231E+308;
ModelDoc2 swModel = default(ModelDoc2);
object Box = null;
double[] BoxArray = new double[6];
double X_max, X_min, Y_max, Y_min, Z_max, Z_min;
swModel = (ModelDoc2)swApp.ActiveDoc;
SelectionMgr sm = swModel.SelectionManager;
int select_num = sm.GetSelectedObjectCount();
Debug.Print(select_num.ToString());
// 初始化
X_max = MinDouble;
X_min = MaxDouble;
Y_max = MinDouble;
Y_min = MaxDouble;
Z_max = MinDouble;
Z_min = MaxDouble;
Component2[] swComponent = new Component2[10];
for (i = 1; i <= select_num; i++)
{
// 对选中零件分别求取外包络顶点坐标值
Component2 a = sm.GetSelectedObject6(i, -1);
Debug.Print(i.ToString());
Box = (object)a.GetBox(false, false);
BoxArray = (double[])Box;
X_max = GetMax(BoxArray[0], BoxArray[3], X_max);
X_min = GetMin(BoxArray[0], BoxArray[3], X_min);
Y_max = GetMax(BoxArray[1], BoxArray[4], Y_max);
Y_min = GetMin(BoxArray[1], BoxArray[4], Y_min);
Z_max = GetMax(BoxArray[2], BoxArray[5], Z_max);
Z_min = GetMin(BoxArray[2], BoxArray[5], Z_min);
Debug.Print("Bounding Box" + i + " = ");
Debug.Print(" (" + (X_min * 1000.0) + "," + (Y_min * 1000.0) + "," + (Z_min * 1000.0) + ") mm");
Debug.Print(" (" + (X_max * 1000.0) + "," + (Y_max * 1000.0) + "," + (Z_max * 1000.0) + ") mm");
// // 绘制外包络草图
//SketchManager swSketchMgr = default(SketchManager);
//SketchPoint[] swSketchPt = new SketchPoint[9];
//SketchSegment[] swSketchSeg = new SketchSegment[13];
//swSketchMgr = swModel.SketchManager;
//swSketchMgr.Insert3DSketch(true);
//swSketchMgr.AddToDB = true;
//swSketchPt[0] = swSketchMgr.CreatePoint(X_min, Y_min, Z_min);
//swSketchPt[1] = swSketchMgr.CreatePoint(X_min, Y_min, Z_max);
//swSketchPt[2] = swSketchMgr.CreatePoint(X_min, Y_max, Z_min);
//swSketchPt[3] = swSketchMgr.CreatePoint(X_min, Y_max, Z_max);
//swSketchPt[4] = swSketchMgr.CreatePoint(X_max, Y_min, Z_min);
//swSketchPt[5] = swSketchMgr.CreatePoint(X_max, Y_min, Z_max);
//swSketchPt[6] = swSketchMgr.CreatePoint(X_max, Y_max, Z_min);
//swSketchPt[7] = swSketchMgr.CreatePoint(X_max, Y_max, Z_max);
//swSketchSeg[0] = swSketchMgr.CreateLine(X_min, Y_min, Z_min, X_max, Y_min, Z_min);
//swSketchSeg[1] = swSketchMgr.CreateLine(X_max, Y_min, Z_min, X_max, Y_min, Z_max);
//swSketchSeg[2] = swSketchMgr.CreateLine(X_max, Y_min, Z_max, X_min, Y_min, Z_max);
//swSketchSeg[3] = swSketchMgr.CreateLine(X_min, Y_min, Z_max, X_min, Y_min, Z_min);
//swSketchSeg[4] = swSketchMgr.CreateLine(X_min, Y_min, Z_min, X_min, Y_max, Z_min);
//swSketchSeg[5] = swSketchMgr.CreateLine(X_min, Y_min, Z_max, X_min, Y_max, Z_max);
//swSketchSeg[6] = swSketchMgr.CreateLine(X_max, Y_min, Z_min, X_max, Y_max, Z_min);
//swSketchSeg[7] = swSketchMgr.CreateLine(X_max, Y_min, Z_max, X_max, Y_max, Z_max);
//swSketchSeg[8] = swSketchMgr.CreateLine(X_min, Y_max, Z_min, X_max, Y_max, Z_min);
//swSketchSeg[9] = swSketchMgr.CreateLine(X_max, Y_max, Z_min, X_max, Y_max, Z_max);
//swSketchSeg[10] = swSketchMgr.CreateLine(X_max, Y_max, Z_max, X_min, Y_max, Z_max);
//swSketchSeg[11] = swSketchMgr.CreateLine(X_min, Y_max, Z_max, X_min, Y_max, Z_min);
//swSketchMgr.AddToDB = false;
//swSketchMgr.Insert3DSketch(true);
}
}
参考资料:
GetBox Method (IComponent2) - 2018 - SOLIDWORKS API HelpGet Assembly Bounding Box Using Components Example (C#) - 2018 - SOLIDWORKS API Help