This repository has been archived on 2023-01-27. You can view files and clone it, but cannot push or open issues or pull requests.
cad/ref/xcad/tests/integration/SolidWorks.Tests.Integration/MemoryGeometryBuilderTests.cs
2022-10-15 19:16:08 +02:00

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);
}
}
}
}