什么是极点
一个模型中的极点是指在某个方向上的最高或最低点。在三维模型中,通常有三个方向: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
希望大家点赞收藏,还有什么来的。。。
对,给钱。