SolidWorks二次开发系列入门100篇之97-极点坐标

SolidWorks二次开发系列入门100篇之97-极点坐标_第1张图片
什么是极点

一个模型中的极点是指在某个方向上的最高或最低点。在三维模型中,通常有三个方向:x轴、y轴和z轴。因此,在x轴,y轴和z轴的正方向和负方向上,每个模型可能都有两个极点。极点通常是一些锐角或骨刺,可能需要特殊的注意和处理,以确保模型在渲染和动画过程中能够正确地呈现并不出现异常。

这是CSDN的AI回答的,意思应该没错吧,错了找它,别找我。SolidWorks二次开发系列入门100篇之97-极点坐标_第2张图片
直接一点就是某个指定方向向量上最远的一个点。

比如下面这个零件,是个斜的,别问我是谁画的SolidWorks二次开发系列入门100篇之97-极点坐标_第3张图片

SolidWorks二次开发系列入门100篇之97-极点坐标_第4张图片
这个情况下,我们要知道沿这个小圆柱上两个极点的坐标的距离 就是这个方向上的长度。
我猜这就是常规的用于包围盒可能用到的方法。
具体官方说明,请查看这个链接:
GetExtremePoint

但这个是针对某个实体的,所以在获取零件的一些极点时需要遍历实体,再获取每个实体的。
SolidWorks二次开发系列入门100篇之97-极点坐标_第5张图片
关键代码就这样了,复杂的我也不会。

		/// 
        /// 极点坐标的获取
        /// 
        /// 
        /// 
        private void BtnExtremePoint_Click(object sender, EventArgs e)
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            Vector3d vector = new Vector3d(new Point3d(0,0,0),new Point3d(1,1,1)).Normalized;

            //这里是针对零件。
            if (swModel != null &&swModel.GetType()==(int)swDocumentTypes_e.swDocPART)
            {

                PartDoc part = (PartDoc)swModel;
                var vBodies = GetBodyCopies(part);

                for (int i = 0; i < vBodies.Length; i++)
                {

                    var body = vBodies[i];

                  

                    bool ExtPRes=  body.GetExtremePoint(vector.X,vector.Y,vector.Z,out double OutX,out double OutY,out double OutZ);

                    if (ExtPRes)
                    {

                        MessageBox.Show($@"{vector.X},{vector.Y},{vector.Z}->{OutX},{OutY},{OutZ}");

                    }
                    else
                    {
                        MessageBox.Show("未找到极点");
                    }
                 



                }

            }

            //如果是装配体。

            if (swModel != null && swModel.GetType() == (int)swDocumentTypes_e.swDocASSEMBLY)
            {

                var vcomps = (object[])(swModel as AssemblyDoc).GetComponents(false);
                foreach ( var comp in vcomps)
                {
                    var tempComp=comp as Component2;

                    if (tempComp == null) continue;

                    if (tempComp.GetPathName().ToString().ToLower().EndsWith("sldprt"))
                    {

                        //把装配中的向量先转到该Comp中
                        var swMathUtility = swApp.IGetMathUtility();
                        var tempTrans = tempComp.Transform2.IInverse();
                        var tempPointInASM1 = new double[3] { 0, 0, 0 };
                        var tempPointInASM2 = new double[3] { vector.X, vector.Y, vector.Z };


                        var mathPointASM1 = (MathPoint)swMathUtility.CreatePoint(tempPointInASM1);
                        var mathPointASM2 = (MathPoint)swMathUtility.CreatePoint(tempPointInASM2);

                        var swMathPtInPart1 = (MathPoint)mathPointASM1.MultiplyTransform(tempTrans);
                        var swMathPtInPart2 = (MathPoint)mathPointASM2.MultiplyTransform(tempTrans);

                        var PointArrayData1 = (double[])swMathPtInPart1.ArrayData;
                        var PointArrayData2 = (double[])swMathPtInPart2.ArrayData;

                        //向量在该Component中
                        Vector3d vectorInPart = new Vector3d(new Point3d(PointArrayData1),new Point3d(PointArrayData2)).Normalized;


                        PartDoc part = (PartDoc)tempComp.IGetModelDoc();
                        if (part != null) {

                            var vBodies = GetBodyCopies(part);

                            for (int i = 0; i < vBodies.Length; i++)
                            {

                                var body = vBodies[i];
                                               

                                bool ExtPRes = body.GetExtremePoint(vectorInPart.X, vectorInPart.Y, vectorInPart.Z, out double OutX, out double OutY, out double OutZ);

                                if (ExtPRes)
                                {
                                    MessageBox.Show($@"零件{tempComp.Name2}->方向{vectorInPart.X},{vectorInPart.Y},{vectorInPart.Z}->{OutX},{OutY},{OutZ}(零件中的坐标)");

                                    //再转换到装配体中。
                                   
                                    var tempPointInPart = new double[3] { OutX, OutY, OutZ };

                                    var mathPoint= (MathPoint)swMathUtility.CreatePoint(tempPointInPart);

                                    var swMathPtInAsm = (MathPoint)mathPoint.MultiplyTransform(tempComp.Transform2);
                                    
                                    var arrayData = (double[])swMathPtInAsm.ArrayData;


                                    MessageBox.Show($@"零件{tempComp.Name2}->方向{vector.X},{vector.Y},{vector.Z}->{arrayData[0]},{arrayData[1]},{arrayData[2]}(装配体)");


                                }
                                else
                                {
                                    MessageBox.Show("未找到极点");
                                }



                            }

                        }

                    }




                }


            }




        }

这就是结果,要注意的是这个点不一定是你想要的中心点或者什么点,但它一定是这个方向上的极点之一。(因为这边是一个平面)
SolidWorks二次开发系列入门100篇之97-极点坐标_第6张图片

所以如果我们读取反方向的,圆顶那边,基本上就是唯一的了。只有最顶部。
接近于0,0,0

SolidWorks二次开发系列入门100篇之97-极点坐标_第7张图片

SolidWorks二次开发系列入门100篇之97-极点坐标_第8张图片

说明功能正常,这个办法还有助于标总长总宽这种类型的,在工程图中可能需要做辅助点,具体的我就不再解释了
本系列课程源码 https://gitee.com/painezeng/CSharpAndSolidWorks

希望大家点赞收藏,还有什么来的。。。
SolidWorks二次开发系列入门100篇之97-极点坐标_第9张图片

对,给钱。

你可能感兴趣的:(C#,SolidWorks,二次开发,API,SolidWorks二次开发,C#,SolidWorks,API)