ArcObjects Library Reference  

CompositeExamples

About the 3D multipatch examples Sample

[C#]

CompositeExamples.cs

using ESRI.ArcGIS.Geometry;
using System;

namespace MultiPatchExamples
{
    public static class CompositeExamples
    {
        private static object _missing = Type.Missing;

        public static IGeometry GetExample1()
        {
            //Composite: Multiple, Disjoint Geometries Contained Within A Single MultiPatch

            IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();

            IMultiPatch multiPatch = multiPatchGeometryCollection as IMultiPatch;

            //Vector3D Example 2

            IGeometry vector3DExample2Geometry = Vector3DExamples.GetExample2();

            ITransform3D vector3DExample2Transform3D = vector3DExample2Geometry as ITransform3D;
            vector3DExample2Transform3D.Move3D(5, 5, 0);

            IGeometryCollection vector3DExample2GeometryCollection = vector3DExample2Geometry as IGeometryCollection;

            for (int i = 0; i < vector3DExample2GeometryCollection.GeometryCount; i++)
            {
                multiPatchGeometryCollection.AddGeometry(vector3DExample2GeometryCollection.get_Geometry(i), ref _missing, ref _missing);
            }

            //Vector3D Example 3

            IGeometry vector3DExample3Geometry = Vector3DExamples.GetExample3();

            ITransform3D vector3DExample3Transform3D = vector3DExample3Geometry as ITransform3D;
            vector3DExample3Transform3D.Move3D(5, -5, 0);

            IGeometryCollection vector3DExample3GeometryCollection = vector3DExample3Geometry as IGeometryCollection;

            for (int i = 0; i < vector3DExample3GeometryCollection.GeometryCount; i++)
            {
                multiPatchGeometryCollection.AddGeometry(vector3DExample3GeometryCollection.get_Geometry(i), ref _missing, ref _missing);
            }

            //Vector3D Example 4

            IGeometry vector3DExample4Geometry = Vector3DExamples.GetExample4();

            ITransform3D vector3DExample4Transform3D = vector3DExample4Geometry as ITransform3D;
            vector3DExample4Transform3D.Move3D(-5, -5, 0);

            IGeometryCollection vector3DExample4GeometryCollection = vector3DExample4Geometry as IGeometryCollection;

            for (int i = 0; i < vector3DExample4GeometryCollection.GeometryCount; i++)
            {
                multiPatchGeometryCollection.AddGeometry(vector3DExample4GeometryCollection.get_Geometry(i), ref _missing, ref _missing);
            }

            //Vector3D Example 5

            IGeometry vector3DExample5Geometry = Vector3DExamples.GetExample5();

            ITransform3D vector3DExample5Transform3D = vector3DExample5Geometry as ITransform3D;
            vector3DExample5Transform3D.Move3D(-5, 5, 0);

            IGeometryCollection vector3DExample5GeometryCollection = vector3DExample5Geometry as IGeometryCollection;

            for (int i = 0; i < vector3DExample5GeometryCollection.GeometryCount; i++)
            {
                multiPatchGeometryCollection.AddGeometry(vector3DExample5GeometryCollection.get_Geometry(i), ref _missing, ref _missing);
            }

            return multiPatchGeometryCollection as IGeometry;
        }

        public static IGeometry GetExample2()
        {
            //Composite: Cutaway Of Building With Multiple Floors Composed Of 1 TriangleStrip And 5 Ring Parts

            IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();

            IMultiPatch multiPatch = multiPatchGeometryCollection as IMultiPatch;

            //Walls

            IPointCollection wallsPointCollection = new TriangleStripClass();

            //Start

            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 0), ref _missing, ref _missing);
            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 16), ref _missing, ref _missing);

            //Right Wall

            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 0), ref _missing, ref _missing);
            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 16), ref _missing, ref _missing);

            //Back Wall

            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 0), ref _missing, ref _missing);
            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 16), ref _missing, ref _missing);

            //Left Wall

            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 0), ref _missing, ref _missing);
            wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 16), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(wallsPointCollection as IGeometry, ref _missing, ref _missing);

            //Floors

            //Base

            IPointCollection basePointCollection = new RingClass();
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 0), ref _missing, ref _missing);

            IRing baseRing = basePointCollection as IRing;
            baseRing.Close();

            multiPatchGeometryCollection.AddGeometry(baseRing as IGeometry, ref _missing, ref _missing);

            //First Floor

            IPointCollection firstFloorPointCollection = new RingClass();
            firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 4), ref _missing, ref _missing);
            firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 4), ref _missing, ref _missing);
            firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 4), ref _missing, ref _missing);
            firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 4), ref _missing, ref _missing);

            IRing firstFloorRing = firstFloorPointCollection as IRing;
            firstFloorRing.Close();

            multiPatchGeometryCollection.AddGeometry(firstFloorRing as IGeometry, ref _missing, ref _missing);

            //Second Floor

            IPointCollection secondFloorPointCollection = new RingClass();
            secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 8), ref _missing, ref _missing);
            secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 8), ref _missing, ref _missing);
            secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 8), ref _missing, ref _missing);
            secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 8), ref _missing, ref _missing);

            IRing secondFloorRing = secondFloorPointCollection as IRing;
            secondFloorRing.Close();

            multiPatchGeometryCollection.AddGeometry(secondFloorRing as IGeometry, ref _missing, ref _missing);

            //Third Floor

            IPointCollection thirdFloorPointCollection = new RingClass();
            thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 12), ref _missing, ref _missing);
            thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 12), ref _missing, ref _missing);
            thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 12), ref _missing, ref _missing);
            thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 12), ref _missing, ref _missing);

            IRing thirdFloorRing = thirdFloorPointCollection as IRing;
            thirdFloorRing.Close();

            multiPatchGeometryCollection.AddGeometry(thirdFloorRing as IGeometry, ref _missing, ref _missing);

            //Roof

            IPointCollection roofPointCollection = new RingClass();
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 16), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 16), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 16), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 16), ref _missing, ref _missing);

            IRing roofRing = roofPointCollection as IRing;
            roofRing.Close();

            multiPatchGeometryCollection.AddGeometry(roofRing as IGeometry, ref _missing, ref _missing);

            return multiPatchGeometryCollection as IGeometry;
        }

        public static IGeometry GetExample3()
        {
            //Composite: House Composed Of 7 Ring, 1 TriangleStrip, And 1 Triangles Parts

            IGeometryCollection multiPatchGeometryCollection = new MultiPatchClass();

            IMultiPatch multiPatch = multiPatchGeometryCollection as IMultiPatch;

            //Base (Exterior Ring)

            IPointCollection basePointCollection = new RingClass();
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), ref _missing, ref _missing);
            basePointCollection.AddPoint(basePointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(basePointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(basePointCollection as IRing, esriMultiPatchRingType.esriMultiPatchOuterRing);

            //Front With Cutaway For Door (Exterior Ring)

            IPointCollection frontPointCollection = new RingClass();
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 1, 0), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 1, 4), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -1, 4), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -1, 0), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), ref _missing, ref _missing);
            frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), ref _missing, ref _missing);
            frontPointCollection.AddPoint(frontPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(frontPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(frontPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchOuterRing);

            //Back (Exterior Ring)

            IPointCollection backPointCollection = new RingClass();
            backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), ref _missing, ref _missing);
            backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), ref _missing, ref _missing);
            backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), ref _missing, ref _missing);
            backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), ref _missing, ref _missing);
            backPointCollection.AddPoint(backPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(backPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(backPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchOuterRing);

            //Right Side (Ring Group)

            //Exterior Ring

            IPointCollection rightSideExteriorPointCollection = new RingClass();
            rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), ref _missing, ref _missing);
            rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), ref _missing, ref _missing);
            rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), ref _missing, ref _missing);
            rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), ref _missing, ref _missing);
            rightSideExteriorPointCollection.AddPoint(rightSideExteriorPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(rightSideExteriorPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(rightSideExteriorPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchOuterRing);

            //Interior Ring

            IPointCollection rightSideInteriorPointCollection = new RingClass();
            rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, 4, 4), ref _missing, ref _missing);
            rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, 4, 2), ref _missing, ref _missing);
            rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, 4, 2), ref _missing, ref _missing);
            rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, 4, 4), ref _missing, ref _missing);
            rightSideInteriorPointCollection.AddPoint(rightSideInteriorPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(rightSideInteriorPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(rightSideInteriorPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchInnerRing);

            //Left Side (Ring Group)

            //Exterior Ring

            IPointCollection leftSideExteriorPointCollection = new RingClass();
            leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), ref _missing, ref _missing);
            leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), ref _missing, ref _missing);
            leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), ref _missing, ref _missing);
            leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), ref _missing, ref _missing);
            leftSideExteriorPointCollection.AddPoint(leftSideExteriorPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(leftSideExteriorPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(leftSideExteriorPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchOuterRing);

            //Interior Ring

            IPointCollection leftSideInteriorPointCollection = new RingClass();
            leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, -4, 4), ref _missing, ref _missing);
            leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, -4, 4), ref _missing, ref _missing);
            leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, -4, 2), ref _missing, ref _missing);
            leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, -4, 2), ref _missing, ref _missing);
            leftSideInteriorPointCollection.AddPoint(leftSideInteriorPointCollection.get_Point(0), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(leftSideInteriorPointCollection as IGeometry, ref _missing, ref _missing);

            multiPatch.PutRingType(leftSideInteriorPointCollection as IRing, esriMultiPatchRingType.esriMultiPatchInnerRing);

            //Roof

            IPointCollection roofPointCollection = new TriangleStripClass();
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 0, 9), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 0, 9), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), ref _missing, ref _missing);
            roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(roofPointCollection as IGeometry, ref _missing, ref _missing);

            //Triangular Area Between Roof And Front/Back

            IPointCollection triangularAreaPointCollection = new TrianglesClass();

            //Area Between Roof And Front

            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 0, 9), ref _missing, ref _missing);
            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), ref _missing, ref _missing);
            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), ref _missing, ref _missing);

            //Area Between Roof And Back

            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 0, 9), ref _missing, ref _missing);
            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), ref _missing, ref _missing);
            triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), ref _missing, ref _missing);

            multiPatchGeometryCollection.AddGeometry(triangularAreaPointCollection as IGeometry, ref _missing, ref _missing);

            return multiPatchGeometryCollection as IGeometry;
        }

        public static IGeometry GetExample4()
        {
            const double CircleDegrees = 360.0;
            const int CircleDivisions = 18;
            const double VectorComponentOffset = 0.0000001;
            const double InnerBuildingRadius = 3.0;
            const double OuterBuildingExteriorRingRadius = 9.0;
            const double OuterBuildingInteriorRingRadius = 6.0;
            const double BaseZ = 0.0;
            const double InnerBuildingZ = 16.0;
            const double OuterBuildingZ = 6.0;

            //Composite: Tall Building Protruding Through Outer Ring-Shaped Building

            IMultiPatch multiPatch = new MultiPatchClass();

            IGeometryCollection multiPatchGeometryCollection = multiPatch as IGeometryCollection;

            IPoint originPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0);

            IVector3D upperAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10);

            IVector3D lowerAxisVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10);

            lowerAxisVector3D.XComponent += VectorComponentOffset;

            IVector3D normalVector3D = upperAxisVector3D.CrossProduct(lowerAxisVector3D) as IVector3D;

            double rotationAngleInRadians = GeometryUtilities.GetRadians(CircleDegrees / CircleDivisions);

            //Inner Building

            IGeometry innerBuildingBaseGeometry = new PolygonClass();

            IPointCollection innerBuildingBasePointCollection = innerBuildingBaseGeometry as IPointCollection;

            //Outer Building

            IGeometry outerBuildingBaseGeometry = new PolygonClass();

            IGeometryCollection outerBuildingBaseGeometryCollection = outerBuildingBaseGeometry as IGeometryCollection;

            IPointCollection outerBuildingBaseExteriorRingPointCollection = new RingClass();

            IPointCollection outerBuildingBaseInteriorRingPointCollection = new RingClass();

            for (int i = 0; i < CircleDivisions; i++)
            {
                normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D);

                //Inner Building

                normalVector3D.Magnitude = InnerBuildingRadius;

                IPoint innerBuildingBaseVertexPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent,
                                                                                         originPoint.Y + normalVector3D.YComponent);

                innerBuildingBasePointCollection.AddPoint(innerBuildingBaseVertexPoint, ref _missing, ref _missing);

                //Outer Building

                //Exterior Ring

                normalVector3D.Magnitude = OuterBuildingExteriorRingRadius;

                IPoint outerBuildingBaseExteriorRingVertexPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent,
                                                                                                     originPoint.Y + normalVector3D.YComponent);

                outerBuildingBaseExteriorRingPointCollection.AddPoint(outerBuildingBaseExteriorRingVertexPoint, ref _missing, ref _missing);

                //Interior Ring

                normalVector3D.Magnitude = OuterBuildingInteriorRingRadius;

                IPoint outerBuildingBaseInteriorRingVertexPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent,
                                                                                                     originPoint.Y + normalVector3D.YComponent);

                outerBuildingBaseInteriorRingPointCollection.AddPoint(outerBuildingBaseInteriorRingVertexPoint, ref _missing, ref _missing);
            }

            IPolygon innerBuildingBasePolygon = innerBuildingBaseGeometry as IPolygon;
            innerBuildingBasePolygon.Close();

            IRing outerBuildingBaseExteriorRing = outerBuildingBaseExteriorRingPointCollection as IRing;
            outerBuildingBaseExteriorRing.Close();

            IRing outerBuildingBaseInteriorRing = outerBuildingBaseInteriorRingPointCollection as IRing;
            outerBuildingBaseInteriorRing.Close();
            outerBuildingBaseInteriorRing.ReverseOrientation();

            outerBuildingBaseGeometryCollection.AddGeometry(outerBuildingBaseExteriorRing as IGeometry, ref _missing, ref _missing);
            outerBuildingBaseGeometryCollection.AddGeometry(outerBuildingBaseInteriorRing as IGeometry, ref _missing, ref _missing);

            ITopologicalOperator topologicalOperator = outerBuildingBaseGeometry as ITopologicalOperator;
            topologicalOperator.Simplify();

            IConstructMultiPatch innerBuildingConstructMultiPatch = new MultiPatchClass();
            innerBuildingConstructMultiPatch.ConstructExtrudeFromTo(BaseZ, InnerBuildingZ, innerBuildingBaseGeometry);

            IGeometryCollection innerBuildingMultiPatchGeometryCollection = innerBuildingConstructMultiPatch as IGeometryCollection;

            for (int i = 0; i < innerBuildingMultiPatchGeometryCollection.GeometryCount; i++)
            {
                multiPatchGeometryCollection.AddGeometry(innerBuildingMultiPatchGeometryCollection.get_Geometry(i), ref _missing, ref _missing);
            }

            IConstructMultiPatch outerBuildingConstructMultiPatch = new MultiPatchClass();
            outerBuildingConstructMultiPatch.ConstructExtrudeFromTo(BaseZ, OuterBuildingZ, outerBuildingBaseGeometry);

            IMultiPatch outerBuildingMultiPatch = outerBuildingConstructMultiPatch as IMultiPatch;

            IGeometryCollection outerBuildingMultiPatchGeometryCollection = outerBuildingConstructMultiPatch as IGeometryCollection;

            for (int i = 0; i < outerBuildingMultiPatchGeometryCollection.GeometryCount; i++)
            {
                IGeometry outerBuildingPatchGeometry = outerBuildingMultiPatchGeometryCollection.get_Geometry(i);

                multiPatchGeometryCollection.AddGeometry(outerBuildingPatchGeometry, ref _missing, ref _missing);

                if (outerBuildingPatchGeometry.GeometryType == esriGeometryType.esriGeometryRing)
                {
                    bool isBeginningRing = false;

                    esriMultiPatchRingType multiPatchRingType = outerBuildingMultiPatch.GetRingType(outerBuildingPatchGeometry as IRing, ref isBeginningRing);

                    multiPatch.PutRingType(outerBuildingPatchGeometry as IRing, multiPatchRingType);
                }
            }

            return multiPatchGeometryCollection as IGeometry;            
        }
    }
}
[Visual Basic .NET]

