コード例 #1
0
ファイル: View.cs プロジェクト: Doeffe/DynamoRevit
        /// <summary>
        /// Duplicates A view.
        /// </summary>
        /// <param name="view">The View to be Duplicated</param>
        /// <param name="viewDuplicateOption">Enter View Duplicate Option: 0 = Duplicate. 1 = AsDependent. 2 = WithDetailing.</param>
        /// <param name="prefix"></param>
        /// <param name="suffix"></param>
        /// <returns></returns>
        public static Revit.Elements.Views.View DuplicateView(View view, int viewDuplicateOption = 0, string prefix = "", string suffix = "")
        {
            View newView = null;

            if (view == null)
            {
                throw new ArgumentNullException(nameof(view));
            }
            if (view is Sheet)
            {
                throw new ArgumentException(Properties.Resources.DuplicateViewCantApplySheet);
            }

            ViewDuplicateOption Option = 0;

            switch (viewDuplicateOption)
            {
            case 0:
                Option = ViewDuplicateOption.Duplicate;
                break;

            case 1:
                Option = ViewDuplicateOption.AsDependent;
                break;

            case 2:
                Option = ViewDuplicateOption.WithDetailing;
                break;

            default:
                throw new ArgumentException(Properties.Resources.ViewDuplicateOptionOutofRange);
            }

            try
            {
                RevitServices.Transactions.TransactionManager.Instance.EnsureInTransaction(Application.Document.Current.InternalDocument);
                var viewElement = ElementBinder.GetElementFromTrace <Autodesk.Revit.DB.View>(Document);

                int    count       = 0;
                string newViewName = "";
                if (!String.IsNullOrEmpty(prefix) || !String.IsNullOrEmpty(suffix))
                {
                    newViewName = prefix + view.Name + suffix;
                }
                Autodesk.Revit.UI.UIDocument uIDocument = new Autodesk.Revit.UI.UIDocument(Document);
                var openedViews = uIDocument.GetOpenUIViews().ToList();

                if (viewElement != null)
                {
                    count++;
                    var oldViewName = viewElement.Name;
                    if (oldViewName.Equals(newViewName))
                    {
                        newView = viewElement.ToDSType(false) as View;
                    }
                    else
                    {
                        count--;
                    }
                }

                if (count == 0)
                {
                    if (!CheckUniqueViewName(newViewName))
                    {
                        throw new ArgumentException(String.Format(Properties.Resources.ViewNameExists, newViewName));
                    }
                    if (view.InternalView.CanViewBeDuplicated(Option))
                    {
                        var viewID  = view.InternalView.Duplicate(Option);
                        var viewEle = Document.GetElement(viewID) as Autodesk.Revit.DB.View;
                        newView = ElementWrapper.ToDSType(viewEle, false) as View;
                    }
                    else
                    {
                        throw new Exception(String.Format(Properties.Resources.ViewCantBeDuplicated, view.Name));
                    }

                    if (!String.IsNullOrEmpty(newViewName))
                    {
                        var param = newView.InternalView.get_Parameter(BuiltInParameter.VIEW_NAME);
                        param.Set(newViewName);
                    }
                    if (viewElement != null)
                    {
                        var shouldClosedViews = openedViews.FindAll(x => viewElement.Id == x.ViewId);
                        if (shouldClosedViews.Count > 0)
                        {
                            foreach (var v in shouldClosedViews)
                            {
                                if (uIDocument.GetOpenUIViews().ToList().Count() > 1)
                                {
                                    v.Close();
                                }
                                else
                                {
                                    throw new InvalidOperationException(string.Format(Properties.Resources.CantCloseLastOpenView, viewElement.ToString()));
                                }
                            }
                        }
                    }
                }

                ElementBinder.CleanupAndSetElementForTrace(Document, newView.InternalElement);

                RevitServices.Transactions.TransactionManager.Instance.TransactionTaskDone();
            }
            catch (Exception e)
            {
                //if (e is Autodesk.Revit.Exceptions.InvalidOperationException)
                //    throw e;
                if (newView != null)
                {
                    newView.Dispose();
                }
                throw e;
            }

            return(newView);
        }
