Creating a simple triangulation (using C#)
This is a very simple example illustrating how to wrap these APIs in a C# console application to create a Vulcan triangulation.
To avoid BadImageFormatException exceptions - the .Net project must have platform target set to x64.
The Vulcan API DLLs should exist in same directory as your application.
//////////////////////////////////////////////////////////////////////////////
//
// Name : mtkExportedApi_ReadWrite_dotnet.cs
// Description : A basic example of using the mtkExportedApi with C#
//
//////////////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
namespace Vulcan00tWriter
{
class Program
{
// Import C Functions required
[DllImport("mtkExportedApi_ReadWrite_Init.dll", EntryPoint = "MTK_API_InitExtend", CharSet = CharSet.None)]
private static extern int MTK_API_InitExtend();
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_API_Terminate", CharSet = CharSet.None)]
private static extern void MTK_API_Terminate();
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_SetVulcanEnvironmentVariable", CharSet = CharSet.None)]
private static extern int MTK_SetVulcanEnvironmentVariable(string vulcan);
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_New", CharSet = CharSet.None)]
private static extern IntPtr MTK_Triangulation_New();
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_Save", CharSet = CharSet.None)]
private static extern int MTK_Triangulation_Save(IntPtr triang, string name);
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_Close", CharSet = CharSet.None)]
private static extern int MTK_Triangulation_Close(IntPtr triang);
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_IsValid", CharSet = CharSet.None)]
private static extern int MTK_Triangulation_IsValid(IntPtr triang);
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_AddTriangle", CharSet = CharSet.None)]
private static extern int MTK_Triangulation_AddTriangle(IntPtr triang, ref int a, ref int b, ref int c);
[DllImport("mtkExportedApi_ReadWrite.dll", EntryPoint = "MTK_Triangulation_AddPoint", CharSet = CharSet.None)]
private static extern int MTK_Triangulation_AddPoint(IntPtr triang, ref double x, ref double y, ref double z);
static void Main(string[] args)
{
var vulcanPath = "";
while(!Directory.Exists(vulcanPath))
{
Console.WriteLine("Please input your Vulcan install path:\n");
vulcanPath = Console.ReadLine();
}
var savePath = "";
while(string.IsNullOrEmpty(savePath) || File.Exists(savePath))
{
Console.WriteLine("Enter path to save 00t file:\n");
savePath = Console.ReadLine();
savePath = Path.GetFullPath(savePath);
if(File.Exists(savePath))
Console.WriteLine($"{savePath} already exists. Try a different file name.");
}
// Initialise the library and check licence
if (InitVulcan(vulcanPath))
{
// Build the triangulation
BuildDemoTriangulation(savePath);
}
// Clean up
MTK_API_Terminate();
Console.WriteLine("Done");
Console.WriteLine("Press any key to exit...");
Console.ReadLine();
}
static void BuildDemoTriangulation(string path)
{
double edge_size = 5;
List<Vector3D> points = new List<Vector3D>();
List<TripleIndex> faces = new List<TripleIndex>();
// Create a tetrahedron
points.Add(new Vector3D(-edge_size, -edge_size, -edge_size));
points.Add(new Vector3D(-edge_size, edge_size, edge_size));
points.Add(new Vector3D(edge_size, -edge_size, edge_size));
points.Add(new Vector3D(edge_size, edge_size, -edge_size));
faces.Add(new TripleIndex(0, 1, 2));
faces.Add(new TripleIndex(0, 2, 3));
faces.Add(new TripleIndex(0, 1, 3));
faces.Add(new TripleIndex(1, 2, 3));
IntPtr triang = MTK_Triangulation_New();
if(triang == IntPtr.Zero)
{
Console.WriteLine("Failed to create new triangulation in memory.");
return;
}
Console.WriteLine("Writing points");
points.ForEach(pt => MTK_Triangulation_AddPoint(triang, ref pt.X, ref pt.Y, ref pt.Z));
Console.WriteLine("Writing faces");
faces.ForEach(face => MTK_Triangulation_AddTriangle(triang, ref face.A, ref face.B, ref face.C));
Console.WriteLine($"Saving path {path}");
if(MTK_Triangulation_Save(triang, path) != 0)
{
Console.WriteLine($"Error occured saving {path}");
}
Console.WriteLine("Removing reference to object");
MTK_Triangulation_Close(triang);
}
static bool InitVulcan(string path)
{
if (MTK_SetVulcanEnvironmentVariable(path) == 0)
{
if (MTK_API_InitExtend() == 0)
{
Console.WriteLine("Library initialised");
return true;
} else
{
Console.WriteLine("Failed to initialise with Extend license");
}
} else
{
Console.WriteLine("Failed to set Vulcan Environment Variable");
}
return false;
}
public struct Vector3D
{
public double X, Y, Z;
public Vector3D(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
}
public struct TripleIndex
{
public int A, B, C;
public TripleIndex(int a, int b, int c)
{
A = a; B = b; C = c;
}
}
}
}