// // (C) Copyright 2003-2023 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. // namespace Revit.SDK.Samples.CreateComplexAreaRein.CS { using System.Collections.Generic; using System.Linq; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure; using Element = Autodesk.Revit.DB.Element; /// /// provide utility method to get geometry data for /// creating AreaReinforcement on wall or floor /// class GeomHelper { private Document m_currentDoc; //active document /// /// constructor, initialize m_currentDoc /// public GeomHelper() { m_currentDoc = Command.CommandData.Application.ActiveUIDocument.Document; } /// /// get necessary data when create AreaReinforcement on a horizontal floor /// /// floor on which to create AreaReinforcemen /// reference of the horizontal face on the floor /// curves compose the horizontal face of the floor /// is successful public bool GetFloorGeom(Floor floor, ref Reference refer, ref IList curves) { //get horizontal face's reference FaceArray faces = GeomUtil.GetFaces(floor); foreach (Face face in faces) { if (GeomUtil.IsHorizontalFace(face)) { refer = face.Reference; break; } } if (null == refer) { return false; } //get analytical model profile AnalyticalPanel model = null; Document document = floor.Document; AnalyticalToPhysicalAssociationManager assocManager = AnalyticalToPhysicalAssociationManager.GetAnalyticalToPhysicalAssociationManager(document); if (assocManager != null) { ElementId associatedElementId = assocManager.GetAssociatedElementId(floor.Id); if (associatedElementId != ElementId.InvalidElementId) { Element associatedElement = document.GetElement(associatedElementId); if (associatedElement != null && associatedElement is AnalyticalPanel) { model = associatedElement as AnalyticalPanel; } } } if (null == model) { return false; } curves = model.GetOuterContour().ToList(); if (!GeomUtil.IsRectangular(curves)) { return false; } curves = AddInlaidCurves(curves, 0.5); return true; } /// /// create CurveArray which contain 8 curves, 4 is exterior lines and 4 is interior lines /// /// /// /// private IList AddInlaidCurves(IList curves, double scale) { //because curves is readonly, can't use method Curve.Append(Curve) List lines = new List(); for (int i = 0; i < 4; i++) { Line temp = curves[i] as Line; lines.Add(temp); } //length and width of the rectangle double length = GeomUtil.GetLength(lines[0]); double width = GeomUtil.GetLength(lines[1]); for (int i = 0; i < 2; i++) { //height line Line tempLine1 = lines[i * 2]; Line scaledLine1 = GeomUtil.GetScaledLine(tempLine1, scale); double distance1 = scale / 2 * width; Line movedLine1 = GeomUtil.GetXYParallelLine(scaledLine1, distance1); lines.Add(movedLine1); //width line Line tempLine2 = lines[i * 2 + 1]; Line scaledLine2 = GeomUtil.GetScaledLine(tempLine2, scale); double distance2 = scale / 2 * length; Line movedLine2 = GeomUtil.GetXYParallelLine(scaledLine2, distance2); lines.Add(movedLine2); } //add all 8 lines into return array IList allLines = new List(); for (int i = 0; i < 8; i++) { allLines.Add(lines[i]); } return allLines; } } }