DATAKIT API  V2025.1
JT Write Samples

Table Of Contents:


Full samples source code

0.Introduction

Before writing Jt files, you need to initialise Datakit API.
Checking the main, we need to :

  • start Datakit API with Dtk_API::StartAPI function, and precise the working directory as its mandatory first parameter
  • intialise tessellation, we will need it to store Dtk_BodyPtr
  • We remove wire creation while tessellating.
  • stop Datakit API at the end with Dtk_API::StopAPI

    //start_of_jtwmain
    int JtWriteSample(const Dtk_string &inResultDirectory)
    {
    cout << endl << "----------------------------------------------" << endl;
    cout <<"Jt Write start" << endl;
    tess_InitTesselation("./", 0.005); // Init Tessellation : working directory and default tolerance (needed for writing bodies)
    tess_ComputeBoundariesFromMesh(0); // Disable wire creation on mesh during Brep tessellation.
    int err = AllJtWTests(inResultDirectory); // all tests.
    tess_EndTesselation(); // End of tessellation
    cout <<"Jt Write end" << endl;
    return err;
    }
    //end_of_jtwmain

    The list of available tests of this sample are in function AllJtWTests


1.Meshes


1.1.One Mesh

Let start with a simple code that will write a JT file containing a red cube (as mesh).

//start_of_jtwsample11
// ------------------------------------ SampleOneMesh_1_1 ---------------------------------------------
{
Dtk_Jtw_Interface J(outputFileName, err);
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_MeshPtr CubeMesh = sampleWriter::CreateMeshCube(); // create a simple red cube
CHECK_OK(J.AddMesh(CubeMesh)); // write the cube
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError; // Automatic Finish while J released
}
//end_of_jtwsample11
  • First, we init the writer with output file name
  • Then we create the root node, giving it the name « RootNode ».
  • We create a red cube, see comon function sampleWriter::CreateMeshCube()
  • Then we add it into the writer,
  • close the root node,
  • Automatic Finish when J released

1.2.Transparency, per vertex color, wireframe

We will see with this example how to write transparency, wireframe, and points

//start_of_jtwsample12
template <typename T>
inline void Shift(T& mesh, double sh)
{
t.addTranslate(Dtk_dir(sh, 0, 0));
mesh->Transform(t);
}
{
Dtk_Jtw_Interface J(outputFileName, err);
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_MeshPtr CubeMesh = sampleWriter::CreateMeshCube(); // create a simple red cube
CHECK_OK(J.AddMesh(CubeMesh)); // write the cube (A)
Dtk_MeshPtr CubePervertexColorMesh = sampleWriter::CreateMeshCubeVertexColor(); // create a per vertex color cube
Shift(CubePervertexColorMesh, 3); // translate it not to be on previous geometry
CHECK_OK(J.AddMesh(CubePervertexColorMesh)); // (B)
Dtk_MeshPtr TransparentCube = sampleWriter::CreateMeshCube(); // create a simple red cube
TransparentCube->info()->SetColor(Dtk_RGB(0, 255, 0, 128)); // set whole cube as green and transparent
Shift(TransparentCube, 6); // translate it not to be on previous geometry
CHECK_OK(J.AddMesh(TransparentCube)); // (C)
Dtk_MeshPtr TransparentOneFaceCube = sampleWriter::CreateMeshCube(); // create a simple red cube
if (TransparentOneFaceCube->get_nb_mesh_face() == 6)
{
if (TransparentOneFaceCube->get_mesh_face(3)->info().IsNULL())
TransparentOneFaceCube->get_mesh_face(3)->info() = Dtk_Info::create();
TransparentOneFaceCube->get_mesh_face(3)->info()->SetColor(Dtk_RGB(0, 0, 255, 128)); // set face 3 as blue and transparent
}
Shift(TransparentOneFaceCube, 9); // translate it not to be on previous geometry (D)
CHECK_OK(J.AddMesh(TransparentOneFaceCube));
Dtk_MeshPtr MeshWire = sampleWriter::CreateMeshWire(); // create wire mesh
Shift(MeshWire, 12); // translate it not to be on previous geometry
CHECK_OK(J.AddMesh(MeshWire)); // (E)
Dtk_MeshPtr MeshPoints = sampleWriter::CreateMeshPoints(); // create a mesh wich contain only orange points.
Shift(MeshPoints, 15); // translate it not to be on previous geometry
CHECK_OK(J.AddMesh(MeshPoints)); // (F)
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError; // Automatic Finish while J released
}
//end_of_jtwsample12

This sample will make 6 cases :

  • Case A, the previous opaque red cube
  • Case B, and percolor vertex cube. We apply a transformation on the cube to shift it, in order not to overlap previous cube. See "Shift" subfunction to see how to shift a mesh.
  • Case C, a transparent green cube : the last parameter of Dtk_Rgb defines a transparency, between 0 and 255. Here, 128 is an half transparent cube.
  • Case D, this time we make a blue transparent face on a single face of the cube.
  • Case E, Dtk_mesh can also store a wire geometry, and we can write it.
  • Case F, Dtk_mesh can also store points, and we can write it.

2.Bodies


2.1.Writing body

Jt also support writing bodies as Parasolid bodies.
You will need to link Datakit Parasolid Write library.
Because Jt always stores meshes internally, you will need Datakit Tessellation library too.
Back to main, we see tessellation initialisation. From this sample, it will be required.

//start_of_jtwsample21
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(1, 2); // Create a Cylinder radius=1, height=2 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample21

This sample initialises the tessellation, and writes a cylinder with a green face, and the others uncolored.
Then use function jtw_AddBody to write the body.


2.2.Level of detail (LOD)

Datakit Jt Writer allows to write multiple level of details.

//start_of_jtwsample22
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(1, 2); // Create a Cylinder radius=1, height=2 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body, tessellated as default tess_InitTesselation value
Dtk_BodyPtr cylinder2 = sampleWriter::CreateCyl(1, 2); // Create another Cylinder radius=1, height=2 (with a green face)
Shift(cylinder2, 3); // shift the cylinder, see exemple above
Dtk_tab<Dtk_Float32> lods; // create a LOD array
lods.push_back(0.001f); lods.push_back(-1); // Highest LOD : linear tol = 0.001, angular automatic
lods.push_back(0.01f); lods.push_back(-1); // Medium LOD : linear tol = 0.01, angular automatic
lods.push_back(0.1f); lods.push_back(-1); // Lower LOD : linear tol = 0.1, angular automatic
CHECK_OK(J.AddBody(cylinder2, lods)); // add the body, will tessellate automaticly for LODS.
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample22

