Ejemplo n.º 1
0
        public static void testCreatePlateau()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

            //select a surface
            PromptEntityOptions selSurface = new PromptEntityOptions("\nSelect a tin surface: ");

            selSurface.SetRejectMessage("\nOnly tin surface allowed");
            selSurface.AddAllowedClass(typeof(TinSurface), true);
            PromptEntityResult resSurface = ed.GetEntity(selSurface);

            if (resSurface.Status != PromptStatus.OK)
            {
                return;
            }
            ObjectId surfaceId = resSurface.ObjectId;

            //select a polyline
            PromptEntityOptions selPline = new PromptEntityOptions("\nSelect a polyline: ");

            selPline.SetRejectMessage("\nOnly polylines allowed");
            selPline.AddAllowedClass(typeof(Polyline), true);
            PromptEntityResult resPline = ed.GetEntity(selPline);

            if (resPline.Status != PromptStatus.OK)
            {
                return;
            }
            ObjectId plineId = resPline.ObjectId;

            //erase the pline?
            PromptKeywordOptions selYesNo = new PromptKeywordOptions("\nErase polyline?");

            selYesNo.Keywords.Add("Yes");
            selYesNo.Keywords.Add("No");
            PromptResult resYesNo = ed.GetKeywords(selYesNo);

            if (resYesNo.Status != PromptStatus.OK)
            {
                return;
            }
            bool erasePline = resYesNo.StringResult.Equals("Yes");

            Database db = Application.DocumentManager.MdiActiveDocument.Database;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                TinSurface surface = trans.GetObject(surfaceId, OpenMode.ForWrite) as TinSurface;
                Polyline   pline   = trans.GetObject(plineId, OpenMode.ForWrite) as Polyline;
                var        test    = surface.ExtractGridded(SurfaceExtractionSettingsType.Model);
                //find all vertices inside a pline area
                ObjectIdCollection plinesBorder = new ObjectIdCollection();
                plinesBorder.Add(plineId);
                TinSurfaceVertex[] verticesInsidePline = surface.GetVerticesInsidePolylines(plinesBorder);

                //set the new elevation for all vertices founded
                surface.SetVerticesElevation(verticesInsidePline, pline.Elevation);

                //now create a surface vertex at each pline vertex
                for (int plineVertexIndex = 0; plineVertexIndex < pline.NumberOfVertices; plineVertexIndex++)
                {
                    //get the pline coordinate
                    Point3d plineVertex0 = pline.GetPoint3dAt(plineVertexIndex);
                    Point3d plineVertex1 = pline.GetPoint3dAt(plineVertexIndex < (pline.NumberOfVertices - 1) ? plineVertexIndex + 1 : 0);

                    //create a surface vertex at each pline vertex
                    //this will ensure that we have a vertex at each corner,
                    //which is required for the next step (AddLine)
                    SurfaceOperationAddTinVertex res0 = surface.AddVertex(plineVertex0);
                    SurfaceOperationAddTinVertex res1 = surface.AddVertex(plineVertex1);

                    //finally create a line connecting the newly creted vertices
                    TinSurfaceVertex vertex0 = surface.FindVertexAtXY(res0.Location.X, res0.Location.Y);
                    TinSurfaceVertex vertex1 = surface.FindVertexAtXY(res1.Location.X, res1.Location.Y);
                    surface.AddLine(vertex0, vertex1);
                }

                trans.Commit();
            }
        }