// Copyright (C) 2004-2006 Autodesk, Inc.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of version 2.1 of the GNU Lesser
// General Public License as published by the Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
using System;
using System.Diagnostics;
using OSGeo.FDO.Geometry;
using OSGeo.FDO.Spatial;
using OSGeo.FDO.Common;
namespace Fdo_Test
{
///
/// Summary description for CommonFuntion.
///
public class Common
{
public const int Dimensionality_XY = 0;
public const int Dimensionality_Z = 1;
public const int Dimensionality_M = 2;
//////////////////////////////////////////////////////////////////////
// Dump...
//////////////////////////////////////////////////////////////////////
public static void DumpPosition(string context, IDirectPosition p)
{
#if DUMPTESTCONTENT
if (p.Dimensionality == Dimensionality_XY)
Console.WriteLine(" {0} XY=({1}, {2})", context, p.X, p.Y);
else if (p.Dimensionality == (Dimensionality_XY|Dimensionality_Z))
Console.WriteLine(" {0} XYZ=({1}, {2}, {3})", context, p.X, p.Y, p.Z);
else if (p.Dimensionality == (Dimensionality_XY|Dimensionality_M))
Console.WriteLine(" {0} XYM=({1}, {2}, {3})", context, p.X, p.Y, p.M);
else if (p.Dimensionality == (Dimensionality_XY|Dimensionality_Z|Dimensionality_M))
Console.WriteLine(" {0} XYZM=({1}, {2}, {3}, {4})", context, p.X, p.Y, p.Z, p.M);
else
Debug.Assert(false, "DumpPosition::UNKNOWN_DIMENSION_TYPE!");
#endif
}
public static void DumpEnvelope(IEnvelope env)
{
#if DUMPTESTCONTENT
Console.WriteLine(" Envelope=min({0}, {1}, {2}) max({3}, {4}, {5})", env.MinX, env.MinY, env.MinZ, env.MaxX, env.MaxY, env.MaxZ);
#endif
}
// Dump FGFT
public static void DumpFGFT(IGeometry p)
{
#if DUMPTESTCONTENT
Console.WriteLine("FGFT = {0}", p.Text);
#endif
}
public static void DumpLineString(ILineString line)
{
#if DUMPTESTCONTENT
Console.WriteLine("{0}:count({1}) dimtype({2}) derivedtype({3}) closed({4})", "LINESTRING", line.Count, line.Dimensionality, line.DerivedType, line.IsClosed);
#endif
IDirectPosition pStart = line.StartPosition;
DumpPosition("", pStart);
IDirectPosition pEnd = line.EndPosition;
DumpPosition("", pEnd);
IEnvelope envl = line.Envelope;
DumpEnvelope(envl);
for (int i=0; i should be <{1}>", geom.Text, fgft));
}
public static void CheckGeometryValidity(SpatialGeometryValidity validity1, SpatialGeometryValidity validity2)
{
Debug.Assert(validity1 == validity2, "Geometry Validity mismatch.");
}
//////////////////////////////////////////////////////////////////////
// Helpers to create repetitive geometries
public static ICurveString CreateCurveString(double offset)
{
FgfGeometryFactory gf = new FgfGeometryFactory();
IDirectPosition startPos = gf.CreatePositionXY(offset+0.0, offset+0.0);
IDirectPosition midPos = gf.CreatePositionXY(offset+0.0, offset+1.0);
IDirectPosition endPos = gf.CreatePositionXY(offset+1.0, offset+2.0);
ICircularArcSegment arcSeg = gf.CreateCircularArcSegment(startPos, midPos, endPos);
DirectPositionCollection points = new DirectPositionCollection();
IDirectPosition pt1 = gf.CreatePositionXY(offset+1.0, offset+2.0);
IDirectPosition pt2 = gf.CreatePositionXY(offset+3.0, offset+0.0);
IDirectPosition pt3 = gf.CreatePositionXY(offset+3.0, offset+2.0);
points.Add(pt1);
points.Add(pt2);
points.Add(pt3);
ILineStringSegment lineSeg = gf.CreateLineStringSegment(points);
CurveSegmentCollection curveSegs = new CurveSegmentCollection();
curveSegs.Add(arcSeg);
curveSegs.Add(lineSeg);
return gf.CreateCurveString(curveSegs);
}
public static IRing CreateRing(double offset)
{
FgfGeometryFactory gf = new FgfGeometryFactory();
IDirectPosition startPos = gf.CreatePositionXY(offset+0.0, offset+0.0);
IDirectPosition midPos = gf.CreatePositionXY(offset+0.0, offset+1.0);
IDirectPosition endPos = gf.CreatePositionXY(offset+1.0, offset+2.0);
ICircularArcSegment arcSeg = gf.CreateCircularArcSegment(startPos, midPos, endPos);
DirectPositionCollection points = new DirectPositionCollection();
IDirectPosition fromPt = gf.CreatePositionXY(offset+1.0, offset+2.0);
IDirectPosition toPt = gf.CreatePositionXY(offset+0.0, offset+0.0);
points.Add(fromPt);
points.Add(toPt);
ILineStringSegment lineSeg = gf.CreateLineStringSegment(points);
CurveSegmentCollection curveSegs = new CurveSegmentCollection();
curveSegs.Add(arcSeg);
curveSegs.Add(lineSeg);
return gf.CreateRing(curveSegs);
}
public static ICurvePolygon CreateCurvePolygon(double offset)
{
IRing extRing = CreateRing(offset + 100);
RingCollection intRings = new RingCollection();
IRing ring1 = CreateRing(offset + 200);
IRing ring2 = CreateRing(offset + 300);
intRings.Add(ring1);
intRings.Add(ring2);
FgfGeometryFactory gf = new FgfGeometryFactory();
return gf.CreateCurvePolygon(extRing, intRings);
}
public static IMultiCurvePolygon CreateMultiCurvePolygon(int numCurvePolys, double offset)
{
CurvePolygonCollection curvePolys = new CurvePolygonCollection();
for (int i=0; i