How To ... Output Geometry Data To Text File - Part Two

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:

Defining MacroScripts

Picking Scene Nodes By Hit

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

Step-By-Step

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.

Defining Macro Scripts

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).

Defining Custom Functions

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.

Picking Scene Nodes By Hit

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.

isValidNode

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.

FileStream Values

)
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

Using the Script

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

Where to go from here

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" Tutorials Index Page

How To ... Read Geometry Data From Text File - Part One

How To ... Output Geometry Data To Text File - Part One

Next

How To ... Read Geometry Data From Text File - Part Two