首页 > 解决方案 > 在 Solidworks 零件中查找孔

问题描述

我正在尝试使用 Solidworks API 在 C# 中创建一个应用程序,它可以帮助我检测 SolidWorks 零件中的孔。我对 C# 很陌生,这就像一个新的实验。

到目前为止,我编写了一个代码来做到这一点,但它并没有完全按照我想让他做的事情去做。它实际上选择了所有圆柱形零件,而不仅仅是孔。

另外,有没有办法使用 C# 来区分孔(完整的圆形边缘)和孔(不是完整的圆形边缘或在身体边缘切割的孔)

这是我的代码,我也会尝试发布一些图片以使其清楚。

namespace ColorCylFaces
{
    class Program
    {
        static void Main(string[] args)
        {
            SldWorks.SldWorks mySwApp;
            ModelDoc2 swDoc;
            Surface swSurface;
            PartDoc swPart;
            object[] faces;
            Face2[] swFaces;
            object[] bodies;
            Body2[] swBodies;
            Boolean boolResult;
            double[] EvalData = new double[3];

            double[] dPt = new double[3];

            double[] dNormVec = new double[3];

            var vCylParams = new double[3];

            object[] Orgn = new object[3];

            object[] reyvec = new object[3];

            Object[] DirVec = new object[3];

            var Bounds = new double[3];

            bool[] intersc = new bool[11];

            int arr;
            try
            {
                mySwApp = new SldWorks.SldWorks();
            }
            catch (Exception)
            {
                MessageBox.Show("La connexion à Solidworks a échoué!");
                return;
                throw;
            }
            swDoc = mySwApp.ActiveDoc;
            if (swDoc == null)
            {
                MessageBox.Show("La prochaine fois, ouvrez une pièce!");
                return;
            }
            Debug.Print("Nom du fichier: " + swDoc.GetPathName());
            if (swDoc.GetType() != (int)swDocumentTypes_e.swDocPART)
            {
                MessageBox.Show("Le document actif n'est pas un Part. \n La prochaine fois, ouvrez une pièce, rien d'autre!");
                return;
            }
            swPart = (PartDoc)swDoc;
            bodies = swPart.GetBodies2((int)swBodyType_e.swSolidBody, false);

            List<IBody2> bodyList = new List<IBody2>();
            foreach (IBody2 item in bodies)
            {
                bodyList.Add(item);
            }

                foreach (Body2 swBody in bodies)
            {
                faces = swBody.GetFaces();
               
                foreach (Face2 swFace in faces)
                {
                    swSurface = swFace.GetSurface();
                    boolResult = swSurface.IsCylinder();
                    if (boolResult == true)
                    {
                        vCylParams = swSurface.CylinderParams;

                        Orgn[0] = vCylParams[0];

                        Orgn[1] = vCylParams[1];

                        Orgn[2] = vCylParams[2];

                        reyvec[0] = Math.Abs(Math.Abs(vCylParams[3]) - 1);

                        reyvec[1] = Math.Abs(Math.Abs(vCylParams[4]) - 1);

                        reyvec[2] = Math.Abs(Math.Abs(vCylParams[5]) - 1);

                        arr = swDoc.RayIntersections(

                            bodyList.ToArray(),

                            (object)Orgn,

                            (object)reyvec,

                            (int)swRayPtsOpts_e.swRayPtsOptsTOPOLS,

                            0.1,

                            1);

                        double[] colorInfo = swFace.MaterialPropertyValues;
                        if (colorInfo == null)
                        {

                            colorInfo = swDoc.MaterialPropertyValues;
                        }
                        colorInfo[0] = 1.0;
                        colorInfo[1] = 1.0;
                        colorInfo[2] = 1.0;
                        swFace.MaterialPropertyValues = colorInfo;
                    }
                }
            }
        }
    }
}

标签: c#apisolidworkscylindrical

解决方案


我在 Codestack 上找到了一篇与此主题相关的文章。有一个关于如何区分实际孔和凸台的示例。你可以在这里找到它:https ://www.codestack.net/solidworks-api/geometry/determine-hole-boss/

我能想到的另一个解决方案是通过遍历特征树中的特征来读取所有孔向导特征。但这只会找到用孔向导创建的孔。


推荐阅读