2022年9月24日星期六

Nx Layer

 Programming Layer Functions

NX Layers

NX has 256 layers numbered from 1 to 256.

One layer only can/must be the work layer at any given time. The work layer is selectable and therefore visible. Work is done on the current work layer.

All other layers can have one of three statuses: selectable, visible only or invisible.

Categories names can be applied to layer(s) so that layers may be selected by layer numbers or categories. All layers have a default category name All.

Interactive Layer functions include:

Format -> Layer Settings

Format -> Visible in View

Format-> Layer Categories

Format -> Move to Layer

Format -> Copy to Layer

NX Layers Programming

Layer Classes

The classes available in NXOpen.Layer namespace are:

Category Represents a layer category.

CategoryCollection Represents a collection of layer categories.

Layer Manager Represents an object that manages layers.

StateCollection Represents a copy of the layer states.

StateInfo Used in several methods that gets or sets the state of a layer

Layer Status

There are two different enumerations for layer status values.

The ones for the "wrapped" user function calls are valued at 1 thru 4.

UFConstants.UF_LAYER_WORK_LAYER 1

UFConstants.UF_LAYER_ACTIVE_LAYER 2

UFConstants.UF_LAYER_REFERENCE_LAYER 3

UFConstants.UF_LAYER_INACTIVE_LAYER 4

The other set is valued at 0 thru 3. These values are used with the NXOpen.Layer.State... methods.

NXOpen.Layer.State.WorkLayer 0

NXOpen.Layer.State.Selectable 1

NXOpen.Layer.State.Visible 2

NXOpen.Layer.State.Hidden 3

You can use either set, but they are not interchangeable.

Layer Constants

The constants for layers has two members. These are:

FirstLayer The number of the first layer. Valid layers are numbered from Layer.Constants.FirstLayer to Layer.Constants.LastLayer.

LastLayer The number of the last layer. Valid layers are numbered from Layer.Constants.FirstLayer to Layer.Constants.LastLayer

Layer State

The state has four members. These are:

WorkLayer Work layer. All newly created objects are placed on the work layer.

Selectable Objects on the layer are selectable.

Visible Objects on the layer are visible but not selectable.

Hidden Objects on the layer are not visible and not selectable.

Layer Methods

The table below lists more common layer class methods.

Class

Member

Description

NXOpen.Layer.Category

Represents a layer category.

Description

Returns or sets the category’s description, if one exists

GetMemberLayers

Returns all the layers that belong to the category.

SetState

Changes the state of every layer in the category to the specified state, except the work layer

NXOpen.Layer.CategoryCollection

Represents a collection of layer categories.

Create Category

Creates a new layer category

NXOpen.Layer.LayerManager

Represents an object that manages layers.

ChangeStates

Changes the states of the specified layers in the part.

CopyObjects

Copies objects to the specified layer

GetAllObjectsOnLayer

Returns all objects on the specified layer

GetStates

Gets the states for all layers in the part

GetVisibilitiesInView

Gets the visibility of all layers in a specified view.

MoveDisplayableObjects

Movedisplayable objects to the specified layer.

SetState

Sets the state of the specified layer.

SetStates

Set the states for all layers in the part

We now look at a number of programs that use various layer functions.

Program 1:

This program moves all solid bodies to a specific layer. All solid bodies are selected using a collection class (discussed in detail in “Using Collection Classes”). The layer specification is defined using a NXInputBox to input a layer number. NXInputBox Class is discussed in Appendix 1.

Program 1 Listing: move_solid_bodies_to_new_layer.vb

Option Strict Off

Imports NXOpen

Imports NXOpenUI

Imports NXOpen.Utilities

Module move_solid_bodies_to_new_layer

Dim s As Session = Session.GetSession()

Sub Main()

Dim workPart As Part = s.Parts.Work

Dim bodies As BodyCollection = workPart.Bodies

Dim solid_bodies(-1) As Body

Dim counter As Integer = 0

Dim newLayer As Integer = 100

Dim bodyCount As Integer = bodies.ToArray.Length

MsgBox("All Bodies in Work Part: " & bodyCount.ToString())

newLayer = NXInputBox.GetInputNumber("Destination Layer Number", "Destination Layer number", newLayer.ToString)

If bodyCount > 0 Then

For Each thisBody As Body In bodies

If thisBody.IsSolidBody.Equals(True) Then

ReDim Preserve solid_bodies(counter)

solid_bodies(counter) = thisBody

counter += 1

End If

Next

workPart.Layers.MoveDisplayableObjects(newLayer, solid_bodies)

Dim solidBodyCount As Integer = solid_bodies.Length()

MsgBox(solidBodyCount.ToString() & "Solid Bodies moved to layer: " & newLayer.ToString)

End If

End Sub

Public Function GetUnloadOption(ByVal dummy As String) As Integer

Return Session.LibraryUnloadOption.Immediately

End Function

End Module

This program uses the NXInputBox class (yellow highlight). It should be noted that this does not require locking UG Access (discussed in “ “).

The solid bodies in the work part are collected into bodies using:

Dim bodies As BodyCollection = workPart.Bodies

This collects all Bodies into the collection called bodies.

Arrays are created a fixed size. If the number of elements is dynamic or unknown we should use collections.

The above program does use an array which stores the counted bodies. To do this we used the command: Redim Preserve

ReDim Preserve solid_bodies(counter)

ReDim is to change the size of the array solid_bodies. Preserve keeps the entries already in solid_bodies. The next body can now be added and the counter incremented.

An alternative to this is to use a list method of the collection class using

Dim list1 As New ArrayList()

list1.Clear()

Instead of

ReDim Preserve solid_bodies(counter)

solid_bodies(counter) = thisBody

counter += 1

use

list1.Add(thisBody)

An array list cannot be used in journals. For larger lists using array list is more efficient.

Having determined the number of solid bodies in bodies using:

Dim bodyCount As Integer = bodies.ToArray.Length

We can now loop through them and set the layer number for each of the solid bodies using:

For Each thisBody As Body In bodies

If thisBody.IsSolidBody.Equals(True) Then

ReDim Preserve solid_bodies(counter)

solid_bodies(counter) = thisBody

counter += 1

End If

Next

Finally we move the solid bodies to the required layer using:

workPart.Layers.MoveDisplayableObjects(newLayer, solid_bodies)

Program 2:

It is commonly required to create objects from within a program and have them created on a predetermined layer. To this one needs to make the work layer the layer that the programmer wants the object to be created on. After the new object has been created it is normal to set the work layer back to its original position. To do this we need to store the work layer then change the work layer to create whatever is required and finally restore the original setting.

Program 2 simply creates a block on a requested layer number.

Program 2: Listing

Option Strict Off

Imports System

Imports NXOpen

Imports NXOpen.UF

Imports NXOpen.Utilities

Imports NXOpenUI

Module LayerProgramming2

Sub Main()

Dim s As Session = Session.GetSession()

Dim ui As UI = ui.GetUI()

Dim ufs As UFSession = UFSession.GetUFSession()

Dim workPart As Part = s.Parts.Work

Dim stateArray1(0) As Layer.StateInfo

' Get the current worklayer

Dim workLayer As Integer = workPart.Layers.WorkLayer

' Ask for layer to create solid block on

Dim newLayer As Integer = Nothing

newLayer = NXInputBox.GetInputNumber("Destination Layer Number", "Destination Layer number", newLayer.ToString)

If newLayer <> workLayer Then

' Set new worklayer

stateArray1(0).Layer = newLayer

stateArray1(0).State = Layer.State.WorkLayer

workPart.Layers.ChangeStates(stateArray1, False)

End If

' Set an undo mark

Dim markId1 As Session.UndoMarkId

markId1 = s.SetUndoMark(Session.MarkVisibility.Visible, "Start")

' Create the block

Dim nullFeatures_Feature As Features.Feature = Nothing

Dim blockFeatureBuilder1 As Features.BlockFeatureBuilder

blockFeatureBuilder1 = workPart.Features.CreateBlockFeatureBuilder(nullFeatures_Feature)

blockFeatureBuilder1.BooleanOption.Type = GeometricUtilities.BooleanOperation.BooleanType.Create

Dim originPoint1 As Point3d = New Point3d(0.0, 0.0, 0.0)

blockFeatureBuilder1.SetOriginAndLengths(originPoint1, "100", "100", "75")

blockFeatureBuilder1.SetBooleanOperationAndTarget(Features.Feature.BooleanType.Create, Nothing)

Dim feature1 As Features.Feature

feature1 = blockFeatureBuilder1.CommitFeature()

' If we have changed worklayer we may need to change it back to the original setting

If workLayer <> workPart.Layers.WorkLayer Then

stateArray1(0).Layer = workLayer

stateArray1(0).State = Layer.State.WorkLayer

workPart.Layers.ChangeStates(stateArray1, False)

End If

End Sub

Public Function GetUnloadOption(ByVal dummy As String) As Integer