CompositeExamples.vb

Imports Microsoft.VisualBasic
Imports ESRI.ArcGIS.Geometry
Imports System


Public Class CompositeExamples
    Private Shared _missing As Object = Type.Missing

    Private Sub New()
    End Sub
    Public Shared Function GetExample1() As IGeometry
        'Composite: Multiple, Disjoint Geometries Contained Within A Single MultiPatch

        Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()

        Dim multiPatch As IMultiPatch = TryCast(multiPatchGeometryCollection, IMultiPatch)

        'Vector3D Example 2

        Dim vector3DExample2Geometry As IGeometry = Vector3DExamples.GetExample2()

        Dim vector3DExample2Transform3D As ITransform3D = TryCast(vector3DExample2Geometry, ITransform3D)
        vector3DExample2Transform3D.Move3D(5, 5, 0)

        Dim vector3DExample2GeometryCollection As IGeometryCollection = TryCast(vector3DExample2Geometry, IGeometryCollection)

        Dim i As Integer = 0
        Do While i < vector3DExample2GeometryCollection.GeometryCount
            multiPatchGeometryCollection.AddGeometry(vector3DExample2GeometryCollection.Geometry(i), _missing, _missing)
            i += 1
        Loop

        'Vector3D Example 3

        Dim vector3DExample3Geometry As IGeometry = Vector3DExamples.GetExample3()

        Dim vector3DExample3Transform3D As ITransform3D = TryCast(vector3DExample3Geometry, ITransform3D)
        vector3DExample3Transform3D.Move3D(5, -5, 0)

        Dim vector3DExample3GeometryCollection As IGeometryCollection = TryCast(vector3DExample3Geometry, IGeometryCollection)

        i = 0
        Do While i < vector3DExample3GeometryCollection.GeometryCount
            multiPatchGeometryCollection.AddGeometry(vector3DExample3GeometryCollection.Geometry(i), _missing, _missing)
            i += 1
        Loop

        'Vector3D Example 4

        Dim vector3DExample4Geometry As IGeometry = Vector3DExamples.GetExample4()

        Dim vector3DExample4Transform3D As ITransform3D = TryCast(vector3DExample4Geometry, ITransform3D)
        vector3DExample4Transform3D.Move3D(-5, -5, 0)

        Dim vector3DExample4GeometryCollection As IGeometryCollection = TryCast(vector3DExample4Geometry, IGeometryCollection)

        i = 0
        Do While i < vector3DExample4GeometryCollection.GeometryCount
            multiPatchGeometryCollection.AddGeometry(vector3DExample4GeometryCollection.Geometry(i), _missing, _missing)
            i += 1
        Loop

        'Vector3D Example 5

        Dim vector3DExample5Geometry As IGeometry = Vector3DExamples.GetExample5()

        Dim vector3DExample5Transform3D As ITransform3D = TryCast(vector3DExample5Geometry, ITransform3D)
        vector3DExample5Transform3D.Move3D(-5, 5, 0)

        Dim vector3DExample5GeometryCollection As IGeometryCollection = TryCast(vector3DExample5Geometry, IGeometryCollection)

        i = 0
        Do While i < vector3DExample5GeometryCollection.GeometryCount
            multiPatchGeometryCollection.AddGeometry(vector3DExample5GeometryCollection.Geometry(i), _missing, _missing)
            i += 1
        Loop

        Return TryCast(multiPatchGeometryCollection, IGeometry)
    End Function

    Public Shared Function GetExample2() As IGeometry
        'Composite: Cutaway Of Building With Multiple Floors Composed Of 1 TriangleStrip And 5 Ring Parts

        Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()

        Dim multiPatch As IMultiPatch = TryCast(multiPatchGeometryCollection, IMultiPatch)

        'Walls

        Dim wallsPointCollection As IPointCollection = New TriangleStripClass()

        'Start

        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 0), _missing, _missing)
        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 16), _missing, _missing)

        'Right Wall

        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 0), _missing, _missing)
        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 16), _missing, _missing)

        'Back Wall

        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 0), _missing, _missing)
        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 16), _missing, _missing)

        'Left Wall

        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 0), _missing, _missing)
        wallsPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 16), _missing, _missing)

        multiPatchGeometryCollection.AddGeometry(TryCast(wallsPointCollection, IGeometry), _missing, _missing)

        'Floors

        'Base

        Dim basePointCollection As IPointCollection = New RingClass()
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 0), _missing, _missing)

        Dim baseRing As IRing = TryCast(basePointCollection, IRing)
        baseRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(baseRing, IGeometry), _missing, _missing)

        'First Floor

        Dim firstFloorPointCollection As IPointCollection = New RingClass()
        firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 4), _missing, _missing)
        firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 4), _missing, _missing)
        firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 4), _missing, _missing)
        firstFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 4), _missing, _missing)

        Dim firstFloorRing As IRing = TryCast(firstFloorPointCollection, IRing)
        firstFloorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(firstFloorRing, IGeometry), _missing, _missing)

        'Second Floor

        Dim secondFloorPointCollection As IPointCollection = New RingClass()
        secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 8), _missing, _missing)
        secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 8), _missing, _missing)
        secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 8), _missing, _missing)
        secondFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 8), _missing, _missing)

        Dim secondFloorRing As IRing = TryCast(secondFloorPointCollection, IRing)
        secondFloorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(secondFloorRing, IGeometry), _missing, _missing)

        'Third Floor

        Dim thirdFloorPointCollection As IPointCollection = New RingClass()
        thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 12), _missing, _missing)
        thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 12), _missing, _missing)
        thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 12), _missing, _missing)
        thirdFloorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 12), _missing, _missing)

        Dim thirdFloorRing As IRing = TryCast(thirdFloorPointCollection, IRing)
        thirdFloorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(thirdFloorRing, IGeometry), _missing, _missing)

        'Roof

        Dim roofPointCollection As IPointCollection = New RingClass()
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, 3, 16), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(3, -3, 16), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, -3, 16), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-3, 3, 16), _missing, _missing)

        Dim roofRing As IRing = TryCast(roofPointCollection, IRing)
        roofRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(roofRing, IGeometry), _missing, _missing)

        Return TryCast(multiPatchGeometryCollection, IGeometry)
    End Function

    Public Shared Function GetExample3() As IGeometry
        'Composite: House Composed Of 7 Ring, 1 TriangleStrip, And 1 Triangles Parts

        Dim multiPatchGeometryCollection As IGeometryCollection = New MultiPatchClass()

        Dim multiPatch As IMultiPatch = TryCast(multiPatchGeometryCollection, IMultiPatch)

        'Base (Exterior Ring)

        Dim basePointCollection As IPointCollection = New RingClass()
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), _missing, _missing)
        basePointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), _missing, _missing)

        Dim baseRing As IRing = TryCast(basePointCollection, IRing)
        baseRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(baseRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(baseRing, esriMultiPatchRingType.esriMultiPatchOuterRing)

        'Front With Cutaway For Door (Exterior Ring)

        Dim frontPointCollection As IPointCollection = New RingClass()
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 1, 0), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 1, 4), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -1, 4), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -1, 0), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), _missing, _missing)
        frontPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), _missing, _missing)

        Dim frontRing As IRing = TryCast(frontPointCollection, IRing)
        frontRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(frontRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(frontRing, esriMultiPatchRingType.esriMultiPatchOuterRing)

        'Back (Exterior Ring)

        Dim backPointCollection As IPointCollection = New RingClass()
        backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), _missing, _missing)
        backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), _missing, _missing)
        backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), _missing, _missing)
        backPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), _missing, _missing)

        Dim backRing As IRing = TryCast(backPointCollection, IRing)
        backRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(backRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(backRing, esriMultiPatchRingType.esriMultiPatchOuterRing)

        'Right Side (Ring Group)

        'Exterior Ring

        Dim rightSideExteriorPointCollection As IPointCollection = New RingClass()
        rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), _missing, _missing)
        rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), _missing, _missing)
        rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 0), _missing, _missing)
        rightSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 0), _missing, _missing)

        Dim rightSideExteriorRing As IRing = TryCast(rightSideExteriorPointCollection, IRing)
        rightSideExteriorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(rightSideExteriorRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(rightSideExteriorRing, esriMultiPatchRingType.esriMultiPatchOuterRing)

        'Interior Ring

        Dim rightSideInteriorPointCollection As IPointCollection = New RingClass()
        rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, 4, 4), _missing, _missing)
        rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, 4, 2), _missing, _missing)
        rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, 4, 2), _missing, _missing)
        rightSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, 4, 4), _missing, _missing)

        Dim rightSideInteriorRing As IRing = TryCast(rightSideInteriorPointCollection, IRing)
        rightSideInteriorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(rightSideInteriorRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(rightSideInteriorRing, esriMultiPatchRingType.esriMultiPatchInnerRing)

        'Left Side (Ring Group)

        'Exterior Ring

        Dim leftSideExteriorPointCollection As IPointCollection = New RingClass()
        leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), _missing, _missing)
        leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 0), _missing, _missing)
        leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 0), _missing, _missing)
        leftSideExteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), _missing, _missing)

        Dim leftSideExteriorRing As IRing = TryCast(leftSideExteriorPointCollection, IRing)
        leftSideExteriorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(leftSideExteriorRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(leftSideExteriorRing, esriMultiPatchRingType.esriMultiPatchOuterRing)

        'Interior Ring

        Dim leftSideInteriorPointCollection As IPointCollection = New RingClass()
        leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, -4, 4), _missing, _missing)
        leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, -4, 4), _missing, _missing)
        leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-1, -4, 2), _missing, _missing)
        leftSideInteriorPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(1, -4, 2), _missing, _missing)

        Dim leftSideInteriorRing As IRing = TryCast(leftSideInteriorPointCollection, IRing)
        leftSideInteriorRing.Close()

        multiPatchGeometryCollection.AddGeometry(TryCast(leftSideInteriorRing, IGeometry), _missing, _missing)

        multiPatch.PutRingType(leftSideInteriorRing, esriMultiPatchRingType.esriMultiPatchInnerRing)

        'Roof

        Dim roofPointCollection As IPointCollection = New TriangleStripClass()
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 0, 9), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 0, 9), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), _missing, _missing)
        roofPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), _missing, _missing)

        multiPatchGeometryCollection.AddGeometry(TryCast(roofPointCollection, IGeometry), _missing, _missing)

        'Triangular Area Between Roof And Front/Back

        Dim triangularAreaPointCollection As IPointCollection = New TrianglesClass()

        'Area Between Roof And Front

        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 0, 9), _missing, _missing)
        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, 4, 6), _missing, _missing)
        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(5, -4, 6), _missing, _missing)

        'Area Between Roof And Back

        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 0, 9), _missing, _missing)
        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, -4, 6), _missing, _missing)
        triangularAreaPointCollection.AddPoint(GeometryUtilities.ConstructPoint3D(-5, 4, 6), _missing, _missing)

        multiPatchGeometryCollection.AddGeometry(TryCast(triangularAreaPointCollection, IGeometry), _missing, _missing)

        Return TryCast(multiPatchGeometryCollection, IGeometry)
    End Function

    Public Shared Function GetExample4() As IGeometry
        Const CircleDegrees As Double = 360.0
        Const CircleDivisions As Integer = 18
        Const VectorComponentOffset As Double = 0.0000001
        Const InnerBuildingRadius As Double = 3.0
        Const OuterBuildingExteriorRingRadius As Double = 9.0
        Const OuterBuildingInteriorRingRadius As Double = 6.0
        Const BaseZ As Double = 0.0
        Const InnerBuildingZ As Double = 16.0
        Const OuterBuildingZ As Double = 6.0

        'Composite: Tall Building Protruding Through Outer Ring-Shaped Building

        Dim multiPatch As IMultiPatch = New MultiPatchClass()

        Dim multiPatchGeometryCollection As IGeometryCollection = TryCast(multiPatch, IGeometryCollection)

        Dim originPoint As IPoint = GeometryUtilities.ConstructPoint3D(0, 0, 0)

        Dim upperAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, 10)

        Dim lowerAxisVector3D As IVector3D = GeometryUtilities.ConstructVector3D(0, 0, -10)

        lowerAxisVector3D.XComponent += VectorComponentOffset

        Dim normalVector3D As IVector3D = TryCast(upperAxisVector3D.CrossProduct(lowerAxisVector3D), IVector3D)

        Dim rotationAngleInRadians As Double = GeometryUtilities.GetRadians(CircleDegrees / CircleDivisions)

        'Inner Building

        Dim innerBuildingBaseGeometry As IGeometry = New PolygonClass()

        Dim innerBuildingBasePointCollection As IPointCollection = TryCast(innerBuildingBaseGeometry, IPointCollection)

        'Outer Building

        Dim outerBuildingBaseGeometry As IGeometry = New PolygonClass()

        Dim outerBuildingBaseGeometryCollection As IGeometryCollection = TryCast(outerBuildingBaseGeometry, IGeometryCollection)

        Dim outerBuildingBaseExteriorRingPointCollection As IPointCollection = New RingClass()

        Dim outerBuildingBaseInteriorRingPointCollection As IPointCollection = New RingClass()

        Dim i As Integer
        For i = 0 To CircleDivisions - 1
            normalVector3D.Rotate(-1 * rotationAngleInRadians, upperAxisVector3D)

            'Inner Building

            normalVector3D.Magnitude = InnerBuildingRadius

            Dim innerBuildingBaseVertexPoint As IPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent)

            innerBuildingBasePointCollection.AddPoint(innerBuildingBaseVertexPoint, _missing, _missing)

            'Outer Building

            'Exterior Ring

            normalVector3D.Magnitude = OuterBuildingExteriorRingRadius

            Dim outerBuildingBaseExteriorRingVertexPoint As IPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent)

            outerBuildingBaseExteriorRingPointCollection.AddPoint(outerBuildingBaseExteriorRingVertexPoint, _missing, _missing)

            'Interior Ring

            normalVector3D.Magnitude = OuterBuildingInteriorRingRadius

            Dim outerBuildingBaseInteriorRingVertexPoint As IPoint = GeometryUtilities.ConstructPoint2D(originPoint.X + normalVector3D.XComponent, originPoint.Y + normalVector3D.YComponent)

            outerBuildingBaseInteriorRingPointCollection.AddPoint(outerBuildingBaseInteriorRingVertexPoint, _missing, _missing)
        Next i

        Dim innerBuildingBasePolygon As IPolygon = TryCast(innerBuildingBaseGeometry, IPolygon)
        innerBuildingBasePolygon.Close()

        Dim outerBuildingBaseExteriorRing As IRing = TryCast(outerBuildingBaseExteriorRingPointCollection, IRing)
        outerBuildingBaseExteriorRing.Close()

        Dim outerBuildingBaseInteriorRing As IRing = TryCast(outerBuildingBaseInteriorRingPointCollection, IRing)
        outerBuildingBaseInteriorRing.Close()
        outerBuildingBaseInteriorRing.ReverseOrientation()

        outerBuildingBaseGeometryCollection.AddGeometry(TryCast(outerBuildingBaseExteriorRing, IGeometry), _missing, _missing)
        outerBuildingBaseGeometryCollection.AddGeometry(TryCast(outerBuildingBaseInteriorRing, IGeometry), _missing, _missing)

        Dim topologicalOperator As ITopologicalOperator = TryCast(outerBuildingBaseGeometry, ITopologicalOperator)
        topologicalOperator.Simplify()

        Dim innerBuildingConstructMultiPatch As IConstructMultiPatch = New MultiPatchClass()
        innerBuildingConstructMultiPatch.ConstructExtrudeFromTo(BaseZ, InnerBuildingZ, innerBuildingBaseGeometry)

        Dim innerBuildingMultiPatchGeometryCollection As IGeometryCollection = TryCast(innerBuildingConstructMultiPatch, IGeometryCollection)

        i = 0
        Do While i < innerBuildingMultiPatchGeometryCollection.GeometryCount
            multiPatchGeometryCollection.AddGeometry(innerBuildingMultiPatchGeometryCollection.Geometry(i), _missing, _missing)
            i += 1
        Loop

        Dim outerBuildingConstructMultiPatch As IConstructMultiPatch = New MultiPatchClass()
        outerBuildingConstructMultiPatch.ConstructExtrudeFromTo(BaseZ, OuterBuildingZ, outerBuildingBaseGeometry)

        Dim outerBuildingMultiPatch As IMultiPatch = TryCast(outerBuildingConstructMultiPatch, IMultiPatch)

        Dim outerBuildingMultiPatchGeometryCollection As IGeometryCollection = TryCast(outerBuildingConstructMultiPatch, IGeometryCollection)

        i = 0
        Do While i < outerBuildingMultiPatchGeometryCollection.GeometryCount
            Dim outerBuildingPatchGeometry As IGeometry = outerBuildingMultiPatchGeometryCollection.Geometry(i)

            multiPatchGeometryCollection.AddGeometry(outerBuildingPatchGeometry, _missing, _missing)

            If outerBuildingPatchGeometry.GeometryType = esriGeometryType.esriGeometryRing Then
                Dim isBeginningRing As Boolean = False

                Dim multiPatchRingType As esriMultiPatchRingType = outerBuildingMultiPatch.GetRingType(TryCast(outerBuildingPatchGeometry, IRing), isBeginningRing)

                multiPatch.PutRingType(TryCast(outerBuildingPatchGeometry, IRing), multiPatchRingType)
            End If
            i += 1
        Loop

        Return TryCast(multiPatchGeometryCollection, IGeometry)
    End Function
End Class