bool vtStructureArray::WriteXML(const char* filename, bool bGZip) const { VTLOG("WriteXML(%s)\n", filename); // Avoid trouble with '.' and ',' in Europe LocaleWrap normal_numbers(LC_NUMERIC, "C"); GZOutput out(bGZip); if (!gfopen(out, filename)) { throw xh_io_exception("Could not open output file", xh_location(filename), "XML Writer"); } gfprintf(out, "<?xml version=\"1.0\"?>\n"); gfprintf(out, "\n"); gfprintf(out, "<StructureCollection xmlns=\"http://www.openplans.net\"\n" "\t\t\t\t\t xmlns:gml=\"http://www.opengis.net/gml\"\n" "\t\t\t\t\t xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n" "\t\t\t\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" "\t\t\t\t\t xsi:schemaLocation=\"http://www.openplans.net/buildings.xsd\">\n"); gfprintf(out, "\n"); // Write the extents (required by gml:StructureCollection) DRECT ext; GetExtents(ext); gfprintf(out, "\t<gml:boundedBy>\n"); gfprintf(out, "\t\t<gml:Box>\n"); gfprintf(out, "\t\t\t<gml:coordinates>"); gfprintf(out, "%.9lf,%.9lf %.9lf,%.9lf", ext.left, ext.bottom, ext.right, ext.top); gfprintf(out, "</gml:coordinates>\n"); gfprintf(out, "\t\t</gml:Box>\n"); gfprintf(out, "\t</gml:boundedBy>\n"); gfprintf(out, "\n"); // Write projection char *wkt; OGRErr err = m_proj.exportToWkt(&wkt); if (err != OGRERR_NONE) { throw xh_io_exception("Couldn't write CRS to file", xh_location(filename), "XML Writer"); } gfprintf(out, "\t<SRS>%s</SRS>\n", wkt); gfprintf(out, "\n"); OGRFree(wkt); bool bDegrees = (m_proj.IsGeographic() == 1); for (uint i = 0; i < GetSize(); i++) { vtStructure *str = GetAt(i); str->WriteXML(out, bDegrees); } gfprintf(out, "</StructureCollection>\n"); gfclose(out); return true; }
void vtBuilding::WriteXML(GZOutput &out, bool bDegrees) const { const char *coord_format = "%.9lg"; // up to 9 significant digits gfprintf(out, "\t<Building"); if (m_fElevationOffset != 0.0) gfprintf(out, " ElevationOffset=\"%.2f\"", m_fElevationOffset); if (m_bAbsolute) gfprintf(out, " Absolute=\"true\""); gfprintf(out, ">\n"); int i, j, k; int levels = GetNumLevels(); for (i = 0; i < levels; i++) { const vtLevel *lev = GetLevel(i); gfprintf(out, "\t\t<Level FloorHeight=\"%f\" StoryCount=\"%d\">\n", lev->m_fStoryHeight, lev->m_iStories); gfprintf(out, "\t\t\t<Footprint>\n"); gfprintf(out, "\t\t\t\t<gml:Polygon>\n"); // Every footprint polygon has at least one outer boundary gfprintf(out, "\t\t\t\t\t<gml:outerBoundaryIs>\n"); gfprintf(out, "\t\t\t\t\t\t<gml:LinearRing>\n"); gfprintf(out, "\t\t\t\t\t\t\t<gml:coordinates>"); const DPolygon2 &pfoot = lev->GetFootprint(); const DLine2 &outer = pfoot[0]; int points = outer.GetSize(); for (j = 0; j < points; j++) { gfprintf(out, coord_format, outer[j].x); gfprintf(out, ","); gfprintf(out, coord_format, outer[j].y); if (j != points-1) gfprintf(out, " "); } gfprintf(out, "</gml:coordinates>\n"); gfprintf(out, "\t\t\t\t\t\t</gml:LinearRing>\n"); gfprintf(out, "\t\t\t\t\t</gml:outerBoundaryIs>\n"); // If we have a compound footprint, write inner rings separately int rings = pfoot.size(); for (int iring = 1; iring < rings; iring++) { gfprintf(out, "\t\t\t\t\t<gml:innerBoundaryIs>\n"); gfprintf(out, "\t\t\t\t\t\t<gml:LinearRing>\n"); gfprintf(out, "\t\t\t\t\t\t\t<gml:coordinates>"); const DLine2 &inner = pfoot[iring]; int points = inner.GetSize(); for (j = 0; j < points; j++) { gfprintf(out, coord_format, inner[j].x); gfprintf(out, ","); gfprintf(out, coord_format, inner[j].y); if (j != points-1) gfprintf(out, " "); } gfprintf(out, "</gml:coordinates>\n"); gfprintf(out, "\t\t\t\t\t\t</gml:LinearRing>\n"); gfprintf(out, "\t\t\t\t\t</gml:innerBoundaryIs>\n"); } gfprintf(out, "\t\t\t\t</gml:Polygon>\n"); gfprintf(out, "\t\t\t</Footprint>\n"); int edges = lev->NumEdges(); for (j = 0; j < edges; j++) { vtEdge *edge = lev->GetEdge(j); gfprintf(out, "\t\t\t<Edge"); if (edge->m_pMaterial) gfprintf(out, " Material=\"%s\"", (const char *)*edge->m_pMaterial); gfprintf(out, " Color=\"%02x%02x%02x\"", edge->m_Color.r, edge->m_Color.g, edge->m_Color.b); if (edge->m_iSlope != 90) gfprintf(out, " Slope=\"%d\"", edge->m_iSlope); if (edge->m_fEaveLength != 0.0f) gfprintf(out, " EaveLength=\"%f\"", edge->m_fEaveLength); if (!edge->m_Facade.IsEmpty()) gfprintf(out, " Facade=\"%s\"", (pcchar)edge->m_Facade); gfprintf(out, ">\n"); int features = edge->NumFeatures(); for (k = 0; k < features; k++) { gfprintf(out, "\t\t\t\t<EdgeElement"); const vtEdgeFeature &feat = edge->m_Features[k]; gfprintf(out, " Type=\"%s\"", vtBuilding::GetEdgeFeatureString(feat.m_code)); if (feat.m_vf1 != 0.0f) gfprintf(out, " Begin=\"%.3f\"", feat.m_vf1); if (feat.m_vf2 != 1.0f) gfprintf(out, " End=\"%.3f\"", feat.m_vf2); gfprintf(out, "/>\n"); } gfprintf(out, "\t\t\t</Edge>\n"); } gfprintf(out, "\t\t</Level>\n"); } WriteTags(out); gfprintf(out, "\t</Building>\n"); }
static void ascii_showboard(void) { int i, j; char letterbar[64]; int last_pos_was_move; int pos_is_move; int dead; int last_move = get_last_move(); make_letterbar(board_size, letterbar); set_handicap_spots(board_size); printf("\n"); printf(" White (O) has captured %d stone%s\n", black_captured, black_captured == 1 ? "" : "s"); printf(" Black (X) has captured %d stone%s\n", white_captured, white_captured == 1 ? "" : "s"); if (showscore) { if (current_score_estimate == NO_SCORE) printf(" No score estimate is available yet.\n"); else if (current_score_estimate < 0) printf(" Estimated score: Black is ahead by %d\n", -current_score_estimate); else if (current_score_estimate > 0) printf(" Estimated score: White is ahead by %d\n", current_score_estimate); else printf(" Estimated score: Even!\n"); } printf("\n"); fflush(stdout); printf("%s", letterbar); if (get_last_player() != EMPTY) { gfprintf(stdout, " Last move: %s %1m", get_last_player() == WHITE ? "White" : "Black", last_move); } printf("\n"); fflush(stdout); for (i = 0; i < board_size; i++) { printf(" %2d", board_size - i); last_pos_was_move = 0; for (j = 0; j < board_size; j++) { if (POS(i, j) == last_move) pos_is_move = 128; else pos_is_move = 0; dead = (dragon_status(POS(i, j)) == DEAD) && showdead; switch (BOARD(i, j) + pos_is_move + last_pos_was_move) { case EMPTY+128: case EMPTY: printf(" %c", hspots[i][j]); last_pos_was_move = 0; break; case BLACK: printf(" %c", dead ? 'x' : 'X'); last_pos_was_move = 0; break; case WHITE: printf(" %c", dead ? 'o' : 'O'); last_pos_was_move = 0; break; case BLACK+128: printf("(%c)", 'X'); last_pos_was_move = 256; break; case WHITE+128: printf("(%c)", 'O'); last_pos_was_move = 256; break; case EMPTY+256: printf("%c", hspots[i][j]); last_pos_was_move = 0; break; case BLACK+256: printf("%c", dead ? 'x' : 'X'); last_pos_was_move = 0; break; case WHITE+256: printf("%c", dead ? 'o' : 'O'); last_pos_was_move = 0; break; default: fprintf(stderr, "Illegal board value %d\n", (int) BOARD(i, j)); exit(EXIT_FAILURE); break; } } if (last_pos_was_move == 0) { if (board_size > 10) printf(" %2d", board_size - i); else printf(" %1d", board_size - i); } else { if (board_size > 10) printf("%2d", board_size - i); else printf("%1d", board_size - i); } printf("\n"); } fflush(stdout); printf("%s\n\n", letterbar); fflush(stdout); if (clock_on) { clock_print(WHITE); clock_print(BLACK); } } /* end ascii_showboard */