About the 3D multipatch examples Sample
[C#]
GeometryUtilities.cs
using ESRI.ArcGIS.Geometry; using System; namespace MultiPatchExamples { public static class GeometryUtilities { private static object _missing = Type.Missing; public static void MakeZAware(IGeometry geometry) { IZAware zAware = geometry as IZAware; zAware.ZAware = true; } public static IVector3D ConstructVector3D(double xComponent, double yComponent, double zComponent) { IVector3D vector3D = new Vector3DClass(); vector3D.SetComponents(xComponent, yComponent, zComponent); return vector3D; } public static double GetRadians(double decimalDegrees) { return decimalDegrees * (Math.PI / 180); } public static IPoint ConstructPoint3D(double x, double y, double z) { IPoint point = ConstructPoint2D(x, y); point.Z = z; MakeZAware(point as IGeometry); return point; } public static IPoint ConstructPoint2D(double x, double y) { IPoint point = new PointClass(); point.X = x; point.Y = y; return point; } public static IGeometryCollection ConstructMultiPatchOutline(IGeometry multiPatchGeometry) { IGeometryCollection outlineGeometryCollection = new GeometryBagClass(); IGeometryCollection multiPatchGeometryCollection = multiPatchGeometry as IGeometryCollection; for (int i = 0; i < multiPatchGeometryCollection.GeometryCount; i++) { IGeometry geometry = multiPatchGeometryCollection.get_Geometry(i); switch(geometry.GeometryType) { case (esriGeometryType.esriGeometryTriangleStrip): outlineGeometryCollection.AddGeometryCollection(ConstructTriangleStripOutline(geometry)); break; case (esriGeometryType.esriGeometryTriangleFan): outlineGeometryCollection.AddGeometryCollection(ConstructTriangleFanOutline(geometry)); break; case (esriGeometryType.esriGeometryTriangles): outlineGeometryCollection.AddGeometryCollection(ConstructTrianglesOutline(geometry)); break; case (esriGeometryType.esriGeometryRing): outlineGeometryCollection.AddGeometry(ConstructRingOutline(geometry), ref _missing, ref _missing); break; default: throw new Exception("Unhandled Geometry Type. " + geometry.GeometryType); } } return outlineGeometryCollection; } public static IGeometryCollection ConstructTriangleStripOutline(IGeometry triangleStripGeometry) { IGeometryCollection outlineGeometryCollection = new GeometryBagClass(); IPointCollection triangleStripPointCollection = triangleStripGeometry as IPointCollection; // TriangleStrip: a linked strip of triangles, where every vertex (after the first two) completes a new triangle. // A new triangle is always formed by connecting the new vertex with its two immediate predecessors. for (int i = 2; i < triangleStripPointCollection.PointCount; i++) { IPointCollection outlinePointCollection = new PolylineClass(); outlinePointCollection.AddPoint(triangleStripPointCollection.get_Point(i - 2), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleStripPointCollection.get_Point(i - 1), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleStripPointCollection.get_Point(i), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleStripPointCollection.get_Point(i - 2), ref _missing, ref _missing); //Simulate: Polygon.Close IGeometry outlineGeometry = outlinePointCollection as IGeometry; MakeZAware(outlineGeometry); outlineGeometryCollection.AddGeometry(outlineGeometry, ref _missing, ref _missing); } return outlineGeometryCollection; } public static IGeometryCollection ConstructTriangleFanOutline(IGeometry triangleFanGeometry) { IGeometryCollection outlineGeometryCollection = new GeometryBagClass(); IPointCollection triangleFanPointCollection = triangleFanGeometry as IPointCollection; // TriangleFan: a linked fan of triangles, where every vertex (after the first two) completes a new triangle. // A new triangle is always formed by connecting the new vertex with its immediate predecessor // and the first vertex of the part. for (int i = 2; i < triangleFanPointCollection.PointCount; i++) { IPointCollection outlinePointCollection = new PolylineClass(); outlinePointCollection.AddPoint(triangleFanPointCollection.get_Point(0), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleFanPointCollection.get_Point(i - 1), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleFanPointCollection.get_Point(i), ref _missing, ref _missing); outlinePointCollection.AddPoint(triangleFanPointCollection.get_Point(0), ref _missing, ref _missing); //Simulate: Polygon.Close IGeometry outlineGeometry = outlinePointCollection as IGeometry; MakeZAware(outlineGeometry); outlineGeometryCollection.AddGeometry(outlineGeometry, ref _missing, ref _missing); } return outlineGeometryCollection; } public static IGeometryCollection ConstructTrianglesOutline(IGeometry trianglesGeometry) { IGeometryCollection outlineGeometryCollection = new GeometryBagClass(); IPointCollection trianglesPointCollection = trianglesGeometry as IPointCollection; // Triangles: an unlinked set of triangles, where every three vertices completes a new triangle. if ((trianglesPointCollection.PointCount % 3) != 0) { throw new Exception("Triangles Geometry Point Count Must Be Divisible By 3. " + trianglesPointCollection.PointCount); } else { for (int i = 0; i < trianglesPointCollection.PointCount; i+=3) { IPointCollection outlinePointCollection = new PolylineClass(); outlinePointCollection.AddPoint(trianglesPointCollection.get_Point(i), ref _missing, ref _missing); outlinePointCollection.AddPoint(trianglesPointCollection.get_Point(i + 1), ref _missing, ref _missing); outlinePointCollection.AddPoint(trianglesPointCollection.get_Point(i + 2), ref _missing, ref _missing); outlinePointCollection.AddPoint(trianglesPointCollection.get_Point(i), ref _missing, ref _missing); //Simulate: Polygon.Close IGeometry outlineGeometry = outlinePointCollection as IGeometry; MakeZAware(outlineGeometry); outlineGeometryCollection.AddGeometry(outlineGeometry, ref _missing, ref _missing); } } return outlineGeometryCollection; } public static IGeometry ConstructRingOutline(IGeometry ringGeometry) { IGeometry outlineGeometry = new PolylineClass(); IPointCollection outlinePointCollection = outlineGeometry as IPointCollection; IPointCollection ringPointCollection = ringGeometry as IPointCollection; for (int i = 0; i < ringPointCollection.PointCount; i++) { outlinePointCollection.AddPoint(ringPointCollection.get_Point(i), ref _missing, ref _missing); } outlinePointCollection.AddPoint(ringPointCollection.get_Point(0), ref _missing, ref _missing); //Simulate: Polygon.Close MakeZAware(outlineGeometry); return outlineGeometry; } } }
[Visual Basic .NET]
GeometryUtilities.vb
Imports Microsoft.VisualBasic Imports ESRI.ArcGIS.Geometry Imports System Public Class GeometryUtilities Private Shared _missing As Object = Type.Missing Private Sub New() End Sub Public Shared Sub MakeZAware(ByVal geometry As IGeometry) Dim zAware As IZAware = TryCast(geometry, IZAware) zAware.ZAware = True End Sub Public Shared Function ConstructVector3D(ByVal xComponent As Double, ByVal yComponent As Double, ByVal zComponent As Double) As IVector3D Dim vector3D As IVector3D = New Vector3DClass() vector3D.SetComponents(xComponent, yComponent, zComponent) Return vector3D End Function Public Shared Function GetRadians(ByVal decimalDegrees As Double) As Double Return decimalDegrees * (Math.PI / 180) End Function Public Shared Function ConstructPoint3D(ByVal x As Double, ByVal y As Double, ByVal z As Double) As IPoint Dim point As IPoint = ConstructPoint2D(x, y) point.Z = z MakeZAware(TryCast(point, IGeometry)) Return point End Function Public Shared Function ConstructPoint2D(ByVal x As Double, ByVal y As Double) As IPoint Dim point As IPoint = New PointClass() point.X = x point.Y = y Return point End Function Public Shared Function ConstructMultiPatchOutline(ByVal multiPatchGeometry As IGeometry) As IGeometryCollection Dim outlineGeometryCollection As IGeometryCollection = New GeometryBagClass() Dim multiPatchGeometryCollection As IGeometryCollection = TryCast(multiPatchGeometry, IGeometryCollection) Dim i As Integer = 0 Do While i < multiPatchGeometryCollection.GeometryCount Dim geometry As IGeometry = multiPatchGeometryCollection.Geometry(i) Select Case geometry.GeometryType Case (esriGeometryType.esriGeometryTriangleStrip) outlineGeometryCollection.AddGeometryCollection(ConstructTriangleStripOutline(geometry)) Case (esriGeometryType.esriGeometryTriangleFan) outlineGeometryCollection.AddGeometryCollection(ConstructTriangleFanOutline(geometry)) Case (esriGeometryType.esriGeometryTriangles) outlineGeometryCollection.AddGeometryCollection(ConstructTrianglesOutline(geometry)) Case (esriGeometryType.esriGeometryRing) outlineGeometryCollection.AddGeometry(ConstructRingOutline(geometry), _missing, _missing) Case Else Throw New Exception("Unhandled Geometry Type. " & geometry.GeometryType) End Select i += 1 Loop Return outlineGeometryCollection End Function Public Shared Function ConstructTriangleStripOutline(ByVal triangleStripGeometry As IGeometry) As IGeometryCollection Dim outlineGeometryCollection As IGeometryCollection = New GeometryBagClass() Dim triangleStripPointCollection As IPointCollection = TryCast(triangleStripGeometry, IPointCollection) ' TriangleStrip: a linked strip of triangles, where every vertex (after the first two) completes a new triangle. ' A new triangle is always formed by connecting the new vertex with its two immediate predecessors. Dim i As Integer = 2 Do While i < triangleStripPointCollection.PointCount Dim outlinePointCollection As IPointCollection = New PolylineClass() outlinePointCollection.AddPoint(triangleStripPointCollection.Point(i - 2), _missing, _missing) outlinePointCollection.AddPoint(triangleStripPointCollection.Point(i - 1), _missing, _missing) outlinePointCollection.AddPoint(triangleStripPointCollection.Point(i), _missing, _missing) outlinePointCollection.AddPoint(triangleStripPointCollection.Point(i - 2), _missing, _missing) 'Simulate: Polygon.Close Dim outlineGeometry As IGeometry = TryCast(outlinePointCollection, IGeometry) MakeZAware(outlineGeometry) outlineGeometryCollection.AddGeometry(outlineGeometry, _missing, _missing) i += 1 Loop Return outlineGeometryCollection End Function Public Shared Function ConstructTriangleFanOutline(ByVal triangleFanGeometry As IGeometry) As IGeometryCollection Dim outlineGeometryCollection As IGeometryCollection = New GeometryBagClass() Dim triangleFanPointCollection As IPointCollection = TryCast(triangleFanGeometry, IPointCollection) ' TriangleFan: a linked fan of triangles, where every vertex (after the first two) completes a new triangle. ' A new triangle is always formed by connecting the new vertex with its immediate predecessor ' and the first vertex of the part. Dim i As Integer = 2 Do While i < triangleFanPointCollection.PointCount Dim outlinePointCollection As IPointCollection = New PolylineClass() outlinePointCollection.AddPoint(triangleFanPointCollection.Point(0), _missing, _missing) outlinePointCollection.AddPoint(triangleFanPointCollection.Point(i - 1), _missing, _missing) outlinePointCollection.AddPoint(triangleFanPointCollection.Point(i), _missing, _missing) outlinePointCollection.AddPoint(triangleFanPointCollection.Point(0), _missing, _missing) 'Simulate: Polygon.Close Dim outlineGeometry As IGeometry = TryCast(outlinePointCollection, IGeometry) MakeZAware(outlineGeometry) outlineGeometryCollection.AddGeometry(outlineGeometry, _missing, _missing) i += 1 Loop Return outlineGeometryCollection End Function Public Shared Function ConstructTrianglesOutline(ByVal trianglesGeometry As IGeometry) As IGeometryCollection Dim outlineGeometryCollection As IGeometryCollection = New GeometryBagClass() Dim trianglesPointCollection As IPointCollection = TryCast(trianglesGeometry, IPointCollection) ' Triangles: an unlinked set of triangles, where every three vertices completes a new triangle. If (trianglesPointCollection.PointCount Mod 3) <> 0 Then Throw New Exception("Triangles Geometry Point Count Must Be Divisible By 3. " & trianglesPointCollection.PointCount) Else Dim i As Integer = 0 Do While i < trianglesPointCollection.PointCount Dim outlinePointCollection As IPointCollection = New PolylineClass() outlinePointCollection.AddPoint(trianglesPointCollection.Point(i), _missing, _missing) outlinePointCollection.AddPoint(trianglesPointCollection.Point(i + 1), _missing, _missing) outlinePointCollection.AddPoint(trianglesPointCollection.Point(i + 2), _missing, _missing) outlinePointCollection.AddPoint(trianglesPointCollection.Point(i), _missing, _missing) 'Simulate: Polygon.Close Dim outlineGeometry As IGeometry = TryCast(outlinePointCollection, IGeometry) MakeZAware(outlineGeometry) outlineGeometryCollection.AddGeometry(outlineGeometry, _missing, _missing) i += 3 Loop End If Return outlineGeometryCollection End Function Public Shared Function ConstructRingOutline(ByVal ringGeometry As IGeometry) As IGeometry Dim outlineGeometry As IGeometry = New PolylineClass() Dim outlinePointCollection As IPointCollection = TryCast(outlineGeometry, IPointCollection) Dim ringPointCollection As IPointCollection = TryCast(ringGeometry, IPointCollection) Dim i As Integer = 0 Do While i < ringPointCollection.PointCount outlinePointCollection.AddPoint(ringPointCollection.Point(i), _missing, _missing) i += 1 Loop outlinePointCollection.AddPoint(ringPointCollection.Point(0), _missing, _missing) 'Simulate: Polygon.Close MakeZAware(outlineGeometry) Return outlineGeometry End Function End Class