コード例 #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="barType"></param>
        /// <param name="barStyle"></param>
        /// <param name="host"></param>
        /// <param name="startHook"></param>
        /// <param name="endHook"></param>
        /// <param name="startHookOrientation"></param>
        /// <param name="endHookOrientation"></param>
        /// <param name="normal"></param>
        /// <param name="useExistingShape"></param>
        /// <param name="createNewShape"></param>
        private void InitRebar(object curve,
                               Autodesk.Revit.DB.Structure.RebarBarType barType,
                               Autodesk.Revit.DB.Structure.RebarStyle barStyle,
                               Autodesk.Revit.DB.Element host,
                               Autodesk.Revit.DB.Structure.RebarHookType startHook,
                               Autodesk.Revit.DB.Structure.RebarHookType endHook,
                               Autodesk.Revit.DB.Structure.RebarHookOrientation startHookOrientation,
                               Autodesk.Revit.DB.Structure.RebarHookOrientation endHookOrientation,
                               Autodesk.Revit.DB.XYZ normal,
                               bool useExistingShape,
                               bool createNewShape)
        {
            Autodesk.Revit.DB.Document document = DocumentManager.Instance.CurrentDBDocument;

            TransactionManager.Instance.EnsureInTransaction(document);

            var rebarElem = ElementBinder.GetElementFromTrace <Autodesk.Revit.DB.Structure.Rebar>(document);



            // geometry wrapper for polycurves

            List <Curve> geometry = new List <Curve>();

            if (curve.GetType() == typeof(DynamoRebar.RevitPolyCurve))
            {
                DynamoRebar.RevitPolyCurve polycurve = (DynamoRebar.RevitPolyCurve)curve;
                geometry = polycurve.Curves;
            }
            else
            {
                geometry.Add((Curve)curve);
            }


            bool changed = false;



            // Check for existing Geometry

            if (rebarElem != null)
            {
                foreach (Curve existingCurve in rebarElem.ComputeDrivingCurves())
                {
                    bool curveIsExisting = false;

                    foreach (Curve newCurve in geometry)
                    {
                        if (CurveUtils.CurvesAreSimilar(newCurve, existingCurve))
                        {
                            curveIsExisting = true; break;
                        }
                    }

                    if (!curveIsExisting)
                    {
                        changed = true;
                    }
                }
            }



            if (rebarElem == null || changed)
            {
                // Delete exsiting Rebar Element
                if (rebarElem != null && rebarElem.Id != ElementId.InvalidElementId)
                {
                    document.Delete(rebarElem.Id);
                }

                rebarElem = Autodesk.Revit.DB.Structure.Rebar.CreateFromCurves(document, barStyle, barType, startHook, endHook, host, normal, geometry, startHookOrientation, endHookOrientation, useExistingShape, createNewShape);
            }
            else
            {
                rebarElem.SetHostId(document, host.Id);
                rebarElem.SetHookTypeId(0, startHook.Id);
                rebarElem.SetHookTypeId(1, endHook.Id);
                rebarElem.SetHookOrientation(0, startHookOrientation);
                rebarElem.SetHookOrientation(1, endHookOrientation);
                rebarElem.ChangeTypeId(barType.Id);
            }


            InternalSetRebar(rebarElem);

            TransactionManager.Instance.TransactionTaskDone();


            if (rebarElem != null)
            {
                ElementBinder.CleanupAndSetElementForTrace(document, this.InternalElement);
            }
            else
            {
                ElementBinder.SetElementForTrace(this.InternalElement);
            }
        }
