// ************************************** // Face // ************************************** Face::Face(ifstream &in, const EdgeSetPtr validEdges, FaceSetPtr faces) { LoadName(in); CheckNameForDuplication(faces); EdgeSetPtr temp = new EdgeSet(); LoadEdges(in, temp, validEdges); ConvertToTileSet(temp, tiles); #ifdef _tdebug cout << "created face " << name << endl; #endif } inline TileSetPtr Face::Tiles() { return tiles; } void Face::CheckNameForDuplication(FaceSetPtr faces) { for (unsigned int i=0; isize(); i++) { if ((*faces)[i]->IsCalled(name)) { // error, name duplication Error e("Name duplication in faces\n"); throw(e); } } } void Face::LoadEdges(ifstream &in, EdgeSetPtr loadedEdges, const EdgeSetPtr validEdges) throw(Error) { if (!GetAndDiscard(in, '{')) { Error e("Missing Brace in face definition"); throw(e); } while (!GetAndDiscard(in, '}')) { EdgePtr E = LoadEdge(in, validEdges); loadedEdges->push_back(E); if (NextNonWhite(in) == '}') continue; if (!GetAndDiscard(in, ',')) { Error e("Missing Comma in face definition"); throw(e); } if (in.eof()) { Error e("Missing Brace in face definition"); throw(e); } } } EdgePtr Face::LoadEdge(ifstream &in, EdgeSetPtr validComponents) throw (Error) { string componentName; LoadAlphaString(in, componentName); for (unsigned int i=0; isize(); i++) if ((*validComponents)[i]->IsCalled(componentName)) return (*validComponents)[i]; // error, can't find component Error e("Invalid edge in face specification\n"); throw(e); } unsigned int Face::ConvertToTileSet(const EdgeSetPtr ES, TileSetPtr TS) { // use the algorithm from the notes, return number of tiles }