示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }
示例#3
0
        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);
        }
示例#4
0
 internal FamilyInstances(Autodesk.Revit.DB.FamilySymbol fs, Autodesk.Revit.DB.Line line, Autodesk.Revit.DB.Level level)
 {
     SafeInit(() => InitFamilyInstance(fs, line, level));
 }