什么是极点
一个模型中的极点是指在某个方向上的最高或最低点。在三维模型中,通常有三个方向:x轴、y轴和z轴。因此,在x轴,y轴和z轴的正方向和负方向上,每个模型可能都有两个极点。极点通常是一些锐角或骨刺,可能需要特殊的注意和处理,以确保模型在渲染和动画过程中能够正确地呈现并不出现异常。
这是CSDN的AI回答的,意思应该没错吧,错了找它,别找我。
直接一点就是某个指定方向向量上最远的一个点。
比如下面这个零件,是个斜的,别问我是谁画的
这个情况下,我们要知道沿这个小圆柱上两个极点的坐标的距离 就是这个方向上的长度。
我猜这就是常规的用于包围盒可能用到的方法。
具体官方说明,请查看这个链接:
GetExtremePoint
但这个是针对某个实体的,所以在获取零件的一些极点时需要遍历实体,再获取每个实体的。
关键代码就这样了,复杂的我也不会。
/// <summary>/// 极点坐标的获取/// </summary>/// <param name="sender"></param>/// <param name="e"></param>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("未找到极点");}}}}}}}
这就是结果,要注意的是这个点不一定是你想要的中心点或者什么点,但它一定是这个方向上的极点之一。(因为这边是一个平面)
所以如果我们读取反方向的,圆顶那边,基本上就是唯一的了。只有最顶部。
接近于0,0,0
说明功能正常,这个办法还有助于标总长总宽这种类型的,在工程图中可能需要做辅助点,具体的我就不再解释了
本系列课程源码 https://gitee.com/painezeng/CSharpAndSolidWorks
希望大家点赞收藏,还有什么来的。。。
对,给钱。