MAXScript Language Reference > 3ds Max Objects > Interfaces > Core Interfaces > Core Interfaces Documentation > S >

# Interface: simpleFaceManager

Interfaces > Core Interfaces > simpleFaceManager

| Core Interfaces - Quick Navigation

This Core Interface provides basic Per-Face data storage abilities. Available in 3ds Max 9 and higher.

Methods:

    <Interface>simpleFaceManager.addChannel <object>object type:<enum> id:<DWORD array> name:<string>

    object Validated by Validator function
    type enums: {#integer | #index | #float | #boolean | #point2 | #point3}
    type default value:	 #integer
    id default value: #()
    id Validated by Validator function
    name default value: undefined

Adds a new per-face data channel to the specified object of the given type using a user-defined ID and name.

The ID can be generated using the genClassID() method and has the same form as the class IDs of scripted plug-ins.

FOR EXAMPLE
    obj = Plane length:60.0 width:60.0 widthsegs: 1 lengthsegs: 2
    convertto obj Editable_Poly
    idA = genClassID returnValue:true
    channelA = simpleFaceManager.AddChannel obj type: #integer id:idA
    channelA.name = "The Integer Channel"
    channelA.SetValues #(5,2)
    idB = genClassID returnValue:true
    channelB = simpleFaceManager.AddChannel obj type: #float id:idB
    channelB.name = "The Float Channel"
    channelB.SetValues #(3.1459,7.236)

    <void>simpleFaceManager.removeChannel <object>object <DWORD array>id

    id Validated by Validator function

Removes the channel with the specified ID from the given object.

    <Interface>simpleFaceManager.getChannel <object>object <DWORD array>id

    object Validated by Validator function
    id Validated by Validator function

Returns the simpleFaceChannel MixinInterface of the channel with the specified ID from the given object.

FOR EXAMPLE
    --continuing from the previous example on this page:
    theInt = simpleFaceManager.getChannel obj idA

    <Interface by value array>simpleFaceManager.getChannels <object>object

    object Validated by Validator function

Returns an array of simpleFaceChannel MixinInterface of all channels in the given object.

FOR EXAMPLE
    --continuing from the previous example on this page:
    SimpleFaceManager.getChannels obj
    --> #(<MixinInterface:simpleFaceChannel>, <MixinInterface:simpleFaceChannel>)

Interface: simpleFaceChannel

This MixinInterface is exposed by the SimpleFaceData class and provides access to the Per-Face data in a specific channel.

Available in 3ds Max 9 and higher.

Properties:

    .name : string : Read|Write

Get/set the name of the data channel.

    .id : DWORD by value array : Read

Get the unique ID of the channel.

    .type : enum : Read

    type enums: {#integer|#index|#float|#boolean|#point2|#point3}

Get the type of the data stored in the channel.

    .numFaces : DWORD : Read

Get the number of faces or polygons in the channel.

FOR EXAMPLE
    --continuing from the previous example on this page:
    theInt = simpleFaceManager.getChannel obj idA
    --> <MixinInterface:simpleFaceChannel>
    theInt.name
    --> "The Integer Channel"
    theInt.type
    --> #integer
    theInt.numfaces
    --> 2

Methods:

    <fpvalue by value>getValue <index>face

    face Validated by Validator function

Get the value of the indexed face.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.getValue 1
    --> 5
    theInt.getValue 2
    --> 2
    theInt.getValue 3
    -- Runtime error: Invalid face index.

    <boolean>setValue <index>face <value>value

    face Validated by Validator function
    value Validated by Validator function

Set the value of the indexed face.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.setValue 1 6
    --> true

    <fpvalue by value>getValues()

Get all the values of the channel.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.getValues()
    --> #(6, 2)

    <boolean>setValues <value>values

    values Validated by Validator function

Set all the values of the channel to the values in the specified array.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.setValues #(10,12)
    --> true
    theInt.getValues()
    --> #(10, 12)

    <fpvalue by value>getValueBySelection <bitArray>faces

    faces Validated by Validator function

Get the values of the faces specified by the set bits of the bitArray argument. If all specified faces contain the same value, that value will be returned. If the specified faces contain different values, the return value will be undefined.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.getValueBySelection #{1}
    --> 10
    theInt.getValueBySelection #{1..2}
    --> undefined

    <boolean>setValueBySelection <bitArray>faces <value>value

    faces Validated by Validator function
    value Validated by Validator function

Set the value of all faces specified by the set bits of the bitArray argument to the same value specified in the second argument.

FOR EXAMPLE
    --continuing from the previous example:
    theInt.setValueBySelection #{1..2} 42
    --> true
    theInt.getValues()
    --> #(42, 42)
    theInt.getValueBySelection #{1..2} --now we can the value of both faces!
    --> 42

The Per-Face data will survive topology changes and class conversions. For example, if you would convert the plane from the above example to Editable Mesh, the channels will be preserved and each of the four faces in the new mesh will inherit the data from the respective polygons in the Editable Poly:

FOR EXAMPLE
    convertToMesh obj
    --> $Editable_Mesh:Plane01 @ [0.000000,0.000000,0.000000]
    SimpleFaceManager.getChannels obj --check that all channels are still there
    --> #(<MixinInterface:simpleFaceChannel>, <MixinInterface:simpleFaceChannel>)
    theInt=(SimpleFaceManager.getChannels obj)[1] --get the first one
    --> <MixinInterface:simpleFaceChannel>
    theInt.numfaces --check the number of faces - now we have 4triangles
    --> 4
    theInt.getValues() --see that the original values were propagated
    --> #(42, 42, 42, 42)
    convertTo obj Editable_Poly --convert back to Editable Poly
    --> $Editable_Poly:Plane01 @ [0.000000,0.000000,0.000000]
    theInt.numfaces --the data has been consolidated
    --> 2

When converting from Editable Mesh to Editable Poly, multiple triangles with different per-face data could be consolidated into a single polygonal face. In this case, the LAST value of a face added to the polygon will be used.

FOR EXAMPLE
    convertToMesh obj
    --> $Editable_Mesh:Plane01 @ [0.000000,0.000000,0.000000]
    theInt.numfaces --check the number of faces - now we have 4 triangles
    --> 4
    theInt.setValues #(1,2,3,4) --set different values for the 4 triangles
    --> true
    convertTo obj Editable_Poly --convert to Editable Poly
    --> $Editable_Poly:Plane01 @ [0.000000,0.000000,0.000000]
    theInt.getValues() --get the consolidated data - it is #(2,4) and not #(1,3)
    --> #(2,4)

When changing topology by tessellating existing faces, the new faces will inherit the values of the original face.

FOR EXAMPLE
    polyop.tessellateByFace obj 1 --tessellate the first face into 4 new faces
    --> OK
    theInt.numfaces --check the total number of faces in the data channel
    --> 5
    --note that because of the way Editable Poly updates polygon lists when
    --changing topology, the previous face 2 becomes face 1,
    --while the new 4 polygons from the tessellation have been given
    --indices 2,3,4 and 5.
    theInt.getValues() --get the new data:
    --> #(4, 2, 2, 2, 2)