C# Solidworks二次开发 求零件外包络(边界框)

问题背景

使用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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值