C# SolidWorks 二次开发 API ---遍历特定圆柱面进行处理

  • 功能要求
    如下图,从客户处过来的图档螺丝孔后缀尺寸第三位都是0.001 ,这是客户用来定义螺纹的标识。
    但是对于加工处理上,不需要这个后缀,会让生产人员误解为精度要求比较高。
    所以考虑是否有批处理的功能,把8.501 变成8.5的直径。
    在这里插入图片描述

  • 方案解析
    该零件可能是第三方数据转换而来,没有对应的特征。所以只能通过查找零件中对应的圆柱面,通过圆柱面的直径值来查找需要处理的面。最后通过偏移面的功能,来批量处理成后面小数点没那么精确的实体。

  • 代码参考

            SldWorks swApp = PStandAlone.GetSolidWorks();//连接solidworks
            swApp.CommandInProgress = true; //因为是exe测试,所以启动该选项,加快速度
            ModelDoc2 swModel = default(ModelDoc2);
            ModelDocExtension swModelDocExt = default(ModelDocExtension);
            SelectionMgr swSelMgr = default(SelectionMgr);
            Feature swFeature = null;

                   

            swModel = (ModelDoc2)swApp.ActiveDoc; //获取当前零件

            swModelDocExt = (ModelDocExtension)swModel.Extension;

            //选择所有,零件中是选中所有的边。
            swModelDocExt.SelectAll(); 

            swSelMgr = (SelectionMgr)swModel.SelectionManager;

            var edgeCount = swSelMgr.GetSelectedObjectCount();  //获取 已经选中的边数

            Debug.Print("总边数:" + edgeCount);

            int faceidStart = 10000;  //设定一个面的起始id,用于识别该面是否已经被获取到。

            List<Face2> face2sList001 = new List<Face2>();
            List<Face2> face2sList002 = new List<Face2>();

            for (int i = 1; i <= edgeCount; i++)
            {
                var thisEdge = (Edge)swSelMgr.GetSelectedObject(i);

                var swCurve = (Curve)thisEdge.GetCurve();

                var thisCurveP = thisEdge.GetCurveParams3();

                if (swCurve.IsCircle() == true)
                {
                    var circleV = (double[])swCurve.CircleParams;

                    var cirDir = circleV[6] * 2000.0;
                    //Debug.Print("直径->" + cirDir.ToString());

                    if (cirDir.ToString("0.000").EndsWith("1") || cirDir.ToString("0.000").EndsWith("2"))//当小数点第三位为1或者2时
                    {
                        Debug.Print(" R-->  " + cirDir);

                        var vFace = (Object[])thisEdge.GetTwoAdjacentFaces2();

                        var Face21 = (Face2)(vFace[0]);
                        var Face22 = (Face2)(vFace[1]);

                        var face1 = Face21?.GetSurface();
                        var face2 = Face22?.GetSurface();

                        if (face1 != null && (face1 as Surface).IsCylinder())
                        {
                            var faceP = (double[])(face1 as Surface).CylinderParams;

                            var oldFaceid = Face21.GetFaceId();

                            if (oldFaceid == 0)
                            {
                                Face21.SetFaceId(faceidStart);
                                faceidStart += 1;
                                if (cirDir.ToString("0.000").EndsWith("1"))
                                {
                                    face2sList001.Add(Face21);
                                }
                                else
                                {
                                    face2sList002.Add(Face21);
                                }
                            }
                        }

                        if (face2 != null && (face2 as Surface).IsCylinder())
                        {
                            var faceP = (double[])(face2 as Surface).CylinderParams;

                            var oldFaceid = Face22.GetFaceId();

                            if (oldFaceid == 0)
                            {
                                Face22.SetFaceId(faceidStart);
                                faceidStart += 1;

                                if (cirDir.ToString("0.000").EndsWith("1"))
                                {
                                    face2sList001.Add(Face22);
                                }
                                else
                                {
                                    face2sList002.Add(Face22);
                                }
                            }
                        }
                    }
                }
            }
             

            swModel.ClearSelection();//清除掉所有选择的边

// 重新选中 需要处理掉0.001的面
            for (int i = 0; i < face2sList001.Count; i++)
            {
                face2sList001[i].SetFaceId(0);

                var faceEntity = (Entity)face2sList001[i];

                // faceEntity.Select4(true, selectData);

                faceEntity.SelectByMark(true, 1);
            }
   
            var Feature001 = swModel.FeatureManager.InsertMoveFace3((int)swMoveFaceType_e.swMoveFaceTypeOffset, true, 0, 0.0000005, null, null, 0, 0); //偏移面 去掉0.001

            Feature001.Name = "Remove001";

            swModel.ClearSelection();
    // 重新选中 需要处理掉0.002的面
            for (int i = 0; i < face2sList002.Count; i++)
            {
                face2sList002[i].SetFaceId(0);

                var faceEntity = (Entity)face2sList002[i];

                faceEntity.SelectByMark(true, 1);
            }

         
            var Feature002 = swModel.FeatureManager.InsertMoveFace3((int)swMoveFaceType_e.swMoveFaceTypeOffset, true, 0, 0.000001, null, null, 0, 0);//偏移面 去掉0.002

            Feature002.Name = "Remove002";
      swApp.CommandInProgress = false;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paine Zeng

如果对有帮助,请我喝咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值