// // (C) Copyright 2003-2019 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. // using System; using System.Collections.Generic; using System.Text; using Autodesk.Revit.DB; using Autodesk.Revit; using System.Windows.Forms; using System.Collections; namespace Revit.SDK.Samples.NewHostedSweep.CS { /// /// Provides functions to create SlabEdge. /// public class SlabEdgeCreator : HostedSweepCreator { /// /// Constructor takes Revit.Document as parameter. /// /// Revit document public SlabEdgeCreator(Autodesk.Revit.UI.UIDocument rvtDoc) : base(rvtDoc) { } /// /// Edges which SlabEdge can be created on. /// private Dictionary> m_floorSlabEdges; /// /// Filter all the edges from the element which SlabEdge can be created on. /// /// private void FilterEdgesForSlabEdge(Autodesk.Revit.DB.Element elem) { Transaction transaction = new Transaction(this.RvtDocument, "FilterEdgesForSlabEdge"); transaction.Start(); // Note: This method will create a SlabEdge with no reference. // In the future, API may not allow to create such SlabEdge with // no references, invoke this methods like this may throw exception. // SlabEdge slabEdge = m_rvtDoc.Create.NewSlabEdge(null, new ReferenceArray()); List floorEdges = m_floorSlabEdges[elem]; foreach (Edge edge in m_elemGeom[elem].EdgeBindingDic.Keys) { if (edge.Reference == null) continue; try { slabEdge.AddSegment(edge.Reference); // AddSegment successfully, so this edge can be used to crate SlabEdge. floorEdges.Add(edge); } catch (Autodesk.Revit.Exceptions.ArgumentOutOfRangeException) { // Exception, this edge will be discard. } } // Delete this element, because we just use it to filter the edges. m_rvtDoc.Delete(slabEdge.Id); transaction.RollBack(); } /// /// A string indicates this creator just for Floor SlabEdge creation. /// public override string Name { get { return "Floor Slab Edge"; } } /// /// All SlabEdge types in Revit active document. /// public override IEnumerable AllTypes { get { FilteredElementCollector filteredElementCollector = new FilteredElementCollector(m_rvtDoc); filteredElementCollector.OfClass(typeof(SlabEdgeType)); return filteredElementCollector; } } /// /// Create a SlabEdge. /// /// SlabEdge type /// SlabEdge reference array /// Created SlabEdge protected override HostedSweep CreateHostedSweep(ElementType symbol, ReferenceArray refArr) { SlabEdge slabEdge = m_rvtDoc.Create.NewSlabEdge(symbol as SlabEdgeType, refArr); if (slabEdge != null) // Avoid the Revit warning, flip the direction in horizontal direction. slabEdge.HorizontalFlip(); return slabEdge; } /// /// Dictionary to store all the Floor=>Edges which SlabEdge can be created on. /// public override Dictionary> SupportEdges { get { if (m_floorSlabEdges == null) { m_floorSlabEdges = new Dictionary>(); FilteredElementCollector collector = new FilteredElementCollector(m_rvtDoc); collector.OfClass(typeof(Floor)); foreach (Element elem in collector.ToElements()) { if (elem is Floor) { ElementGeometry solid = ExtractGeom(elem); if (solid != null) { m_floorSlabEdges.Add(elem, new List()); m_elemGeom.Add(elem, solid); FilterEdgesForSlabEdge(elem); } } } } return m_floorSlabEdges; } } } }