This example writes 2 bodies. The first one is like the previous sample. Tessellated with default linear tolerance as 0.005, see function tess_InitTessellation
Then we fill an array of LODS (0.001,-1) ; (0.01,-1) ; (0.1,-1) ;
The function jtw_AddBodyMultiLOD will tessellate 3 times at different tolerances.
We can add up to 9 LODS. Because tesselation takes 2 parameters, numbers of LODS will be sizeof array divided by 2.

A good way to see result is, inside JT2Go, to right click on the background, then :

  • In preference menu, show the tessellation lines
  • In the performance menu, keep the maximum level of detail for Still Frame, and minimum for moving frames. You will see the level of detail changing while moving.

2.3.Wire Body

Fill a Dtk_Body with wire curves, and Datakit Jt Writer will write it as Wireframe segment as NURBS, and will also tessellate it as wire meshes.

//start_of_jtwsample23
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.AddBody(wire));
CHECK_OK(J.AddBody(wire2));
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample23

We can set curve colors, thickness, and style filling info field of each curve

ellipsedotted->info()->SetColor(Dtk_RGB(255, 0, 255));
ellipsedotted->info()->SetCurveLineType(DTK_DOTTED);
ellipsedotted->info()->SetCurveThickNessInMM(2);

2.4.Bodies visibility

It is possible to hide a body. Just set blanked status on its info field. It also works with meshes.

//start_of_jtwsample24
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.AddBody(cylinder));
Shift(cylinder2, 3);
CHECK_OK(J.AddBody(cylinder2));
Shift(cylinder3, 6);
cylinder3->info()->SetBlankedStatus(DTK_TRUE);
CHECK_OK(J.AddBody(cylinder3));
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample24

In our sample, we add 3 bodies on the same part. It is possible to see them in Jt2Go, by right
clicking into the project workshpace, enable « show leaf structure ».
Our bodies are considerated as « subnodes »

We see that the last body became invisible.


3.Assemblies


3.1.Simple assembly

Here is an example to write an assembly, with sub assembly. No instances here, so « wheel » will be written twice in the file.

//start_of_jtwsample31
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
CHECK_OK(J.OpenInstance("Wheel")); // open
Shift(wheel, 2);
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2")); // open
Shift(wheel, 3);
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample31

3.2.Instances

We can re-instantiate a part. The first time we call OpenInstance « Wheel », we give a custom ID for the part « wheel ». Here id_of_wheel, it needs to be a positive number.
Datakit JtWrite will store this ID, and when we call again OpenInstance with same ID, the writer automaticly re-instantiates the wheel. You must close the child.v
We provide a different Dtk_transfo (a placement matrix) for each instance, even a different name (wheel and wheel2) is possible.
This time, the wheel is stored once in the JT file.

//start_of_jtwsample32
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)))); // open instance
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample32

3.3.Instances of subassembly

We can re-instantiate full subassembly. Here, we give an ID of 2 to Axles, and at the end we reuse it with another transformation.

//start_of_jtwsample33
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_Int64 id_of_axles = 2;
CHECK_OK(J.OpenInstance("Axles", 2)); // open Axles, give an ID for future reinstance, placement by default : identity matrix
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)))); // open instance
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", 2, Dtk_transfo(X, Y, Z, Dtk_pnt(10, 0, 0)))); // reinstance whole subassembly with matrix
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample33

3.4.Instance colors and transparency

We can give colors to instances.
Let's take previous example.
Use LastInstance_SetInstanceColor to set colors on instances.
We re-instantiate Axles2 with a red color, and an alpha as 128 : transparency. But the last parameter "keepsubcolor" tells only uncolored colors are filled. (so green faces stay green)
For Axles3, we give a blue color, but the last parameter "overwritecolor" tells all is filled, even the green faces.

//start_of_jtwsample34
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_Int64 id_of_axles = 2;
CHECK_OK(J.OpenInstance("Axles", id_of_axles)); // open Axles, give an ID for future reinstance, placement by default : identity matrix
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)))); // open instance
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", id_of_axles, Dtk_transfo(X, Y, Z, Dtk_pnt(5, 0, 0))));
// Give a RED color with transparence, with keepsubcolor strategy : only uncolored faces are filled
CHECK_OK(J.CloseLastInstance()); // close Axles2
CHECK_OK(J.OpenInstance("Axles3", id_of_axles, Dtk_transfo(X, Y, Z, Dtk_pnt(10, 0, 0))));
// Give a BLUE color, with overwrite color strategy : all faces are filled
CHECK_OK(J.CloseLastInstance()); // close Axles2
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample34

3.5.Instance visibility

Get back to example 3.2.
Using LastInstance_SetInvisible will hide an instance.

//start_of_jtwsample35
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)))); // open instance
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt())));
CHECK_OK(J.LastInstance_SetInvisible()); // Set as invisible
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample35

3.6.Multiple output files, per part

Jt allows to write multiple files.
Let's get the 3.3 example.
Here we call OpenInstance with « assembly/wheel.jt » and « assembly/axle.jt », it will write a new file for this part, into a new folder
(the main file’s name is «JTW_SampleMultipleFilesPerPart_3_6.jt » on this sample, seejtw_InitWrite).

//start_of_jtwsample36
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_Int64 id_of_axles = 2;
CHECK_OK(J.OpenInstance("Axles", 2)); // open Axles, give an ID for future reinstance, placement by default : identity matrix
CHECK_OK(J.OpenInstance("Axle",Dtk_transfo(), "assembly/axle.jt"));// open instance in a new file.
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)), "assembly/wheel.jt"));
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", 2, Dtk_transfo(X, Y, Z, Dtk_pnt(10, 0, 0)))); // reinstance whole subassembly with matrix
CHECK_OK(J.CloseLastInstance()); // close Axles2
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample36

