Interface: simpleFaceManager
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.
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 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 can 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)
|