/// <summary> /// Make a line from start point to end point with the direction and style /// </summary> /// <param name="startpt">start point</param> /// <param name="endpt">end point</param> /// <param name="direction">the direction which decide the plane</param> /// <param name="style">line style name</param> public void MakeLine(Autodesk.Revit.DB.XYZ startpt, Autodesk.Revit.DB.XYZ endpt, Autodesk.Revit.DB.XYZ direction, string style) { try { m_LineCount = m_LineCount + 1; Line line = m_app.Application.Create.NewLineBound(startpt, endpt); // Line must lie in the sketch plane. Use the direction of the line to construct a plane that hosts the target line. XYZ rotatedDirection = XYZ.BasisX; // If the direction is not vertical, cross the direction vector with Z to get a vector rotated ninety degrees. That vector, // plus the original vector, form the axes of the sketch plane. if (!direction.IsAlmostEqualTo(XYZ.BasisZ) && !direction.IsAlmostEqualTo(-XYZ.BasisZ)) { rotatedDirection = direction.Normalize().CrossProduct(XYZ.BasisZ); } Plane geometryPlane = m_app.Application.Create.NewPlane(direction, rotatedDirection, startpt); SketchPlane skplane = m_app.ActiveUIDocument.Document.Create.NewSketchPlane(geometryPlane); ModelCurve mcurve = m_app.ActiveUIDocument.Document.Create.NewModelCurve(line, skplane); m_app.ActiveUIDocument.Document.Regenerate(); ElementArray lsArr = mcurve.LineStyles; foreach (Autodesk.Revit.DB.Element e in lsArr) { if (e.Name == style) { mcurve.LineStyle = e; break; } } m_app.ActiveUIDocument.Document.Regenerate(); } catch (System.Exception ex) { m_outputInfo.Add("Failed to create lines: " + ex.ToString()); } }
/// <summary> /// Draw a small line for debug porpouse /// </summary> public static void MakeLine(Autodesk.Revit.UI.UIApplication app, Autodesk.Revit.DB.XYZ startpt, Autodesk.Revit.DB.XYZ endpt, Autodesk.Revit.DB.XYZ direction, string style) { try { Line line = app.Application.Create.NewLineBound(startpt, endpt); XYZ rotatedDirection = XYZ.BasisX; if (!direction.IsAlmostEqualTo(XYZ.BasisZ) && !direction.IsAlmostEqualTo(-XYZ.BasisZ)) { rotatedDirection = direction.Normalize().CrossProduct(XYZ.BasisZ); } Plane geometryPlane = app.Application.Create.NewPlane (direction, rotatedDirection, startpt); SketchPlane skplane = app.ActiveUIDocument.Document. Create.NewSketchPlane(geometryPlane); ModelCurve mcurve = app.ActiveUIDocument.Document.Create. NewModelCurve(line, skplane); ElementArray lsArr = mcurve.LineStyles; foreach (Autodesk.Revit.DB.Element e in lsArr) { if (e.Name == style) { mcurve.LineStyle = e; break; } } } catch (System.Exception e) { } }
/// <summary> /// Get an edge from the form by its endpoints /// </summary> /// <param name="form">The form contains the edge</param> /// <param name="startPoint">Start point of the edge</param> /// <param name="endPoint">End point of the edge</param> /// <returns>The edge found</returns> private Edge GetEdgeByEndPoints(Form form, Autodesk.Revit.DB.XYZ startPoint, Autodesk.Revit.DB.XYZ endPoint) { Edge edge = null; // Get all edges of the form EdgeArray edges = null; Options geoOptions = m_revitApp.Create.NewGeometryOptions(); geoOptions.ComputeReferences = true; Autodesk.Revit.DB.GeometryElement geoElement = form.get_Geometry(geoOptions); foreach (GeometryObject geoObject in geoElement.Objects) { Solid solid = geoObject as Solid; if (null == solid) continue; edges = solid.Edges; } // Traverse the edges and look for the edge with the right endpoints foreach (Edge ed in edges) { Autodesk.Revit.DB.XYZ rpPos1 = ed.Evaluate(0); Autodesk.Revit.DB.XYZ rpPos2 = ed.Evaluate(1); if ((startPoint.IsAlmostEqualTo(rpPos1) && endPoint.IsAlmostEqualTo(rpPos2)) || (startPoint.IsAlmostEqualTo(rpPos2) && endPoint.IsAlmostEqualTo(rpPos1))) { edge = ed; break; } } return edge; }