示例#1
0
        private IModelPoint Polygon2ModelPoint(IPolygon polygon, out Gvitech.CityMaker.Resource.IModel gvModel)
        {
            if (polygon == null || !polygon.IsValid)
            {
                gvModel = null;
                return(null);
            }
            IVector3 vector = polygon.QueryNormal();

            if (vector.Z < 0.0)
            {
                polygon.ExteriorRing.ReverseOrientation();
            }
            IModelPoint        result            = null;
            IGeometryConvertor geometryConvertor = new GeometryConvertorClass();
            ITriMesh           triMesh           = geometryConvertor.PolygonToTriMesh(polygon);

            if (triMesh != null)
            {
                IMultiTriMesh multiTriMesh = ((IGeometryFactory) new GeometryFactoryClass()).CreateGeometry(gviGeometryType.gviGeometryMultiTrimesh, polygon.VertexAttribute) as IMultiTriMesh;
                multiTriMesh.AddTriMesh(triMesh);
                bool flag = geometryConvertor.TriMeshToModelPoint(multiTriMesh, out gvModel, out result);
                if (flag && gvModel != null)
                {
                    this.Model2Water(ref gvModel);
                }
            }
            else
            {
                result  = null;
                gvModel = null;
            }
            return(result);
        }
示例#2
0
        public void Init(Form window)
        {
            m_Window = window;

            InitDevice(m_NumSamples);
            InitShaders();

            m_TextureMgr = new SharpDXTextureMgr(this);
            m_TriMeshMgr = new SharpDXTriMeshMgr(this);

            var desc = new D3D11.BufferDescription(64, D3D11.ResourceUsage.Default, D3D11.BindFlags.ConstantBuffer, D3D11.CpuAccessFlags.None, D3D11.ResourceOptionFlags.None, 0);
            var o    = Matrix4x4.Identity();

            m_ShaderParams = D3D11.Buffer.Create(Device, ref o, desc);
            m_DeviceContext.VertexShader.SetConstantBuffer(0, m_ShaderParams);

            m_Quad = m_TriMeshMgr.CreateQuad(2.0f, 2.0f);
        }
示例#3
0
        public void DrawTriMesh(ITriMesh triMesh, Matrix4x4 transform)
        {
            var context        = Device.ImmediateContext;
            var inputAssembler = context.InputAssembler;
            var indexBuffer    = ((SharpDXTriMesh)triMesh).IndexBuffer;
            var vertexBuffer   = ((SharpDXTriMesh)triMesh).VertexBuffer;

            inputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            inputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);
            inputAssembler.SetVertexBuffers(0, new D3D11.VertexBufferBinding(vertexBuffer, Marshal.SizeOf <Vertex>(), 0));

            context.UpdateSubresource(ref transform, m_ShaderParams);

            if (m_PixelShader.HasTextures)
            {
                m_DeviceContext.PixelShader.SetShaderResources(0, m_PixelShader.GetShaderResources());
            }

            context.DrawIndexed(triMesh.NumTris, 0, 0);
        }
示例#4
0
文件: MainForm.cs 项目: batuZ/Samples
        private void btnConstructMultiTriMesh_Click(object sender, EventArgs e)
        {
            try
            {
                if (gfactory == null)
                    gfactory = new GeometryFactory();
                multiTriMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryMultiTrimesh, gviVertexAttribute.gviVertexAttributeZ) as IMultiTriMesh;
                if (multiTriMesh == null)
                    return;

                triMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryTriMesh, gviVertexAttribute.gviVertexAttributeZ) as ITriMesh;
                if (triMesh == null)
                    return;
                ArrayList vertices = new ArrayList();  //ITopoNode数组
                point = gfactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                for (int i = 0; i < 17; ++i)
                {
                    point.SetCoords(i, i, i, 0, 0);
                    vertices.Add(triMesh.AddPoint(point));
                }
                triMesh.AddTriangle(vertices[0] as ITopoNode, vertices[1] as ITopoNode, vertices[2] as ITopoNode);
                triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[1] as ITopoNode, vertices[3] as ITopoNode);
                triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[1] as ITopoNode, vertices[4] as ITopoNode);
                triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[4] as ITopoNode, vertices[5] as ITopoNode);
                triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[4] as ITopoNode, vertices[6] as ITopoNode);
                triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[6] as ITopoNode, vertices[7] as ITopoNode);
                triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[6] as ITopoNode, vertices[8] as ITopoNode);
                triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[8] as ITopoNode, vertices[9] as ITopoNode);
                triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[9] as ITopoNode, vertices[10] as ITopoNode);
                triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[9] as ITopoNode, vertices[11] as ITopoNode);
                triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[11] as ITopoNode, vertices[12] as ITopoNode);
                triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[10] as ITopoNode, vertices[12] as ITopoNode);
                triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[14] as ITopoNode, vertices[10] as ITopoNode);
                triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[15] as ITopoNode, vertices[14] as ITopoNode);
                triMesh.AddTriangle(vertices[15] as ITopoNode, vertices[16] as ITopoNode, vertices[14] as ITopoNode);
                triMesh.AddTriangle(vertices[16] as ITopoNode, vertices[5] as ITopoNode, vertices[14] as ITopoNode);
                triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[5] as ITopoNode, vertices[16] as ITopoNode);
                triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[3] as ITopoNode, vertices[16] as ITopoNode);

                multiTriMesh.AddGeometry(triMesh);

                MultiSurface geo = new MultiSurface();
                // Geometry属性
                geo.Dimension = multiTriMesh.Dimension;
                if (multiTriMesh.Envelope != null)
                {
                    geo.MaxX = multiTriMesh.Envelope.MaxX;
                    geo.MaxY = multiTriMesh.Envelope.MaxY;
                    geo.MaxZ = multiTriMesh.Envelope.MaxZ;
                    geo.MinX = multiTriMesh.Envelope.MinX;
                    geo.MinY = multiTriMesh.Envelope.MinY;
                    geo.MinZ = multiTriMesh.Envelope.MinZ;
                }
                geo.GeometryType = multiTriMesh.GeometryType;
                geo.IsEmpty = multiTriMesh.IsEmpty;
                geo.IsValid = multiTriMesh.IsValid;
                geo.VertexAttribute = multiTriMesh.VertexAttribute;
                geo.HasId = multiTriMesh.HasId();
                geo.HasM = multiTriMesh.HasM();
                geo.HasZ = multiTriMesh.HasZ();
                // GeometryCollection属性
                geo.GeometryCount = multiTriMesh.GeometryCount;
                geo.IsOverlap = multiTriMesh.IsOverlap;
                // MultiSurface属性
                geo.Area = multiTriMesh.GetArea();

                this.propertyGrid1.SelectedObject = geo;
            }
            catch (System.Exception ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.Message);
            }
        }
