Ejemplo n.º 1
0
 internal static Topography FromExisting(TopographySurface topoSurface, bool isRevitOwned)
 {
     return(new Topography(topoSurface)
     {
         IsRevitOwned = isRevitOwned
     });
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Normalizes all points in the selected subregion to the average elevation of the host surface.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        private void NormalizeSubregionAndPoints(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            // Pick subregion
            TopographySurface subregion   = SiteUIUtils.PickSubregion(uiDoc);
            TopographySurface toposurface = SiteEditingUtils.GetTopographySurfaceHost(subregion);
            IList <XYZ>       points      = SiteEditingUtils.GetPointsFromSubregionExact(subregion);

            // Get elevation of all points on the toposurface
            IList <XYZ> allPoints = toposurface.GetPoints();
            double      elevation = SiteEditingUtils.GetAverageElevation(allPoints);

            // Edit scope for all changes
            using (TopographyEditScope editScope = new TopographyEditScope(doc, "Edit TS"))
            {
                editScope.Start(toposurface.Id);

                using (Transaction t = new Transaction(doc, "Normalize terrain"))
                {
                    t.Start();

                    // Change all points to same elevation
                    toposurface.ChangePointsElevation(points, elevation);
                    t.Commit();
                }

                editScope.Commit(new TopographyEditFailuresPreprocessor());
            }
        }
Ejemplo n.º 3
0
        public ApplicationPlaceholderObject TopographyToNative(Topography speckleSurface)
        {
            var docObj = GetExistingElementByApplicationId(((Base)speckleSurface).applicationId);

            var pts = new List <XYZ>();

            for (int i = 0; i < speckleSurface.displayMesh.vertices.Count; i += 3)
            {
                var point = new Geometry.Point(speckleSurface.displayMesh.vertices[i], speckleSurface.displayMesh.vertices[i + 1], speckleSurface.displayMesh.vertices[i + 2], speckleSurface.displayMesh.units);
                pts.Add(PointToNative(point));
            }

            if (docObj != null)
            {
                Doc.Delete(docObj.Id);
            }

            var revitSurface = TopographySurface.Create(Doc, pts);

            if (speckleSurface is RevitTopography rt)
            {
                SetInstanceParameters(revitSurface, rt);
            }
            //Report.Log($"Created Topography {revitSurface.Id}");
            return(new ApplicationPlaceholderObject {
                applicationId = ((Base)speckleSurface).applicationId, ApplicationGeneratedId = revitSurface.UniqueId, NativeObject = revitSurface
            });
        }
Ejemplo n.º 4
0
        public static TopographySurface ToNative(this Topography mySurface)
        {
            var(docObj, stateObj) = GetExistingElementByApplicationId(mySurface.ApplicationId, mySurface.Type);

            var pts = new List <XYZ>();

            for (int i = 0; i < mySurface.Vertices.Count; i += 3)
            {
                pts.Add(new XYZ(mySurface.Vertices[i] * Scale, mySurface.Vertices[i + 1] * Scale, mySurface.Vertices[i + 2] * Scale));
            }

            if (docObj != null)
            {
                Doc.Delete(docObj.Id);

                // TODO: Can't start a transaction here as we have started a global transaction for the creation of all objects.
                // TODO: Let each individual ToNative method handle its own transactions. It's a big change, so will leave for later.

                //var srf = (TopographySurface) docObj;

                //using( TopographyEditScope e = new TopographyEditScope( Doc, "Speckle Topo Edit" ) )
                //{
                //  e.Start(srf.Id);
                //  srf.DeletePoints( srf.GetPoints() );
                //  srf.AddPoints( pts );
                //  e.Commit( null );
                //}
                //return srf;
            }

            return(TopographySurface.Create(Doc, pts));
        }
Ejemplo n.º 5
0
        void CommitInstance
        (
            Document doc, IGH_DataAccess DA, int Iteration,
            IEnumerable <Rhino.Geometry.Point3d> points
        )
        {
            var element = PreviousElement(doc, Iteration);

            try
            {
                if (element?.Pinned ?? true)
                {
                    var scaleFactor = 1.0 / Revit.ModelUnits;
                    if (scaleFactor != 1.0)
                    {
                        points = points.Select(p => p * scaleFactor);
                    }

                    element = TopographySurface.Create(doc, points.ToHost().ToList());
                }
            }
            catch (Exception e)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message);
            }
            finally
            {
                ReplaceElement(doc, DA, Iteration, element);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Implement this method as an external command for Revit.
        /// </summary>
        /// <param name="commandData">An object that is passed to the external application
        /// which contains data related to the command,
        /// such as the application object and active view.</param>
        /// <param name="message">A message that can be set by the external application
        /// which will be displayed if a failure or cancellation is returned by
        /// the external command.</param>
        /// <param name="elements">A set of elements to which the external application
        /// can add elements that are to be highlighted in case of failure or cancellation.</param>
        /// <returns>Return the status of the external command.
        /// A result of Succeeded means that the API external method functioned as expected.
        /// Cancelled can be used to signify that the user canceled the external operation
        /// at some point. Failure should be returned if the application is unable to proceed with
        /// the operation.</returns>
        public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                Document document = commandData.Application.ActiveUIDocument.Document;

                TrianglesData trianglesData = TrianglesData.Load();

                using (Transaction tran = new Transaction(document, "CreateTrianglesTopography"))
                {
                    tran.Start();
                    // Creates a new topography surface element from facets and adds it to the document.
                    IList <PolymeshFacet> triangleFacets = new List <PolymeshFacet>();
                    foreach (List <int> facet in trianglesData.Facets)
                    {
                        triangleFacets.Add(new PolymeshFacet(facet[0], facet[1], facet[2]));
                    }
                    TopographySurface topoSurface = TopographySurface.Create(document, trianglesData.Points, triangleFacets);
                    Parameter         name        = topoSurface.get_Parameter(Autodesk.Revit.DB.BuiltInParameter.ROOM_NAME);
                    if (name != null)
                    {
                        name.Set("CreateTrianglesTopography");
                    }
                    tran.Commit();
                }

                return(Result.Succeeded);
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return(Result.Failed);
            }
        }
Ejemplo n.º 7
0
        public ApplicationPlaceholderObject TopographyToNative(Topography speckleSurface)
        {
            var docObj = GetExistingElementByApplicationId(((Base)speckleSurface).applicationId);

            var pts = new List <XYZ>();

            for (int i = 0; i < speckleSurface.baseGeometry.vertices.Count; i += 3)
            {
                pts.Add(new XYZ(
                            ScaleToNative(speckleSurface.baseGeometry.vertices[i], speckleSurface.baseGeometry.units),
                            ScaleToNative(speckleSurface.baseGeometry.vertices[i + 1], speckleSurface.baseGeometry.units),
                            ScaleToNative(speckleSurface.baseGeometry.vertices[i + 2], speckleSurface.baseGeometry.units)));
            }

            if (docObj != null)
            {
                Doc.Delete(docObj.Id);
            }

            var revitSurface = TopographySurface.Create(Doc, pts);

            if (speckleSurface is RevitTopography rt)
            {
                SetInstanceParameters(revitSurface, rt);
            }

            return(new ApplicationPlaceholderObject {
                applicationId = ((Base)speckleSurface).applicationId, ApplicationGeneratedId = revitSurface.UniqueId, NativeObject = revitSurface
            });
        }
Ejemplo n.º 8
0
        private Topography(IList <XYZ> points)
        {
            //Phase 1 - Check to see if the object exists and should be rebound
            var oldSurf =
                ElementBinder.GetElementFromTrace <TopographySurface>(Document);

            var document = DocumentManager.Instance.CurrentDBDocument;

            //Phase 2- There was no existing point, create one
            TransactionManager.Instance.EnsureInTransaction(Document);

            var topo = TopographySurface.Create(document, points);

            InternalSetTopographySurface(topo);

            TransactionManager.Instance.TransactionTaskDone();

            if (oldSurf != null)
            {
                ElementBinder.CleanupAndSetElementForTrace(Document, this.InternalElement);
            }
            else
            {
                ElementBinder.SetElementForTrace(this.InternalElement);
            }
        }
Ejemplo n.º 9
0
        public RevitTopography TopographyToSpeckle(TopographySurface revitTopo)
        {
            var speckleTopo = new RevitTopography();

            speckleTopo.displayMesh = GetElementMesh(revitTopo);
            GetAllRevitParamsAndIds(speckleTopo, revitTopo);
            //Report.Log($"Converted Topography {revitTopo.Id}");
            return(speckleTopo);
        }
Ejemplo n.º 10
0
        public RevitTopography TopographyToSpeckle(TopographySurface revitTopo)
        {
            var speckleTopo = new RevitTopography();

            speckleTopo.baseGeometry = GetElementMesh(revitTopo);
            GetAllRevitParamsAndIds(speckleTopo, revitTopo);

            return(speckleTopo);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Prompts the user to pick a TopographySurface (non-subregion).
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        /// <returns>The selected TopographySurface.</returns>
        public static TopographySurface PickTopographySurface(UIDocument uiDoc)
        {
            Reference toposurfRef = uiDoc.Selection.PickObject(ObjectType.Element,
                                                               new TopographySurfaceSelectionFilter(),
                                                               "Select topography surface");

            TopographySurface toposurface = uiDoc.Document.GetElement(toposurfRef) as TopographySurface;

            return(toposurface);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Prompts the user to pick a subregion.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        /// <returns>The selected subregion.</returns>
        public static TopographySurface PickSubregion(UIDocument uiDoc)
        {
            Reference subregRef = uiDoc.Selection.PickObject(ObjectType.Element,
                                                             new SubRegionSelectionFilter(),
                                                             "Select subregion");

            TopographySurface subregion = uiDoc.Document.GetElement(subregRef) as TopographySurface;

            return(subregion);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Gets the points from a rectangular outline surrounding the subregion bounding box.
        /// </summary>
        /// <param name="subregion">The subregion.</param>
        /// <returns>The points.</returns>
        public static IList <XYZ> GetPointsFromSubregionRough(TopographySurface subregion)
        {
            BoundingBoxXYZ bbox = subregion.get_BoundingBox(null);

            // Get toposurface points
            TopographySurface toposurface = GetTopographySurfaceHost(subregion);

            Outline     outline = new Outline(bbox.Min, bbox.Max);
            IList <XYZ> points  = toposurface.FindPoints(outline);

            return(points);
        }
Ejemplo n.º 14
0
        void ReconstructTopographyByPoints
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            IList <Rhino.Geometry.Point3d> points,
            [Optional] IList <Rhino.Geometry.Curve> regions
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;

            if (scaleFactor != 1.0)
            {
                for (int p = 0; p < points.Count; ++p)
                {
                    points[p] = points[p] * scaleFactor;
                }

                if (regions != null)
                {
                    foreach (var region in regions)
                    {
                        region.Scale(scaleFactor);
                    }
                }
            }

            //if (element is TopographySurface topography)
            //{
            //  using (var editScope = new TopographyEditScope(doc, "TopographyByPoints"))
            //  {
            //    editScope.Start(element.Id);
            //    topography.DeletePoints(topography.GetPoints());
            //    topography.AddPoints(points.ToHost().ToList());

            //    foreach (var subRegionId in topography.GetHostedSubRegionIds())
            //      doc.Delete(subRegionId);

            //    editScope.Commit(new Revit.FailuresPreprocessor());
            //  }
            //}
            //else
            {
                ReplaceElement(ref element, TopographySurface.Create(doc, points.ToHost().ToList()));
            }

            if (element != null && regions != null && regions.Count > 0)
            {
                var curveLoops = regions.Select(region => CurveLoop.Create(region.ToHost().ToList())).ToList();
                SiteSubRegion.Create(doc, curveLoops, element.Id);
            }
        }
Ejemplo n.º 15
0
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication app = commandData.Application;
            Document      doc = app.ActiveUIDocument.Document;

            ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_Topography);

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            IList <Element>          topoSurf  = collector.WherePasses(filter).WhereElementIsNotElementType().ToElements();

            TopographySurface topo = topoSurf[0] as TopographySurface;

            try
            {
                GeometryElement elementGeometry = topo.get_Geometry(new Options());
                TaskDialog.Show("Here", elementGeometry.LongCount().ToString());

                int count = 0;
                foreach (GeometryObject obj in elementGeometry)
                {
                    if (obj is Mesh)
                    {
                        Mesh topoMesh = obj as Mesh;
                        count += topoMesh.NumTriangles;
                    }
                    else if (obj is Solid)
                    {
                        Solid sol = obj as Solid;
                        foreach (Face face in sol.Faces)
                        {
                            Mesh meshFace = face.Triangulate(0.7);
                        }
                    }
                }

                TaskDialog.Show("There", count.ToString());

                return(Result.Succeeded);
            }
            catch (Exception e)
            {
                TaskDialog.Show("There", e.Message);
                return(Result.Cancelled);
            }
        }
Ejemplo n.º 16
0
        public TopographySurface Run(Document doc)
        {
            var bb0 = coordService.GetRevitCoords(osmStore.MapBottom, osmStore.MapLeft);
            var bb1 = coordService.GetRevitCoords(osmStore.MapTop, osmStore.MapLeft);
            var bb2 = coordService.GetRevitCoords(osmStore.MapTop, osmStore.MapRight);
            var bb3 = coordService.GetRevitCoords(osmStore.MapBottom, osmStore.MapRight);

            var points = new List <XYZ>()
            {
                bb0, bb1, bb2, bb3
            };

            var topography = TopographySurface.Create(doc, points);

            return(topography);
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Prompts the user to select a point, and returns a point near to the associated TopographySurface.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        /// <param name="toposurface">The target topography surface.</param>
        /// <param name="message">The selection message.</param>
        /// <returns>The point.</returns>
        public static XYZ PickPointNearToposurface(UIDocument uiDoc, TopographySurface toposurface, String message)
        {
            // Pick the point
            XYZ point = uiDoc.Selection.PickPoint(message);

            // Get the average elevation for the host topography surface
            double elevation = SiteEditingUtils.GetAverageElevation(toposurface.GetPoints());

            // Project the point onto the Z = average elevation plane
            XYZ viewDirection = uiDoc.ActiveView.ViewDirection.Normalize();

            double elevationDelta = (elevation - point.Z) / viewDirection.Z;

            point = point + viewDirection * elevationDelta;

            return(point);
        }
Ejemplo n.º 18
0
        public DataToTopography(Document document, List <List <XYZ> > contours, double interpolationLength = 10, double proximityTolerance = 5)
        {
            Dictionary <string, XYZ> dict = new Dictionary <string, XYZ>();
            int counter = 0;

            foreach (List <XYZ> cntr in contours)
            {
                ProcessPolygon processedContour = new ProcessPolygon(cntr);
                processedContour.LoadEdgeLengths();
                processedContour.RemoveClosePoints(proximityTolerance);
                processedContour.Interpolate(interpolationLength);
                processedContour.LoadEdgeLengths();
                foreach (XYZ item in processedContour.ProcessedPolygon)
                {
                    string key = item.X.ToString() + item.Y.ToString();
                    try
                    {
                        dict.Add(key, item);
                    }
                    catch (Exception)
                    {
                        //MessageBox.Show(er.Message);
                        counter++;
                    }
                }
            }
            this.NumberOfFailedPoints = counter;
            List <XYZ> pnts = new List <XYZ>();

            foreach (var item in dict.Keys)
            {
                XYZ pn;
                if (dict.TryGetValue(item, out pn))
                {
                    pnts.Add(pn);
                }
            }
            using (Transaction createTopography = new Transaction(document))
            {
                createTopography.Start("Create Topography");
                this.Topography = TopographySurface.Create(document, pnts);
                createTopography.Commit();
            }
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Deletes a subregion and all topography surface points it contains.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        public void DeleteSubregionAndPoints(UIDocument uiDoc)
        {
            Document doc = uiDoc.Document;

            // Select subregion
            TopographySurface subregion   = SiteUIUtils.PickSubregion(uiDoc);
            TopographySurface toposurface = SiteEditingUtils.GetTopographySurfaceHost(subregion);
            IList <XYZ>       points      = SiteEditingUtils.GetNonBoundaryPoints(subregion);

            // All changes are added to one transaction group - will create one undo item
            using (TransactionGroup deleteGroup = new TransactionGroup(doc, "Delete region"))
            {
                deleteGroup.Start();

                // Edit scope to delete points- if there are points in the region
                if (points.Count > 0)
                {
                    using (TopographyEditScope editScope = new TopographyEditScope(doc, "Edit TS"))
                    {
                        editScope.Start(toposurface.Id);

                        // Transaction for point deletion
                        using (Transaction t = new Transaction(doc, "Delete points"))
                        {
                            t.Start();
                            toposurface.DeletePoints(points);
                            t.Commit();
                        }


                        editScope.Commit(new TopographyEditFailuresPreprocessor());
                    }
                }

                // Transaction to delete subregion
                using (Transaction t2 = new Transaction(doc, "Delete subregion"))
                {
                    t2.Start();
                    doc.Delete(subregion.Id);
                    t2.Commit();
                }
                deleteGroup.Assimilate();
            }
        }
Ejemplo n.º 20
0
        private void okButton_Click(object sender, RoutedEventArgs e)
        {
            // Get the lat and long domain
            latMin = Convert.ToDouble(minLatTextBox.Text);
            latMax = Convert.ToDouble(maxLatTextBox.Text);
            lonMin = Convert.ToDouble(minLonTextBox.Text);
            lonMax = Convert.ToDouble(maxLonTextBox.Text);

            LINE.Geometry.Interval2d topoDomain = new LINE.Geometry.Interval2d(lonMin, lonMax, latMin, latMax);

            // output parameters

            string filePath = fileTextBox.Text;


            if (filePath != null && System.IO.File.Exists(filePath))
            {
                List <List <LINE.Geometry.Point3d> > pts = ElkLib.ProcessTopoFile(filePath, unitScale, topoDomain);

                List <XYZ> points = new List <XYZ>();
                for (int i = 0; i < pts.Count; i++)
                {
                    List <LINE.Geometry.Point3d> rowPoints = pts[i];

                    for (int j = 0; j < rowPoints.Count; j++)
                    {
                        XYZ revPoint = new XYZ(rowPoints[j].X, rowPoints[j].Y, rowPoints[j].Z);
                        points.Add(revPoint);
                    }
                }
                using (Transaction trans = new Transaction(doc, "Elk Create Topography"))
                {
                    trans.Start();

                    if (points.Count > 2)
                    {
                        TopographySurface topo = TopographySurface.Create(doc, points);
                    }
                    trans.Commit();
                }
            }
            Close();
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Exports topography surface as IFC site object.
        /// </summary>
        /// <param name="exporterIFC">The ExporterIFC object.</param>
        /// <param name="topoSurface">The TopographySurface object.</param>
        /// <param name="geometryElement">The geometry element.</param>
        /// <param name="productWrapper">The ProductWrapper.</param>
        public static void ExportTopographySurface(ExporterIFC exporterIFC, TopographySurface topoSurface, GeometryElement geometryElement, ProductWrapper productWrapper)
        {
            // Skip if the element is already processed and the Site has been created before
            if (!IFCAnyHandleUtil.IsNullOrHasNoValue(ExporterCacheManager.SiteHandle) && !IFCAnyHandleUtil.IsNullOrHasNoValue(ExporterCacheManager.ElementToHandleCache.Find(topoSurface.Id)))
            {
                return;
            }

            string            ifcEnumType;
            IFCExportInfoPair exportType = ExporterUtil.GetExportType(exporterIFC, topoSurface, out ifcEnumType);

            // Check the intended IFC entity or type name is in the exclude list specified in the UI
            Common.Enums.IFCEntityType elementClassTypeEnum;

            if (Enum.TryParse <Common.Enums.IFCEntityType>(exportType.ExportInstance.ToString(), out elementClassTypeEnum) ||
                Enum.TryParse <Common.Enums.IFCEntityType>(exportType.ExportType.ToString(), out elementClassTypeEnum))
            {
                if (ExporterCacheManager.ExportOptionsCache.IsElementInExcludeList(elementClassTypeEnum))
                {
                    return;
                }

                if (elementClassTypeEnum == Common.Enums.IFCEntityType.IfcSite)
                {
                    ExportSiteBase(exporterIFC, topoSurface.Document, topoSurface, geometryElement, productWrapper);
                }
                else
                {
                    // Export Default Site first before exporting the TopographySurface as a generic element
                    ExportDefaultSite(exporterIFC, topoSurface.Document, productWrapper);
                    using (ProductWrapper genElemProductWrapper = ProductWrapper.Create(exporterIFC, true))
                    {
                        GenericElementExporter.ExportGenericElement(exporterIFC, topoSurface, geometryElement, genElemProductWrapper, exportType);
                        ExporterUtil.ExportRelatedProperties(exporterIFC, topoSurface, genElemProductWrapper);
                    }
                    productWrapper.ClearInternalHandleWrapperData(topoSurface.Document.ProjectInformation);
                }
            }
            else
            {
                ExportSiteBase(exporterIFC, null, topoSurface, geometryElement, productWrapper);
            }
        }
Ejemplo n.º 22
0
        public override Value Evaluate(FSharpList <Value> args)
        {
            if (!args[0].IsList)
            {
                throw new Exception("The input is not a list of points.");
            }

            var newPts = ((Value.List)args[0]).Item.Select(x => (XYZ)((Value.Container)x).Item).ToList();

            if (!newPts.Any())
            {
                throw new Exception("There are no points in the list.");
            }

            TopographySurface topo = null;

            if (Elements.Any())
            {
                if (dynUtils.TryGetElement(Elements[0], out topo))
                {
                    //In Revit 2014, a transaction edit scope is required to edit a topo surface
                    //we can not currently handle this as it generates a transaction group
                    //so just delete the existing surface and remake.
                    DeleteElement(Elements[0]);

                    topo        = CreateTopographySurface(newPts);
                    Elements[0] = topo.Id;
                }
            }
            else
            {
                topo = CreateTopographySurface(newPts);
                Elements.Add(topo.Id);
            }

            if (topo == null)
            {
                throw new ArgumentException("A topography surface could not be created.");
            }

            return(Value.NewContainer(topo));
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Gets all non-boundary points from a TopographySurface or Subregion.
        /// </summary>
        /// <param name="toposurface">The TopographySurface or Subregion.</param>
        /// <returns>The non-boundary points.</returns>
        public static IList <XYZ> GetNonBoundaryPoints(TopographySurface toposurface)
        {
            IList <XYZ> existingPoints = toposurface.GetPoints();

            // Remove boundary points from the list.
            IList <XYZ> boundaryPoints = toposurface.GetBoundaryPoints();

            foreach (XYZ boundaryPoint in boundaryPoints)
            {
                foreach (XYZ existingPoint in existingPoints)
                {
                    if (boundaryPoint.IsAlmostEqualTo(existingPoint, 1e-05))
                    {
                        existingPoints.Remove(existingPoint);
                        break;
                    }
                }
            }

            return(existingPoints);
        }
Ejemplo n.º 24
0
        public static Topography ToSpeckle(this TopographySurface mySurface)
        {
            var speckleTopo = new Topography();

            speckleTopo.Vertices = new List <double>();
            speckleTopo.Faces    = new List <int>();

            var geom = mySurface.get_Geometry(new Options());

            foreach (var element in geom)
            {
                if (element is Mesh)
                {
                    var mesh = ( Mesh )element;

                    foreach (var vert in mesh.Vertices)
                    {
                        speckleTopo.Vertices.AddRange(new double[] { vert.X / Scale, vert.Y / Scale, vert.Z / Scale });
                    }

                    for (int i = 0; i < mesh.NumTriangles; i++)
                    {
                        var triangle = mesh.get_Triangle(i);
                        var A        = triangle.get_Index(0);
                        var B        = triangle.get_Index(1);
                        var C        = triangle.get_Index(2);
                        speckleTopo.Faces.Add(0);
                        speckleTopo.Faces.AddRange(new int[] { ( int )A, ( int )B, ( int )C });
                    }
                }
            }

            speckleTopo.parameters     = GetElementParams(mySurface);
            speckleTopo.typeParameters = GetElementTypeParams(mySurface);
            speckleTopo.ApplicationId  = mySurface.UniqueId;
            speckleTopo.elementId      = mySurface.Id.ToString();

            speckleTopo.GenerateHash();
            return(speckleTopo);
        }
Ejemplo n.º 25
0
        void ReconstructTopographyByPoints
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            IList <Rhino.Geometry.Point3d> points,
            [Optional] IList <Rhino.Geometry.Curve> regions
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;
            var xyz         = points.Select(x => x.ChangeUnits(scaleFactor).ToHost()).ToArray();

            //if (element is TopographySurface topography)
            //{
            //  using (var editScope = new TopographyEditScope(doc, "TopographyByPoints"))
            //  {
            //    editScope.Start(element.Id);
            //    topography.DeletePoints(topography.GetPoints());
            //    topography.AddPoints(points.ToHost().ToList());

            //    foreach (var subRegionId in topography.GetHostedSubRegionIds())
            //      doc.Delete(subRegionId);

            //    editScope.Commit(new Revit.FailuresPreprocessor());
            //  }
            //}
            //else
            {
                ReplaceElement(ref element, TopographySurface.Create(doc, xyz));
            }

            if (element is object && regions?.Count > 0)
            {
                var curveLoops = regions.Select(region => CurveLoop.Create(region.ChangeUnits(scaleFactor).ToHostMultiple().ToArray())).ToArray();
                SiteSubRegion.Create(doc, curveLoops, element.Id);
            }
        }
Ejemplo n.º 26
0
        /// <summary>
        /// Changes the elevation of all points in the subregion by a designated delta.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        /// <param name="elevationDelta">The change in elevation.</param>
        public static void ChangeSubregionAndPointsElevation(UIDocument uiDoc, double elevationDelta)
        {
            Document doc = uiDoc.Document;

            // Pick subregion
            TopographySurface subregion   = PickSubregion(uiDoc);
            TopographySurface toposurface = SiteEditingUtils.GetTopographySurfaceHost(subregion);

            // Get points
            IList <XYZ> points = SiteEditingUtils.GetNonBoundaryPoints(subregion);

            if (points.Count == 0)
            {
                return;
            }

            // Change in elevation
            XYZ delta = elevationDelta * XYZ.BasisZ;

            // Edit scope for all changes
            using (TopographyEditScope editScope = new TopographyEditScope(doc, "Raise/lower terrain"))
            {
                editScope.Start(toposurface.Id);

                using (Transaction t = new Transaction(doc, "Raise/lower terrain"))
                {
                    t.Start();

                    // Use MovePoints to change all points relative to their current position
                    toposurface.MovePoints(points, delta);
                    t.Commit();
                }

                editScope.Commit(new TopographyEditFailuresPreprocessor());
            }
        }
Ejemplo n.º 27
0
 private void InternalSetTopographySurface(TopographySurface topoSurface)
 {
     InternalTopographySurface = topoSurface;
     this.InternalElementId    = InternalTopographySurface.Id;
     this.InternalUniqueId     = InternalTopographySurface.UniqueId;
 }
Ejemplo n.º 28
0
        /// <summary>
        /// Adds a new retaining pond.
        /// </summary>
        /// <param name="uiDoc">The document.</param>
        /// <param name="pondRadius">The radius of the pond.</param>
        private void AddNewRetainingPond(UIDocument uiDoc, double pondRadius)
        {
            Document doc = uiDoc.Document;

            // Find toposurfaces
            FilteredElementCollector tsCollector = new FilteredElementCollector(doc);

            tsCollector.OfClass(typeof(TopographySurface));
            IEnumerable <TopographySurface> tsEnumerable = tsCollector.Cast <TopographySurface>().Where <TopographySurface>(ts => !ts.IsSiteSubRegion);
            int count = tsEnumerable.Count <TopographySurface>();

            // If there is only on surface, use it.  If there is more than one, let the user select the target.
            TopographySurface targetSurface = null;

            if (count > 1) // tmp
            {
                targetSurface = SiteUIUtils.PickTopographySurface(uiDoc);
            }
            else
            {
                targetSurface = tsEnumerable.First <TopographySurface>();
            }

            // Pick point and project to plane at toposurface average elevation
            XYZ    point     = SiteUIUtils.PickPointNearToposurface(uiDoc, targetSurface, "Pick point for center of pond.");
            double elevation = point.Z;

            // Add subregion first, so that any previously existing points can be removed to avoid distorting the new region

            // Find material "Water"
            FilteredElementCollector collector = new FilteredElementCollector(doc);

            collector.OfClass(typeof(Material));
            Material mat = collector.Cast <Material>().FirstOrDefault <Material>(m => m.Name == "Water");

            // Create subregion curves
            List <Curve> curves = new List <Curve>();

            curves.Add(Arc.Create(point, pondRadius, 0, Math.PI, XYZ.BasisX, XYZ.BasisY));
            curves.Add(Arc.Create(point, pondRadius, Math.PI, 2 * Math.PI, XYZ.BasisX, XYZ.BasisY));

            CurveLoop        curveLoop  = CurveLoop.Create(curves);
            List <CurveLoop> curveLoops = new List <CurveLoop>();

            curveLoops.Add(curveLoop);

            // All changes are added to one transaction group - will create one undo item
            using (TransactionGroup addGroup = new TransactionGroup(doc, "Add pond group"))
            {
                addGroup.Start();

                IList <XYZ> existingPoints = null;
                // Transacton for adding subregion.
                using (Transaction t2 = new Transaction(doc, "Add subregion"))
                {
                    t2.Start();
                    SiteSubRegion region = SiteSubRegion.Create(doc, curveLoops, targetSurface.Id);
                    if (mat != null)
                    {
                        region.TopographySurface.MaterialId = mat.Id;
                    }
                    t2.Commit();

                    // The boundary points for the subregion cannot be deleted, since they are generated
                    // to represent the subregion boundary rather than representing real points in the host.
                    // Get non-boundary points only to be deleted.
                    existingPoints = SiteEditingUtils.GetNonBoundaryPoints(region.TopographySurface);

                    // Average elevation of all points in the subregion to use as base elevation for the pond topography
                    elevation = SiteEditingUtils.GetAverageElevation(region.TopographySurface.GetPoints());
                }

                // Add the topography points to the target surface via edit scope.
                using (TopographyEditScope editScope = new TopographyEditScope(doc, "Edit TS"))
                {
                    editScope.Start(targetSurface.Id);

                    // Transaction for points changes
                    using (Transaction t = new Transaction(doc, "Add points"))
                    {
                        t.Start();

                        // Delete existing points first to avoid conflict
                        if (existingPoints.Count > 0)
                        {
                            targetSurface.DeletePoints(existingPoints);
                        }

                        // Generate list of points to add
                        IList <XYZ> points = SiteEditingUtils.GeneratePondPointsSurrounding(new XYZ(point.X, point.Y, elevation - 3), pondRadius);
                        targetSurface.AddPoints(points);
                        t.Commit();
                    }

                    editScope.Commit(new TopographyEditFailuresPreprocessor());
                }
                addGroup.Assimilate();
            }
        }
Ejemplo n.º 29
0
 private TopographySurface CreateTopographySurface(List <XYZ> points)
 {
     return(TopographySurface.Create(dynRevitSettings.Doc.Document, points));
 }
Ejemplo n.º 30
0
 /// <summary>
 /// Exports topography surface as IFC site object.
 /// </summary>
 /// <param name="exporterIFC">The ExporterIFC object.</param>
 /// <param name="topoSurface">The TopographySurface object.</param>
 /// <param name="geometryElement">The geometry element.</param>
 /// <param name="productWrapper">The ProductWrapper.</param>
 public static void ExportTopographySurface(ExporterIFC exporterIFC, TopographySurface topoSurface, GeometryElement geometryElement, ProductWrapper productWrapper)
 {
     ExportSiteBase(exporterIFC, null, topoSurface, geometryElement, productWrapper);
 }
Ejemplo n.º 31
0
 /// <summary>
 /// Exports topography surface as IFC site object.
 /// </summary>
 /// <param name="exporterIFC">
 /// The ExporterIFC object.
 /// </param>
 /// <param name="topSurface">
 /// The TopographySurface object.
 /// </param>
 /// <param name="geometryElement">
 /// The geometry element.
 /// </param>
 /// <param name="productWrapper">
 /// The IFCProductWrapper.
 /// </param>
 public static void ExportTopographySurface(ExporterIFC exporterIFC, TopographySurface topSurface, GeometryElement geometryElement, IFCProductWrapper productWrapper)
 {
     ExportSiteBase(exporterIFC, null, topSurface, geometryElement, productWrapper);
     PropertyUtil.CreateInternalRevitPropertySets(exporterIFC, topSurface, productWrapper);
 }
Ejemplo n.º 32
0
 internal static Topography FromExisting(TopographySurface topoSurface, bool isRevitOwned)
 {
     return new Topography(topoSurface)
     {
         IsRevitOwned = isRevitOwned
     };
 }
Ejemplo n.º 33
0
 private void InternalSetTopographySurface(TopographySurface topoSurface)
 {
     InternalTopographySurface = topoSurface;
     this.InternalElementId = InternalTopographySurface.Id;
     this.InternalUniqueId = InternalTopographySurface.UniqueId;
 }
Ejemplo n.º 34
0
 private Topography(TopographySurface topoSurface)
 {
     InternalSetTopographySurface(topoSurface);
 }
Ejemplo n.º 35
0
 private Topography(TopographySurface topoSurface)
 {
     InternalSetTopographySurface(topoSurface);
 }