コード例 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="curve"></param>
        /// <param name="barType"></param>
        /// <param name="barStyle"></param>
        /// <param name="host"></param>
        /// <param name="startHook"></param>
        /// <param name="endHook"></param>
        /// <param name="startHookOrientation"></param>
        /// <param name="endHookOrientation"></param>
        /// <param name="normal"></param>
        /// <param name="useExistingShape"></param>
        /// <param name="createNewShape"></param>
        private void InitRebarContainer(System.Collections.Generic.List <object> curves,
                                        Autodesk.Revit.DB.Structure.RebarBarType barType,
                                        Autodesk.Revit.DB.Structure.RebarStyle barStyle,
                                        Autodesk.Revit.DB.Element host,
                                        Autodesk.Revit.DB.Structure.RebarHookType startHook,
                                        Autodesk.Revit.DB.Structure.RebarHookType endHook,
                                        Autodesk.Revit.DB.Structure.RebarHookOrientation startHookOrientation,
                                        Autodesk.Revit.DB.Structure.RebarHookOrientation endHookOrientation,
                                        System.Collections.Generic.List <Autodesk.Revit.DB.XYZ> normals,
                                        bool useExistingShape,
                                        bool createNewShape)
        {
            Autodesk.Revit.DB.Document document = DocumentManager.Instance.CurrentDBDocument;

            TransactionManager.Instance.EnsureInTransaction(document);

            var rebarElem = ElementBinder.GetElementFromTrace <Autodesk.Revit.DB.Structure.RebarContainer>(document);

            // Parse Geometry

            List <List <Curve> > curvature = new List <List <Curve> >();

            foreach (object curve in curves)
            {
                List <Curve> geometry = new List <Curve>();

                if (curve.GetType() == typeof(DynamoRebar.RevitPolyCurve))
                {
                    DynamoRebar.RevitPolyCurve polycurve = (DynamoRebar.RevitPolyCurve)curve;
                    geometry = polycurve.Curves;
                }
                else
                {
                    geometry.Add((Curve)curve);
                }

                curvature.Add(geometry);
            }



            if (rebarElem == null)
            {
                ElementId stdC = Autodesk.Revit.DB.Structure.RebarContainerType.CreateDefaultRebarContainerType(DocumentManager.Instance.CurrentDBDocument);
                rebarElem = Autodesk.Revit.DB.Structure.RebarContainer.Create(DocumentManager.Instance.CurrentDBDocument, host, stdC);
            }
            else
            {
                //rebarElem.ClearItems();
                rebarElem.SetHostId(document, host.Id);
            }


            int counter = rebarElem.ItemsCount;

            for (int i = 0; i < counter; i++)
            {
                Autodesk.Revit.DB.Structure.RebarContainerItem item = rebarElem.GetItem(i);

                int index = GeometryMatches(item.ComputeDrivingCurves(), curvature);

                if (index == -1)
                {
                    rebarElem.RemoveItem(item);
                }
                else
                {
                    item.SetHookOrientation(0, startHookOrientation);
                    item.SetHookOrientation(1, endHookOrientation);
                    item.SetHookTypeId(0, startHook.Id);
                    item.SetHookTypeId(1, endHook.Id);
                    curvature.RemoveAt(index);
                    if (normals.Count > 1)
                    {
                        normals.RemoveAt(index);
                    }
                }
            }



            for (int i = 0; i < curvature.Count; i++)
            {
                // If there is only one normal in the list use this one for all curves
                XYZ          normal   = (normals.Count == 1) ? normals[0] : normals[i];
                List <Curve> geometry = curvature[i];

                rebarElem.AppendItemFromCurves(barStyle, barType, startHook, endHook, normal, geometry, startHookOrientation, endHookOrientation, useExistingShape, createNewShape);
            }



            // Update Quantity Parameter
            Autodesk.Revit.DB.Parameter quantityParameter = rebarElem.get_Parameter(BuiltInParameter.REBAR_ELEM_QUANTITY_OF_BARS);
            Autodesk.Revit.DB.Structure.RebarContainerParameterManager containerParameters = rebarElem.GetParametersManager();
            containerParameters.AddOverride(quantityParameter.Id, curves.Count);


            InternalSetRebarContainer(rebarElem);

            TransactionManager.Instance.TransactionTaskDone();


            if (rebarElem != null)
            {
                ElementBinder.CleanupAndSetElementForTrace(document, this.InternalElement);
            }
            else
            {
                ElementBinder.SetElementForTrace(this.InternalElement);
            }
        }