示例#5
0
文件: MainForm.cs 项目: batuZ/Samples
        private void btnConstructTriMesh_Click(object sender, EventArgs e)
        {
            if (gfactory == null)
                gfactory = new GeometryFactory();
            triMesh = gfactory.CreateGeometry(gviGeometryType.gviGeometryTriMesh, gviVertexAttribute.gviVertexAttributeZ) as ITriMesh;
            if (triMesh == null)
                return;

            ArrayList vertices = new ArrayList();  //ITopoNode数组
            point = gfactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
            for (int i = 0; i < 17; ++i)
            {
                point.SetCoords(i, i, i, 0, 0);
                vertices.Add(triMesh.AddPoint(point));
            }

            point.SetCoords(100, 100, 100, 0, 0);
            triMesh.AddPoint(point);

            ArrayList facets = new ArrayList();  //ITopoFacet数组
            facets.Add(triMesh.AddTriangle(vertices[0] as ITopoNode, vertices[1] as ITopoNode, vertices[2] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[1] as ITopoNode, vertices[3] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[1] as ITopoNode, vertices[4] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[4] as ITopoNode, vertices[5] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[4] as ITopoNode, vertices[6] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[5] as ITopoNode, vertices[6] as ITopoNode, vertices[7] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[6] as ITopoNode, vertices[8] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[8] as ITopoNode, vertices[9] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[7] as ITopoNode, vertices[9] as ITopoNode, vertices[10] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[9] as ITopoNode, vertices[11] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[10] as ITopoNode, vertices[11] as ITopoNode, vertices[12] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[10] as ITopoNode, vertices[12] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[14] as ITopoNode, vertices[10] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[13] as ITopoNode, vertices[15] as ITopoNode, vertices[14] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[15] as ITopoNode, vertices[16] as ITopoNode, vertices[14] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[16] as ITopoNode, vertices[5] as ITopoNode, vertices[14] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[3] as ITopoNode, vertices[5] as ITopoNode, vertices[16] as ITopoNode));
            facets.Add(triMesh.AddTriangle(vertices[2] as ITopoNode, vertices[3] as ITopoNode, vertices[16] as ITopoNode));

            TriMesh geo = new TriMesh();
            // Geometry属性
            geo.Dimension = triMesh.Dimension;
            if (triMesh.Envelope != null)
            {
                geo.MaxX = triMesh.Envelope.MaxX;
                geo.MaxY = triMesh.Envelope.MaxY;
                geo.MaxZ = triMesh.Envelope.MaxZ;
                geo.MinX = triMesh.Envelope.MinX;
                geo.MinY = triMesh.Envelope.MinY;
                geo.MinZ = triMesh.Envelope.MinZ;
            }
            geo.GeometryType = triMesh.GeometryType;
            geo.IsEmpty = triMesh.IsEmpty;
            geo.IsValid = triMesh.IsValid;
            geo.VertexAttribute = triMesh.VertexAttribute;
            geo.HasId = triMesh.HasId();
            geo.HasM = triMesh.HasM();
            geo.HasZ = triMesh.HasZ();
            // Surface属性
            if (triMesh.Centroid != null)
            {
                geo.CentroidX = triMesh.Centroid.X;
                geo.CentroidY = triMesh.Centroid.Y;
                geo.CentroidZ = triMesh.Centroid.Z;
            }
            geo.IsClosed = triMesh.IsClosed;
            if (triMesh.PointOnSurface != null)
            {
                geo.PointOnSurfaceX = triMesh.PointOnSurface.X;
                geo.PointOnSurfaceY = triMesh.PointOnSurface.Y;
                geo.PointOnSurfaceZ = triMesh.PointOnSurface.Z;
            }
            // TriMesh属性
            geo.DirectedEdgeCount = triMesh.DirectedEdgeCount;
            geo.FacetCount = triMesh.FacetCount;
            geo.VertexCount = triMesh.VertexCount;

            this.propertyGrid1.SelectedObject = geo;
        }
示例#6
0
        public static bool ConvertPolygon(double[] vtx, double height, int flag, out IDoubleArray VArray, out IUInt16Array IndexArray, out IFloatArray TextureArrayU1V1, out IDoubleArray Norms)
        {
            bool flag2;

            VArray           = new DoubleArrayClass();
            IndexArray       = new UInt16ArrayClass();
            TextureArrayU1V1 = new FloatArrayClass();
            IFloatArray array = null;

            Norms = new DoubleArrayClass();
            IPolygon polygon = null;
            ITriMesh o       = null;

            try
            {
                if (((vtx == null) || ((vtx.Length % 2) != 0)) || (vtx.Length < 8))
                {
                    return(false);
                }
                polygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                if (polygon == null)
                {
                    return(false);
                }
                int num = vtx.Length / 2;
                for (int i = 0; i < num; i++)
                {
                    IPoint pointValue = geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                    if (flag == 1)
                    {
                        pointValue.X = vtx[i * 2];
                        pointValue.Y = vtx[(i * 2) + 1];
                        pointValue.Z = height;
                    }
                    else
                    {
                        pointValue.X = vtx[((num - i) - 1) * 2];
                        pointValue.Y = vtx[(((num - i) - 1) * 2) + 1];
                        pointValue.Z = height;
                    }
                    polygon.ExteriorRing.AppendPoint(pointValue);
                }
                if (!polygon.IsClosed)
                {
                    polygon.Close();
                }
                o = geoConvertor.PolygonToTriMesh(polygon);
                if (o == null)
                {
                    return(false);
                }
                if (!o.BatchExport(ref VArray, ref IndexArray, ref TextureArrayU1V1, ref array, ref Norms))
                {
                    return(false);
                }
                flag2 = true;
            }
            catch (Exception)
            {
                flag2 = false;
            }
            finally
            {
                if (polygon != null)
                {
                    Marshal.ReleaseComObject(polygon);
                }
                if (o != null)
                {
                    Marshal.ReleaseComObject(o);
                }
            }
            return(flag2);
        }
