예제 #1
0
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;
}
예제 #2
0
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");
}
예제 #3
0
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 */