通过创建边到平面的投影曲线,可以获取产品的最大外形,在模具设计的过程中经常会用到。
这个方法通过录制修改得来,具体细节可能还不是很完善,但是可以使用
/// <summary>
/// 创建边到平面的投影曲线
/// </summary>
/// <param name="edges">等待投影的曲线</param>
/// <param name="face">被投影的面</param>
public static void CreateProjectCurveFeature(Edge[] edges, Face face, out ProjectCurve projectCurve)
{
theSession = Session.GetSession();
NXOpen.Part workPart = theSession.Parts.Work;
NXOpen.Point3d origin1 = new NXOpen.Point3d(0.0, 0.0, 0.0);
NXOpen.Vector3d normal1 = new NXOpen.Vector3d(0.0, 0.0, 1.0);
NXOpen.Plane plane1;
plane1 = workPart.Planes.CreatePlane(origin1, normal1, NXOpen.SmartObject.UpdateOption.WithinModeling);
NXOpen.Features.Feature nullNXOpen_Features_Feature = null;
NXOpen.Features.ProjectCurveBuilder projectCurveBuilder1;
projectCurveBuilder1 = workPart.Features.CreateProjectCurveBuilder(nullNXOpen_Features_Feature);
projectCurveBuilder1.CurveFitData.Tolerance = 0.001;
projectCurveBuilder1.ProjectionDirectionMethod = NXOpen.Features.ProjectCurveBuilder.DirectionType.AlongVector;
projectCurveBuilder1.ProjectionDirectionMethod = NXOpen.Features.ProjectCurveBuilder.DirectionType.AlongFaceNormal;
projectCurveBuilder1.SectionToProject.DistanceTolerance = 0.001;
projectCurveBuilder1.SectionToProject.ChainingTolerance = 0.00095;
projectCurveBuilder1.SectionToProject.AngleTolerance = 0.050000000000000003;
projectCurveBuilder1.SectionToProject.SetAllowedEntityTypes(NXOpen.Section.AllowTypes.CurvesAndPoints);
foreach (var ed in edges)
{
NXOpen.Edge[] edges1 = new NXOpen.Edge[1] { ed };
NXOpen.EdgeDumbRule edgeDumbRule1;
edgeDumbRule1 = workPart.ScRuleFactory.CreateRuleEdgeDumb(edges1);
projectCurveBuilder1.SectionToProject.AllowSelfIntersection(true);
NXOpen.SelectionIntentRule[] rules1 = new NXOpen.SelectionIntentRule[1];
rules1[0] = edgeDumbRule1;
NXOpen.NXObject nullNXOpen_NXObject = null;
Point3d v1 = new Point3d();
Point3d v2 = new Point3d();
ed.GetVertices(out v1, out v2);
projectCurveBuilder1.SectionToProject.AddToSection(rules1, ed, nullNXOpen_NXObject, nullNXOpen_NXObject, v1, NXOpen.Section.Mode.Create, false);
}
NXOpen.NXObject[] geom1 = new NXOpen.NXObject[1];
geom1[0] = face;
plane1.SetMethod(NXOpen.PlaneTypes.MethodType.Distance);
plane1.SetGeometry(geom1);
plane1.SetFlip(false);
plane1.SetReverseSide(false);
plane1.SetAlternate(NXOpen.PlaneTypes.AlternateType.One);
plane1.Evaluate();
plane1.SetMethod(NXOpen.PlaneTypes.MethodType.Distance);
projectCurveBuilder1.PlaneToProjectTo = plane1;
NXObject nXObject1 = projectCurveBuilder1.Commit();
projectCurve = (ProjectCurve)nXObject1;
projectCurveBuilder1.SectionToProject.CleanMappingData();
projectCurveBuilder1.Destroy();
}
调用方法:
public static void Main(string[] args)
{
try
{
theSession = Session.GetSession();
displayPart = theSession.Parts.Display;
theUFSession = UFSession.GetUFSession();
workPart = theSession.Parts.Work;
#region 验证投影函数
Body bodyYZHU = (Body)workPart.Bodies.FindObject("BLOCK(1)");
Body bodyYZUI = (Body)workPart.Bodies.FindObject("CONE(2)");
Auto_Init.BodyInit init = new Auto_Init.BodyInit(bodyYZHU);
BodyModel model = init.ProcBody();
Face topface = (Face)NXOpen.Utilities.NXObjectManager.GetObjectFromUInt(uint.Parse(model.faceFlag.faceTop));
Face face3 = (Face)NXOpen.Utilities.NXObjectManager.GetObjectFromUInt(uint.Parse(model.faceFlag.face3));
ProjectCurve proCurve;
CurveTool.CreateProjectCurveFeature(bodyYZUI.GetEdges(), topface, out proCurve);
CurveTool.CreateProjectCurveFeature(bodyYZUI.GetEdges(), face3, out proCurve);
#endregion
}
catch (NXOpen.NXException ex)
{
theUI.NXMessageBox.Show("Block Styler", NXMessageBox.DialogType.Error, ex.ToString());
}
}
运行结果: