Пример #1
0
        public List <string> SearchSurfaces()
        {
            List <string> SurfaceNames = new List <string>();

            ObjectIdCollection SurfaceIds = CivilDoc.GetSurfaceIds();

            foreach (ObjectId surfaceId in SurfaceIds)
            {
                TinSurface oSurface = surfaceId.GetObject(OpenMode.ForRead) as TinSurface;
                if (!SurfaceNames.Contains(oSurface.Name))
                {
                    SurfaceNames.Add(oSurface.Name);
                }
            }

            return(SurfaceNames);
        }
Пример #2
0
        public ResultBuffer GetSurfaceIds(ResultBuffer resbuf)
        {
            var nil = new TypedValue((int)LispDataType.Nil);

            if (resbuf == null)
            {
                CivilDocument      currentDocument = CivilApplication.ActiveDocument;
                ObjectIdCollection SurfaceIds      = currentDocument.GetSurfaceIds();
                ResultBuffer       returnValue     = ListObjectIds(SurfaceIds);
                return(returnValue);
            }
            return(new ResultBuffer(nil));
        }
Пример #3
0
        private Autodesk.Civil.DatabaseServices.Surface EGSurface()
        {
            ObjectIdCollection SurfaceIds = civDoc.GetSurfaceIds();

            foreach (ObjectId surfaceId in SurfaceIds)
            {
                Autodesk.Civil.DatabaseServices.Surface CivSurface = surfaceId.GetObject(OpenMode.ForRead) as Autodesk.Civil.DatabaseServices.Surface;
                if (CivSurface.Name == "EG")
                {
                    return(CivSurface);
                }
            }

            return(null);
        }
Пример #4
0
        public static Surface ByIndex(int index)
        {
            CivilDocument      civilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
            Surface            surface       = null;
            ObjectIdCollection surfaceIds    = civilDocument.GetSurfaceIds();

            //get the current document and database
            AcadApp.Document doc = AcadApp.Application.DocumentManager.MdiActiveDocument;
            Database         db  = doc.Database;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                surface = new Surface((Autodesk.Civil.DatabaseServices.Entity)trans.GetObject(surfaceIds[index], OpenMode.ForRead), false);
            }
            return(surface);
        }
        public static void FindWaterBowlsByWaterdrop()
        {
            CivilDocument civilDoc = CivilApplication.ActiveDocument;
            Document      doc      = Application.DocumentManager.MdiActiveDocument;
            Database      db       = doc.Database;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord   modelSpace = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                ObjectIdCollection surfaceIds = civilDoc.GetSurfaceIds();
                foreach (ObjectId surfaceId in surfaceIds)
                {
                    TinSurface surf = trans.GetObject(surfaceId, OpenMode.ForRead) as TinSurface;
                    if (surf == null)
                    {
                        continue;
                    }

                    foreach (TinSurfaceVertex vertex in surf.Vertices)
                    {
                        // get the centroid is failing... need to investigate better
                        //Point2d centroid = GetCentroid(new List<Point3d>() { triangle.Vertex1.Location, triangle.Vertex2.Location, triangle.Vertex3.Location });

                        ObjectIdCollection drops = surf.Analysis.CreateWaterdrop(vertex.Location.Convert2d(new Plane()), Autodesk.Civil.WaterdropObjectType.Polyline3D);
                        if (drops.Count > 1)
                        {
                            Point3d    closestPoint = FindClosestPoint(trans, drops[0], drops[1]);
                            Polyline3d curveA       = trans.GetObject(drops[0], OpenMode.ForRead) as Polyline3d;
                            if (closestPoint.DistanceTo(curveA.StartPoint) > Tolerance.Global.EqualPoint)
                            {
                                DBPoint newPoint = new DBPoint();
                                newPoint.Position = closestPoint;
                                modelSpace.AppendEntity(newPoint);
                                trans.AddNewlyCreatedDBObject(newPoint, true);
                            }
                        }

                        // cleanup...
                        foreach (ObjectId drop in drops)
                        {
                            trans.GetObject(drop, OpenMode.ForWrite).Erase();
                        }
                    }
                }
                trans.Commit();
            }
        }
        public static void FindWaterBowlsByVertex()
        {
            CivilDocument civilDoc = CivilApplication.ActiveDocument;
            Document      doc      = Application.DocumentManager.MdiActiveDocument;
            Database      db       = doc.Database;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTableRecord   modelSpace = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                ObjectIdCollection surfaceIds = civilDoc.GetSurfaceIds();
                foreach (ObjectId surfaceId in surfaceIds)
                {
                    TinSurface surf = trans.GetObject(surfaceId, OpenMode.ForRead) as TinSurface;
                    if (surf == null)
                    {
                        continue;
                    }

                    foreach (TinSurfaceVertex vertex in surf.Vertices)
                    {
                        // start assuming is a low point
                        bool isLowest = true;
                        // now look at the other end of each Edge from the vertex
                        foreach (TinSurfaceEdge edge in vertex.Edges)
                        {
                            TinSurfaceVertex otherVertice = (edge.Vertex1.Location.DistanceTo(vertex.Location) < Tolerance.Global.EqualPoint ? edge.Vertex2 : edge.Vertex1);
                            // is the other vertice lower?
                            if (otherVertice.Location.Z < vertex.Location.Z)
                            {
                                isLowest = false; // other is lower, therefore this is not the lowest
                            }
                        }

                        // if is the lowest, add a point there
                        if (isLowest)
                        {
                            DBPoint newPoint = new DBPoint();
                            newPoint.Position = vertex.Location;
                            modelSpace.AppendEntity(newPoint);
                            trans.AddNewlyCreatedDBObject(newPoint, true);
                        }
                    }
                }
                trans.Commit();
            }
        }
Пример #7
0
        public static List <Surface> GetSurfaces(Autodesk.AutoCAD.DynamoNodes.Document document)
        {
            List <Surface> surfaces = new List <Surface>();

            Autodesk.AutoCAD.ApplicationServices.Document acDoc = document.AcDocument;
            Database           db            = acDoc.Database;
            CivilDocument      civilDocument = CivilDocument.GetCivilDocument(db);
            ObjectIdCollection surfaceIds    = civilDocument.GetSurfaceIds();

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                foreach (ObjectId surfaceId in surfaceIds)
                {
                    surfaces.Add(new Surface((Autodesk.Civil.DatabaseServices.Entity)trans.GetObject(surfaceId, OpenMode.ForRead), false));
                }
            }
            return(surfaces);
        }
Пример #8
0
        public ObjectId findSurface(string surfaceName)
        {
            CivilDocument doc = CivilApplicationManager.ActiveCivilDocument;

            using (Transaction tr = CivilApplicationManager.StartTransaction())
            {
                foreach (ObjectId surfaceId in doc.GetSurfaceIds())
                {
                    C3DLandDb.Surface surface = surfaceId.GetObject(OpenMode.ForRead) as C3DLandDb.Surface;
                    if (surface.Name == surfaceName)
                    {
                        return(surfaceId);
                    }
                }
            }

            return(ObjectId.Null);
        }
Пример #9
0
        public static Surface ByName(string surfaceName)
        {
            CivilDocument      civilDocument = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
            Surface            surface       = null;
            ObjectIdCollection surfaceIds    = civilDocument.GetSurfaceIds();

            //get the current document and database
            AcadApp.Document doc = AcadApp.Application.DocumentManager.MdiActiveDocument;
            Database         db  = doc.Database;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                foreach (ObjectId objectId in surfaceIds)
                {
                    surface = new Surface((Autodesk.Civil.DatabaseServices.Entity)trans.GetObject(objectId, OpenMode.ForRead), false);
                    if (surface.Name != surfaceName)
                    {
                        surface = null;
                    }
                }
            }
            return(surface);
        }
        /// <summary>
        /// Get the list of surfaces and search by name
        /// </summary>
        /// <param name="name">Name of surface to search.
        /// Case sensitive.</param>
        /// <returns>ObjectId of the surface</returns>
        public static ObjectId GetSurfaceId(string name)
        {
            Database db = Application.DocumentManager.
                          MdiActiveDocument.Database;

            using (Transaction trans = db.
                                       TransactionManager.StartTransaction())
            {
                CivilDocument      civilDoc   = CivilApplication.ActiveDocument;
                ObjectIdCollection surfaceIds = civilDoc.GetSurfaceIds();
                foreach (ObjectId surfaceId in surfaceIds)
                {
                    CivilSurface surface =
                        trans.GetObject(surfaceId, OpenMode.ForRead)
                        as CivilSurface;
                    if (surface.Name == name)
                    {
                        return(surface.ObjectId);
                    }
                }
            }
            return(ObjectId.Null);
        }
Пример #11
0
        public static Dictionary <string, object> BySurfaces(Autodesk.AutoCAD.DynamoNodes.Document doc_dyn, List <string> TopSurfacesNames,
                                                             List <string> BottomSurfacesNames, string PathToFolderSaveLog, string layer = "0", string Id_separator = "___")
        {
            Document      doc     = doc_dyn.AcDocument;
            CivilDocument c3d_doc = Autodesk.Civil.ApplicationServices.CivilApplication.ActiveDocument;
            //Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;

            //Internal variables:
            //For logging processes
            string PathToSaveLog = PathToFolderSaveLog + $"\\SolidsBySurfaces_{Guid.NewGuid()}.log";

            //File.Create(PathToSaveLog);
            void SaveLog(string save_data)
            {
                File.AppendAllText(PathToSaveLog, save_data);
            }

            //For out data
            Dictionary <string, object> out_data         = new Dictionary <string, object>();
            List <ObjectId>             solids_instances = new List <ObjectId>();
            List <string> solids_ids = new List <string>();

            ObjectIdCollection SurfaceIds = c3d_doc.GetSurfaceIds();

            ObjectId GetSurfaceByName(string name)
            {
                foreach (ObjectId id in SurfaceIds)
                {
                    TinSurface oSurface = id.GetObject(OpenMode.ForRead) as TinSurface;
                    if (oSurface.Name == name)
                    {
                        return(id);
                    }
                }
                return(ObjectId.Null);
            }

            using (DocumentLock acDocLock = doc.LockDocument())
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    for (int i1 = 0; i1 < TopSurfacesNames.Count; i1++)
                    {
                        string   TopName = TopSurfacesNames[i1]; string BottomName = BottomSurfacesNames[i1];
                        ObjectId top_surf_id    = GetSurfaceByName(TopName);
                        ObjectId bottom_surf_id = GetSurfaceByName(BottomName);
                        string   surfaces_id    = TopName + Id_separator + BottomName;
                        if (top_surf_id != ObjectId.Null && bottom_surf_id != ObjectId.Null)
                        {
                            TinSurface top_surf    = top_surf_id.GetObject(OpenMode.ForRead) as TinSurface;
                            TinSurface bottom_surf = bottom_surf_id.GetObject(OpenMode.ForRead) as TinSurface;
                            //bool UseCurrentFile = string.IsNullOrEmpty(PathToSaveSolids);
                            ObjectIdCollection out_solids = null;
                            try
                            {
                                out_solids = top_surf.CreateSolidsAtSurface(bottom_surf_id, layer, 0);
                            }
                            catch
                            {
                                SaveLog($"Wrong operation CreateSolids for top = {TopName} and bottom = {BottomName}");
                            }
                            if (out_solids != null)
                            {
                                string ids = $"For {surfaces_id} was created nest solids (Handle): \n";
                                foreach (ObjectId one_id in out_solids)
                                {
                                    string obj_handle = ((ObjectId)one_id).Handle.ToString();
                                    ids += obj_handle + "\t";
                                    solids_instances.Add(one_id);
                                    solids_ids.Add(surfaces_id);
                                }
                                SaveLog(ids + "\n");
                            }
                        }
                        else
                        {
                            SaveLog($"Invalid names for top = {TopName} and bottom = {BottomName}");
                        }
                    }
                    tr.Commit();
                }
            }
            return(new Dictionary <string, object>
            {
                { "Solid's instances", solids_instances },
                { "Solid's ids (by surfaces)", solids_ids }
            });
        }
Пример #12
0
        [CommandMethod("expsurfpts")] //Comanda pentru exportarea intr-un fisier PENZD.csv a punctelor unei suprafete
        public void ExpSurfPts()
        {
            CivilDocument      civDoc  = CivilApplication.ActiveDocument;
            Document           acadDoc = Application.DocumentManager.MdiActiveDocument;
            Database           db      = HostApplicationServices.WorkingDatabase;
            Editor             ed      = acadDoc.Editor;
            ObjectIdCollection surfIds = civDoc.GetSurfaceIds();

            //Verificarea existentei a cel putin unei suprafete
            if (surfIds.Count == 0)
            {
                ed.WriteMessage("\nNo Surfaces found!");
                return;
            }

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //Selectarea suprafetei
                Autodesk.Civil.DatabaseServices.Surface suprafata;
                if (surfIds.Count == 1)
                {
                    suprafata = (Autodesk.Civil.DatabaseServices.Surface)trans.GetObject(surfIds[0], OpenMode.ForRead);
                }
                else
                {
                    PromptEntityOptions PrEntOpt = new PromptEntityOptions("\nSelect Surface: ");
                    PrEntOpt.AllowNone = false;
                    PrEntOpt.SetRejectMessage("\nSelected object is not a Civil3D surface!");
                    PrEntOpt.AddAllowedClass(typeof(Autodesk.Civil.DatabaseServices.Surface), false);
                    PromptEntityResult PrEntRes = ed.GetEntity(PrEntOpt);
                    if (PrEntRes.Status != PromptStatus.OK)
                    {
                        ed.WriteMessage("\nAborting!");
                        return;
                    }
                    suprafata = (Autodesk.Civil.DatabaseServices.Surface)trans.GetObject(PrEntRes.ObjectId, OpenMode.ForRead);
                }

                //Obtinerea punctelor suprafetei
                List <string> puncte = new List <string>();
                int           nr     = 0;
                if (suprafata is Autodesk.Civil.DatabaseServices.TinSurface)
                {
                    Autodesk.Civil.DatabaseServices.TinSurface suprafTIN = (Autodesk.Civil.DatabaseServices.TinSurface)suprafata;
                    //Autodesk.Civil.DatabaseServices.TinSurfaceVertexCollection vertecsiTIN = suprafTIN.Vertices;
                    foreach (Autodesk.Civil.DatabaseServices.TinSurfaceVertex V in suprafTIN.Vertices)
                    {
                        nr = nr + 1;
                        puncte.Add(nr.ToString() + "," + V.Location.ToString().Replace("(", "").Replace(")", "") + "," + suprafata.Name);
                    }
                }
                else if (suprafata is Autodesk.Civil.DatabaseServices.GridSurface)
                {
                    Autodesk.Civil.DatabaseServices.GridSurface suprafGRID = (Autodesk.Civil.DatabaseServices.GridSurface)suprafata;
                    foreach (Autodesk.Civil.DatabaseServices.GridSurfaceVertex V in suprafGRID.Vertices)
                    {
                        nr = nr + 1;
                        puncte.Add(nr.ToString() + "," + V.Location.ToString().Replace("(", "").Replace(")", "") + "," + suprafata.Name);
                    }
                }
                else
                {
                    ed.WriteMessage("\nSurface type not supported! Aborting.");
                    return;
                }

                ////TEST: se listeaza punctele
                //foreach(string p in puncte) ed.WriteMessage(p);

                //Selectia fisierului .csv si scrierea punctelor
                PromptSaveFileOptions PrFileOpt = new PromptSaveFileOptions("\nSelect file for point export: ");
                PrFileOpt.Filter = ("CSV file (*.csv)|*.csv");
                string caleDocAcad = HostApplicationServices.Current.FindFile(acadDoc.Name, acadDoc.Database, FindFileHint.Default);
                //PrFileOpt.InitialDirectory = caleDocAcad.Remove(caleDocAcad.LastIndexOf("\\");
                PrFileOpt.InitialFileName = caleDocAcad.Replace(caleDocAcad.Substring(caleDocAcad.LastIndexOf('.')), ".csv");
                ed.WriteMessage(PrFileOpt.InitialDirectory);

                PromptFileNameResult PrFileRes = ed.GetFileNameForSave(PrFileOpt);
                if (PrFileRes.Status != PromptStatus.OK)
                {
                    ed.WriteMessage("\nPoint export unsuccessful!");
                    return;
                }
                StreamWriter scriitor = new StreamWriter(PrFileRes.StringResult);
                foreach (string p in puncte)
                {
                    scriitor.WriteLine(p);
                }
                scriitor.Dispose();
            }
        }