我正在尝试使用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;
}
}
}
}
}
}
我在Codestack上找到了一篇与此主题相关的文章。有一个关于如何区分实际孔和凸台的示例。你可以在这里找到它:https://www.codestack.net/solidworks-api/geometry/determine-hole-boss/
我能想到的另一个解决方案是通过遍历特征树中的特征来读取所有孔向导特征。但这只能找到使用孔向导创建的孔。