今天这篇文章话题来源于群里的聊天,在讨论有些插件功能的开发原理。
如标题,今天讲的是如何查找零件文件名不一样,但实际可能是同一个东西的办法。
- 题外话
熟悉Solidworks的人都知道,Solidworks有一个比较零件或者特征不同点的工具(专业版本才能用,免费版当然不限制)。
而且还有Api
具体的我之前的文件间讲过:https://blog.csdn.net/zengqh0314/article/details/106012670
当然今天的分析功能和上面的没啥关系哈,今天是通过代码的方式来分析类型于下图的装配体中,零件实体相同的不同名零件,这样可以进一步判断是否可以进行替换,减少非标物料的实际应用。
下图里的三个圆是同一零件生衍生出来的
从肉眼看是一样的,但当零件很多的时候。或者说是借用别人的装配体的时候,相似的零件不能判断是否一样。
当前有人会想着重量,体积,重心等一样也可以判断是一样的。我之前也这么干过,但是不太准确。大概是没啥问题。
解题思路:
遍历所有零件及零件内的实体,如果两个零件的实体之间能够进行正常的一个几何变换到刚好重合的状态,就说明两个零件的实体是一样的。也可以认为这两个零件是一样的。就这是所谓的不同文件名但长一样的零件。
最关键的api方法就是GetCoincidenceTransform2
具体的例子我就不讲了。
所以,要比较两个零件是否一样的,我们需要拿到零件对应的实体。再去用这个方法判断一下,是否能直接直接空间几何的变化后保持一致。
var swApp = Connect.GetRunningSolidWorks(); //连接可以nuget上搜索Paine ,找到对应的引用。
var swModel=swApp.IActiveDoc2;
var KeepComp = swModel.ISelectionManager.GetSelectedObjectsComponent3(1, -1);
var MoveComp = swModel.ISelectionManager.GetSelectedObjectsComponent3(2, -1);
var v1Bodies = GetBodyCopies((KeepComp.IGetModelDoc() as PartDoc));
var v2Bodies = GetBodyCopies((MoveComp.IGetModelDoc() as PartDoc));
if (v1Bodies.Length==1 && v2Bodies.Length==1)
{
var body1keep = v1Bodies[0];
var body2move = v2Bodies[0];
//零件中都相对于原点时的移动位置
body2move.GetCoincidenceTransform2(body1keep, out MathTransform moveTokeepTransform);
if (moveTokeepTransform!=null)
{
MessageBox.Show(@"两零件实体相同!");
}
else
{
MessageBox.Show(@"两零件不同!");
return;
}
}
上面就是关键的代码了,当然实际 应用中还可以做很多不同的事情 ,比如,零件的自动替换工作。
上面代码中用到了一个复制零件实体的功能。
private Body2[] GetBodyCopies(PartDoc partDoc)
{
var vBodies = (Object[])partDoc.GetBodies2((int)swBodyType_e.swAllBodies, true);
Body2[] newBodies = new Body2[vBodies.Length];
for (int i = 0; i < vBodies.Length; i++)
{
var swBody2 = (Body2)vBodies[i];
newBodies[i] = (Body2)swBody2.Copy();
}
return newBodies;
}
而且还可能 需要判断 一些其它看不见的信息,比如质量 材质等其它信息。
我们来看下执行结果 :
有了这个判断 的结果 ,要达到第一个图插件的目的,就需要遍历所有不同的零件文件,进行统一的比较。再将结果分组实现即可。
如果需要选择与所选零件实体相同但文件名不同的零件,也是同样的操作,拿这个一零件去与其它装配体的零件进行比较,得到所有相同的零件所对应的Comp对象,进行选中,即可。
上面的代码我会单独保存出来,下次再上传。