// 验证CBrepBody体是否合法
static void TestBrepBody(CBrepBody *pBrep, int TestCaseNum, bool ExpectResult, ofstream &outFile)
{
string wrongResult(" 组数据测试失败,用例参见 \\TestCase\\WhiteboxCase\\GGP_23537.txt");
if(ExpectResult)
{
EXPECT_TRUE(pBrep != nullptr) << TestCaseNum << wrongResult;
if(pBrep != nullptr)
{
EXPECT_TRUE(pBrep->IsStrictlyValid()) << TestCaseNum << wrongResult;
// 将体的string写入到outFile 中
bool isOpen = outFile.is_open();
if(isOpen)
{
char *strBrep = pBrep->AsString();
outFile<< TestCaseNum << endl << strBrep <<endl;
delete []strBrep;
}
}
}
else
EXPECT_TRUE(pBrep == nullptr)<<TestCaseNum<< wrongResult;
}
// 读取数据,并造体验证。FilePath:测试用例数据;outFile:生成的体数据
static void TestLoftBody(string FilePath, ofstream &outFile)
{
CPolygon* startPolygon;
CPolygon* endPolygon;
vector<CCurve3d*> spine;
vector<vector<CVector2i> > verticesMap;
int TestCaseNum = 0; // FilePath中用例的标号
bool ExpectResult = true; // 期望结果是成功还是失败
bool isSameCoordOrigin = true; // 标架的原点是否与脊线的始末端点重合
bool isCoordRightAngle = true; // 标架的Z轴是否与路径的始末切矢的夹角theta<(90-g_angle)
bool isUnitCoord = true; // 标架是否单位化的标架
bool isRightHandCoord = true; // 标架是否为右手系标架
ifstream infile(FilePath);
if(!infile)
return;
string line;
while(getline(infile, line))
{
if(line == "[TestCase]")
{
string s_TestCase;
getline(infile, s_TestCase);
TestCaseNum = atoi(s_TestCase.data());
}
if(line == "[startPolygon]") // 放样首端polygon
{
string s_poly;
getline(infile, s_poly);
startPolygon = (CPolygon*)CGeometry::LoadFromStr((char*)s_poly.data());
}
if(line == "[endPolygon]") // 放样末端polygon
{
string s_poly;
getline(infile, s_poly);
endPolygon = (CPolygon*)CGeometry::LoadFromStr((char*)s_poly.data());
}
if(line == "[spine]") // 脊线
{
string s_path;
while(getline(infile, s_path))
{
if(s_path == "[~spine]")
break;
if(s_path == "")
continue;
CCurve3d* pCurve = (CCurve3d*)CGeometry::LoadFromStr((char*)s_path.data());
spine.push_back(pCurve);
}
}
if(line == "[verticesMap]") // 点对应关系
{
string s_map;
while(getline(infile, s_map))
{
if(s_map == "[~verticesMap]")
break;
string s_n1, s_n2;
int n1, n2;
vector<CVector2i> index;
stringstream ss(s_map);
while(ss>>s_n1 && ss>>s_n2)
{
n1 = atoi(s_n1.data());
n2 = atoi(s_n2.data());
index.push_back(CVector2i(n1, n2));
}
if(!index.empty())
verticesMap.push_back(index);
}
}
if(line == "[NotSameCoordOrigin]")
isSameCoordOrigin = false;
if(line == "[NotCoordRightAngle]")
isCoordRightAngle = false;
if(line == "[NotUnitCoord]")
isUnitCoord = false;
if(line == "[NotRightHandCoord]")
isRightHandCoord = false;
if(line == "[ExpectResult]") // 期望结果,1-表示返回体指针,0-表示返回空
{
string s_ExpectResult;
getline(infile, s_ExpectResult);
ExpectResult = atoi(s_ExpectResult.c_str());
}
if(line == "[~TestCase]") // 代表这条用例读完了,造体、验证、释放内存
{
GBodyBuilder bd;
CCoordinates3d coord0, coord1;
CVector3d spineEndVt;
if(!spine.empty()) // 设置 coord0, coord1 的值
{
coord0.ZAxisCoordinates(spine.front()->StartVt());//CVector3d(1.0, 0.0, 0.0)
coord0.Origin = spine.front()->StartPoint();
spineEndVt = spine.back()->EndVt();
coord1.ZAxisCoordinates(spineEndVt);
coord1.Origin = spine.back()->EndPoint();
}
if(!isSameCoordOrigin)
coord0.Origin += CVector3d(1.0, 0.0, 0.0);
if(!isCoordRightAngle)
{
spineEndVt = - spineEndVt;
coord1.ZAxisCoordinates(spineEndVt);
}
if(!isUnitCoord)
coord0.X = CVector3d(2.0, 2.0, 3.0);
if(!isRightHandCoord)
coord1.Z = - coord1.Z;
if(TestCaseNum == 39) // 调试
int o = 37;
// 放样造体
CBrepBody *pB0 = bd.LoftBody(startPolygon, endPolygon, coord0, coord1, spine, verticesMap);
if(isSameCoordOrigin && isCoordRightAngle && isUnitCoord && isRightHandCoord)
TestBrepBody(pB0, TestCaseNum, ExpectResult, outFile);
else
TestBrepBody(pB0, TestCaseNum, false, outFile);
// 释放内存
FREE_PTR(pB0);
FREE_PTR(startPolygon);
FREE_PTR(endPolygon);
for(int i=0; i<spine.size(); i++)
FREE_PTR(spine[i]);
spine.clear();
verticesMap.clear();
TestCaseNum = 0;
ExpectResult = isSameCoordOrigin = isCoordRightAngle = isUnitCoord = isRightHandCoord = true;
}
}
infile.close();
}
// 自定义端面放样造体,测试用例在 GGP_23537.txt 中,共37组
TEST(GeometryBuilder_LoftBody, GGP_23537)
{
string caseNo("GGP_23537");
string FilePath = CFileHelper::GetFilePath(string(caseNo + ".txt"), g_WhiteboxCaseDir);
ofstream outFile;
outFile.open("D:\\LoftBody.txt"); // 测试用例输出文件,调试用 ****提交时需要注释掉该行****
TestLoftBody(FilePath, outFile);
outFile.close();
}
关于测试用例的txt文档
第1组:polygon为三角形,spine为两端线段
[TestCase]
1
[startPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=3,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=1,Pos=(0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge1={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 1.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge2={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 1.00000000000000000000),Dir=(-0.70710678118654746000 -0.70710678118654746000),Range=[0.00000000000000000000 1.41421356237309510000]}}}}
[endPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=3,BoxValid=1,Box2d=[(0.00000000000000000000 0.00000000000000000000),(1.00000000000000000000 1.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=1,Pos=(0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge1={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 1.00000000000000000000),Range=[0.00000000000000000000 1.00000000000000000000]}}Coedge2={TYPE=1301,CurveData={TYPE=1,Pos=(1.00000000000000000000 1.00000000000000000000),Dir=(-0.70710678118654746000 -0.70710678118654746000),Range=[0.00000000000000000000 1.41421356237309510000]}}}}
[spine]
{TYPE=100,Pos=(0.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 10.00000000000000000000]}
{TYPE=100,Pos=(10.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 0.44721359549995793000 0.89442719099991586000),Range=[0.00000000000000000000 22.36067977499789800000]}
[~spine]
[verticesMap]
0 0 1 1 2 2 0 0
[~verticesMap]
[ExpectResult]
1
[~TestCase]
第2组:polygon为圆,spine为两端线段
[TestCase]
2
[startPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=1,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=2,CenterPt=[0.00000000000000000000 0.00000000000000000000],Radius=5.00000000000000000000,Range=[0.00000000000000000000 31.41592653589793100000],ClockSing=1}}}}
[endPolygon]
{TYPE=1309,LoopCount=1,DistEpsilon=0.00010000000000000000,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)],Loop0={TYPE=1304,DistEpsilon=0.00010000000000000000,CoedgeCount=1,BoxValid=1,Box2d=[(-5.00000000000000000000 -5.00000000000000000000),(5.00000000000000000000 5.00000000000000000000)]Coedge0={TYPE=1301,CurveData={TYPE=2,CenterPt=[0.00000000000000000000 0.00000000000000000000],Radius=5.00000000000000000000,Range=[0.00000000000000000000 31.41592653589793100000],ClockSing=1}}}}
[spine]
{TYPE=100,Pos=(0.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(1.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Range=[0.00000000000000000000 10.00000000000000000000]}
{TYPE=100,Pos=(10.00000000000000000000 0.00000000000000000000 0.00000000000000000000),Dir=(0.00000000000000000000 0.44721359549995793000 0.89442719099991586000),Range=[0.00000000000000000000 22.36067977499789800000]}
[~spine]
[verticesMap]
0 0 0 0
[~verticesMap]
[ExpectResult]
1
[~TestCase]
。。。。。。