示例#7
0
        void axRenderControl1_RcMouseClickSelect(IPickResult PickResult, IPoint IntersectPoint, gviModKeyMask Mask, gviMouseSelectMode EventSender)
        {
            try
            {
                this.axRenderControl1.FeatureManager.UnhighlightAll();
                if (PickResult != null)
                {
                    if (PickResult.Type == gviObjectType.gviObjectFeatureLayer)
                    {
                        IFeatureLayerPickResult flpr = PickResult as IFeatureLayerPickResult;
                        int fid = flpr.FeatureId;
                        this.axRenderControl1.FeatureManager.HighlightFeature(_featureClass, fid, System.Drawing.Color.Yellow);

                        //////////////////////////////////////////////////////////////////////////
                        //
                        //  GeometryConvert的代码添加在这里
                        //
                        //////////////////////////////////////////////////////////////////////////
                        fidList.Clear();
                        fidList.Add(fid);
                        IRowBuffer rowGC = _featureClass.GetRow(fidList[0]);

                        int nPose = rowGC.FieldIndex("Geometry");
                        if (nPose == -1)
                        {
                            MessageBox.Show("不存在Geometry列");
                            return;
                        }

                        // 获取ModelPoint
                        IModelPoint modelPointGC = null;
                        if (rowGC != null)
                        {
                            nPose = rowGC.FieldIndex("Geometry");
                            IGeometry geo = rowGC.GetValue(nPose) as IGeometry;
                            if (geo.GeometryType == gviGeometryType.gviGeometryModelPoint)
                            {
                                modelPointGC = geo as IModelPoint;
                            }
                        }

                        this.Text = "拾取成功";

                        // 获取Model
                        string modelName = modelPointGC.ModelName;
                        IModel modelGC   = (_featureClass.FeatureDataSet as IResourceManager).GetModel(modelName);

                        // 1、获取MultiTriMesh
                        IGeometryConvertor gc      = new GeometryConvertor();
                        IMultiTriMesh      multiTM = gc.ModelPointToTriMesh(modelGC, modelPointGC, false);
                        this.Text = "ModelToTriMesh完成";

                        if (this.cbCreateRenderTriMesh.Checked)
                        {
                            // 创建RenderTriMesh在三维上显示
                            for (int i = 0; i < multiTM.GeometryCount; i++)
                            {
                                ITriMesh       tm  = multiTM.GetGeometry(i) as ITriMesh;
                                IRenderTriMesh rtm = this.axRenderControl1.ObjectManager.CreateRenderTriMesh(tm, null, rootId);

                                //随机颜色填充TriMesh
                                Random         randObj = new Random(i);
                                int            aColor  = randObj.Next(0, 255);
                                int            gColor  = randObj.Next(0, 255);
                                int            rColor  = randObj.Next(0, 255);
                                ISurfaceSymbol ss      = new SurfaceSymbol();
                                ss.Color   = System.Drawing.Color.FromArgb(rColor, gColor, aColor);
                                rtm.Symbol = ss;
                                rTMeshList.Add(rtm);
                            }
                        }

                        if (this.cbCreateRenderPolygon.Checked)
                        {
                            // 2、获取投影MultiPolygon
                            IMultiPolygon multiPolygon = gc.ProjectTriMeshToPolygon(multiTM, 1.0);
                            this.Text = "MultiTriMeshToFootprint完成。面积:" + multiPolygon.GetArea();

                            // 创建RenderPolygon在三维上显示
                            for (int i = 0; i < multiPolygon.GeometryCount; i++)
                            {
                                IPolygon       polygon  = multiPolygon.GetGeometry(i) as IPolygon;
                                IRenderPolygon rpolygon = this.axRenderControl1.ObjectManager.CreateRenderPolygon(polygon, null, rootId);
                                rPolygonList.Add(rpolygon);
                            }
                        }

                        if (this.cbCreateRenderPolygon2.Checked)
                        {
                            // 3、获取切割MultiPolygon
                            double heightSpec = 0.0, heightIntersect = 0.0;
                            Double.TryParse(IntersectPoint.Z.ToString(), out heightIntersect);
                            fidList.Clear();
                            fidList.Add(fid);
                            IEnvelope box = _featureClass.GetFeaturesEnvelope(fidList.ToArray(), "Geometry");
                            heightSpec = System.Math.Abs(heightIntersect - box.MinZ);
                            // 注意:CutTriMeshToPolygon方法的第三个参数为空间分辨率,应该选择合适值。
                            // 值过大会导致结果不精确,值过小会导致转换时间过长。使用时应设置大小合适的值来平衡精度和效率问题。
                            IMultiPolygon multiPolygon2 = gc.CutTriMeshToPolygon(multiTM, heightSpec, 0.5);
                            this.Text = "MultiTriMeshToFootprint2完成。面积:" + multiPolygon2.GetArea();

                            // 创建RenderPolygon在三维上显示
                            for (int i = 0; i < multiPolygon2.GeometryCount; i++)
                            {
                                IPolygon       polygon2  = multiPolygon2.GetGeometry(i) as IPolygon;
                                IRenderPolygon rpolygon2 = this.axRenderControl1.ObjectManager.CreateRenderPolygon(polygon2, null, rootId);
                                rPolygonList2.Add(rpolygon2);
                            }
                        }

                        if (this.cbCreateRenderMulPoint.Checked)
                        {
                            // 4、获取MultiPoint
                            IMultiPoint multiPoint = gc.MultiTriMeshToMultiPoint(multiTM, 3.0);
                            this.Text = "MultiTriMeshToMultiPoint完成。MultiPoint个数为:" + multiPoint.GeometryCount;

                            //创建RenderPoint在三维上显示
                            IRenderMultiPoint rpoint = this.axRenderControl1.ObjectManager.CreateRenderMultiPoint(multiPoint, null, rootId);
                            rPointList.Add(rpoint);
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
示例#8
0
文件: MainForm.cs 项目: batuZ/Samples
        void axRenderControl1_RcObjectEditFinish()
        {
            this.axRenderControl1.InteractMode = gviInteractMode.gviInteractNormal;
            polygonDraw = currentGeometry as IPolygon;
            //抬高一点
            for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++)
            {
                IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint;
                pointOnExr.Z += 1;
                polygonDraw.ExteriorRing.UpdatePoint(i, pointOnExr);
            }

            renderpolygonDraw.SetFdeGeometry(polygonDraw);
            renderpolygonDraw.VisibleMask = gviViewportMask.gviViewNone;

            double height = 0.0;

            try
            {
                height = double.Parse(this.numHeight.Value.ToString());
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("请检查挖洞高度");
                return;
            }

            //构造底面polygon
            IPolygon polygonBottom = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;

            for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++)
            {
                IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint;
                maxZ          = pointOnExr.Z;
                pointOnExr.Z -= height;
                minZ          = pointOnExr.Z;
                polygonBottom.ExteriorRing.AppendPoint(pointOnExr);
            }
            polygonBottom.Close();
            PolygonList.Add(polygonBottom);
            //CreateRenderPolygon(polygonBottom);


            //构造侧面polygon
            for (int i = 0; i < polygonDraw.ExteriorRing.PointCount; i++)
            {
                IPoint pointOnExr = polygonDraw.ExteriorRing.GetPoint(i).Clone() as IPoint;
                pointOnExr.Z -= height;

                IPoint pointOnExr2 = null;
                if (i == polygonDraw.ExteriorRing.PointCount - 1)
                {
                    pointOnExr2 = polygonDraw.ExteriorRing.GetPoint(0).Clone() as IPoint;
                }
                else
                {
                    pointOnExr2 = polygonDraw.ExteriorRing.GetPoint(i + 1).Clone() as IPoint;
                }
                pointOnExr2.Z -= height;

                IPolygon polygonTemp = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(i));
                polygonTemp.ExteriorRing.AppendPoint(pointOnExr);
                polygonTemp.ExteriorRing.AppendPoint(pointOnExr2);
                if (i == polygonDraw.ExteriorRing.PointCount - 1)
                {
                    polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(0));
                }
                else
                {
                    polygonTemp.ExteriorRing.AppendPoint(polygonDraw.ExteriorRing.GetPoint(i + 1));
                }
                polygonTemp.Close();
                PolygonList.Add(polygonTemp);
                //CreateRenderPolygon(polygonTemp);
            }


            List <IRowBuffer> list   = new List <IRowBuffer>();
            ISpatialFilter    filter = new SpatialFilter();

            filter.Geometry      = polygonDraw;
            filter.SpatialRel    = gviSpatialRel.gviSpatialRelEnvelope;
            filter.GeometryField = "Geometry";
            IRowBuffer row    = null;
            IFdeCursor cursor = __fc.Search(filter, false);

            while ((row = cursor.NextRow()) != null)
            {
                list.Add(row);
            }

            foreach (IRowBuffer r in list)
            {
                __fid = (Int32)r.GetValue(0);
                int geometryIndex = -1;
                geometryIndex = r.FieldIndex("Geometry");
                int nameIndex = -1;
                nameIndex = r.FieldIndex("Name");
                if (geometryIndex != -1)
                {
                    // 获取ModelPoint
                    IModelPoint mp = r.GetValue(geometryIndex) as IModelPoint;

                    // 获取Model
                    string modelName = mp.ModelName;
                    IModel m         = (__fc.FeatureDataSet as IResourceManager).GetModel(modelName);

                    Logger.WriteMsg(LogLevel.Message, "---------开始ModelPointToTriMesh----------", DateTime.Now);
                    // 获取MultiTriMesh
                    IMultiTriMesh multiTM = gc.ModelPointToTriMesh(m, mp, false);
                    Logger.WriteMsg(LogLevel.Message, string.Format("---------完成ModelPointToTriMesh:{0}----------", multiTM.GeometryCount), DateTime.Now);

                    // 获取Name
                    string strName = r.GetValue(nameIndex).ToString();
                    for (int i = 0; i < multiTM.GeometryCount; i++)
                    {
                        ITriMesh tm = multiTM.GetGeometry(i) as ITriMesh;
                        //if (!tm.IsClosed)
                        //    continue;

                        // 生成剖面
                        for (int p = 0; p < PolygonList.Count; p++)
                        {
                            IPolygon curPolygon = PolygonList[p];
                            Logger.WriteMsg(LogLevel.Message, string.Format("TM:{0} PG:{1}", i, p), DateTime.Now);
                            if (gc.GetSolidProfile(tm, curPolygon, out multiPolygon))
                            {
                                Logger.WriteMsg(LogLevel.Message, string.Format("TM:{0} PG:{1} TRUE", i, p), DateTime.Now);
                                if (multiPolygon != null && multiPolygon.GeometryCount > 0)
                                {
                                    for (int j = 0; j < multiPolygon.GeometryCount; j++)
                                    {
                                        IPolygon tm2 = multiPolygon.GetGeometry(j) as IPolygon;
                                        //RenderPolygonList.Add(CreateRenderPolygon(tm2));

                                        ICurveSymbol cs = new CurveSymbol();
                                        cs.Color = Color.FromArgb(0, Color.White);
                                        ISurfaceSymbol ss = new SurfaceSymbol();
                                        ss.BoundarySymbol = cs;
                                        ss.Color          = m.GetGroup(0).GetPrimitive(0).Material.DiffuseColor;
                                        IRenderPolygon tmPolygon = this.axRenderControl1.ObjectManager.CreateRenderPolygon(tm2, ss, rootId);
                                        tmPolygon.SetClientData("Name", strName);
                                        RenderPolygonList.Add(tmPolygon);

                                        #region 用当前选中的模型材质,生成截面模型

                                        /*
                                         * IModel outModel = null;
                                         * IModelPoint outMP = null;
                                         * gc.PolygonToModelPoint(tm2, out outModel, out outMP);
                                         *
                                         * if (outModel != null && outMP != null)
                                         * {
                                         *
                                         *  IDrawGroup dgroup = outModel.GetGroup(0);
                                         *  IDrawPrimitive dpri = dgroup.GetPrimitive(0);
                                         *  IDrawMaterial dmar = dpri.Material;
                                         *  dmar.CullMode = gviCullFaceMode.gviCullNone;
                                         *
                                         *  //处理贴图
                                         *  //IPropertySet psOut = new PropertySet();
                                         *  string imgName = m.GetGroup(0).GetPrimitive(0).Material.TextureName;
                                         *  if (imgName != "")
                                         *  {
                                         *      dmar.WrapModeS = gviTextureWrapMode.gviTextureWrapRepeat;
                                         *      dmar.WrapModeT = gviTextureWrapMode.gviTextureWrapRepeat;
                                         *
                                         *      //string tmpImgPath = (strMediaPath + @"\1\") + imgName + ".dds";
                                         *      //IImage imageOut = (__fc.FeatureDataSet as IResourceManager).GetImage(imgName);
                                         *      //imageOut.WriteFile(tmpImgPath);
                                         *      //psOut.SetProperty(imgName, imageOut);
                                         *      //dmar.TextureName = imgName;
                                         *
                                         *      IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imgName);
                                         *      this.axRenderControl1.ObjectManager.AddImage(imgName, image);
                                         *      dmar.TextureName = imgName;
                                         *
                                         *      if (dpri.VertexArray.Length == 12)
                                         *      {
                                         *          IFloatArray texcoords = new FloatArray();
                                         *          texcoords.Append(0);
                                         *          texcoords.Append(0);
                                         *          texcoords.Append(1.0f);
                                         *          texcoords.Append(0);
                                         *          texcoords.Append(1.0f);
                                         *          texcoords.Append(1.0f);
                                         *          texcoords.Append(0);
                                         *          texcoords.Append(1.0f);
                                         *          dpri.TexcoordArray = texcoords;
                                         *      }
                                         *      else
                                         *      {
                                         *          IFloatArray texcoords = new FloatArray();
                                         *          texcoords.Append(0);
                                         *          texcoords.Append(0);
                                         *          for (int v = 3; v < dpri.VertexArray.Length - 2; )
                                         *          {
                                         *              texcoords.Append(Math.Abs(dpri.VertexArray.Get(v) - dpri.VertexArray.Get(0)));
                                         *              texcoords.Append(Math.Abs(dpri.VertexArray.Get(v+2) - dpri.VertexArray.Get(2)));
                                         *              v += 3;
                                         *          }
                                         *          dpri.TexcoordArray = texcoords;
                                         *      }
                                         *  }
                                         *  else
                                         *  {
                                         *      dmar.DepthBias = m.GetGroup(0).GetPrimitive(0).Material.DepthBias;
                                         *      dmar.DiffuseColor = m.GetGroup(0).GetPrimitive(0).Material.DiffuseColor;
                                         *      dmar.EnableBlend = m.GetGroup(0).GetPrimitive(0).Material.EnableBlend;
                                         *      dmar.EnableLight = m.GetGroup(0).GetPrimitive(0).Material.EnableLight;
                                         *      dmar.SpecularColor = m.GetGroup(0).GetPrimitive(0).Material.SpecularColor;
                                         *      dmar.WrapModeS = m.GetGroup(0).GetPrimitive(0).Material.WrapModeS;
                                         *      dmar.WrapModeT = m.GetGroup(0).GetPrimitive(0).Material.WrapModeT;
                                         *  }
                                         *
                                         *  dpri.Material = dmar;
                                         *  dgroup.SetPrimitive(0, dpri);
                                         *  outModel.SetGroup(0, dgroup);
                                         *
                                         *  //处理模型
                                         *  //string osgNameOut = __fid + "_" + p + "_" + j;
                                         *  //string tmpOSGPath = (strMediaPath + @"\1\" + osgNameOut + ".osg");
                                         *  //outModel.WriteFile(tmpOSGPath, psOut);
                                         *  //outMP.ModelName = tmpOSGPath;
                                         *
                                         *
                                         *  string osgName = __fid + "_" + p + "_" + j;
                                         *  this.axRenderControl1.ObjectManager.AddModel(osgName, outModel);
                                         *  outMP.ModelName = osgName;
                                         *
                                         *  //可视化
                                         *  outMP.ModelEnvelope = outModel.Envelope;
                                         *  IRenderModelPoint outRenderMP = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(outMP, null, rootId);
                                         *  //this.axRenderControl1.RefreshModel(null, tmpOSGPath);
                                         *  outRenderMP.ShowOutline = true;
                                         *  //outRenderMP.VisibleMask = gviViewportMask.gviViewNone;
                                         *  RenderMPProfileList.Add(outRenderMP);
                                         * }
                                         */
                                        #endregion
                                    }
                                }
                            }
                        } //遍历PolygonList结束
                    }     //遍历multiTM结束



                    //去掉内环模型
                    __fl.VisibleMask = gviViewportMask.gviViewNone;
                    IModel            modelInterior = null;
                    IModelPoint       mpInterior    = null;
                    IRenderModelPoint rmpInterior   = null;
                    IModel            modelExterior = null;
                    IModelPoint       mpExterior    = null;
                    IRenderModelPoint rmpExterior   = null;
                    IMultiPolygon     mltiPolygon   = geoFactory.CreateGeometry(gviGeometryType.gviGeometryMultiPolygon, gviVertexAttribute.gviVertexAttributeZ) as IMultiPolygon;
                    mltiPolygon.AddGeometry(polygonDraw);
                    Logger.WriteMsg(LogLevel.Message, "---------开始SplitModelPointByPolygon2DWithZ----------", DateTime.Now);
                    if (gc.SplitModelPointByPolygon2DWithZ(mltiPolygon, m, mp, minZ, maxZ, out modelInterior, out mpInterior, out modelExterior, out mpExterior))
                    {
                        Logger.WriteMsg(LogLevel.Message, "SplitModelPointByPolygon2DWithZ返回值为TRUE", DateTime.Now);
                        if (modelExterior != null && mpExterior != null)
                        {
                            this.axRenderControl1.ObjectManager.AddModel(mpExterior.ModelName, modelExterior);
                            string[] imagenames = modelExterior.GetImageNames();
                            for (int q = 0; q < imagenames.Length; q++)
                            {
                                IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imagenames[q]);
                                this.axRenderControl1.ObjectManager.AddImage(imagenames[q], image);
                            }
                            rmpExterior = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mpExterior, null, rootId);
                            RenderMPExteriorList.Add(rmpExterior);
                        }
                        if (modelInterior != null && mpInterior != null)
                        {
                            this.axRenderControl1.ObjectManager.AddModel(mpInterior.ModelName, modelInterior);
                            string[] imagenames = modelInterior.GetImageNames();
                            for (int q = 0; q < imagenames.Length; q++)
                            {
                                IImage image = (__fc.FeatureDataSet as IResourceManager).GetImage(imagenames[q]);
                                this.axRenderControl1.ObjectManager.AddImage(imagenames[q], image);
                            }
                            rmpInterior             = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mpInterior, null, rootId);
                            rmpInterior.VisibleMask = gviViewportMask.gviViewNone;
                            RenderMPInteriorList.Add(rmpInterior);
                        }
                    }
                }
            }//遍历RowBufferList结束
             //MessageBox.Show("执行成功");
        }