3.7.Multiple output files, shattered files

It is also possible to create JT files for each internal node :
We see a new JT file for each OpenInstance (that is neither re-instantiate nor the root)

//start_of_jtwsample37
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_Int64 id_of_axles = 2;
CHECK_OK(J.OpenInstance("Axles", 2, Dtk_transfo(), "shattered_axles.jt")); // open Axles, give an ID for future reinstance, open instance in a new file.
CHECK_OK(J.OpenInstance("Axle", Dtk_transfo(), "shattered_axle.jt")); // open instance in a new file.
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels", Dtk_transfo(), "shattered_wheels.jt")); // open instance in a new file.
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)), "shattered_wheel.jt")); // open instance in a new file.
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly."
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", 2, Dtk_transfo(X, Y, Z, Dtk_pnt(10, 0, 0)))); // reinstance whole subassembly with matrix
CHECK_OK(J.CloseLastInstance()); // close Axles2
CHECK_OK(J.CloseLastInstance()); // close RootNode
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample37

4.Additionnal datas


4.1.Writing version

Datakit JtWrite versions 8.0 ; 9.0 ; 9.1 ; 9.2 ; 9.3 ; 9.4 ; 9.5 ; 10.0 ; 10.1 ; 10.2 ; 10.3 ; 10.4 ; 10.5 ; 10.6 ; 10.7
We can choose the version to write in constructor. Default is version 9.5

//start_of_jtwsample41
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep, Dtk_Jtw_Interface::version80); // set version 8.0
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_MeshPtr CubeMesh = sampleWriter::CreateMeshCube(); // create a simple red cube
CHECK_OK(J.AddMesh(CubeMesh)); // write the cube
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample41

4.2.Units

You can choose unit for your file.
Available units are millimeters, centimeters, meters, inches, feet, yards, micrometers, decimeters, kilometers, mils, miles. By default, units are millimeters
You can check this in Jt2Go using the Analysis menu, and make measurements

//start_of_jtwsample42
{
// set units as inches
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_MeshPtr CubeMesh = sampleWriter::CreateMeshCube(); // create a simple red cube
CHECK_OK(J.AddMesh(CubeMesh)); // write the cube
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample42

4.3.Metadatas

Metadatas can be written for each child. We can write several metadats for each child.
Here, we write « MyTitle » with « MyValue » for RootNode.

//start_of_jtwsample43
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(1, 2); // Create a Cylinder radius=1, height=2 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample43

4.4.Layers

Fill layer of body info field (or mesh info field) to write layers on the corresponding node.

//start_of_jtwsample44
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Cyl1"));
cylinder->info()->SetLayer(3);
CHECK_OK(J.AddBody(cylinder)); // Add the body
CHECK_OK(J.OpenInstance("Cyl2"));
cylinder2->info()->SetLayer(5);
Shift(cylinder2, 3);
CHECK_OK(J.AddBody(cylinder2)); // Add the body
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample44

4.5.Layer names

Here is a function to create a Dtk_LayerInfoSetPtr.
Just after the creation of RootNode, call AddLayerInfoSet. These datas are stored as properties into the RootNode.

//start_of_jtwsample45
{
lay->SetLayerID(0, 3); // layer 0 has ID 3
lay->SetLayerID(1, 5); // layer 1 has ID 5
lay->SetLayerName(0, "LayerThree");
lay->SetLayerName(1, "LayerFive");
return lay;
}
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Cyl1"));
cylinder->info()->SetLayer(3);
CHECK_OK(J.AddBody(cylinder)); // Add the body
CHECK_OK(J.OpenInstance("Cyl2"));
cylinder2->info()->SetLayer(5);
Shift(cylinder2, 3);
CHECK_OK(J.AddBody(cylinder2)); // Add the body
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample45

5.PMI


5.1.Simple PMI

Datakit JT Writer allows to write PMI, using AddPMI

//start_of_jtwsample51
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=1, height=2 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi)); // Add the PMI
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample51

For this first example, the PMI is disconnected. Jt2Go won’t show it by defaut. Let’s configure it to show the PMI. Later, we can undo these modifications :
Go to PMI preference and make Jt2Go automatically turns on PMI. Do not hide empty modelview.

If you right click on the PMI and select « show in PMI tree », you will see the PMI type (a Datum Feature Symbol), and its name : « Datum:1 »


5.2.ModelViews

Datakit Jt Writer allows to write modelviews.

//start_of_jtwsample52
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi)); // Add the PMI
Dtk_pnt from(0, 0, 100);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(0, 1, 0);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 100, 100, up); // semiwidth = 100
mvfit->info() = Dtk_Info::create();
mvfit->info()->SetName("FitView");
from = Dtk_pnt(300, 300, 300);
up = Dtk_dir(-0.57735, 0.57735, -0.57735);
cam = Dtk_Camera::Create(from, to, 250, 250, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample52

To define a Modelview, we need to define a camera.
Datakit JT Writer writes orthographic views.
So we need a point from, a point to, an up vector, and also a semiwidth. It it the distance between the targetpoint and the bound of screen.
In our example, the cylinder has a radius of 100, so the semiwidth is 100, we transmit it in Camera construction for « FitView ».
As we see, we also fill Modelview names in info field.
(We suggest to write version 9.5 for better result).

Here is the result in Jt2Go.
To see Modelviews, click on Modelviews on the left, then « find » to compute modelviews.
Selecting a modelview will set the camera.
You can see the name of the modelview when highlighting the view.

As you see, the PMI is not present in the modelview. We will have to associate it.


5.3.PMI and modelview association

To insert a PMI into the modelview, you have to give an ID to the PMI (here we give for example ID 5), an ID to the PMI (here for example ID 8), and use ConnectPMI_ModelViews.

//start_of_jtwsample53
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi, 5)); // Add the PMI, set ID = 5
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 250, 250, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
CHECK_OK(J.ConnectPMI_ModelView(5, 8)); // Connect PMI 5 into Modelview 8
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample53

Selecting « toggle view » will show which PMI are in which views.


5.4. PMI and geometry association

We can associate a PMI to geometry (face, edge or vertex)

//start_of_jtwsample54
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi, 5)); // Add the PMI, set ID = 5
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 150, 150, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
CHECK_OK(J.ConnectPMI_ModelView(5, 8)); // Connect PMI 5 into Modelview 8
CHECK_OK(J.ConnectPMI_Geom(5, 2, DTK_TYPE_FACE)); // Connect PMI 5 on body, on face ID= 2
CHECK_OK(J.ConnectPMI_Geom(5, 15, DTK_TYPE_EDGE)); // Connect PMI 5 on body, on edge ID= 15
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample54

The body cylinder has face ID from 1 to 4, and edge ID from 11 to 16.
Here we associate the PMI 5 to face number 2, and edge number 15.
Clicking on PMI will highlight the face and the edge in JT2Go.


5.5.Sections

It is also possible to write sections, giving second parameter of Dtk_ModelDisplay constructor.

//start_of_jtwsample55
{
body->AddOpenShell(shell);
section1->info() = Dtk_Info::create();
section1->info()->SetColor(Dtk_RGB(128, 0, 0)); // red
face1->SetGeom(Dtk_SurfacePtr::DtkDynamicCast(section1));
shell->AddFace(face1, DTK_TRUE);
section2->info() = Dtk_Info::create();
section2->info()->SetColor(Dtk_RGB(0, 0, 128)); // blue
face2->SetGeom(Dtk_SurfacePtr::DtkDynamicCast(section2));
shell->AddFace(face2, DTK_TRUE);
}
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi, 5)); // Add the PMI, set ID = 5
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 150, 150, up);
Dtk_PlaneSurfacePtr section = Dtk_PlaneSurface::Create(Dtk_pnt(), Dtk_dir(1, 0, 0), Dtk_dir(0, 1, 0)); // (A)
//Dtk_EntityPtr section = MakeMultiSection(); // (B)
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
CHECK_OK(J.ConnectPMI_ModelView(5, 8)); // Connect PMI 5 into Modelview 8
CHECK_OK(J.ConnectPMI_Geom(5, 2, DTK_TYPE_FACE)); // Connect PMI 5 on body, on face ID= 2
CHECK_OK(J.ConnectPMI_Geom(5, 15, DTK_TYPE_EDGE)); // Connect PMI 5 on body, on edge ID= 15
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample55

Here we give just a plane, and the section cuts the model in this modeldisplay. Default cutting color is yellow/green

It is also possible to make multiple sections. You need to fill a body to give to Dtk_ModelDisplay constructor.
In this function, we fill a Dtk_Entity as Body, containing 2 planes. These planes are colored (red and blue) to give section colors.
Enable MakeMultiSection function in this code (B) (disable (A)) to see this result :


5.6.PMI associations with other PMI.

It is possible to link some PMI together. Here we create 10 PMI (ID 5 to 14) and we connect PMI 6 to PMI 8 with function ConnectPMI_PMI.
(Note that I changed Modelview ID to 30, to not collide with a PMI ID)

//start_of_jtwsample56
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
int i;
for (i = 0; i < 10; i++) // create 10 PMI
{
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
Shift(pmi, 15 * i);
CHECK_OK(J.AddPMI(pmi, 5 + i)); // Add the PMI, set ID = 5
}
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 150, 150, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 30)); // Add Modelview, set ID = 8
for (i = 0; i < 10; i++) // link the 10 PMIto ModelView
{
}
CHECK_OK(J.ConnectPMI_PMI(6, 8)); // Associate PMI 6 to PMI 8
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample56

Selecting this PMI will automaticly select the other.


5.7. Axis Systems, reference planes, axis, points

It is possible to write Axis Systems, reference planes, reference axis and reference points.

//start_of_jtwsample57
{
body->info() = Dtk_Info::create();
body->info()->SetName("MyReferencePlane");
body->info()->SetInfiniteGeometryFlag(1); // mandatory
body->info()->SetColor(Dtk_RGB(128, 0, 0)); // color red
body->AddOpenShell(shell);
double box[4] = { -200,200,-200,200 }; // trim of the plane
plane->SetTrimUVBox(box);
face1->SetGeom(Dtk_SurfacePtr::DtkDynamicCast(plane));
shell->AddFace(face1, DTK_TRUE);
return body;
}
{
body->info() = Dtk_Info::create();
body->info()->SetName("MyReferenceAxis");
body->info()->SetInfiniteGeometryFlag(1); // mandatory
body->info()->SetColor(Dtk_RGB(0, 128, 0)); // color green
body->AddOpenShell(shell);
Dtk_LinePtr L = Dtk_Line::Create(Dtk_pnt(100, 100, 0), Dtk_dir(0, 0, 1));
L->SetTrimmingParameters(0.0, 200.0);
shell->AddWire(tabwire);
return body;
}
{
body->info() = Dtk_Info::create();
body->info()->SetName("MyReferencePoint");
body->info()->SetInfiniteGeometryFlag(1); // mandatory
body->info()->SetColor(Dtk_RGB(0, 0, 128)); // color blue
body->AddOpenShell(shell);
Dtk_PointPtr point = Dtk_Point::Create(Dtk_pnt(120, 120, 0));
tabpoints.push_back(point);
shell->AddWire(tabpoints);
return body;
}
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 250, 250, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
axis->SetMatrix(Dtk_transfo(Dtk_dir(1, 0, 0), Dtk_dir(0, 1, 0), Dtk_dir(0, 0, 1), Dtk_pnt(100, 100, 0))); // X,Y,Z, O
axis->SetName("MyAxisSystem"); // give a name
CHECK_OK(J.AddAxisSystem(axis, 50)); // give ID 50
CHECK_OK(J.ConnectPMI_ModelView(50, 8)); // Connect AxisSystem 50 to Modelview 8
CHECK_OK(J.AddReferenceGeometry(refplane, 60)); // give ID 60
CHECK_OK(J.ConnectPMI_ModelView(60, 8)); // Connect Referenceplane 50 to Modelview 8
CHECK_OK(J.AddReferenceGeometry(refaxis, 70)); // give ID 70
CHECK_OK(J.ConnectPMI_ModelView(70, 8)); // Connect Referenceplane 60 to Modelview 8
CHECK_OK(J.AddReferenceGeometry(refpoint, 80)); // give ID 80
CHECK_OK(J.ConnectPMI_ModelView(80, 8)); // Connect Referenceplane 70 to Modelview 8
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample57

5.8. Targeting a specific body

If you add more than one body in a single node, and want to connect a PMI on a specific body, you need another parameter. This example sets Id 10 and 11 to cylinders. Then the ConnectPMI_Geom sets the last parameter, to target face 2 in body 10, and also edge 15 on body 11.

//start_of_jtwsample58
{
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_BodyPtr cylinder = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
cylinder->info()->SetId(10);
CHECK_OK(J.AddBody(cylinder)); // Add the body
Dtk_BodyPtr cylinder2 = sampleWriter::CreateCyl(100, 150); // Create a Cylinder radius=100, height=150 (with a green face)
Shift(cylinder2, 250);
cylinder2->info()->SetId(11);
CHECK_OK(J.AddBody(cylinder2)); // Add the body
Dtk_FdtPtr pmi = sampleWriter::CreateFdtDatum(); // Create an FDT (PMI)
CHECK_OK(J.AddPMI(pmi, 5)); // Add the PMI, set ID = 5
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 250, 250, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("SecondView");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
CHECK_OK(J.ConnectPMI_ModelView(5, 8)); // Connect PMI 5 into Modelview 8
CHECK_OK(J.ConnectPMI_Geom(5, 2, DTK_TYPE_FACE, Dtk_tab<Dtk_Int64>(), 10)); // Connect PMI 5 on body 10, on face ID= 2
CHECK_OK(J.ConnectPMI_Geom(5, 15, DTK_TYPE_EDGE, Dtk_tab<Dtk_Int64>(), 11)); // Connect PMI 5 on body 11, on edge ID= 15
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample58

5.9. Types of PMI

A lot of types of PMI are supported. It is written as wireframe.


6.Assembly and PMI


6.1.Modelviews on assembly

You can make modelviews in each node you want, by default the modelviews target all subassembly where the modelview is added.

//start_of_jtwsample61
{
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(0, 0, 0);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 5, 5, up);
mv->info() = Dtk_Info::create();
mv->info()->SetName(name);
return mv;
}
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
Dtk_Int64 id_of_axles = 2;
CHECK_OK(J.OpenInstance("Axles", id_of_axles)); // open Axles, give an ID for future reinstance, placement by default : identity matrix
CHECK_OK(J.OpenInstance("Axle")); // open
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels")); // open
Dtk_Int64 id_of_wheel = 1;
CHECK_OK(J.OpenInstance("Wheel", id_of_wheel, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5)))); // open instance
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", id_of_wheel, Dtk_transfo(X, -Y, -Z, Dtk_pnt()))); // open reinstance
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", id_of_axles, Dtk_transfo(X, Y, Z, Dtk_pnt(5, 0, 0)))); // reinstance whole subassembly with matrix
CHECK_OK(J.CloseLastInstance()); // close Axles2
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample61

Note that for this example, modelviews are empty, you need to tell Jt2Go to show empty modelviews (see 5.1.)


6.2. Targeting a specific instance.

Before targeting a specific instance, we need to give ID to each node :
Let's see this code :

//start_of_jtwsample62
{
for (int i = 0; i < nb; i++)
res.push_back(r[i]);
return res;
}
{
double scale = 0.1;
Dtk_transfo rescale(Dtk_dir(scale, 0, 0), Dtk_dir(0, scale, 0), Dtk_dir(0, 0, scale), scale * Dtk_pnt(-50., -100., -50.));
pmi->Transform(rescale);
Dtk_transfo shift;
shift.addTranslate(D);
pmi->Transform(shift);
return pmi;
}
{
Dtk_pnt from(300, 300, 300);
Dtk_pnt to(3, 0, 3);
Dtk_dir up(-0.57735, 0.57735, -0.57735);
Dtk_CameraPtr cam = Dtk_Camera::Create(from, to, 5, 5, up);
mv2->info() = Dtk_Info::create();
mv2->info()->SetName("View");
CHECK_OK(J.AddModelView(mv2, 8)); // Add Modelview, set ID = 8
if (option == 1) // 6.2. Add instances by addition
{
Dtk_Int64 r1[] = { 1,11,2,13,4,14 }; // target one specific wheel
Dtk_Int64 r2[] = { 1,16 }; // target one specific axle subassembly
}
if (option == 2) // 6.3. Remove instances (soustraction)
{
Dtk_Int64 r1[] = { 1,11,2,13,4,14 }; // target one specific wheel
CHECK_OK(J.ConnectModelView_Instance(8, Makeroute(r1, 6), 1)); // last parameter hide = 1
}
if (option == 3) // 6.4. Target PMI on assembly geometry
{
CHECK_OK(J.AddPMI(pmi, 5)); // Add the PMI, set ID = 5
CHECK_OK(J.ConnectPMI_ModelView(5, 8)); // set PMI into Modelview
Dtk_Int64 r1[] = { 1,11,2,13,4,15,5 }; // target one specific wheel
Dtk_Int64 r2[] = { 1,16,2,12, 3 }; // target one specific axle
}
return dtkNoError;
}
Dtk_ErrorStatus JtwSampleModelViewTarget_6_2(const Dtk_string& outputFileName,int option)
{
Dtk_dir X(1, 0, 0);
Dtk_dir Y(0, 1, 0);
Dtk_dir Z(0, 0, 1);
Dtk_Jtw_Interface J(outputFileName, err, Dtk_Jtw_Interface::xtbrep); // Specify allowing BREP Writing
CHECK_OK(err);
CHECK_OK(J.OpenInstance("RootNode")); // Rootnode creation
CHECK_OK(J.OpenInstance("Axles", 2));
CHECK_OK(J.OpenInstance("Axle", 3));
CHECK_OK(J.AddBody(axle));
CHECK_OK(J.CloseLastInstance()); // close Axle
CHECK_OK(J.OpenInstance("Wheels", 4));
CHECK_OK(J.OpenInstance("Wheel", 5, Dtk_transfo(X, Y, Z, Dtk_pnt(0, 0, 5))));
CHECK_OK(J.AddBody(wheel));
CHECK_OK(J.CloseLastInstance()); // close Wheel
CHECK_OK(J.OpenInstance("Wheel2", 5, Dtk_transfo(X, -Y, -Z, Dtk_pnt())));
CHECK_OK(J.CloseLastInstance()); // reinstancied : must close Wheel2 immediatly.
CHECK_OK(J.CloseLastInstance()); // close Wheels
CHECK_OK(J.CloseLastInstance()); // close Axles
CHECK_OK(J.OpenInstance("Axles2", 2, Dtk_transfo(X, Y, Z, Dtk_pnt(6, 0, 0))));
CHECK_OK(J.CloseLastInstance()); // close Axles2
MakePmiOnRoot(J, option);
CHECK_OK(J.CloseLastInstance()); // Rootnode closing.
cout << "=> " << outputFileName.c_str() << endl;
return dtkNoError;// Automatic Finish while J released
}
//end_of_jtwsample62

With this code, we give an ID to each node, into OpenInstance, we see ("Axles", 2), ("Axle", 3), ("Wheels", 4), ("Wheel", 5)
Some are re-instantiated (2 and 5)
It gives this tree inside Jt2Go

With this, we can target a node. But there are multiple nodes « 5 » and multiple nodes « 2 », because these nodes are re-instantiated.
To remove ambiguity, we can give ID to instances too, using LastInstance_SetInstanceID :
In this code, we define instancesid 11,12,13,14,15,16. (Avoid giving same id as idParts given by OpenInstance)
Now, the tree is :

Now we can reach an instance, using a « route » to reach it :
To reach first wheel, route is 1,11,2,13,4,14,5
To reach second Axle, route is 1,16,2,12,3
To reach last Wheels subassembly, route is 1,16,2,13,4
Now let’s fill function MakePmiOnRoot (with option 1 for this sample) to target only an axle, and just a wheel on the other axle :
Fill a « route » to target an assembly you need.


6.3. Removing a specific instance from Modelview

The previous sample shows how to select subassemblies to put in modeldisplay.
We can select subassemblies to remove from modeldisplay
See previous code with option 2 for this sample.
We consider route 1,11,2,13,4,14 (to a specific wheel), then we use last parameter "hide" of ConnectModelView_Instance to hide it.
In the previous example we selected instances to add, now we keep all instances besides the selected one.


6.4. Targeting geometry in assembly

Let’s consider a PMI into root node, we want it to target a face of a specific geometry instance, and also another face somewhere else in assembly.
See previous code with option 3 for this sample.


