C# SolidWorks二次开发——遍历单个零件的一些信息,如遍历face、loop等(SolidWorks 2020 + VS 2019)
这里介绍如何去遍历当前零件的一些基本信息,如遍历零件上的face、Loop、edge等,获取面的一些基本信息等,这些信息一般是我们进行下一步操作的基础。
这里给出了最基本最常用的一些信息的遍历方法,没有提到的可以参考SolidWorks官方帮助文档。
SolidWorks大致调用结构如下,具体参考SolidWorks官方帮助文档或网站:https://www.codestack.net/solidworks-api/getting-started/api-object-model/class-diagram/
1、获取当前的零件文档
在前两节课提到的Addin插件按钮会调用的函数中,获取当前的零件文档
public void CreateCube()
{
//获取当前文档
IModelDoc2 activeDoc = iSwApp.IActiveDoc2;
//当前文档转换为零件文档
IPartDoc currentPartDoc = (IPartDoc)activeDoc;
//如果非空,则调用遍历的函数
if (currentPartDoc != null)
{
//调用遍历面的函数
TraverseFace(currentPartDoc);
}
}
2、遍历零件的Face
函数的传入参数为当前的零件文档(IPartDoc currentPartDoc)
public void TraverseFace(IPartDoc currentPartDoc)
{
//用于存放遍历到的IFace2的List
List<IFace2> bodyFaces = new List<IFace2>();
//获取所有Body
Array bodies = (Array)(currentPartDoc.GetBodies2((int)swBodyType_e.swSolidBody, true));
//遍历每个Body
foreach (IBody2 body in bodies)
{
//获取所有Face
Array faces = (Array)body.GetFaces();
//遍历每个Face
for (int i = 0; i < faces.Length; i++)
{
//获取当前正在遍历的面
IFace2 face = (IFace2)faces.GetValue(i);
//加入到List中
bodyFaces.Add(face);
}
}
}
3、获取Face的一些基本信息,如面类型、对应面类型的一些参数等
函数的传入参数为面(IFace2 tempFace)
仅例举常用的一些信息,其余信息可以查看帮助文档
public int GetFaceInformation(IFace2 tempFace)
{
//获得该面的面积,结果保留8位小数
double tempFaceArea = Math.Round(tempFace.GetArea(), 8);
//获得该面的边数
int tempFaceEdgeCount = tempFace.GetEdgeCount();
//得到surface
ISurface tempsurface = tempFace.GetSurface();
//判断tempsurface的类型
//如果该面为平面
if(tempsurface.IsPlane())
{
//得到平面的法向,其余信息可以查看帮助文档
double[] normalOfPlane = new double[3];
normalOfPlane[0] = tempSurface.PlaneParams[0];
normalOfPlane[1] = tempSurface.PlaneParams[1];
normalOfPlane[2] = tempSurface.PlaneParams[2];
}
//如果该面为柱面
if(tempsurface.IsCylinder())
{
//得到柱面半径,其余信息可以查看帮助文档
double radiusOfCylinder = tempsurface.CylinderParams[6];
}
//如果该面是球面
if(tempsurface.IsSphere())
{
//得到球面半径,其余信息可以查看帮助文档
double radiusOfSphere = tempsurface.SphereParams[3];
}
}
4、遍历Loop、Edge等
函数的传入参数为面(IFace2 tempFace)
仅例举常用的一些信息,其余信息可以查看帮助文档
public int TraverseEdge(IFace2 tempFace)
{
//获取面的环
object[] tempLoops = (object[])tempFace.GetLoops();
//遍历环上的边
for (int a = 0; a < tempLoops.Length; a++)
{
//获取当前在遍历的Loop
ILoop2 tempLoop = (ILoop2)tempLoops[a];
//如果是外环
if (tempLoop.IsOuter() == true)
{
//取边
object[] edges = (object[])tempLoop.GetEdges();
//遍历边
for(int b = 0; b < edges.Length; b++)
{
//获取当前在遍历的Edge
IEdge tempEdge = (IEdge)edges[b];
//取该edge的起点
if(edge.IGetStartVertex()!= null)
{
double[] pointArray = new double[3];
pointArray = edge.IGetStartVertex().GetPoint();
}
}
}
}
}