示例#9
0
        public override bool Draw(out IModelPoint mp, out IModel fmodel, out IModel smodel)
        {
            List <ushort>  list2      = new List <ushort>();
            IPolygon       polygon    = null;
            IPolygon       polygon2   = null;
            IPolygon       polygon3   = null;
            IPoint         pointValue = null;
            ITriMesh       mesh       = null;
            IDoubleArray   vArray     = null;
            IUInt16Array   indexArray = null;
            IFloatArray    array3     = null;
            IFloatArray    array4     = null;
            IDoubleArray   norms      = null;
            IDrawGroup     group      = null;
            IDrawPrimitive primitive  = null;
            IDrawPrimitive primitive2 = null;
            IDrawPrimitive primitive3 = null;
            double         naN        = double.NaN;
            double         ty         = double.NaN;

            base.Draw(out mp, out fmodel, out smodel);
            try
            {
                int           num;
                int           num2;
                List <Vector> list;
                polygon  = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                polygon2 = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                polygon3 = DrawGeometry.geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;
                if (this._route.Count > 2)
                {
                    list = Maths.DisperseLine(this._route, this._pillarSection.Diameter);
                }
                else
                {
                    list = this._route;
                }
                double[] vtxs = this._pillarSection.GetVtxs();
                SystemLog.Instance.Log("顶点个数:" + vtxs.Length);
                double[] numArray = new double[list.Count];
                for (num = 0; num < list.Count; num++)
                {
                    if (num == 0)
                    {
                        numArray[num] = 0.0;
                    }
                    else
                    {
                        numArray[num] = (list[num] - list[num - 1]).Length + numArray[num - 1];
                    }
                }
                object renderInfo = (this._renderType == RenderType.Texture) ? ((object)this._tcNames) : ((object)this._colors);
                int[]  index      = new int[3];
                index[1] = 1;
                index[2] = 2;
                if (!base.NewEmptyModel(index, this._renderType, renderInfo, out fmodel))
                {
                    return(false);
                }
                group = fmodel.GetGroup(0);
                SystemLog.Instance.Log("开始计算正交向量:" + DateTime.Now.ToLongTimeString());
                primitive = group.GetPrimitive(0);
                for (num = 0; num < list.Count; num++)
                {
                    Vector vector;
                    Vector vector2;
                    Vector vector3;
                    if (num == 0)
                    {
                        vector = list[num + 1] - list[num];
                    }
                    else if (num == (list.Count - 1))
                    {
                        vector = list[num] - list[num - 1];
                    }
                    else
                    {
                        vector = ((list[num] - list[num - 1])).UnitVector() + ((list[num + 1] - list[num])).UnitVector();
                    }
                    Maths.GenerateComplementBasis(vector, out vector2, out vector3);
                    vector2 = -vector2;
                    num2    = 0;
                    while (num2 <= this._pillarSection.SegCount)
                    {
                        Vector vector6;
                        Vector vector7;
                        (((vtxs[num2 * 2] - this._pillarSection.OffsetX) * vector2) + ((vtxs[(num2 * 2) + 1] - this._pillarSection.OffsetY) * vector3)).UnitVector();
                        Vector vector4 = list[num] + ((Vector)((vtxs[num2 * 2] * vector2) + (vtxs[(num2 * 2) + 1] * vector3)));
                        Vector vector5 = (Vector)(vector4 * 1.01);
                        if (num == 0)
                        {
                            pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                            pointValue.SetCoords(vector4.X, vector4.Y, vector4.Z, 0.0, 0);
                            polygon.ExteriorRing.AppendPoint(pointValue);
                            pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                            pointValue.SetCoords(vector5.X, vector5.Y, vector5.Z, 0.0, 0);
                            polygon3.ExteriorRing.AppendPoint(pointValue);
                        }
                        else if (num == (list.Count - 1))
                        {
                            pointValue = DrawGeometry.geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                            pointValue.SetCoords(vector4.X, vector4.Y, vector4.Z, 0.0, 0);
                            polygon2.ExteriorRing.AppendPoint(pointValue);
                        }
                        primitive.VertexArray.Append((float)vector4.X);
                        primitive.VertexArray.Append((float)vector4.Y);
                        primitive.VertexArray.Append((float)vector4.Z);
                        list2.Add((ushort)((primitive.VertexArray.Length / 3) - 1));
                        primitive.VertexArray.Append((float)vector4.X);
                        primitive.VertexArray.Append((float)vector4.Y);
                        primitive.VertexArray.Append((float)vector4.Z);
                        list2.Add((ushort)((primitive.VertexArray.Length / 3) - 1));
                        if (this._renderType == RenderType.Texture)
                        {
                            primitive.TexcoordArray.Append((float)(num2 * 1.0));
                            primitive.TexcoordArray.Append((float)(num * 1.0));
                            primitive.TexcoordArray.Append((float)(num2 * 1.0));
                            primitive.TexcoordArray.Append((float)(num * 1.0));
                        }
                        if (num2 == 0)
                        {
                            vector6 = new Vector(vtxs[num2 * 2] - vtxs[(this._pillarSection.SegCount - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((this._pillarSection.SegCount - 1) * 2) + 1], 0.0).UnitVector();
                            vector7 = new Vector(vtxs[(num2 + 1) * 2] - vtxs[num2 * 2], vtxs[((num2 + 1) * 2) + 1] - vtxs[(num2 * 2) + 1], 0.0).UnitVector();
                        }
                        else if (num2 == this._pillarSection.SegCount)
                        {
                            vector6 = new Vector(vtxs[num2 * 2] - vtxs[(num2 - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((num2 - 1) * 2) + 1], 0.0).UnitVector();
                            vector7 = new Vector(vtxs[2] - vtxs[num2 * 2], vtxs[3] - vtxs[(num2 * 2) + 1], 0.0).UnitVector();
                        }
                        else
                        {
                            vector6 = new Vector(vtxs[num2 * 2] - vtxs[(num2 - 1) * 2], vtxs[(num2 * 2) + 1] - vtxs[((num2 - 1) * 2) + 1], 0.0).UnitVector();
                            vector7 = new Vector(vtxs[(num2 + 1) * 2] - vtxs[num2 * 2], vtxs[((num2 + 1) * 2) + 1] - vtxs[(num2 * 2) + 1], 0.0).UnitVector();
                        }
                        Vector vector8 = new Vector(vector6.Y, -vector6.X, vector6.Z);
                        primitive.NormalArray.Append((float)vector8.X);
                        primitive.NormalArray.Append((float)vector8.Y);
                        primitive.NormalArray.Append((float)vector8.Z);
                        vector8 = new Vector(vector7.Y, -vector7.X, vector7.Z);
                        primitive.NormalArray.Append((float)vector8.X);
                        primitive.NormalArray.Append((float)vector8.Y);
                        primitive.NormalArray.Append((float)vector8.Z);
                        num2++;
                    }
                }
                SystemLog.Instance.Log("结束计算正交向量:" + DateTime.Now.ToLongTimeString());
                SystemLog.Instance.Log("开始添加索引数组:" + DateTime.Now.ToLongTimeString());
                for (num = 0; num < (list.Count - 1); num++)
                {
                    for (num2 = 0; num2 < this._pillarSection.SegCount; num2++)
                    {
                        primitive.IndexArray.Append(list2[((num * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]);
                        primitive.IndexArray.Append(list2[((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]);
                        primitive.IndexArray.Append(list2[(((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]);
                        primitive.IndexArray.Append(list2[((num * ((this._pillarSection.SegCount + 1) * 2)) + (num2 * 2)) + 1]);
                        primitive.IndexArray.Append(list2[(num * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]);
                        primitive.IndexArray.Append(list2[((num + 1) * ((this._pillarSection.SegCount + 1) * 2)) + ((num2 + 1) * 2)]);
                    }
                }
                SystemLog.Instance.Log("结束添加索引数组:" + DateTime.Now.ToLongTimeString());
                SystemLog.Instance.Log("开始画底面顶面和线框:" + DateTime.Now.ToLongTimeString());
                vArray     = new DoubleArrayClass();
                indexArray = new UInt16ArrayClass();
                array3     = new FloatArrayClass();
                norms      = new DoubleArrayClass();
                primitive2 = group.GetPrimitive(1);
                polygon.ExteriorRing.ReverseOrientation();
                mesh = DrawGeometry.geoConvertor.PolygonToTriMesh(polygon);
                if ((mesh != null) && mesh.BatchExport(ref vArray, ref indexArray, ref array3, ref array4, ref norms))
                {
                    for (num = 0; num < vArray.Length; num++)
                    {
                        primitive2.VertexArray.Append((float)vArray.Array[num]);
                    }
                    for (num = 0; num < indexArray.Length; num++)
                    {
                        primitive2.IndexArray.Append(indexArray.Array[num]);
                    }
                    for (num = 0; num < norms.Length; num++)
                    {
                        primitive2.NormalArray.Append((float)norms.Array[num]);
                    }
                    if (this._renderType == RenderType.Texture)
                    {
                        for (num = 0; num < (vArray.Length / 3); num++)
                        {
                            this.GetTexcoord(vArray.Array[num * 3], vArray.Array[(num * 3) + 1], out naN, out ty);
                            primitive2.TexcoordArray.Append((float)naN);
                            primitive2.TexcoordArray.Append((float)ty);
                        }
                    }
                }
                vArray     = new DoubleArrayClass();
                indexArray = new UInt16ArrayClass();
                array3     = new FloatArrayClass();
                norms      = new DoubleArrayClass();
                primitive3 = group.GetPrimitive(2);
                mesh       = DrawGeometry.geoConvertor.PolygonToTriMesh(polygon2);
                if ((mesh != null) && mesh.BatchExport(ref vArray, ref indexArray, ref array3, ref array4, ref norms))
                {
                    for (num = 0; num < vArray.Length; num++)
                    {
                        primitive3.VertexArray.Append((float)vArray.Array[num]);
                    }
                    for (num = 0; num < indexArray.Length; num++)
                    {
                        primitive3.IndexArray.Append(indexArray.Array[num]);
                    }
                    for (num = 0; num < norms.Length; num++)
                    {
                        primitive3.NormalArray.Append((float)norms.Array[num]);
                    }
                    if (this._renderType == RenderType.Texture)
                    {
                        for (num = 0; num < (vArray.Length / 3); num++)
                        {
                            this.GetTexcoord(vArray.Array[num * 3], vArray.Array[(num * 3) + 1], out naN, out ty);
                            primitive3.TexcoordArray.Append((float)naN);
                            primitive3.TexcoordArray.Append((float)ty);
                        }
                    }
                }
                SystemLog.Instance.Log("结束画底面顶面和线框:" + DateTime.Now.ToLongTimeString());
                SystemLog.Instance.Log("结束调用Draw:" + DateTime.Now.ToLongTimeString());
                return(true);
            }
            catch (Exception exception)
            {
                SystemLog.Instance.Log(exception);
                return(false);
            }
        }
示例#10
0
文件: MainForm.cs 项目: batuZ/Samples
        void axRenderControl1_RcMouseClickSelect(IPickResult PickResult, IPoint IntersectPoint, gviModKeyMask Mask, gviMouseSelectMode EventSender)
        {
            try
            {
                if (PickResult != null)
                {
                    if (PickResult.Type == gviObjectType.gviObjectFeatureLayer)
                    {
                        IFeatureLayerPickResult flpr = PickResult as IFeatureLayerPickResult;
                        int fid = flpr.FeatureId;
                        this.axRenderControl1.FeatureManager.HighlightFeature(_featureClass, fid, System.Drawing.Color.Yellow);

                        //////////////////////////////////////////////////////////////////////////
                        //
                        //  GeometryConvert的代码添加在这里
                        //
                        //////////////////////////////////////////////////////////////////////////
                        fidList.Clear();
                        fidList.Add(fid);
                        IRowBuffer rowGC = _featureClass.GetRow(fidList[0]);

                        int nPose = rowGC.FieldIndex("Geometry");
                        if (nPose == -1)
                        {
                            MessageBox.Show("不存在Geometry列");
                            return;
                        }

                        // 获取polygon
                        IPolygon polygonGC = null;
                        if (rowGC != null)
                        {
                            nPose = rowGC.FieldIndex("Geometry");
                            IGeometry geo = rowGC.GetValue(nPose) as IGeometry;
                            if (geo.GeometryType == gviGeometryType.gviGeometryPolygon)
                            {
                                polygonGC = geo as IPolygon;
                            }
                        }

                        this.Text = "拾取成功";

                        //第一个Tab页:ExtrudePolygonToModel
                        if (this.tabControl1.SelectedIndex == 0)
                        {
                            // 1.调接口构造模型
                            IGeometryConvertor gc       = new GeometryConvertor();
                            gviRoofType        rooftype = gviRoofType.gviRoofFlat;
                            switch (this.comboxRoofType.Text)
                            {
                            case "Flat":
                                rooftype = gviRoofType.gviRoofFlat;
                                break;

                            case "Gable":
                                rooftype = gviRoofType.gviRoofGable;
                                break;

                            case "Hip":
                                rooftype = gviRoofType.gviRoofHip;
                                break;
                            }
                            string      imgPath = (strMediaPath + @"\dds");
                            string      roof    = this.comboBoxRoofTexture.Text;
                            string      facade  = this.comboBoxFacadeTexture.Text;
                            IModelPoint mp      = null;
                            IModel      model   = null;
                            if (!gc.ExtrudePolygonToModel(polygonGC, int.Parse(this.numFloorNumber.Value.ToString()), double.Parse(this.numFloorHeight.Value.ToString()), double.Parse(this.numSlopeAngle.Value.ToString()),
                                                          rooftype, facade, roof, out mp, out model))
                            {
                                MessageBox.Show("拉体块出错!");
                                return;
                            }

                            //2、将模型及贴图写入osg文件
                            string           modelName  = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".osg");//输出osg文件路径
                            IResourceFactory resFactory = new ResourceFactory();
                            string[]         imageNames = model.GetImageNames();
                            IPropertySet     ps         = new PropertySet();
                            for (int i = 0; i < imageNames.Length; i++)
                            {
                                string imgName = imageNames[i];
                                IImage img     = resFactory.CreateImageFromFile(string.Format(@"{0}\{1}", imgPath + @"\facade", imgName));
                                if (img == null)
                                {
                                    img = resFactory.CreateImageFromFile(string.Format(@"{0}\{1}", imgPath + @"\roof", imgName));
                                }
                                ps.SetProperty(imgName, img);
                            }
                            model.WriteFile(modelName, ps);

                            //3、测试显示模型
                            mp.ModelName = modelName;
                            IRenderModelPoint rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, null, rootId);
                            rmp.MouseSelectMask    = gviViewportMask.gviViewNone;
                            rmp.MaxVisibleDistance = 100000;
                            this.axRenderControl1.Camera.LookAtEnvelope(mp.Envelope);//飞入
                            mpList.Add(rmp);
                        }
                        //第二个tab页:ExtrudePolygonToTriMesh
                        else
                        {
                            // 1.调接口构造模型
                            IGeometryConvertor gc = new GeometryConvertor();
                            ITriMesh           tm = gc.ExtrudePolygonToTriMesh(polygonGC, double.Parse(this.numHeight.Value.ToString()), true);
                            if (tm == null)
                            {
                                MessageBox.Show("拉体块出错!");
                                return;
                            }

                            //2、显示三角面
                            //---- 渲染样式不是必须的 -----
                            ISurfaceSymbol surfaceSym = new SurfaceSymbol();
                            surfaceSym.Color       = System.Drawing.Color.Red;
                            surfaceSym.EnableLight = true;
                            ICurveSymbol curveSym = new CurveSymbol();
                            curveSym.Color            = System.Drawing.Color.Yellow;
                            curveSym.Width            = 10;
                            surfaceSym.BoundarySymbol = curveSym;
                            //---- ------------------ -----
                            IRenderTriMesh rmp = this.axRenderControl1.ObjectManager.CreateRenderTriMesh(tm, surfaceSym, rootId);
                            rmp.MouseSelectMask    = gviViewportMask.gviViewNone;
                            rmp.MaxVisibleDistance = 100000;
                            this.axRenderControl1.Camera.LookAtEnvelope(rmp.Envelope);//飞入
                            tmList.Add(rmp);
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                if (ex.GetType().Name.Equals("UnauthorizedAccessException"))
                {
                    MessageBox.Show("需要标准runtime授权");
                }
                else
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }