292 lines
12 KiB
C#
292 lines
12 KiB
C#
using NUnit.Framework;
|
|
using SolidWorks.Interop.sldworks;
|
|
using SolidWorks.Interop.swconst;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Xarial.XCad.Base;
|
|
using Xarial.XCad.Geometry;
|
|
using Xarial.XCad.Geometry.Structures;
|
|
using Xarial.XCad.SolidWorks.Documents;
|
|
using Xarial.XCad.SolidWorks.Geometry;
|
|
|
|
namespace SolidWorks.Tests.Integration
|
|
{
|
|
public class MemoryGeometryBuilderTests : IntegrationTests
|
|
{
|
|
[Test]
|
|
public void ArcSweepTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var sweepArc = m_App.MemoryGeometryBuilder.WireBuilder.PreCreateArc();
|
|
sweepArc.Center = new Point(0, 0, 0);
|
|
sweepArc.Axis = new Vector(0, 0, 1);
|
|
sweepArc.Diameter = 0.01;
|
|
sweepArc.Commit();
|
|
|
|
var sweepLine = m_App.MemoryGeometryBuilder.WireBuilder.PreCreateLine();
|
|
sweepLine.StartCoordinate = new Point(0, 0, 0);
|
|
sweepLine.EndCoordinate = new Point(1, 1, 1);
|
|
sweepLine.Commit();
|
|
|
|
var sweep = m_App.MemoryGeometryBuilder.SolidBuilder.PreCreateSweep();
|
|
sweep.Profiles = new IXRegion[] { m_App.MemoryGeometryBuilder.CreatePlanarSheet(sweepArc).Bodies.First() };
|
|
sweep.Path = sweepLine;
|
|
sweep.Commit();
|
|
|
|
var body = (sweep.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(3, faceCount);
|
|
Assert.That(0.49999999396850558, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(0.50000000621319451, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0.4999999999985747, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(7.8539510270934476E-05, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.043845670222023812, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void ConeTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var cone = m_App.MemoryGeometryBuilder.CreateSolidCone(
|
|
new Point(0, 0, 0),
|
|
new Vector(1, 1, 1),
|
|
0.1, 0.05, 0.2);
|
|
|
|
var body = (cone.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(3, faceCount);
|
|
Assert.That(0.045363235436327753, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(0.045363235436327753, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0.045363235436327753, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(0.00091629785729702325, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.057308095255097079, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void ArcRevolveTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var arc = m_App.MemoryGeometryBuilder.WireBuilder.PreCreateArc();
|
|
arc.Center = new Point(-0.1, 0, 0);
|
|
arc.Axis = new Vector(0, 0, 1);
|
|
arc.Diameter = 0.01;
|
|
arc.Commit();
|
|
|
|
var axis = m_App.MemoryGeometryBuilder.WireBuilder.PreCreateLine();
|
|
axis.StartCoordinate = new Point(0, 0, 0);
|
|
axis.EndCoordinate = new Point(0, 1, 0);
|
|
axis.Commit();
|
|
|
|
var rev = m_App.MemoryGeometryBuilder.SolidBuilder.PreCreateRevolve();
|
|
rev.Angle = Math.PI * 2;
|
|
rev.Axis = axis;
|
|
rev.Profiles = new IXRegion[] { m_App.MemoryGeometryBuilder.CreatePlanarSheet(arc).Bodies.First() };
|
|
rev.Commit();
|
|
|
|
var body = (rev.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(1, faceCount);
|
|
Assert.That(3.9006081899147006E-18, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(0, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(4.9348022005446818E-05, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.019739208802178717, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void BoxTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var box = m_App.MemoryGeometryBuilder.CreateSolidBox(
|
|
new Point(0, 0, 0),
|
|
new Vector(1, 1, 1),
|
|
new Vector(1, 1, 1).CreateAnyPerpendicular(),
|
|
0.1, 0.2, 0.3);
|
|
|
|
var body = (box.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(6, faceCount);
|
|
Assert.That(0.086602540378443879, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(0.086602540378443879, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0.086602540378443879, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(0.0060000000000000036, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.22000000000000014, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void ExtrusionTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var polyline = m_App.MemoryGeometryBuilder.WireBuilder.PreCreatePolyline();
|
|
polyline.Points = new Point[]
|
|
{
|
|
new Point(0, 0, 0),
|
|
new Point(0.1, 0.1, 0),
|
|
new Point(0.2, 0, 0),
|
|
new Point(0, 0, 0)
|
|
};
|
|
polyline.Commit();
|
|
|
|
var extr = m_App.MemoryGeometryBuilder.SolidBuilder.PreCreateExtrusion();
|
|
extr.Depth = 0.5;
|
|
extr.Direction = new Vector(1, 1, 1);
|
|
extr.Profiles = new IXRegion[] { m_App.MemoryGeometryBuilder.CreatePlanarSheet(polyline).Bodies.First() };
|
|
extr.Commit();
|
|
|
|
var body = (extr.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(5, faceCount);
|
|
Assert.That(0.24433756729740647, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(0.17767090063073979, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0.14433756729740646, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(0.002886751345948132, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.21318516525781389, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void CylinderTest()
|
|
{
|
|
int faceCount;
|
|
double[] massPrps;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var cyl = m_App.MemoryGeometryBuilder.CreateSolidCylinder(
|
|
new Point(0, 0, 0), new Vector(1, 0, 0), 0.1, 0.2);
|
|
|
|
var body = (cyl.Bodies.First() as ISwBody).Body;
|
|
|
|
var feat = (m_App.Documents.Active as ISwPart).Part.CreateFeatureFromBody3(body, false, 0) as IFeature;
|
|
|
|
faceCount = feat.GetFaceCount();
|
|
massPrps = feat.IGetBody2().GetMassProperties(0) as double[];
|
|
}
|
|
|
|
Assert.AreEqual(3, faceCount);
|
|
Assert.That(0.10000000000000002, Is.EqualTo(massPrps[0]).Within(0.001).Percent);
|
|
Assert.That(1.949085916259688E-18, Is.EqualTo(massPrps[1]).Within(0.001).Percent);
|
|
Assert.That(0, Is.EqualTo(massPrps[2]).Within(0.001).Percent);
|
|
Assert.That(0.0062831853071795875, Is.EqualTo(massPrps[3]).Within(0.001).Percent);
|
|
Assert.That(0.18849555921538758, Is.EqualTo(massPrps[4]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void PlanarSheetTest()
|
|
{
|
|
bool isPlanar;
|
|
bool isCircular;
|
|
int edgeCount;
|
|
double[] normal;
|
|
double[] circleParams;
|
|
|
|
using (var doc = NewDocument(Interop.swconst.swDocumentTypes_e.swDocPART))
|
|
{
|
|
var arc = m_App.MemoryGeometryBuilder.WireBuilder.PreCreateArc();
|
|
arc.Center = new Point(0.75, 0.5, 0.15);
|
|
arc.Axis = new Vector(Math.Round(1E-16d, 15), 0, 1);
|
|
arc.Diameter = 2.5;
|
|
arc.Commit();
|
|
var face = m_App.MemoryGeometryBuilder.CreatePlanarSheet(arc).Bodies.First().Faces.First();
|
|
isPlanar = face is IXPlanarFace;
|
|
edgeCount = (face as ISwFace).Face.GetEdgeCount();
|
|
isCircular = (((face as ISwFace).Face.GetEdges() as object[]).First() as IEdge).IGetCurve().IsCircle();
|
|
circleParams = (double[])(((face as ISwFace).Face.GetEdges() as object[]).First() as IEdge).IGetCurve().CircleParams;
|
|
normal = (face as ISwFace).Face.Normal as double[];
|
|
}
|
|
|
|
Assert.AreEqual(true, isPlanar);
|
|
Assert.AreEqual(true, isCircular);
|
|
Assert.AreEqual(1, edgeCount);
|
|
Assert.That(0, Is.EqualTo(normal[0]).Within(0.001).Percent);
|
|
Assert.That(0, Is.EqualTo(normal[1]).Within(0.001).Percent);
|
|
Assert.That(1, Is.EqualTo(normal[2]).Within(0.001).Percent);
|
|
Assert.That(0.75, Is.EqualTo(circleParams[0]).Within(0.001).Percent);
|
|
Assert.That(0.5, Is.EqualTo(circleParams[1]).Within(0.001).Percent);
|
|
Assert.That(0.15, Is.EqualTo(circleParams[2]).Within(0.001).Percent);
|
|
Assert.That(1.25, Is.EqualTo(circleParams[6]).Within(0.001).Percent);
|
|
}
|
|
|
|
[Test]
|
|
public void SerializeDeserializeTest()
|
|
{
|
|
double mass;
|
|
|
|
using (var doc = OpenDataDocument("Features1.SLDPRT"))
|
|
{
|
|
var part = (ISwPart)m_App.Documents.Active;
|
|
|
|
byte[] buffer;
|
|
|
|
using (var memStr = new MemoryStream())
|
|
{
|
|
var body = part.Bodies.First();
|
|
m_App.MemoryGeometryBuilder.SerializeBody(body, memStr);
|
|
buffer = memStr.ToArray();
|
|
}
|
|
|
|
using (var memStr = new MemoryStream(buffer))
|
|
{
|
|
var body = (ISwBody)m_App.MemoryGeometryBuilder.DeserializeBody(memStr);
|
|
mass = (body.Body.GetMassProperties(0) as double[])[3];
|
|
}
|
|
|
|
Assert.That(2.3851693679806192E-05, Is.EqualTo(mass).Within(0.001).Percent);
|
|
}
|
|
}
|
|
}
|
|
}
|