## SubComponent

Object Hierarchy | Related C++ Class: SubComponent

### Inheritance

SIObject

SubComponent

### Introduced

v2.0

### Description

Provides access to sub-elements of an X3DObject's Geometry. The most common uses for the SubComponent object include:
- Accessing the components that are selected (see CollectionItem.SubComponent and Selection.Item)
- Accessing a geometry-specific collection of components on an object (see SubComponent.ComponentCollection)
- Dynamically working with a subset of components (see SubComponent.AddElement and SubComponent.RemoveElement)

### Methods

AddElement | CreateCluster | IsClassOf | IsEqualTo
RemoveElement |  |  |

### Properties

Application | Categories | ClusterType | ComponentCollection
ElementArray | FullName | Help | Name
NestedObjects | Origin | OriginPath | Parent
Parent3DObject | Type | Type |

### Examples

#### 1. JScript Example

    /*
            This example demonstrates how to determine which edges are selected
            in the UI by using the SubComponent object via the Selection
    */
    NewScene( null, false );
    // Setup: create a polygon mesh and select some edges on it
    var disc = Application.ActiveSceneRoot.AddGeometry( "Disc", "MeshSurface" );
    Selection.Clear();
    Selection.SetAsText( disc.Name + ".edge[113,115,117,119,121]" );
    // When components are selected, the first member of the Selection
    // is returned as a CollectionItem which can then be converted to a
    // SubComponent object. From there, the ComponentCollection property
    // converts it to the proper collection type (in this case an EdgeCollection)
    var selected = Selection(0).SubComponent.ComponentCollection;
    for (var i=0; i<selected.Count; i++) {
            var sel = selected(i);
            Application.LogMessage( "edge[" + sel.Index + "] is selected." );
    }
    // Expected results:
    //INFO : edge[113] is selected.
    //INFO : edge[115] is selected.
    //INFO : edge[117] is selected.
    //INFO : edge[119] is selected.
    //INFO : edge[121] is selected.

#### 2. Python Example

    #
    # This example demonstrates how to access a NURBS-specific property
    # on a NurbsSurfaceMesh. First it starts out getting the generic
    # Points collection. From the PointCollection it creates a SubComponent.
    # From the SubComponent, it gets the NURBS-specific ControlPointCollection
    #
    app = Application
    app.NewScene( "", 0 )
    # Setup: create a NURBS mesh and get its point collection
    grid = app.ActiveSceneRoot.AddGeometry( "Grid", "NurbsSurface" )
    pnts = grid.ActivePrimitive.Geometry.Points
    # Convert it to SubComponent and just for fun, consider only ten points
    # chosen at random
    subcmp = pnts.SubComponent
    subset = [13, 92, 24, 65, 11, 2, 4, 64, 100, 111]
    subcmp.ElementArray = subset
    # Now convert the SubComponent to a ControlPointCollection using the
    # SubComponent.ComponentCollection property and then loop through the
    # array, checking to see if we have any boundaries
    for ctrlpnt in subcmp.ComponentCollection :
            msg = "CtrlPnt[" + str(ctrlpnt.Index) + "]"
            if ctrlpnt.IsBoundary :
                    msg += " on the NurbsSurface and is a boundary."
            else :
                    msg += " on the NurbsSurface and is NOT a boundary."
            app.LogMessage( msg )
    # Expected results:
    #INFO : CtrlPnt[13] on the NurbsSurface and is NOT a boundary.
    #INFO : CtrlPnt[92] on the NurbsSurface and is NOT a boundary.
    #INFO : CtrlPnt[24] on the NurbsSurface and is NOT a boundary.
    #INFO : CtrlPnt[65] on the NurbsSurface and is a boundary.
    #INFO : CtrlPnt[11] on the NurbsSurface and is a boundary.
    #INFO : CtrlPnt[2] on the NurbsSurface and is a boundary.
    #INFO : CtrlPnt[4] on the NurbsSurface and is a boundary.
    #INFO : CtrlPnt[64] on the NurbsSurface and is NOT a boundary.
    #INFO : CtrlPnt[100] on the NurbsSurface and is NOT a boundary.
    #INFO : CtrlPnt[111] on the NurbsSurface and is a boundary.

#### 3. JScript Example

    // Create a sample scene and select four points on a grid
    var oGrid = ActiveSceneRoot.AddGeometry( "Grid", "NurbsSurface" ) ;
    SelectObj( oGrid ) ;
    ActivateVertexSelTool();
    AddToSelection(oGrid.Name+".pnt[(0,0),(1,0),(2,0),(3,0)]", null, true);
    // Print out information that is available from the OM
    Application.LogMessage( ClassName( Selection(0) ) ) ;
    var oSubComponent = Selection(0).SubComponent ;
    Application.LogMessage( oSubComponent.Parent3DObject ) ;
    Application.LogMessage( oSubComponent.Type ) ;
    Application.LogMessage( ClassName( oSubComponent.ComponentCollection ) ) ;
    Application.LogMessage( oSubComponent.ComponentCollection.Count ) ;
    // Result of running this script:
    //INFO : "CollectionItem"
    //INFO : "grid"
    //INFO : "pntSubComponent"
    //INFO : "PointCollection"
    //INFO : "4"

### See Also

PointCollection.SubComponent SegmentCollection.SubComponent FacetCollection.SubComponent CollectionItem.SubComponent Geometry.CreateSubComponent Cluster.CreateSubComponent ClusterTypes