ayha1999
asked on
Running code
Hi,
How can I run the following c# code and get the result. I want to pass the the following .stl file and find the volume of it on page load event.
stl file:
http://orion.math.iastate.edu/burkardt/data/stl/bottle.stl
Thanks
How can I run the following c# code and get the result. I want to pass the the following .stl file and find the volume of it on page load event.
stl file:
http://orion.math.iastate.edu/burkardt/data/stl/bottle.stl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
namespace WebApplication1
{
public class Triangle
{
public double x; public double y; public double z;
}
public class STLUtils
{
public enum LengthType { inch, cm } ;
List<byte[]> _normals = new List<byte[]>();
List<byte[]> _points = new List<byte[]>();
List<Triangle> _triangles = new List<Triangle>();
List<byte> _bytecount = new List<byte>();
byte[] _fileBytes;
LengthType _lengthType;
string _filename;
public bool IsValidated(string[] args)
{
if (args.Length != 2) return false;
if (!Enum.TryParse<LengthType>(args[1], true, out _lengthType))
{
return false;
}
_filename = args[0];
return File.Exists(_filename);
}
public double CalculateVolume()
{
//read binary file
_fileBytes = File.ReadAllBytes(_filename);
//reverse array if little indian
if (BitConverter.IsLittleEndian)
Array.Reverse(_fileBytes);
//read length
int length = ReadLength();
double totalVol = 0;
//skip 80(header) + 4(length)
var bytes = _fileBytes.Skip(84);
//loop through all triangles data
for (int i = 0; i < length; i++)
{
_normals.Add(bytes.Take(12).ToArray());
var p1 = bytes.Skip(12).Take(12).ToArray();
var p2 = bytes.Skip(24).Take(12).ToArray();
var p3 = bytes.Skip(36).Take(12).ToArray();
var b = bytes.Skip(48).Take(2);
var l = _points.Count;
_points.Add(p1);
_points.Add(p2);
_points.Add(p3);
_triangles.Add(new Triangle { x = l, y = l + 1, z = l + 2 });
_bytecount.Add(b.First());
totalVol += signedVolumeOfTriangle(p1, p2, p3);
bytes = bytes.Skip(50);
}
//convert to required length type (cm/inch)
return (_lengthType == LengthType.cm) ?
totalVol / 1000 :
cm3_To_inch3Transform(totalVol / 1000);
}
private double cm3_To_inch3Transform(double totalVol)
{
return totalVol * 0.0610237441;
}
private int ReadLength()
{
//skip 80 chars (header), read next 4 bytes to get length
int length = BitConverter.ToInt32(_fileBytes.Skip(80).Take(4).ToArray(), 0);
return length;
}
public double signedVolumeOfTriangle(byte[] p1, byte[] p2, byte[] p3)
{
double v321 = p3[0] * p2[1] * p1[2];
double v231 = p2[0] * p3[1] * p1[2];
double v312 = p3[0] * p1[1] * p2[2];
double v132 = p1[0] * p3[1] * p2[2];
double v213 = p2[0] * p1[1] * p3[2];
double v123 = p1[0] * p2[1] * p3[2];
return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);
}
}
}
Thanks
ASKER
syntax error at if (stlUtils.IsValidated(@"c: \bottle.st l", "inch"))
Error 1 No overload for method 'IsValidated' takes 2 arguments
Error 1 No overload for method 'IsValidated' takes 2 arguments
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
It works now but returns 0,means there is not decimal places displayed.
I posted another question. Please have look.
https://www.experts-exchange.com/questions/28149330/Displaying-Decimal.html
Thanks
I posted another question. Please have look.
https://www.experts-exchange.com/questions/28149330/Displaying-Decimal.html
Thanks
Open in new window
2nd parameter of IsValidated accept either "inch" or "cm".