/// <summary> 将 CurveArray 中的曲线进行重新排列,以组成连续的曲线链 </summary> /// <param name="curveArr"> 要进行重组的曲线集合 </param> /// <param name="contigeousCurves"> 如果不能形成连续的曲线链,则返回 null </param> public static void GetContiguousCurvesFromCurves(CurveArray curveArr, out IList <Curve> contigeousCurves) { IList <Curve> curves = curveArr.Cast <Curve>().ToList(); // Build a list of curves from the curve elements contigeousCurves = CurvesFormator.GetContiguousCurvesFromCurves(curves); }
protected IEnumerable <Autodesk.Revit.DB.Curve> GetCurves(Autodesk.Revit.DB.Options options) { var geomElem = this.InternalElement.get_Geometry(options); var curves = new CurveArray(); GetCurves(geomElem, ref curves); return(curves.Cast <Autodesk.Revit.DB.Curve>()); }
//thanks Revit public CurveLoop CurveArrayToCurveLoop(CurveArray array) { var loop = new CurveLoop(); foreach (var item in array.Cast <DB.Curve>()) { loop.Append(item); } return(loop); }
/// <summary> /// Improved implementation by Alexander Ignatovich /// supporting curved wall with curved window, /// second attempt, published April 10, 2015: /// </summary> public Result Execute3( ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Application app = uiapp.Application; Document doc = uidoc.Document; View view = doc.ActiveView; Autodesk.Revit.Creation.Application creapp = app.Create; Autodesk.Revit.Creation.Document credoc = doc.Create; Reference r = uidoc.Selection.PickObject( ObjectType.Element, "Select a wall"); Element e = uidoc.Document.GetElement(r); Creator creator = new Creator(doc); Wall wall = e as Wall; if (wall == null) { return(Result.Cancelled); } using (Transaction tx = new Transaction(doc)) { tx.Start("Wall Profile"); // Get the external wall face for the profile // a little bit simpler than in the last realization Reference sideFaceReference = HostObjectUtils.GetSideFaces( wall, ShellLayerType.Exterior) .First(); Face face = wall.GetGeometryObjectFromReference( sideFaceReference) as Face; // The normal of the wall external face. XYZ normal = wall.Orientation; // Offset curve copies for visibility. Transform offset = Transform.CreateTranslation( 5 * normal); // If the curve loop direction is counter- // clockwise, change its color to RED. Color colorRed = new Color(255, 0, 0); // Get edge loops as curve loops. IList <CurveLoop> curveLoops = face.GetEdgesAsCurveLoops(); foreach (var curveLoop in curveLoops) { CurveArray curves = creapp.NewCurveArray(); foreach (Curve curve in curveLoop) { curves.Append(curve.CreateTransformed( offset)); } var isCounterClockwize = curveLoop .IsCounterclockwise(normal); // Create model lines for an curve loop if it is made if (((LocationCurve)wall.Location).Curve is Line) { //Plane plane = creapp.NewPlane( curves ); // 2016 Plane plane = CurveLoop.CreateViaOffset( curveLoop, 5 * normal.GetLength(), normal.Normalize()).GetPlane(); // 2017 SketchPlane sketchPlane = SketchPlane.Create(doc, plane); ModelCurveArray curveElements = credoc .NewModelCurveArray(curves, sketchPlane); if (isCounterClockwize) { SetModelCurvesColor(curveElements, view, colorRed); } } else { foreach (var curve in curves.Cast <Curve>()) { var curveElements = creator.CreateModelCurves(curve); if (isCounterClockwize) { SetModelCurvesColor(curveElements, view, colorRed); } } } } tx.Commit(); } return(Result.Succeeded); }
/// <summary> /// Improved implementation by Alexander Ignatovich /// supporting curved wall with curved window, /// second attempt, published April 10, 2015: /// </summary> public Result Execute3( ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Application app = uiapp.Application; Document doc = uidoc.Document; View view = doc.ActiveView; Autodesk.Revit.Creation.Application creapp = app.Create; Autodesk.Revit.Creation.Document credoc = doc.Create; Reference r = uidoc.Selection.PickObject( ObjectType.Element, "Select a wall"); Element e = uidoc.Document.GetElement(r); Creator creator = new Creator(doc); Wall wall = e as Wall; if (wall == null) { return(Result.Cancelled); } using (Transaction tx = new Transaction(doc)) { tx.Start("Wall Profile"); // Get the external wall face for the profile // a little bit simpler than in the last // implementation in Execute2. Reference sideFaceReference = HostObjectUtils.GetSideFaces( wall, ShellLayerType.Exterior) .First(); Face face = wall.GetGeometryObjectFromReference( sideFaceReference) as Face; // The plane and normal of the wall external face. XYZ normal = wall.Orientation.Normalize(); Transform ftx = face.ComputeDerivatives(UV.Zero); XYZ forigin = ftx.Origin; XYZ fnormal = ftx.BasisZ; Debug.Print( "wall orientation {0}, face origin {1}, face normal {2}", Util.PointString(normal), Util.PointString(forigin), Util.PointString(fnormal)); // Offset distance. double d = 5; // Offset curve copies for visibility. XYZ voffset = d * normal; Transform offset = Transform.CreateTranslation( voffset); // If the curve loop direction is counter- // clockwise, change its color to RED. Color colorRed = new Color(255, 0, 0); // Get edge loops as curve loops. IList <CurveLoop> curveLoops = face.GetEdgesAsCurveLoops(); foreach (var curveLoop in curveLoops) { //CurveLoop curveLoopOffset = CurveLoop.CreateViaOffset( // curveLoop, d, normal ); CurveArray curves = creapp.NewCurveArray(); foreach (Curve curve in curveLoop) { curves.Append(curve.CreateTransformed( offset)); } var isCounterClockwize = curveLoop .IsCounterclockwise(normal); // Create model lines for an curve loop if it is made Curve wallCurve = ((LocationCurve)wall.Location).Curve; if (wallCurve is Line) { //Plane plane = creapp.NewPlane( curves ); // 2016 //Plane plane = curveLoopOffset.GetPlane(); // 2017 Plane plane = Plane.CreateByNormalAndOrigin( // 2019 normal, forigin + voffset); Debug.Print( "plane origin {0}, plane normal {1}", Util.PointString(plane.Origin), Util.PointString(plane.Normal)); SketchPlane sketchPlane = SketchPlane.Create(doc, plane); ModelCurveArray curveElements = credoc .NewModelCurveArray(curves, sketchPlane); if (isCounterClockwize) { SetModelCurvesColor(curveElements, view, colorRed); } } else { foreach (var curve in curves.Cast <Curve>()) { var curveElements = creator.CreateModelCurves(curve); if (isCounterClockwize) { SetModelCurvesColor(curveElements, view, colorRed); } } } } tx.Commit(); } return(Result.Succeeded); }
protected IEnumerable<Autodesk.Revit.DB.Curve> GetCurves(Autodesk.Revit.DB.Options options) { var geomElem = this.InternalElement.get_Geometry(options); var curves = new CurveArray(); GetCurves(geomElem, ref curves); return curves.Cast<Autodesk.Revit.DB.Curve>(); }