private void InitFamilyInstance(Autodesk.Revit.DB.FamilySymbol fs, Autodesk.Revit.DB.Line line, Autodesk.Revit.DB.Level level) { //Phase 1 - Check to see if the object exists and should be rebound var oldFam = ElementBinder.GetElementFromTrace <Autodesk.Revit.DB.FamilyInstance>(DocumentManager.Instance.CurrentDBDocument); //There was a point, rebind to that, and adjust its position if (oldFam != null) { InternalSetFamilyInstance(oldFam); InternalSetLevel(level); InternalSetFamilySymbol(fs); InternalSetPosition(line); return; } //Phase 2- There was no existing point, create one TransactionManager.Instance.EnsureInTransaction(DocumentManager.Instance.CurrentDBDocument); //If the symbol is not active, then activate it if (!fs.IsActive) { fs.Activate(); } var fi = DocumentManager.Instance.CurrentDBDocument.Create.NewFamilyInstance(line, fs, level, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); ((Autodesk.Revit.DB.LocationCurve)fi.Location).Curve = line; InternalSetFamilyInstance(fi); TransactionManager.Instance.TransactionTaskDone(); ElementBinder.SetElementForTrace(InternalElement); }
public static void CenterTextOnLine(global::Revit.Elements.Dimension dimension) { Autodesk.Revit.DB.Document doc = DocumentManager.Instance.CurrentDBDocument; Autodesk.Revit.DB.Dimension internalDimension = (Autodesk.Revit.DB.Dimension)dimension.InternalElement; Autodesk.Revit.DB.View ownerView = (Autodesk.Revit.DB.View)doc.GetElement(internalDimension.OwnerViewId); //calculate offset distance from the view scale and the text size. int viewScaleFactor = ownerView.Scale; double textHeight = (double)internalDimension.DimensionType.get_Parameter(BuiltInParameter.TEXT_SIZE).AsDouble(); double offsetAmount = ((textHeight + 0.002604) / 2) * viewScaleFactor; List <Line> dimCurve = GetCurve(dimension); if (internalDimension.NumberOfSegments > 1) { for (int i = 0; i < internalDimension.NumberOfSegments; i++) { Autodesk.Revit.DB.Line dimLine = dimCurve[i].ToRevitType() as Autodesk.Revit.DB.Line; var currentSegment = internalDimension.Segments.get_Item(i); XYZ point = dimLine.Evaluate(0.5, true); XYZ normal = dimLine.Direction.Normalize(); XYZ dir = new XYZ(0, 0, 1); XYZ cross = normal.CrossProduct(dir); if (cross.Y > 0) { offsetAmount = -offsetAmount; } XYZ pointEnd = point + (offsetAmount) * cross; TransactionManager.Instance.EnsureInTransaction(doc); currentSegment.TextPosition = pointEnd; TransactionManager.Instance.TransactionTaskDone(); } } else { Autodesk.Revit.DB.Line singleLine = dimCurve.First().ToRevitType() as Autodesk.Revit.DB.Line; XYZ point = singleLine.Evaluate(0.5, true); XYZ normal = singleLine.Direction.Normalize(); XYZ dir = new XYZ(0, 0, 1); XYZ cross = normal.CrossProduct(dir); if (cross.Y > 0) { offsetAmount = -offsetAmount; } XYZ pointEnd = point + (offsetAmount) * cross; TransactionManager.Instance.EnsureInTransaction(doc); internalDimension.TextPosition = pointEnd; TransactionManager.Instance.TransactionTaskDone(); } }
public static List <Autodesk.DesignScript.Geometry.Line> GetCurve(global::Revit.Elements.Dimension dimension) { //convert to internal dimension Autodesk.Revit.DB.Dimension internalDimension = (Autodesk.Revit.DB.Dimension)dimension.InternalElement; Document doc = internalDimension.Document; List <Autodesk.DesignScript.Geometry.Line> dimensionLine = new List <Line>(); if (internalDimension.NumberOfSegments > 1) { Autodesk.Revit.DB.DimensionSegmentArray dimSegArray = internalDimension.Segments; List <Autodesk.Revit.DB.DimensionSegment> dimSegments = new List <DimensionSegment>(); foreach (Autodesk.Revit.DB.DimensionSegment seg in internalDimension.Segments) { dimSegments.Add(seg); } foreach (Autodesk.Revit.DB.DimensionSegment s in dimSegments) { var originPoint = s.Origin.ToPoint(); Autodesk.Revit.DB.Line dimCurve = (Autodesk.Revit.DB.Line)internalDimension.Curve; var vector = dimCurve.Direction.ToVector(); var dimValue = s.Value.Value; if (doc.DisplayUnitSystem.ToString() != "IMPERIAL") { dimValue = s.Value.Value * 304.8; } var startPoint = (Autodesk.DesignScript.Geometry.Point)originPoint.Translate(vector.Reverse(), dimValue / 2); var endPoint = (Autodesk.DesignScript.Geometry.Point)originPoint.Translate(vector, dimValue / 2); dimensionLine.Add(Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(startPoint, endPoint)); } } else { var originPoint = internalDimension.Origin.ToPoint(); Autodesk.Revit.DB.Line dimCurve = (Autodesk.Revit.DB.Line)internalDimension.Curve; var vector = dimCurve.Direction.ToVector(); var dimValue = internalDimension.Value.Value; if (doc.DisplayUnitSystem.ToString() != "IMPERIAL") { dimValue = internalDimension.Value.Value * 304.8; } var startPoint = (Autodesk.DesignScript.Geometry.Point)originPoint.Translate(vector.Reverse(), dimValue / 2); var endPoint = (Autodesk.DesignScript.Geometry.Point)originPoint.Translate(vector, dimValue / 2); dimensionLine.Add(Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(startPoint, endPoint)); } return(dimensionLine); }
internal FamilyInstances(Autodesk.Revit.DB.FamilySymbol fs, Autodesk.Revit.DB.Line line, Autodesk.Revit.DB.Level level) { SafeInit(() => InitFamilyInstance(fs, line, level)); }