#include "GeometricModeling.h"
int g_nSampleCount = 16;
double PI = 3.1415926535897932384626433832795;
bool GeometricModeling::GetModel_RoundPipe(const ParamRoundPipe& Param, OUT DataModel& Model)
{
Model = DataModel();
DataModel SubModel;
SubModel.sName = L"圆管侧壁";
DataBatch Batch;
//构造管线侧面顶点和法线
{
AcGeVector3d PipeOffset = Param.EndPoint - Param.BeginPoint;
AcGeVector3d PipeDirection = PipeOffset.normal();
AcGeVector3d PipePlanDirection = fabs(PipeDirection.dotProduct(AcGeVector3d::kXAxis)) < fabs(PipeDirection.dotProduct(AcGeVector3d::kYAxis)) ? AcGeVector3d::kXAxis : AcGeVector3d::kYAxis;
AcGeVector3d PipeFirstSampleDirection = PipeDirection.crossProduct(PipePlanDirection).normal();
AcGePoint3d PipeFirstSamplePoint = Param.BeginPoint + PipeFirstSampleDirection * (Param.diameter / 2);
double fSampleAngleDiff = (2 * PI) / g_nSampleCount;
//起点
{
for (int i = 0; i <= g_nSampleCount; ++i)
{
AcGeMatrix3d Trans;
Trans.setToRotation(i * fSampleAngleDiff, PipeDirection, Param.BeginPoint);
AcGePoint3d EachPointBegin = PipeFirstSamplePoint;
EachPointBegin.transformBy(Trans);
AcGeVector3d EachSampleDirection = PipeFirstSampleDirection;
EachSampleDirection.transformBy(Trans);
Batch.PushPoint(
DataPoint(
EachPointBegin.x, EachPointBegin.y, EachPointBegin.z,
EachSampleDirection.x, EachSampleDirection.y, EachSampleDirection.z,
0, Param.fVRepeatCount * (double(i) / g_nSampleCount)
)
);
}
}
//终点
{
for (int i = 0; i <= g_nSampleCount; ++i)
{
AcGeMatrix3d Trans;
Trans.setToRotation(i * fSampleAngleDiff, PipeDirection, Param.BeginPoint);
AcGePoint3d EachPointBegin = PipeFirstSamplePoint;
EachPointBegin.transformBy(Trans);
AcGeVector3d EachSampleDirection = PipeFirstSampleDirection;
EachSampleDirection.transformBy(Trans);
AcGePoint3d EachPointEnd = EachPointBegin + PipeOffset;
Batch.PushPoint(
DataPoint(
EachPointEnd.x, EachPointEnd.y, EachPointEnd.z,
EachSampleDirection.x, EachSampleDirection.y, EachSampleDirection.z,
Param.fURepeatCount, Param.fVRepeatCount * (double(i) / g_nSampleCount)
)
);
}
}
}
//构造管线侧面三角形
{
int VertexIndexOffset = g_nSampleCount;
for (int i = 0; i <= g_nSampleCount; ++i)
{
Batch.PushIndexFace(DataIndexFace(i, VertexIndexOffset + i + 1, VertexIndexOffset + i));
Batch.PushIndexFace(DataIndexFace(i, i + 1, VertexIndexOffset + i + 1));
}
}
SubModel.BatchArray.push_back(Batch);
Model.ModelArray.push_back(SubModel);
return true;
}
bool GeometricModeling::GetModel_PipeElbow(const ParamPipeElbow& Param, OUT DataModel& Model)
{
//创建对应圆弧
AcGePoint3d cent;
AcGeVector3d nrm;
AcGeVector3d refVec;
double radius;
double startAngle;
double endAngle;
{
AcGeVector3d BeginSide = Param.pt3dBegin - Param.pt3dCross;
AcGeVector3d EndSide = Param.pt3dEnd - Param.pt3dCross;
AcGePoint3d BeginPoint = Param.pt3dBegin;
AcGePoint3d EndPoint = Param.pt3dEnd;
if (BeginSide.length() >= EndSide.length())
{
radius = BeginSide.length();
EndPoint = Param.pt3dCross + EndSide.normal() * radius;
}
else
{
radius = EndSide.length();
BeginPoint = Param.pt3dCross + BeginSide.normal() * radius;
}
BeginSide = BeginPoint - Param.pt3dCross;
EndSide = EndPoint - Param.pt3dCross;
endAngle = fabs(PI - BeginSide.angleTo(EndSide));
startAngle = 0;
nrm = (-BeginSide).crossProduct(EndSide).normal();
radius = BeginSide.length() / tan(endAngle / 2);
AcGeVector3d vt3dA = (BeginPoint - Param.pt3dCross).normal().rotateBy(PI / 2, nrm);
AcGeVector3d vt3dB = (BeginPoint - Param.pt3dCross).normal().rotateBy(PI / 2, -nrm);
AcGePoint3d centA = BeginPoint + vt3dA * radius;
AcGePoint3d centB = BeginPoint + vt3dB * radius;
cent = (centA.distanceTo(EndPoint) < centB.distanceTo(EndPoint)) ? centA : centB;
refVec = (BeginPoint - cent).normal();
}
AcGeCircArc3d Arc(cent, nrm, refVec, radius, startAngle, endAngle);
double fTotalLength = endAngle * radius;
//管侧面
{
DataModel SubModel;
SubModel.sName = L"弯头侧面";
DataBatch Batch;
//构造管线侧面顶点和法线
{
AcGePoint3dArray SamplePointArray;
Arc.getSamplePoints(g_nSampleCount, SamplePointArray);
for (int iA = 0; iA < SamplePointArray.length() - 1; ++iA)
{
AcGePoint3d BeginPoint = SamplePointArray[iA];
AcGePoint3d EndPoint = SamplePointArray[iA + 1];
double fSampleAngleDiff = (2 * PI) / g_nSampleCount;
//起点
if (0 == iA)
{
AcGeLine3d TangentLine;
Arc.tangent(BeginPoint, TangentLine);
AcGeVector3d pt3dDirection = -TangentLine.direction();
AcGeVector3d PipeFirstSampleDirection = pt3dDirection.crossProduct(nrm).normal();
AcGePoint3d PipeFirstSamplePoint = BeginPoint + PipeFirstSampleDirection * (Param.fD / 2);
for (int i = 0; i <= g_nSampleCount; ++i)
{
AcGeMatrix3d Trans;
Trans.setToRotation(i * fSampleAngleDiff, pt3dDirection, BeginPoint);
AcGePoint3d EachPointBegin = PipeFirstSamplePoint;
EachPointBegin.transformBy(Trans);
AcGeVector3d EachSampleDirection = PipeFirstSampleDirection;
EachSampleDirection.transformBy(Trans);
double fU = Param.fURepeatCount * double(iA) / (SamplePointArray.length() - 1);
Batch.PushPoint(
DataPoint(
EachPointBegin.x, EachPointBegin.y, EachPointBegin.z,
EachSampleDirection.x, EachSampleDirection.y, EachSampleDirection.z,
fU, Param.fVRepeatCount * (double(i) / g_nSampleCount)
)
);
}
}
//终点
{
AcGeLine3d TangentLine;
Arc.tangent(EndPoint, TangentLine);
AcGeVector3d pt3dDirection = -TangentLine.direction();
AcGeVector3d PipeFirstSampleDirection = pt3dDirection.crossProduct(nrm).normal();
AcGePoint3d PipeFirstSamplePoint = EndPoint + PipeFirstSampleDirection * (Param.fD / 2);
for (int i = 0; i <= g_nSampleCount; ++i)
{
AcGeMatrix3d Trans;
Trans.setToRotation(i * fSampleAngleDiff, pt3dDirection, EndPoint);
AcGePoint3d EachPointEnd = PipeFirstSamplePoint;
EachPointEnd.transformBy(Trans);
AcGeVector3d EachSampleDirection = PipeFirstSampleDirection;
EachSampleDirection.transformBy(Trans);
double fU = Param.fURepeatCount * double(iA + 1) / (SamplePointArray.length() - 1);
Batch.PushPoint(
DataPoint(
EachPointEnd.x, EachPointEnd.y, EachPointEnd.z,
EachSampleDirection.x, EachSampleDirection.y, EachSampleDirection.z,
fU, Param.fVRepeatCount * (double(i) / g_nSampleCount)
)
);
}
}
//构造管线侧面三角形
{
int ArcSampleVertexIndexOffset = iA * (g_nSampleCount + 1);
int BeginEndVertexIndexOffset = g_nSampleCount;
for (int i = 0; i <= g_nSampleCount; ++i)
{
Batch.PushIndexFace(DataIndexFace(
ArcSampleVertexIndexOffset + i,
ArcSampleVertexIndexOffset + BeginEndVertexIndexOffset + i + 1,
ArcSampleVertexIndexOffset + BeginEndVertexIndexOffset + i));
Batch.PushIndexFace(DataIndexFace(
ArcSampleVertexIndexOffset + i,
ArcSampleVertexIndexOffset + i + 1,
ArcSampleVertexIndexOffset + BeginEndVertexIndexOffset + i + 1));
}
}
}
}
SubModel.BatchArray.push_back(Batch);
Model.ModelArray.push_back(SubModel);
}
//起点法兰
//{
// AcGePoint3d BeginPoint = Param.pt3dBegin;
// AcGePoint3d EndPoint = Param.pt3dCross;
// AcGeVector3d PipeOffset = EndPoint - BeginPoint;
// AcGeVector3d PipeDirection = PipeOffset.normal();
// EndPoint = BeginPoint + PipeDirection * Param.fFlange_Thickness;
// PipeOffset = EndPoint - BeginPoint;
// ParamFlange ParamF;
// ParamF.pt3dBegin = BeginPoint;
// P