CreateFdtDatumAt
Dtk_FdtPtr CreateFdtDatumAt(const Dtk_pnt &D)
Definition: testlibjtwrite.cpp:1007
Dtk_ModelDisplay::Create
static Dtk_ModelDisplayPtr Create(const Dtk_CameraPtr &inCamera, const Dtk_EntityPtr &inClippingEntity, const Dtk_bool inIsActivated)
Full featured constructor.
Dtk_transfo
This is the Transformation dedicated class.
Definition: dtk_transfo.hpp:19
JtwSampleMetadatas_4_3
Dtk_ErrorStatus JtwSampleMetadatas_4_3(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:496
Dtk_Jtw_Interface::OpenInstance
Dtk_ErrorStatus OpenInstance(const Dtk_string &inName, const Dtk_transfo &inTrans=Dtk_transfo(), const Dtk_string &inExternfile=Dtk_string())
Open a new Instance for the assembly writing.
Dtk_PlaneSurface::Create
static Dtk_PlaneSurfacePtr Create(const Dtk_pnt &inOrigin, const Dtk_dir &inNormal, const Dtk_dir &inUDirection, const Dtk_dir &inVDirection=Dtk_dir())
Create an infinite plane surface.
sampleWriter::CreateMeshCube
Dtk_MeshPtr CreateMeshCube()
Mesh Cube sample.
Definition: testcreatemesh.cpp:207
Dtk_Jtw_Interface::LastInstance_SetInstanceColor
Dtk_ErrorStatus LastInstance_SetInstanceColor(const Dtk_RGB &inRgb, colorstrategy inColorstrategy=keepsubcolor)
Set a Color to previously opened instance.
sampleWriter::CreateCyl
Dtk_BodyPtr CreateCyl(double radius, double height)
Definition: testcreatecube.cpp:1791
sampleWriter::CreateMeshCubeVertexColor
Dtk_MeshPtr CreateMeshCubeVertexColor()
Definition: testcreatemesh.cpp:299
CreateLayerInfosSet
Dtk_LayerInfosSetPtr CreateLayerInfosSet()
Definition: testlibjtwrite.cpp:546
sampleWriter::CreateMeshPoints
Dtk_MeshPtr CreateMeshPoints()
Points mesh sample.
Definition: testcreatemesh.cpp:439
Dtk_Jtw_Interface::ConnectModelView_Instance
Dtk_ErrorStatus ConnectModelView_Instance(Dtk_Int64 inIdmodelview, const Dtk_tab< Dtk_Int64 > &inRoute, int inHide=0, Dtk_ID inBodyID=0, const Dtk_transfo &inExplode=Dtk_transfo())
Connect a ModelView on an Instance, for part representation restriction in a modelview.
DTK_TRUE
#define DTK_TRUE
Definition: define.h:727
JtwSamplePMI_MV_association_5_3
Dtk_ErrorStatus JtwSamplePMI_MV_association_5_3(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:644
Dtk_string
This is a high level string class.
Definition: dtk_string.hpp:58
Dtk_Jtw_Interface::keepsubcolor
@ keepsubcolor
Definition: jtw.h:17
JtWriteSample
int JtWriteSample(const Dtk_string &inResultDirectory)
Definition: testlibjtwrite.cpp:1178
JtwSampleModelViewTarget_6_2
Dtk_ErrorStatus JtwSampleModelViewTarget_6_2(const Dtk_string &outputFileName, int option)
Definition: testlibjtwrite.cpp:1056
JtwSampleAxis_References_5_7
Dtk_ErrorStatus JtwSampleAxis_References_5_7(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:858
JtwSampleBodyLOD_2_2
Dtk_ErrorStatus JtwSampleBodyLOD_2_2(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:109
JtwSampleMultipleFilesShattered_3_7
Dtk_ErrorStatus JtwSampleMultipleFilesShattered_3_7(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:420
Dtk_AxisSystem::create
static Dtk_SmartPtr< Dtk_AxisSystem > create()
Dtk_Jtw_Interface::ConnectPMI_Geom
Dtk_ErrorStatus ConnectPMI_Geom(Dtk_Int64 inIdfdt, Dtk_Int64 inGeomid, type_detk inTypegeom, const Dtk_tab< Dtk_Int64 > &inRoute=Dtk_tab< Dtk_Int64 >(), Dtk_ID inBodyID=0)
Connect a PMI on a body face/edge/vertex.
Dtk_Jtw_Interface::CloseLastInstance
Dtk_ErrorStatus CloseLastInstance()
Close the last opened node.
Dtk_Body::Create
static Dtk_BodyPtr Create()
Create a body.
tess_InitTesselation
int tess_InitTesselation(Dtk_string inWorkingDirectory, double inTolerance)
Init the tesselation library.
JtwSampleBody_2_1
Dtk_ErrorStatus JtwSampleBody_2_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:94
Dtk_Jtw_Interface::xtbrep
@ xtbrep
Definition: jtw.h:13
JtwSampleWireBody_2_3
Dtk_ErrorStatus JtwSampleWireBody_2_3(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:135
MakeReferenceAxis
Dtk_BodyPtr MakeReferenceAxis()
Definition: testlibjtwrite.cpp:825
JtwSampleModelview_sections_5_5
Dtk_ErrorStatus JtwSampleModelview_sections_5_5(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:729
Dtk_Face::Create
static Dtk_FacePtr Create(const Dtk_BodyPtr &inParentBody)
Create a face in a body.
JtwSampleInstancesColors_3_4
Dtk_ErrorStatus JtwSampleInstancesColors_3_4(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:293
JtwSamplePMI_Geom_association_5_4
Dtk_ErrorStatus JtwSamplePMI_Geom_association_5_4(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:675
JtwSampleLayers_4_4
Dtk_ErrorStatus JtwSampleLayers_4_4(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:518
Dtk_Jtw_Interface::version95
@ version95
Definition: jtw.h:28
sampleWriter::CreateMeshWire
Dtk_MeshPtr CreateMeshWire()
Wire mesh sample.
Definition: testcreatemesh.cpp:388
Dtk_Jtw_Interface::AddMetaData
Dtk_ErrorStatus AddMetaData(const Dtk_MetaDataPtr &inToWrite)
Add a Metdata into the current node.
JtwSampleInstancesVisibily_3_5
Dtk_ErrorStatus JtwSampleInstancesVisibily_3_5(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:342
Dtk_Int64
int64_t Dtk_Int64
Definition: define.h:692
Dtk_Line::Create
static Dtk_LinePtr Create(const Dtk_Line &inLineToCopy)
constructors returning Smart pointers
sampleWriter::CreateFdtDatum
Dtk_FdtPtr CreateFdtDatum()
Create Simple Datum.
Definition: testcreatefdt.cpp:19
DTK_DOTTED
@ DTK_DOTTED
Definition: util_ent_dtk.hpp:54
DTK_TYPE_FACE
@ DTK_TYPE_FACE
Definition: define.h:141
Dtk_MetaData::TypeProperty
@ TypeProperty
Definition: dtk_metadata.hpp:28
Dtk_SmartPtr::DtkDynamicCast
static Dtk_SmartPtr< T > DtkDynamicCast(const Dtk_SmartPtr< T2 > &p)
Definition: util_ptr_dtk.hpp:101
Dtk_ErrorStatus
Dtk_ErrorStatus
Definition: error_dtk.hpp:6
Dtk_SmartPtr::IsNULL
Dtk_bool IsNULL() const
Definition: util_ptr_dtk.hpp:118
Dtk_Jtw_Interface::AddPMI
Dtk_ErrorStatus AddPMI(const Dtk_FdtPtr &inPMI, Dtk_Int64 inIdpmi=-1)
Add a fdt into the current node.
Dtk_Jtw_Interface::AddAxisSystem
Dtk_ErrorStatus AddAxisSystem(const Dtk_AxisSystemPtr &inAxisSystem, Dtk_Int64 inIdaxis=-1)
Add an axis system into the current node.
JtwSampleVersion_4_1
Dtk_ErrorStatus JtwSampleVersion_4_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:464
CHECK_OK
#define CHECK_OK(X)
Definition: testwriters.h:9
Dtk_SmartPtr
Definition: util_ptr_dtk.hpp:37
JtwSampleOneMesh_1_1
Dtk_ErrorStatus JtwSampleOneMesh_1_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:24
Dtk_Jtw_Interface::inches
@ inches
Definition: jtw.h:43
Dtk_string::c_str
const char * c_str() const
Retrieve the ASCII conversion string.
Dtk_Jtw_Interface::version80
@ version80
Definition: jtw.h:22
JtwSampleLayerNames_4_5
Dtk_ErrorStatus JtwSampleLayerNames_4_5(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:556
JtwSampleAssembly_3_1
Dtk_ErrorStatus JtwSampleAssembly_3_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:182
JtwSampleSimplePMI_5_1
Dtk_ErrorStatus JtwSampleSimplePMI_5_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:587
Dtk_pnt
This is a mathematical point class.
Definition: dtk_pnt.hpp:22
JtwSamplePMI_Geom_one_association_5_8
Dtk_ErrorStatus JtwSamplePMI_Geom_one_association_5_8(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:902
MakeReferencePlane
Dtk_BodyPtr MakeReferencePlane()
Definition: testlibjtwrite.cpp:807
Dtk_Jtw_Interface::LastInstance_SetInvisible
Dtk_ErrorStatus LastInstance_SetInvisible()
Set previously opened instance as invisible.
Dtk_Jtw_Interface::AddModelView
Dtk_ErrorStatus AddModelView(const Dtk_ModelDisplayPtr &inModelview, Dtk_Int64 inIdmodelview=-1)
Add a modelView into the current node.
Dtk_Camera::Create
static Dtk_CameraPtr Create()
Base constructor.
JtwSampleMeshes_1_2
Dtk_ErrorStatus JtwSampleMeshes_1_2(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:49
JtwSampleAsmInstances_3_3
Dtk_ErrorStatus JtwSampleAsmInstances_3_3(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:250
JtwSampleUnits_4_2
Dtk_ErrorStatus JtwSampleUnits_4_2(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:479
DTK_TYPE_EDGE
@ DTK_TYPE_EDGE
Definition: define.h:128
tess_ComputeBoundariesFromMesh
int tess_ComputeBoundariesFromMesh()
: Check value of option memorize noundaries of mesh
Dtk_tab
This is a high level array class.
Definition: util_stl_dtk.hpp:85
Dtk_transfo::addTranslate
void addTranslate(const Dtk_dir &V)
Translate the Dtk_transfo.
MakeReferencePoint
Dtk_BodyPtr MakeReferencePoint()
Definition: testlibjtwrite.cpp:842
tess_EndTesselation
void tess_EndTesselation()
Free the data used by tesselation library.
Dtk_Jtw_Interface::LastInstance_SetInstanceID
Dtk_ErrorStatus LastInstance_SetInstanceID(Dtk_Int64 inInstanceID)
Set an instance ID to previously opened instance.
sampleWriter::CreateCurves
Dtk_BodyPtr CreateCurves()
Definition: testcreatecube.cpp:1292
sampleWriter::CreateCurvesStyle
Dtk_BodyPtr CreateCurvesStyle()
Definition: testcreatecube.cpp:1370
MakeMultiSection
Dtk_EntityPtr MakeMultiSection()
Definition: testlibjtwrite.cpp:709
JtwSamplePartInstances_3_2
Dtk_ErrorStatus JtwSamplePartInstances_3_2(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:216
MakePmiOnRoot
Dtk_ErrorStatus MakePmiOnRoot(Dtk_Jtw_Interface &J, int option)
Definition: testlibjtwrite.cpp:1019
JtwSampleSimpleModelview_5_2
Dtk_ErrorStatus JtwSampleSimpleModelview_5_2(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:607
Dtk_LayerInfosSet::Create
static Dtk_LayerInfosSetPtr Create(const Dtk_Size_t inNumLayers)
Base constructor.
dtkNoError
@ dtkNoError
Definition: error_dtk.hpp:140
Dtk_tab::push_back
void push_back(const T &x)
Inserts an element at the end of the array.
Definition: util_stl_dtk.hpp:415
Dtk_Shell::Create
static Dtk_ShellPtr Create(const Dtk_BodyPtr &inParentBody)
Create a shell in a body.
Dtk_Jtw_Interface
This is Jt Interface class used to write Jt files.
Definition: jtw.h:8
CreateModelDisplay
Dtk_ModelDisplayPtr CreateModelDisplay(const Dtk_string &name)
Definition: testlibjtwrite.cpp:942
Dtk_Jtw_Interface::AddMesh
Dtk_ErrorStatus AddMesh(const Dtk_MeshPtr &inToWrite, Dtk_Float32 inLossytol=0)
Add a mesh into the current node.
Dtk_Point::Create
static Dtk_PointPtr Create(const Dtk_Point &inToCopy)
constructors returning Smart pointers
Dtk_RGB
Definition: dtk_rgb.hpp:7
AllJtWTests
int AllJtWTests(const Dtk_string &inResultDirectory)
Definition: testlibjtwrite.cpp:1097
JtwSampleMultipleFilesPerPart_3_6
Dtk_ErrorStatus JtwSampleMultipleFilesPerPart_3_6(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:377
JtwSamplePMI_PMI_association_5_6
Dtk_ErrorStatus JtwSamplePMI_PMI_association_5_6(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:766
Dtk_Info::create
static Dtk_SmartPtr< Dtk_Info > create()
Dtk_Jtw_Interface::ConnectPMI_ModelView
Dtk_ErrorStatus ConnectPMI_ModelView(Dtk_Int64 inIdpmi, Dtk_Int64 inIdModelView, const Dtk_tab< Dtk_Int64 > &inRoute=Dtk_tab< Dtk_Int64 >())
Connect a PMI on a ModelView.
Dtk_Jtw_Interface::ConnectPMI_PMI
Dtk_ErrorStatus ConnectPMI_PMI(Dtk_Int64 inIdpmifrom, Dtk_Int64 inIdpmito, const Dtk_tab< Dtk_Int64 > &inRoute=Dtk_tab< Dtk_Int64 >())
Connect a PMI on another PMI.
Dtk_Jtw_Interface::AddLayerInfosSet
Dtk_ErrorStatus AddLayerInfosSet(const Dtk_LayerInfosSetPtr &inToWrite)
Add a Layer informations.
Dtk_Jtw_Interface::AddReferenceGeometry
Dtk_ErrorStatus AddReferenceGeometry(const Dtk_BodyPtr &inRefgeom, Dtk_Int64 inIdrefgeom=-1)
Add a reference geometry into the current node.
Dtk_dir
This is a mathematical direction class.
Definition: dtk_dir.hpp:15
Dtk_Jtw_Interface::overwritecolor
@ overwritecolor
Definition: jtw.h:18
JtwSampleModelViewAsm_6_1
Dtk_ErrorStatus JtwSampleModelViewAsm_6_1(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:954
Dtk_Jtw_Interface::AddBody
Dtk_ErrorStatus AddBody(const Dtk_BodyPtr &inToWrite, const Dtk_tab< Dtk_Float32 > &makelods=Dtk_tab< Dtk_Float32 >(), Dtk_Float32 inLossytol=0)
Add a body into the current node.
JtwSampleBodyVisibility_2_4
Dtk_ErrorStatus JtwSampleBodyVisibility_2_4(const Dtk_string &outputFileName)
Definition: testlibjtwrite.cpp:156
Makeroute
Dtk_tab< Dtk_Int64 > Makeroute(Dtk_Int64 r[], int nb)
Definition: testlibjtwrite.cpp:999
Shift
void Shift(T &mesh, double sh)
Definition: testlibjtwrite.cpp:42
Dtk_MetaData::CreateMetaData
static Dtk_MetaDataPtr CreateMetaData(const MetaDataTypeEnum &inEnumType, Dtk_string inTitle, Dtk_string inValue, Dtk_string inValueType=Dtk_string(L"STRING"))
Create a Dtk_MetaDataPtr .