NX二次开发-建模-获取面的相切曲面

在UG NX中,选择面时,有相切曲面、体的面等等。

在二次开发过程中,为了获得面的相切面,采用录制功能,获取获取相切面的代码(以偏置曲面为例),获得如下代码。

// NX 1934
// Journal created by Administrator on Wed Nov 11 23:48:21 2020 中国标准时间

//
using System;
using NXOpen;

public class NXJournal
{
  public static void Main(string[] args)
  {
    NXOpen.Session theSession = NXOpen.Session.GetSession();
    NXOpen.Part workPart = theSession.Parts.Work;
    NXOpen.Part displayPart = theSession.Parts.Display;
    // ----------------------------------------------
    //   菜单:插入(S)->偏置/缩放(O)->偏置曲面(O)...
    // ----------------------------------------------
    NXOpen.Session.UndoMarkId markId1;
    markId1 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Visible, "起点");
    
    NXOpen.Features.Feature nullNXOpen_Features_Feature = null;
    NXOpen.Features.OffsetSurfaceBuilder offsetSurfaceBuilder1;
    offsetSurfaceBuilder1 = workPart.Features.CreateOffsetSurfaceBuilder(nullNXOpen_Features_Feature);
    
    NXOpen.Unit unit1;
    unit1 = offsetSurfaceBuilder1.Radius.Units;
    
    NXOpen.Expression expression1;
    expression1 = workPart.Expressions.CreateSystemExpressionWithUnits("5", unit1);
    
    offsetSurfaceBuilder1.OutputOption = NXOpen.Features.OffsetSurfaceBuilder.OutputOptionType.OneFeatureForAllFaces;
    
    offsetSurfaceBuilder1.Tolerance = 0.001;
    
    offsetSurfaceBuilder1.Radius.SetFormula("5");
    
    offsetSurfaceBuilder1.SetOrientationMethod(NXOpen.Features.OffsetSurfaceBuilder.OrientationMethodType.UseExistingNormals);
    
    offsetSurfaceBuilder1.ApproxOption = true;
    
    offsetSurfaceBuilder1.PartialOption = true;
    
    offsetSurfaceBuilder1.MaximumExcludedObjects = 10;
    
    offsetSurfaceBuilder1.RemoveProblemVerticesOption = true;
    
    theSession.SetUndoMarkName(markId1, "偏置曲面 对话框");
    
    NXOpen.ScCollector nullNXOpen_ScCollector = null;
    NXOpen.GeometricUtilities.FaceSetOffset faceSetOffset1;
    faceSetOffset1 = workPart.FaceSetOffsets.CreateFaceSet("5", nullNXOpen_ScCollector, false, 0);
    
    offsetSurfaceBuilder1.FaceSets.Append(faceSetOffset1);
    
    NXOpen.ScCollector scCollector1;
    scCollector1 = workPart.ScCollectors.CreateCollector();
    
    NXOpen.Features.SweepAlongGuide sweepAlongGuide1 = ((NXOpen.Features.SweepAlongGuide)workPart.Features.FindObject("SWEEP(2)"));
    NXOpen.Face face1 = ((NXOpen.Face)sweepAlongGuide1.FindObject("FACE 563448 {(-8.5786437626905,0,191.4213562373095) SWEEP(2)}"));
    NXOpen.Face[] boundaryFaces1 = new NXOpen.Face[0];
    NXOpen.FaceTangentRule faceTangentRule1;
    faceTangentRule1 = workPart.ScRuleFactory.CreateRuleFaceTangent(face1, boundaryFaces1, 0.050000000000000003);
    
    NXOpen.SelectionIntentRule[] rules1 = new NXOpen.SelectionIntentRule[1];
    rules1[0] = faceTangentRule1;
    scCollector1.ReplaceRules(rules1, false);
    
    faceSetOffset1.FaceCollector = scCollector1;
    
    offsetSurfaceBuilder1.PartialOption = true;
    
    NXOpen.Session.UndoMarkId markId2;
    markId2 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "偏置曲面");
    
    theSession.DeleteUndoMark(markId2, null);
    
    NXOpen.Session.UndoMarkId markId3;
    markId3 = theSession.SetUndoMark(NXOpen.Session.MarkVisibility.Invisible, "偏置曲面");
    
    NXOpen.NXObject nXObject1;
    nXObject1 = offsetSurfaceBuilder1.Commit();
    
    theSession.DeleteUndoMark(markId3, null);
    
    theSession.SetUndoMarkName(markId1, "偏置曲面");
    
    workPart.Expressions.Delete(expression1);
    
    NXOpen.Expression expression2 = offsetSurfaceBuilder1.Radius;
    NXOpen.Expression expression3 = faceSetOffset1.Offset;
    offsetSurfaceBuilder1.Destroy();
    
    // ----------------------------------------------
    //   菜单:工具(T)->操作记录(J)->停止录制(S)
    // ----------------------------------------------
    
  }
  public static int GetUnloadOption(string dummy) { return (int)NXOpen.Session.LibraryUnloadOption.Immediately; }
}

其实,获得相切面的代码是在:

NXOpen.ScCollector scCollector1;
    scCollector1 = workPart.ScCollectors.CreateCollector();
    
    NXOpen.Features.SweepAlongGuide sweepAlongGuide1 = ((NXOpen.Features.SweepAlongGuide)workPart.Features.FindObject("SWEEP(2)"));
    NXOpen.Face face1 = ((NXOpen.Face)sweepAlongGuide1.FindObject("FACE 563448 {(-8.5786437626905,0,191.4213562373095) SWEEP(2)}"));
    NXOpen.Face[] boundaryFaces1 = new NXOpen.Face[0];
    NXOpen.FaceTangentRule faceTangentRule1;
    faceTangentRule1 = workPart.ScRuleFactory.CreateRuleFaceTangent(face1, boundaryFaces1, 0.050000000000000003);
    
    NXOpen.SelectionIntentRule[] rules1 = new NXOpen.SelectionIntentRule[1];
    rules1[0] = faceTangentRule1;
    scCollector1.ReplaceRules(rules1, false);
    

这里获得的是NXOpen.ScCollector scCollector1,如何将NXOpen.ScCollector scCollector1中的面提取出来,作为NXObject,里面没有涉及。经过研究,可以采用如下的函数实现:

/// <summary>
        /// 获取面的相切面(tangentFaces)
        /// </summary>
        ///<returns>tangentFaces[]</returns>>
        public Face[] GetTangentFaces()
        {
            Face [] tangentFaces = new Face[0];
            NXOpen.FaceTangentRule faceTangentRule;
            NXOpen.Face[] boundaryFaces1 = new NXOpen.Face[0];
            faceTangentRule = workPart.ScRuleFactory.CreateRuleFaceTangent(theFace, boundaryFaces1, 0.5);

            NXOpen.SelectionIntentRule[] rules = new NXOpen.SelectionIntentRule[1];
            rules[0] = faceTangentRule;
            NXOpen.ScCollector scCollector;
            scCollector = workPart.ScCollectors.CreateCollector();
            scCollector.ReplaceRules(rules, false);
            TaggedObject[] taggedObjects = scCollector.GetObjects();
            foreach (var to in taggedObjects)
            {
                Array.Resize(ref tangentFaces, tangentFaces.Length + 1);
                tangentFaces[tangentFaces.Length - 1] = (Face)to;
            }
            return tangentFaces;
        }

采用TaggedObject[] taggedObjects = scCollector.GetObjects();来获取面对象。

猜你喜欢

转载自blog.csdn.net/yang19861007/article/details/109634070