// 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