Revit二次开发之填充区域创建标注
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;
namespace AutoDimention
{
[TransactionAttribute(TransactionMode.Manual)]
public class AutoDimentionGrid_Cmd : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
View view = uidoc.ActiveView;
UIApplication uiapp = commandData.Application;
IEnumerable<FilledRegion> filledRegions = FindFilledRegions(doc, view.Id);
using (Transaction ts = new Transaction(doc))
{
ts.Start("dimention");
foreach(FilledRegion region in filledRegions)
{
CreateDimentions(region, -1 * view.RightDirection);
CreateDimentions(region, view.UpDirection);
}
ts.Commit();
}
return Result.Succeeded;
}
public static IEnumerable<FilledRegion> FindFilledRegions(Document doc,ElementId viewId)
{
FilteredElementCollector collector = new FilteredElementCollector(doc, viewId);
return collector.OfClass(typeof(FilledRegion)).Cast<FilledRegion>();
}
private static void CreateDimentions(FilledRegion fillRegion,XYZ dimensionDirection)
{
Document doc = fillRegion.Document;
View view = doc.GetElement(fillRegion.OwnerViewId) as View;
XYZ edgesDirection = dimensionDirection.CrossProduct(view.ViewDirection);
List<Edge> edges = FindingRegionEdges(fillRegion).Where(m => IsEdgeDirectionSatisfied(m, edgesDirection)).ToList<Edge>();
if(edges.Count<2)
{
return;
}
var shift = UnitUtils.ConvertToInternalUnits(-10 * view.Scale, DisplayUnitType.DUT_MILLIMETERS) * edgesDirection;
var dimensionLine = Line.CreateBound(fillRegion.get_BoundingBox(view).Min + shift, dimensionDirection);
ReferenceArray referenceArray = new ReferenceArray();
foreach(Edge edge in edges)
{
referenceArray.Append(edge.Reference);
}
doc.Create.NewDimension(view, dimensionLine, referenceArray);
}
private static bool IsEdgeDirectionSatisfied(Edge edge,XYZ edgeDirection)
{
Line edgeCurve = edge.AsCurve() as Line;
if (edgeCurve == null) return false;
return edgeCurve.Direction.CrossProduct(edgeDirection).IsAlmostEqualTo(XYZ.Zero);
}
private static IEnumerable<Edge> FindingRegionEdges(FilledRegion filledRegion)
{
View view = filledRegion.Document.GetElement(filledRegion.OwnerViewId) as View;
Options opt = new Options
{
View = view,
ComputeReferences = true
};
return filledRegion.get_Geometry(opt).OfType<Solid>().SelectMany(m => m.Edges.Cast<Edge>());
}
}
}
点击我查看效果
参考文章