'Unloads the image immediately after execution within NX

GetUnloadOption = NXOpen.Session.LibraryUnloadOption.Immediately

End Function

End Module

We first need to get the current worklayer. This is done using:

Dim workLayer As Integer = workPart.Layers.WorkLayer

Next we get the layer on which we want to create the block. This is highlighted in yellow.

We now check that we need to change the worklayer. This is highlighted in green.

Similarly we can change layer state using Hidden, Selectable, or Visible in

stateArray1(0).State = Layer.State.WorkLayer

instead of WorkLayer

We can now create the feature on the required layer. We will discuss feature creation in a separate document. The block creation is highlighted in pink.

We have also included an undo mark. This is useful when creating any object within a program. If undo’s are not included in the program then if a user, after executing the program, an undo will undo not only the program creation but also one previous step prior to running the program. This is always undesirable.

Program 3This program is used to report information about object on a layer. The reporting can be done in a variety of ways. The program first lists all the objects on the current work layer. This can easily to do the same for any other layer or for all layers. The other listing is to list the layer for

all solid bodies. The second list gets all features of the solid which are on the solid layer. We cannot ask the layer number of features directly since the layer number is not directly available from the feature rather from the solid that the feature belongs to.

Program Listing

Option Strict Off

Imports System

Imports NXOpen

Imports NXOpen.UF

Imports NXOpen.Features

Module LayerProgramming3

Sub Main()

Dim s As Session = Session.GetSession()

Dim ui As UI = ui.GetUI()

Dim ufs As UFSession = UFSession.GetUFSession()

Dim lw As ListingWindow = s.ListingWindow

lw.Open()

' We look only at the current work part

Dim workPart As Part = s.Parts.Work

' Get all objects on the work layer

Dim objs() As NXObject = workPart.Layers.GetAllObjectsOnLayer(workPart.Layers.WorkLayer)

lw.WriteLine(objs.Length.ToString & " objects on layer: " & workPart.Layers.WorkLayer.ToString)

' Now list all the objects

For Each b As NXObject In objs

lw.WriteLine(b.ToString)

Next

lw.WriteLine(vbCrLf)

' Another listing for each body in the work part we can list the features and the body layer

For Each abody As Body In workPart.Bodies

For Each afeat As Feature In abody.GetFeatures

lw.WriteLine(afeat.GetFeatureName & " on layer : " & abody.Layer.ToString)

Next

Next

End Sub

Public Function GetUnloadOption(ByVal dummy As String) As Integer

'Unloads the image immediately after execution within NX

GetUnloadOption = NXOpen.Session.LibraryUnloadOption.Immediately

End Function

End

Getting all the objects on a layer is supported directly with a layers mehod. It is done in the program using:

Dim objs() As NXObject = workPart.Layers.GetAllObjectsOnLayer(workPart.Layers.WorkLayer)

We then loop through all the objects in objs to output these to the listing window. The relevant code is displayed in yellow.

Next we look at all bodies and list the associated features and the body layer. We this with obtaining a body collection in the work part using:

For Each abody As Body In workPart.Bodies

For Each afeat As Feature In abody.GetFeatures

lw.WriteLine(afeat.GetFeatureName & " on layer : " & abody.Layer.ToString)

Next

Next

workPart.Bodies has all the bodies. abody.GetFeatures has all features for abody. Note we get the layer number from the body and not from the feature. Again these methods can also be applied to a display part and to components.

Appendix 1

NXInput Class

NXInputBox has the following Members:

GetInputNumber (prompt As String ) As Double

Displays a simple text entry dialog to the user and returns the number the user enters.

Prompt string to the user for the text entry box.

GetInputNumber (prompt As String, caption As String ) As Double

Displays a simple text entry dialog to the user and returns the number the user enters.

Prompt string to the user for the text entry box.

Caption string for the window title to the text entry dialog.

GetInputNumber (prompt As String, caption As String, initialText As String ) As Double

Displays a simple text entry dialog to the user and returns the number the user enters.

Prompt string to the user for the text entry box.

Caption string for the window title to the text entry dialog.

Initial text to use as default text in the text entry box.

This initial text should form a valid double number.

GetInputNumber ( prompt As String, caption As String, initialNumber As Double ) As Double

Displays a simple text entry dialog to the user and returns the number the user enters.

Prompt string to the user for the text entry box.

Caption string for the window title to the text entry dialog.

Initial double to use as a default number in the text entry box.

GetInputString and ParseInputNumber methods are also available.

没有评论:

发表评论