# 第三周工作总结
这种的任务是实现两个表的对接:一个表的是SHREC13_SBR_Model.cla,一个表是SHREC13_SBR_Sketch_Test.cla,
两个表之间的连接点在于模型的名字,也是两者的共同点。-
**1.先将各自的数据都存入在结构体中**-
void getModelTraining(string filepath, std::vector<std::string>& p)
{
ifstream testFile(filepath);
if (!testFile)
{
cout << "eorr:" << filepath << endl;
}
float feature;//存储每行的数据
int sizeIntTemp;
string temp;
getline(testFile, temp);
getline(testFile, temp);
stringstream stringin;
while (!testFile.eof())
{
//m M;
modelNode M;
getline(testFile, temp);
testFile >> temp; //name
if (temp.empty())
{
break;
}
M.Aname = temp;
//cout << "name:" << M.Name << endl;
testFile >> sizeIntTemp; //unKnow
testFile >> sizeIntTemp; //size
M.Asize = sizeIntTemp;
//cout << "size:" << M.msize << endl;
for (int i = 0; i < sizeIntTemp; i++)
{
testFile >> feature;
M.Adata.push_back(feature);
}
for (vector<int>::size_type i = 0; i != (M.Adata.size() - 1); i++)
{
//cout << "M.data:" << M.data[i] << endl;
}
oneModelTab.oneModel.push_back(M);
}
testFile.close();
**2.使用迭代器遍历结构体**-
typedef struct modelNode {
string Aname;
int Asize;
vector<int> Adata;
}Amodel;
typedef struct ModelTable
{
vector<modelNode> oneModel;
};
ModelTable oneModelTab;
ModelTable skecthTab;
**3.数据对接,如名字相同时,得到结构体内的数据**
string model_name ;
cout << "input your want model_name:" << endl;
while (cin >> model_name)
{
auto iter = skecthTab.oneModel.begin();
for (; iter != skecthTab.oneModel.end(); ++iter)
{
if (model_name == iter->Aname)
{
cout << "model_name对应的图集:" << endl;
for (int i = 0; i < iter->Asize; i++)
{
cout << iter->Adata[i] << endl;
}
break;
}
}
if (iter == skecthTab.oneModel.end())
{
cout << "没找到相同名字,重新输入:" << endl;
continue;
}
break;
}
**4.实现通过m.off找到它对应模型的草图**-
void getTrainingSetImage( const string targetmesh, std::vector<std::string>& r)
{
string AssetName ;
string s1;
//cout << targetmesh << "的图集是: " << endl;
auto iter = skecthTab.oneModel.begin();
for (; iter != skecthTab.oneModel.end(); ++iter)
{
AssetName = iter->Aname;
if (AssetName == targetmesh)
{
for (int i = 0; i < iter->Asize; i++)
{
//GetModelPng(sketchTesr);
int aa = iter->Adata[i];
char c[8];
sprintf_s(c, "%d", aa);
s1 = c;
string imagePath = "F:/Sketch3D/Sketch3DToolkit-master/matlab/dataset/others/SHREC13_SBR_TESTING_SKETCHES/" + targetmesh + "/test/" + s1 + ".png" ;
r.push_back(imagePath);
//cout << "F:/Sketch3D/Sketch3DToolkit-master/matlab/dataset/others/SHREC13_SBR_TESTING_SKETCHES/" + targetmesh + "/test/" + s1 + ".png" << endl;
//cout << imagePath << endl;
}
}
}
}
**5.实现单个模型分别存储得到的草图**-
这个函数跟下面的存储全部模型草图的方法差不多,只不过是模型名字不一致,一开始是通过模型的mxx.off来找到模型,再通过模型名字找到草图表中的对应模型的png图片
**6.存储全部模型的草图**
ViewIndexer view_indexer;
unique_ptr<BatchMeshWindow> main_window_ptr = initGLContext();
vector<ViewInfo> view_info_vector;
GetModelPng(sketchTesr);//sketchTesr是草图表
string target_mesh;
std::vector<std::string> target;
vector<std::string> target_sketch_vector;
getModelTraining(ModelCla,target);//遍历SHREC13_SBR_Sketch_Test.cla,输入模型名字,便能得到模型名字对应的.png文件,
for (auto i = target.begin(); i != target.end(); ++i)
{
target_mesh = *i;//得到的所有模型的名字
getTrainingSetImage(target_mesh, target_sketch_vector);
//将得到的模型路径传给target_sketch_vector
for (auto iter = oneModelTab.oneModel.begin(); iter != oneModelTab.oneModel.end(); ++iter)
{
if (target_mesh == iter->Aname)
{
for (int i = 0; i < iter->Asize; i++)
{
char c[8];
int aa = iter->Adata[i];
sprintf_s(c, "%d", aa);
s1 = c;
target_mesh = "F:/Sketch3D/Sketch3DToolkit-master/matlab/dataset/SHREC13_SBR_TARGET_MODELS/models/m" + s1 + ".off";
cout << "[info]: Sampling mesh viewpoints." << endl;
vector<ViewInfo> view_info_vector = sampleMeshViewpoints(target_mesh, *main_window_ptr);
//生成草图的png图片和.xf文件(包含草图的顶点信息)
}
}
}
}