Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations waross on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Hole to slot

Status
Not open for further replies.

cmacca

Mechanical
Mar 19, 2008
66
0
0
AU
We have a running joke at work rev A is a hole, rev B is a bigger hole and rev C is a slot. Which inspired me to write the below code. I would like a bit of help to make it more robust in what face it selects (ie hole/cylindrical face only) and also allow more options for slot direct other than just face normal. Also if anyone has other ways to improve this code please hack the code to suit.

This command works on c'sk and c'bore holes as well and with a few tweaks to the features in the part navigator you can switch between hole, c'sk and c'bore if the hole is created from a hole feature.

I plan to also submit an ER to see if Siemens can write something like this into the hole command. In the mean time this works ok, I find it quicker and easier to use than the OOTB slot command, especially if holes already exist.

Code:
Option Strict Off
Imports System
Imports NXOpen
Imports NXOpen.UF
Imports NXOpen.Utilities

Module NXJournalHoleToSlot
    Sub Main(ByVal args() As String)

        Dim theSession As Session = Session.GetSession()
        Dim workPart As Part = theSession.Parts.Work
        Dim ufs As UFSession = UFSession.GetUFSession()
        Dim displayPart As Part = theSession.Parts.Display

        ' ----------------------------------------------
        '   Menu: Insert->Datum/Point->Datum Plane...
        ' ----------------------------------------------
        Dim markId1 As Session.UndoMarkId
        markId1 = theSession.SetUndoMark(Session.MarkVisibility.Visible, "Start")

        Dim nullFeatures_Feature As Features.Feature = Nothing

        Dim datumPlaneBuilder1 As Features.DatumPlaneBuilder
        datumPlaneBuilder1 = workPart.Features.CreateDatumPlaneBuilder(nullFeatures_Feature)

        Dim plane1 As Plane
        plane1 = datumPlaneBuilder1.GetPlane()

        plane1.SetUpdateOption(SmartObject.UpdateOption.WithinModeling)

        Dim face1 As Face = select_a_face("Select Hole Face")

        Dim line1 As Line
        line1 = workPart.Lines.CreateFaceAxis(face1, SmartObject.UpdateOption.WithinModeling)

        plane1.SetMethod(PlaneTypes.MethodType.Angle)

        Dim geom1(1) As NXObject

        Dim face2 As Face = select_a_face("Select Face Normal To Slot Direction")

        geom1(0) = face2
        geom1(1) = line1
        plane1.SetGeometry(geom1)

        plane1.SetExpression("0")

        plane1.SetAlternate(PlaneTypes.AlternateType.One)

        plane1.RemoveOffsetData()

        plane1.Evaluate()

        datumPlaneBuilder1.ResizeDuringUpdate = True

        Dim datumFeature As Features.Feature
        datumFeature = datumPlaneBuilder1.CommitFeature()

        datumPlaneBuilder1.Destroy()

        Dim adjBefore() As Tag = Nothing
        ufs.Modl.AskAdjacFaces(face1.Tag, adjBefore)

        ' ----------------------------------------------
        '   Menu: Insert->Trim->Divide Face...
        ' ----------------------------------------------

        nullFeatures_Feature = Nothing

        Dim dividefaceBuilder1 As Features.DividefaceBuilder
        dividefaceBuilder1 = workPart.Features.CreateDividefaceBuilder(nullFeatures_Feature)

        dividefaceBuilder1.SelectDividingObject.OffsetDistance.RightHandSide = "5"

        dividefaceBuilder1.BlankOption = True

        Dim projectionOptions1 As GeometricUtilities.ProjectionOptions
        projectionOptions1 = dividefaceBuilder1.ProjectionOption

        Dim section1 As Section
        section1 = dividefaceBuilder1.SelectDividingObject.CurvesToOffset

        section1.DistanceTolerance = 0.0254

        section1.ChainingTolerance = 0.02413

        Dim scCollector1 As ScCollector
        scCollector1 = workPart.ScCollectors.CreateCollector()

        Dim boundaryFaces1(-1) As Face
        Dim faceTangentRule1 As FaceTangentRule
        faceTangentRule1 = workPart.ScRuleFactory.CreateRuleFaceTangent(face1, boundaryFaces1, 0.1)

        Dim rules1(0) As SelectionIntentRule
        rules1(0) = faceTangentRule1
        scCollector1.ReplaceRules(rules1, False)

        dividefaceBuilder1.FacesToDivide = scCollector1

        Dim section2 As Section
        section2 = workPart.Sections.CreateSection(0.02413, 0.0254, 0.1)

        section2.SetAllowedEntityTypes(Section.AllowTypes.OnlyCurves)

        Dim scCollector2 As ScCollector
        scCollector2 = workPart.ScCollectors.CreateCollector()

        Dim faces1(0) As DatumPlane
        Dim datumFeat As Features.DatumFeature = CType(datumFeature, Features.DatumFeature)

        Dim linkedTag As NXOpen.Tag = Nothing
        Dim numObjs As Integer = -1
        Dim tags() As NXOpen.Tag
        ufs.Modl.AskFeatObject(datumFeature.Tag, numObjs, tags)
            linkedTag = tags(0)
        Dim datumPlane1 As DatumPlane = CType(NXObjectManager.Get(linkedTag), DatumPlane)

        faces1(0) = datumPlane1
        Dim faceDumbRule1 As FaceDumbRule
        faceDumbRule1 = workPart.ScRuleFactory.CreateRuleFaceDatum(faces1)

        Dim rules2(0) As SelectionIntentRule
        rules2(0) = faceDumbRule1
        scCollector2.ReplaceRules(rules2, False)

        Dim added1 As Boolean
        added1 = dividefaceBuilder1.SelectDividingObject.DividingObjectsList.Add(scCollector2)

        projectionOptions1.ProjectDirectionMethod = GeometricUtilities.ProjectionOptions.DirectionType.FaceNormal

        Dim divideFaceFeature As Features.Feature
        divideFaceFeature = dividefaceBuilder1.CommitFeature()

        dividefaceBuilder1.Destroy()

        section2.Destroy()

        Dim faceFound As Boolean = False
        Dim newFace As Face
        Dim adjAfter() As Tag = Nothing
        ufs.Modl.AskAdjacFaces(face1.Tag, adjAfter)
        For Each tag As NXOpen.Tag In adjAfter
            For Each tag2 As NXOpen.Tag In adjBefore
                If NXObjectManager.Get(tag).ToString = NXObjectManager.Get(tag2).ToString Then
                    faceFound = True
                    Exit For
                End If
            Next
            If faceFound = False Then
                newFace = CType(NXObjectManager.Get(tag), Face)
                Exit For
            End If
            faceFound = False
        Next

        ' ----------------------------------------------
        '   Menu: Insert->Synchronous Modeling->Move Face...
        ' ----------------------------------------------
        Dim nullFeatures_AdmMoveFace As Features.AdmMoveFace = Nothing

        Dim admMoveFaceBuilder1 As Features.AdmMoveFaceBuilder
        admMoveFaceBuilder1 = workPart.Features.CreateAdmMoveFaceBuilder(nullFeatures_AdmMoveFace)

        admMoveFaceBuilder1.Motion.Option = GeometricUtilities.ModlMotion.Options.Distance

        admMoveFaceBuilder1.FaceChangeOverflowBehavior.FaceChangeOption = GeometricUtilities.FaceChangeOverflowBehavior.Option.ExtendCapFace

        Dim faces2(0) As Face

        faces2(0) = face1
        Dim faceDumbRule2 As FaceDumbRule
        faceDumbRule2 = workPart.ScRuleFactory.CreateRuleFaceDumb(faces2)

        Dim rules3(0) As SelectionIntentRule
        rules3(0) = faceDumbRule2
        admMoveFaceBuilder1.FaceToMove.FaceCollector.ReplaceRules(rules3, False)

        Dim direction1 As Direction
        direction1 = workPart.Directions.CreateDirection(datumPlane1, Sense.Reverse, SmartObject.UpdateOption.WithinModeling)

        admMoveFaceBuilder1.Motion.DistanceVector = direction1

        Dim slotLen As Double

        slotLen = InputBox("Enter slot length", "Slot Length")

        admMoveFaceBuilder1.Motion.DistanceValue.RightHandSide = CStr(slotLen / 2)

        Dim nXObject1 As NXObject
        nXObject1 = admMoveFaceBuilder1.Commit()
        Dim moveFeat1 As Features.Feature = admMoveFaceBuilder1.GetFeature
        admMoveFaceBuilder1.Destroy()

        Dim exprs() As Expression = moveFeat1.GetExpressions()
        Dim moveExp As String = ""
        For Each exp As Expression In exprs
            moveExp = exp.Name
        Next

        ' ----------------------------------------------
        '   Menu: Insert->Synchronous Modeling->Move Face...
        ' ----------------------------------------------
        Dim nullFeatures_AdmMoveFace2 As Features.AdmMoveFace = Nothing

        Dim admMoveFaceBuilder2 As Features.AdmMoveFaceBuilder
        admMoveFaceBuilder2 = workPart.Features.CreateAdmMoveFaceBuilder(nullFeatures_AdmMoveFace2)

        admMoveFaceBuilder2.Motion.Option = GeometricUtilities.ModlMotion.Options.Distance

        admMoveFaceBuilder2.FaceChangeOverflowBehavior.FaceChangeOption = GeometricUtilities.FaceChangeOverflowBehavior.Option.Automatic

        Dim faces3(0) As Face

        faces3(0) = newFace
        Dim faceDumbRule3 As FaceDumbRule
        faceDumbRule3 = workPart.ScRuleFactory.CreateRuleFaceDumb(faces3)

        Dim rules4(0) As SelectionIntentRule
        rules4(0) = faceDumbRule3
        admMoveFaceBuilder2.FaceToMove.FaceCollector.ReplaceRules(rules4, False)

        Dim direction2 As Direction
        direction2 = workPart.Directions.CreateDirection(datumPlane1, Sense.Forward, SmartObject.UpdateOption.WithinModeling)

        admMoveFaceBuilder2.Motion.DistanceVector = direction2

        admMoveFaceBuilder2.Motion.DistanceValue.RightHandSide = moveExp

        Dim nXObject2 As NXObject
        nXObject2 = admMoveFaceBuilder2.Commit()
        Dim moveFeat2 As Features.Feature = admMoveFaceBuilder2.GetFeature
        admMoveFaceBuilder2.Destroy()

        ' ----------------------------------------------
        '   Dialog Begin Feature Group
        ' ----------------------------------------------

        Dim toBeGrouped(3) As Features.Feature ' = selectFeatures("Create Feature Group")
        toBeGrouped(0) = datumFeature
        toBeGrouped(1) = divideFaceFeature
        toBeGrouped(2) = moveFeat1
        toBeGrouped(3) = moveFeat2

        Dim featTags(toBeGrouped.Length - 1) As Tag
        Dim latestTimestamp As Integer = 0
        Dim latestFeature As Features.Feature = Nothing
        Dim oldLatest As Tag = Nothing
        ufs.Modl.AskCurrentFeature(theSession.Parts.Work.Tag, oldLatest)

        For ii As Integer = 0 To toBeGrouped.Length - 1
            featTags(ii) = toBeGrouped(ii).Tag
            If toBeGrouped(ii).Timestamp > latestTimestamp Then
                latestTimestamp = toBeGrouped(ii).Timestamp
                latestFeature = toBeGrouped(ii)
            End If
        Next
        latestFeature.MakeCurrentFeature()
        Dim fGroup As Tag = Tag.Null
        ufs.Modl.CreateSetOfFeature("Hole_To_Slot", featTags, toBeGrouped.Length, 1, fGroup)

        latestFeature = NXObjectManager.Get(fGroup)
        latestFeature.MakeCurrentFeature()

    End Sub
    Function select_a_face(ByRef prompt As String) As Face

        Dim mask() As Selection.MaskTriple = {New Selection.MaskTriple( _
            UFConstants.UF_solid_type, 0, UFConstants.UF_UI_SEL_FEATURE_ANY_FACE)}
        Dim cursor As Point3d = Nothing
        Dim sel_obj As TaggedObject = Nothing

        UI.GetUI.SelectionManager.SelectTaggedObject(prompt, prompt, _
            Selection.SelectionScope.AnyInAssembly, _
            Selection.SelectionAction.ClearAndEnableSpecific, False, _
            False, mask, sel_obj, cursor)

        Return CType(sel_obj, Face)

    End Function

End Module

NX 9.0.3.4 mp12, TC 10.1
 
Status
Not open for further replies.
Back
Top