This is the second part of the Output Geometry Data tutorial. We will enhance the script developed in Part One to support smoothing groups, material ids, and edge visibility.
Related Topics:
NATURAL LANGUAGE
Load the script from Part One.
Create a filter function for geometry objects.
Let the user pick a scene object and apply the filter function.
If the user picked a valid object, get a save file dialog, and ask for a target name.
If the file name is valid, export the vertices.
In the face export code, collect the smoothing groups values, material ids, and edge visibility.
Output the collected values as a single line.
Close the file.
Open for review.
MAXSCRIPT
macroScript ExportMesh category: "HowTo"
(
fn GetGeometry o = (
Superclassof o == Geometryclass and classof o != TargetObject )
obj = pickobject filter:GetGeometry
if isValidNode obj then
(
tmesh =snapshotAsMesh obj
out_name = GetSaveFileName()
if out_name != undefined then
(
out_file = createfile out_name
num_verts = tmesh.numverts
num_faces = tmesh.numfaces
format "%,%\n" num_verts num_faces to:out_file
for v = 1 to num_verts do
format "%," (getVert tmesh v) to:out_file
format "\n" to:out_file
for f = 1 to num_faces do
(
face = getFace tmesh f
sgroup = getFaceSmoothGroup tmesh f
matid = getFaceMatId tmesh f
edge1 = getEdgeVis tmesh f 1
edge2 = getEdgeVis tmesh f 2
edge3 = getEdgeVis tmesh f 3
format "%,%,%,%,%,%\n" face sgroup matid edge1 edge2 edge3 to:out_file
)
close out_file
edit out_name
)--end if
)--end if
)--end macroscript
MacroScript ExportMesh category:"HowTo"
(
We define a macroScript that will be called ExportMesh
. To use the script, you can go to Customize and drag the script from the category "HowTo" to a toolbar, a menu, a quad menu, or assign to a keyboard shortcut.
fn GetGeometry o = (
Superclassof o == Geometryclass and classof o != TargetObject )
We will need a filter function to allow the picking of only specific object types. In this case, the function will return true only when the superclass of the object passed as parameter is GeometryClass and the class of the passed object is not TargetObject (TargetObject is the only Geometry object without a mesh).
obj = pickobject filter:GetGeometry
Now, we can let the user pick a scene object and apply the filter to all objects below the mouse pointer. As you will note, the mouse pointer will allow scene objects to be picked only when their class matches the classes defined in the filter function.
if isValidNode obj then
(
If the user picked a valid object (in other words he did not right-click to cancel and did not press Esc ), we will execute the rest of the script. Otherwise, we will skip the following lines.
tmesh = snapshotAsMesh obj
This is the same as the Part One code. We get the mesh from the picked object.
out_name = GetSaveFileName()
Instead of providing a hard-coded path, we let the user type in any file name.
Standard Open and Save File Dialogs
if out_name != undefined then
(
If the user specified a valid name (in other words he did not press Cancel), we continue with the execution.
out_file = createfileout_name
num_verts = tmesh.numverts
num_faces = tmesh.numfaces
format "%,%\n" num_verts num_faces to:out_file
Just like in Part One, we create a new file and output the vertex and face count
for v = 1 to num_verts do
format "%," (getVert tmesh v) to:out_file
format "\n" to:out_file
Then we export the vertices just like in the compact version of the Part One script.
for f = 1 to num_faces do
(
In the face loop, we will export some more data this time. Each face has a smoothing group value, a material id value, and three edge visibility values. We will export all of them in a single pass.
face = getFace tmesh f
First, we get the face.
sgroup = getFaceSmoothGroup tmesh f
Then, we get the smoothing group value from the same face,
matid = getFaceMatId tmesh f
then the material id value,
edge1 = getEdgeVis tmesh f 1
edge2 = getEdgeVis tmesh f 2
edge3 = getEdgeVis tmesh f 3
and the edge visibility for each of the three face edges.
Editable_Mesh : GeometryClass and TriMesh : Value
format "%,%,%,%,%,%\n" face sgroup matid edge1 edge2 edge3 to:out_file
Now, that we have all the values, we output all of them in a single line. We add a new line character to the end of the line – this will give us a single line for each face.
)
close out_file
When the face loop is ready, we close the output file,
edit out_name
and open the new file to check the result.
)--end if
)--end if
)--end macroscript
To test the script, select Tools > Evaluate from the Scripting Editor'’s menu or alternatively, press Ctrl+E. Then, customize a toolbar and drag the script from the "HowTo" category. Press the button and pick a geometry object from the scene. You can pick any geometry object like Patch, NURBS, procedural object, and others.
SAMPLE OUTPUT OF A CUBE:
8,12
[-50,-50,0],[50,-50,0],[-50,50,0],[50,50,0],[-50,-50,100],[50,-50,100],[-50,50,100],[50,50,100],
[1,3,4],2,2,true,true,false
[4,2,1],2,2,true,true,false
[5,6,8],4,1,true,true,false
[8,7,5],4,1,true,true,false
[1,2,6],8,5,true,true,false
[6,5,1],8,5,true,true,false
[2,4,8],16,4,true,true,false
[8,6,2],16,4,true,true,false
[4,3,7],32,6,true,true,false
[7,8,4],32,6,true,true,false
[3,1,5],64,3,true,true,false
[5,7,3],64,3,true,true,false
Now, that we have the enhanced output, we can go on and enhance the corresponding input script to read back the new data format and create a new scene object with all the face properties.
Later, you can try to extend the script yourself by adding, for example, texture coordinates support.
Back to
How To ... Read Geometry Data From Text File - Part One
How To ... Output Geometry Data To Text File - Part One
Next