-
功能要求
如下图,从客户处过来的图档螺丝孔后缀尺寸第三位都是0.001 ,这是客户用来定义螺纹的标识。
但是对于加工处理上,不需要这个后缀,会让生产人员误解为精度要求比较高。
所以考虑是否有批处理的功能,把8.501 变成8.5的直径。
-
方案解析
该零件可能是第三方数据转换而来,没有对应的特征。所以只能通过查找零件中对应的圆柱面,通过圆柱面的直径值来查找需要处理的面。最后通过偏移面的功能,来批量处理成后面小数点没那么精确的实体。 -
代码参考
SldWorks swApp = PStandAlone.GetSolidWorks();//连接solidworks
swApp.CommandInProgress = true; //因为是exe测试,所以启动该选项,加快速度
ModelDoc2 swModel = default(ModelDoc2);
ModelDocExtension swModelDocExt = default(ModelDocExtension);
SelectionMgr swSelMgr = default(SelectionMgr);
Feature swFeature = null;
swModel = (ModelDoc2)swApp.ActiveDoc; //获取当前零件
swModelDocExt = (ModelDocExtension)swModel.Extension;
//选择所有,零件中是选中所有的边。
swModelDocExt.SelectAll();
swSelMgr = (SelectionMgr)swModel.SelectionManager;
var edgeCount = swSelMgr.GetSelectedObjectCount(); //获取 已经选中的边数
Debug.Print("总边数:" + edgeCount);
int faceidStart = 10000; //设定一个面的起始id,用于识别该面是否已经被获取到。
List<Face2> face2sList001 = new List<Face2>();
List<Face2> face2sList002 = new List<Face2>();
for (int i = 1; i <= edgeCount; i++)
{
var thisEdge = (Edge)swSelMgr.GetSelectedObject(i);
var swCurve = (Curve)thisEdge.GetCurve();
var thisCurveP = thisEdge.GetCurveParams3();
if (swCurve.IsCircle() == true)
{
var circleV = (double[])swCurve.CircleParams;
var cirDir = circleV[6] * 2000.0;
//Debug.Print("直径->" + cirDir.ToString());
if (cirDir.ToString("0.000").EndsWith("1") || cirDir.ToString("0.000").EndsWith("2"))//当小数点第三位为1或者2时
{
Debug.Print(" R--> " + cirDir);
var vFace = (Object[])thisEdge.GetTwoAdjacentFaces2();
var Face21 = (Face2)(vFace[0]);
var Face22 = (Face2)(vFace[1]);
var face1 = Face21?.GetSurface();
var face2 = Face22?.GetSurface();
if (face1 != null && (face1 as Surface).IsCylinder())
{
var faceP = (double[])(face1 as Surface).CylinderParams;
var oldFaceid = Face21.GetFaceId();
if (oldFaceid == 0)
{
Face21.SetFaceId(faceidStart);
faceidStart += 1;
if (cirDir.ToString("0.000").EndsWith("1"))
{
face2sList001.Add(Face21);
}
else
{
face2sList002.Add(Face21);
}
}
}
if (face2 != null && (face2 as Surface).IsCylinder())
{
var faceP = (double[])(face2 as Surface).CylinderParams;
var oldFaceid = Face22.GetFaceId();
if (oldFaceid == 0)
{
Face22.SetFaceId(faceidStart);
faceidStart += 1;
if (cirDir.ToString("0.000").EndsWith("1"))
{
face2sList001.Add(Face22);
}
else
{
face2sList002.Add(Face22);
}
}
}
}
}
}
swModel.ClearSelection();//清除掉所有选择的边
// 重新选中 需要处理掉0.001的面
for (int i = 0; i < face2sList001.Count; i++)
{
face2sList001[i].SetFaceId(0);
var faceEntity = (Entity)face2sList001[i];
// faceEntity.Select4(true, selectData);
faceEntity.SelectByMark(true, 1);
}
var Feature001 = swModel.FeatureManager.InsertMoveFace3((int)swMoveFaceType_e.swMoveFaceTypeOffset, true, 0, 0.0000005, null, null, 0, 0); //偏移面 去掉0.001
Feature001.Name = "Remove001";
swModel.ClearSelection();
// 重新选中 需要处理掉0.002的面
for (int i = 0; i < face2sList002.Count; i++)
{
face2sList002[i].SetFaceId(0);
var faceEntity = (Entity)face2sList002[i];
faceEntity.SelectByMark(true, 1);
}
var Feature002 = swModel.FeatureManager.InsertMoveFace3((int)swMoveFaceType_e.swMoveFaceTypeOffset, true, 0, 0.000001, null, null, 0, 0);//偏移面 去掉0.002
Feature002.Name = "Remove002";
swApp.CommandInProgress = false;