Ejemplo n.º 1
0
 //increase the whole letter of a multi segmented grid
 private void increaseWholeLetter(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref char letter, ref char subLetter, ref bool prevGridIsSub)
 {
     currentMultiSegGrid.Name = WholeName;
     subLetter = 'a';
     foreach (ElementId eID in currentMultiSegGrid.GetGridIds())
     {
         Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid;
         currentGridInMultiSegGrid.Name = WholeName;
     }
     if (letter != 90)
     {
         letter++;
         WholeName = WholeName.Remove(WholeName.Length - 1) + letter.ToString();
     }
     else
     {
         letter = 'A';
         char first = WholeName.First();
         if (first == 90)
         {
             WholeName = "A" + letter.ToString();
         }
         else
         {
             first++;
             WholeName = WholeName.Remove(0);
             WholeName = first.ToString() + WholeName + letter.ToString();
         }
     }
     prevGridIsSub = false;
 }
Ejemplo n.º 2
0
 // 获取链接模型中多段轴网信息
 private void GetAllMultiSegmentGridInfoInLinkDoc()
 {
     foreach (RevitLinkInstance revitLinkInstance in m_lstLinkInst)
     {
         Document linkDocument = revitLinkInstance.GetLinkDocument();
         if (linkDocument != null && m_doc.ActiveView.ViewType != ViewType.Section)
         {
             try
             {
                 FilteredElementCollector filteredElementCollector = new FilteredElementCollector(linkDocument, m_uiDoc.ActiveView.Id);
                 filteredElementCollector.OfClass(typeof(MultiSegmentGrid));
                 foreach (Element element in filteredElementCollector)
                 {
                     MultiSegmentGrid multiSegmentGrid = element as MultiSegmentGrid;
                     if (multiSegmentGrid != null)
                     {
                         ICollection <ElementId> gridIds = multiSegmentGrid.GetGridIds();
                         foreach (ElementId elementId in gridIds)
                         {
                             Grid grid = m_doc.GetElement(elementId) as Grid;
                             if (grid != null)
                             {
                                 DrawElement item = new DrawElement(grid, ElemType._MultiSegGrid);
                                 m_DrawElems.Add(item);
                             }
                         }
                     }
                 }
             }
             catch (Exception)
             {
             }
         }
     }
 }
Ejemplo n.º 3
0
        /***************************************************/

        public static IBHoMObject FromRevit(this MultiSegmentGrid grid, Discipline discipline, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null)
        {
            switch (discipline)
            {
            default:
                return(grid.GridFromRevit(settings, refObjects));
            }
        }
Ejemplo n.º 4
0
        //get the total length of the multisegment grid providing the multisegment grid
        private double getMultiGridTotalLength(Document doc, MultiSegmentGrid targetMultiSegGrid)
        {
            double totalLength = 0;

            foreach (ElementId eID in targetMultiSegGrid.GetGridIds())
            {
                Grid currentGrid = doc.GetElement(eID) as Grid;
                totalLength += getTheoricalLengthOfTheGrid(currentGrid);
            }
            return(totalLength);
        }
Ejemplo n.º 5
0
 private void increaseSubLetter(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref Grid prevGrid, ref char subLetter, ref bool prevGridIsSub)
 {
     currentMultiSegGrid.Name = prevGrid.Name.ElementAt(0).ToString() + "." + subLetter;
     foreach (ElementId eID in currentMultiSegGrid.GetGridIds())
     {
         Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid;
         currentGridInMultiSegGrid.Name = prevGrid.Name.ElementAt(0).ToString() + "." + subLetter;
     }
     prevGridIsSub = true;
     subLetter++;
 }
Ejemplo n.º 6
0
 //increase the whole number of a multi segmented grid
 private void increaseWholeNumber(Document doc, ref MultiSegmentGrid currentMultiSegGrid, ref int counter, ref int subCounter, ref bool prevGridIsSub)
 {
     currentMultiSegGrid.Name = (counter + 1).ToString();
     subCounter = 1;
     foreach (ElementId eID in currentMultiSegGrid.GetGridIds())
     {
         Grid currentGridInMultiSegGrid = doc.GetElement(eID) as Grid;
         currentGridInMultiSegGrid.Name = (counter + 1).ToString();
     }
     counter++;
     prevGridIsSub = false;
 }
Ejemplo n.º 7
0
        //get the length of only the Grids that have the same orientation that the main grid
        private double getMultiGridLengthSameOrientationMainGrid(Document doc, MultiSegmentGrid targetMultiSegGrid, Grid targetMainGrid)
        {
            double totalLength = 0;

            foreach (ElementId eID in targetMultiSegGrid.GetGridIds())
            {
                Grid currentMultiSegGrid = doc.GetElement(eID) as Grid;
                if (verifyGridOrientation(currentMultiSegGrid) == verifyGridOrientation(targetMainGrid))
                {
                    Grid currentGrid = doc.GetElement(eID) as Grid;
                    totalLength += getTheoricalLengthOfTheGrid(currentGrid);
                }
            }
            return(totalLength);
        }
Ejemplo n.º 8
0
        /***************************************************/

        public static IBHoMObject FromRevit(this MultiSegmentGrid grid, Discipline discipline, Transform transform = null, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null)
        {
            IElement1D result = null;

            switch (discipline)
            {
            default:
                result = grid.GridFromRevit(settings, refObjects);
                break;
            }

            if (result != null && transform?.IsIdentity == false)
            {
                TransformMatrix bHoMTransform = transform.FromRevit();
                result = result.ITransform(bHoMTransform);
            }

            return(result as IBHoMObject);
        }
Ejemplo n.º 9
0
        /***************************************************/

        public static BH.oM.Geometry.SettingOut.Grid GridFromRevit(this MultiSegmentGrid revitGrid, RevitSettings settings = null, Dictionary <string, List <IBHoMObject> > refObjects = null)
        {
            settings = settings.DefaultIfNull();

            oM.Geometry.SettingOut.Grid grid = refObjects.GetValue <oM.Geometry.SettingOut.Grid>(revitGrid.Id);
            if (grid != null)
            {
                return(grid);
            }

            List <Grid> gridSegments = revitGrid.GetGridIds().Select(x => revitGrid.Document.GetElement(x) as Grid).ToList();

            if (gridSegments.Count == 0)
            {
                return(null);
            }
            else if (gridSegments.Count == 1)
            {
                return(gridSegments[0].GridFromRevit(settings, refObjects));
            }
            else
            {
                List <BH.oM.Geometry.PolyCurve> joinedGridCurves = BH.Engine.Geometry.Compute.IJoin(gridSegments.Select(x => x.Curve.IFromRevit()).ToList());
                if (joinedGridCurves.Count != 1)
                {
                    BH.Engine.Reflection.Compute.RecordError(String.Format("Revit grid consists of disjoint segments. Element id: {0}", revitGrid.Id));
                    return(null);
                }

                grid      = BH.Engine.Geometry.SettingOut.Create.Grid(joinedGridCurves[0]);
                grid.Name = revitGrid.Name;
            }

            //Set identifiers, parameters & custom data
            grid.SetIdentifiers(revitGrid);
            grid.CopyParameters(revitGrid, settings.ParameterSettings);
            grid.SetProperties(revitGrid, settings.ParameterSettings);

            refObjects.AddOrReplace(revitGrid.Id, grid);
            return(grid);
        }
Ejemplo n.º 10
0
        internal IList <GridInfo> RenumberTable(IList <GridInfo> allOrganizedSingleGrids)
        {
            IList <GridInfo> allOrganizedHorizontalGrids = new List <GridInfo>();
            IList <GridInfo> allOrganizedVerticalGrids   = new List <GridInfo>();

            try
            {
                foreach (GridInfo currentGrid in allOrganizedSingleGrids)
                {
                    if (currentGrid.orientation == "Horizontal")
                    {
                        allOrganizedHorizontalGrids.Add(currentGrid);
                    }
                    else
                    {
                        allOrganizedVerticalGrids.Add(currentGrid);
                    }
                }

                IList <Element>   allMultiGrids    = new FilteredElementCollector(uidoc.Document).OfClass(typeof(MultiSegmentGrid)).ToElements();
                IList <ElementId> allMultiGridsIDs = new List <ElementId>();
                foreach (Element e in allMultiGrids)
                {
                    MultiSegmentGrid currentMultiSegGrid = e as MultiSegmentGrid;
                    allMultiGridsIDs.Add(currentMultiSegGrid.Id);
                }

                bool isNumber = isVerticalGridsNumbered;
                doTheRenumberingOrLettering(uidoc.Document, allOrganizedVerticalGrids, allMultiGridsIDs, isNumber);

                isNumber = isNumber ? false : true;
                doTheRenumberingOrLettering(uidoc.Document, allOrganizedHorizontalGrids, allMultiGridsIDs, isNumber);
            }
            catch (Exception excep)
            {
                ExceptionManager eManager = new ExceptionManager(excep);
            }

            return(allOrganizedHorizontalGrids.Union(allOrganizedVerticalGrids).ToList());
        }
Ejemplo n.º 11
0
        //获取多段轴网信息
        private void GetAllMultiSegmentGridInfo()
        {
            FilteredElementCollector filteredElementCollector = new FilteredElementCollector(m_doc, m_uiDoc.ActiveView.Id);

            filteredElementCollector.OfClass(typeof(MultiSegmentGrid));
            foreach (Element element in filteredElementCollector)
            {
                MultiSegmentGrid multiSegmentGrid = element as MultiSegmentGrid;
                if (multiSegmentGrid != null)
                {
                    ICollection <ElementId> gridIds = multiSegmentGrid.GetGridIds();
                    foreach (ElementId elementId in gridIds)
                    {
                        Grid grid = m_doc.GetElement(elementId) as Grid;
                        if (grid != null)
                        {
                            DrawElement item = new DrawElement(grid, ElemType._MultiSegGrid);
                            m_DrawElems.Add(item);
                        }
                    }
                }
            }
        }
Ejemplo n.º 12
0
        void ReconstructGridByCurve
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Curve curve,
            Optional <Autodesk.Revit.DB.GridType> type,
            Optional <string> name
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;

            curve = curve.ChangeUnits(scaleFactor);

            SolveOptionalType(ref type, doc, ElementTypeGroup.GridType, nameof(type));

            var parametersMask = name == Optional.Nothig ?
                                 new BuiltInParameter[]
            {
                BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                BuiltInParameter.ELEM_FAMILY_PARAM,
                BuiltInParameter.ELEM_TYPE_PARAM
            } :
            new BuiltInParameter[]
            {
                BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                BuiltInParameter.ELEM_FAMILY_PARAM,
                BuiltInParameter.ELEM_TYPE_PARAM,
                BuiltInParameter.DATUM_TEXT
            };

            if (curve.TryGetLine(out var line, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, line.ToHost()), parametersMask);
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else if (curve.TryGetArc(out var arc, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, arc.ToHost()), parametersMask);
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else
            {
                using (var curveLoop = new CurveLoop())
                    using (var polyline = curve.ToArcsAndLines(Revit.VertexTolerance, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                    {
                        int count = polyline.SegmentCount;
                        for (int s = 0; s < count; ++s)
                        {
                            var segment = polyline.SegmentCurve(s);

                            if (segment is Rhino.Geometry.LineCurve l)
                            {
                                curveLoop.Append(l.ToHost());
                            }
                            else if (segment is Rhino.Geometry.ArcCurve a)
                            {
                                curveLoop.Append(a.ToHost());
                            }
                            else
                            {
                                ThrowArgumentException(nameof(curve), "Invalid curve type.");
                            }
                        }

                        curve.TryGetPlane(out var plane);
                        var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                        ReplaceElement(ref element, doc.GetElement(MultiSegmentGrid.Create(doc, type.Value.Id, curveLoop, sketchPlane.Id)), parametersMask);
                    }
            }

            if (name != Optional.Nothig && element != null)
            {
                try { element.Name = name.Value; }
                catch (Autodesk.Revit.Exceptions.ArgumentException e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, $"{e.Message.Replace($".{Environment.NewLine}", ". ")}");
                }
            }
        }
Ejemplo n.º 13
0
 protected GCGridMulti(MultiSegmentGrid grid)
     : base(grid)
 {
 }
Ejemplo n.º 14
0
        /***************************************************/
        /****              Public methods               ****/
        /***************************************************/

        public static Element ToRevitGrid(this oM.Geometry.SettingOut.Grid grid, Document document, RevitSettings settings = null, Dictionary <Guid, List <int> > refObjects = null)
        {
            Element revitGrid = refObjects.GetValue <Grid>(document, grid.BHoM_Guid);

            if (revitGrid != null)
            {
                return(revitGrid);
            }

            settings = settings.DefaultIfNull();

            if (BH.Engine.Geometry.Query.IIsClosed(grid.Curve))
            {
                BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only open curve-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                return(null);
            }

            List <BH.oM.Geometry.ICurve> gridCurves = BH.Engine.Geometry.Query.ISubParts(grid.Curve).ToList();

            if (gridCurves.Count == 0)
            {
                return(null);
            }
            else if (gridCurves.Count == 1)
            {
                Curve curve = grid.Curve.IToRevit();

                if (curve is Line)
                {
                    revitGrid = Grid.Create(document, (Line)curve);
                }
                else if (curve is Arc)
                {
                    revitGrid = Grid.Create(document, (Arc)curve);
                }
                else
                {
                    BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                    return(null);
                }
            }
            else
            {
                CurveLoop loop = new CurveLoop();
                foreach (BH.oM.Geometry.ICurve curve in gridCurves)
                {
                    Curve revitCurve = curve.IToRevit();
                    if (revitCurve is Line || revitCurve is Arc)
                    {
                        loop.Append(revitCurve);
                    }
                    else
                    {
                        BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                        return(null);
                    }
                }

                Plane plane;
                try
                {
                    plane = loop.GetPlane();
                }
                catch
                {
                    BH.Engine.Reflection.Compute.RecordError("Grid curves need to be coplanar. BHoM_Guid: " + grid.BHoM_Guid);
                    return(null);
                }

                SketchPlane sketchPlane = SketchPlane.Create(document, plane);
                ElementId   gridTypeId  = document.GetDefaultElementTypeId(ElementTypeGroup.GridType);
                ElementId   gridId      = MultiSegmentGrid.Create(document, gridTypeId, loop, sketchPlane.Id);
                revitGrid = document.GetElement(gridId);
            }

            revitGrid.CheckIfNullPush(grid);
            if (revitGrid == null)
            {
                return(null);
            }

            try
            {
                revitGrid.Name = grid.Name;
            }
            catch
            {
                BH.Engine.Reflection.Compute.RecordWarning(String.Format("Grid name '{0}' was not unique, name '{1}' has been assigned instead. BHoM_Guid: {2}", grid.Name, revitGrid.Name, grid.BHoM_Guid));
            }

            // Copy parameters from BHoM object to Revit element
            revitGrid.CopyParameters(grid, settings);

            refObjects.AddOrReplace(grid, revitGrid);
            return(revitGrid);
        }
Ejemplo n.º 15
0
        private void doTheRenumberingOrLettering(Document doc, IList <GridInfo> targetListOfGrids, IList <ElementId> allMultiGridsIDs, bool isNumber)
        {
            Grid prevGrid      = null;
            bool prevGridIsSub = false;
            int  counter       = 0;
            int  subCounter    = 1;
            char letter        = 'A';
            char subLetter     = 'a';

            WholeName = "A";


            double currentGridLength = 0;
            double prevGridLength    = 0;

            IList <ElementId> allMultiGridSubGridsIDs = new List <ElementId>();

            foreach (ElementId currentMultiGridId in allMultiGridsIDs)
            {
                allMultiGridSubGridsIDs = allMultiGridSubGridsIDs.Union((uidoc.Document.GetElement(currentMultiGridId) as MultiSegmentGrid).GetGridIds()).ToList();
            }

            foreach (GridInfo currentGridInfo in targetListOfGrids)
            {
                Grid currentGrid = null;

                currentGrid = uidoc.Document.GetElement(new ElementId(currentGridInfo.Id)) as Grid;

                if (allMultiGridSubGridsIDs.Contains(new ElementId(currentGridInfo.Id)))
                {
                    MultiSegmentGrid currentMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(currentGrid)) as MultiSegmentGrid;

                    currentGridLength = getMultiGridLengthSameOrientationMainGrid(doc, currentMultiSegGrid, currentGrid);
                }
                else
                {
                    currentGridLength = getTheoricalLengthOfTheGrid(currentGrid);
                }

                if (prevGrid != null)
                {
                    if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)))
                    {
                        MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid;
                        prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid);
                    }
                    else
                    {
                        prevGridLength = getTheoricalLengthOfTheGrid(prevGrid);
                    }
                    GridInfo prevGridInfo = targetListOfGrids.Where(g => g.Id == prevGrid.Id.IntegerValue).FirstOrDefault();
                    if (canUseSubNumering)
                    {
                        if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Equal)
                        {
                            if (prevGridIsSub == false)
                            {
                                if (isNumber)
                                {
                                    currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub);
                                }
                            }
                            if (prevGridIsSub == true)
                            {
                                if (isNumber)
                                {
                                    currentGridInfo.newName = increaseSubNumber(doc, currentGridInfo, ref prevGridInfo, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    currentGridInfo.newName = increaseSubLetter(doc, currentGridInfo, ref prevGridInfo, ref subLetter, ref prevGridIsSub);
                                }
                            }
                        }
                        if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Bigger)
                        {
                            if (isNumber)
                            {
                                currentGridInfo.newName = increaseSubNumber(doc, currentGridInfo, ref prevGridInfo, ref subCounter, ref prevGridIsSub);
                            }
                            else
                            {
                                currentGridInfo.newName = increaseSubLetter(doc, currentGridInfo, ref prevGridInfo, ref subLetter, ref prevGridIsSub);
                            }
                        }
                        if (CompareGridLength(prevGridLength, currentGridLength) == GridLength.Smaller)
                        {
                            if (isNumber)
                            {
                                currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub);
                            }
                            else
                            {
                                currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub);
                            }
                        }
                    }
                    else
                    {
                        if (isNumber)
                        {
                            currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub);
                        }
                        else
                        {
                            currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub);
                        }
                    }
                }
                else
                {
                    if (isNumber)
                    {
                        currentGridInfo.newName = increaseWholeNumber(doc, currentGridInfo, ref counter, ref subCounter, ref prevGridIsSub);
                    }
                    else
                    {
                        currentGridInfo.newName = increaseWholeLetter(doc, currentGridInfo, ref letter, ref subLetter, ref prevGridIsSub);
                    }
                }
                prevGrid = currentGrid;
            }
        }
Ejemplo n.º 16
0
        internal void ApplyTheRenumberingOnTheActualGrids(IList <GridInfo> targetGridInfoList)
        {
            IList <Element>   allMultiGrids    = new FilteredElementCollector(uidoc.Document).OfClass(typeof(MultiSegmentGrid)).ToElements();
            IList <ElementId> allMultiGridsIDs = new List <ElementId>();

            foreach (Element currentMultiGridElement in allMultiGrids)
            {
                MultiSegmentGrid currentMultiGrid = currentMultiGridElement as MultiSegmentGrid;
                if (currentMultiGrid == null)
                {
                    continue;
                }
                allMultiGridsIDs = allMultiGridsIDs.Union(currentMultiGrid.GetGridIds()).ToList();
            }

            foreach (GridInfo currentGridInfo in targetGridInfoList)
            {
                bool isCurrentGridPartOfMultiGridItem = false;
                Grid currentGrid = uidoc.Document.GetElement(new ElementId(currentGridInfo.Id)) as Grid;

                if (currentGrid == null)
                {
                    isCurrentGridPartOfMultiGridItem = false;
                    continue;
                }

                if (allMultiGridsIDs.Contains(currentGrid.Id))
                {
                    isCurrentGridPartOfMultiGridItem = true;
                }

                if (isCurrentGridPartOfMultiGridItem)
                {
                    ElementId        multisegGridID = MultiSegmentGrid.GetMultiSegementGridId(currentGrid);
                    MultiSegmentGrid multiSegGrid   = uidoc.Document.GetElement(multisegGridID) as MultiSegmentGrid;
                    if (multiSegGrid == null)
                    {
                        continue;
                    }

                    foreach (ElementId currentMultiSegGridMemberID in multiSegGrid.GetGridIds())
                    {
                        Grid currentMultiSegGrid = uidoc.Document.GetElement(currentMultiSegGridMemberID) as Grid;
                        if (currentMultiSegGrid == null)
                        {
                            continue;
                        }
                        currentMultiSegGrid.Name = currentGridInfo.newName;
                    }

                    multiSegGrid.Name = currentGridInfo.newName;
                }
                else
                {
                    if (currentGrid == null)
                    {
                        continue;
                    }
                    currentGrid.Name = currentGridInfo.newName;
                }
            }
        }
Ejemplo n.º 17
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document   doc   = uidoc.Document;
            Selection  sel   = uidoc.Selection;

            IList <Element>   allGrids         = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Grids).WhereElementIsNotElementType().ToElements();
            IList <Element>   allMultiGrids    = new FilteredElementCollector(doc).OfClass(typeof(MultiSegmentGrid)).ToElements();
            IList <ElementId> allMultiGridsIDs = new List <ElementId>();
            IList <Grid>      allSingleGrids   = new List <Grid>();
            IList <string>    allGridNames     = new List <string>();

            try
            {
                if (allGrids.Count == 0)
                {
                    message = "Não foi possível encontrar eixos no projeto, por favor crie-os e rode o comando novamente";
                    return(Result.Failed);
                }

                RenumberGridsUI currentGridUI = new RenumberGridsUI();
                currentGridUI.ShowDialog();
                if (currentGridUI.DialogResult == false)
                {
                    return(Result.Cancelled);
                }

                foreach (Element e in allMultiGrids)
                {
                    MultiSegmentGrid currentMultiSegGrid = e as MultiSegmentGrid;
                    allMultiGridsIDs.Add(currentMultiSegGrid.Id);
                }

                foreach (Element e in allGrids)
                {
                    Grid currentGrid = e as Grid;
                    if (allGridNames.Contains(currentGrid.Name))
                    {
                        continue;
                    }
                    allGridNames.Add(currentGrid.Name);
                    allSingleGrids.Add(currentGrid);
                }

                IList <Grid> allOrganizedSingleGrids = new List <Grid>();

                foreach (Grid currentGrid in allSingleGrids)
                {
                    if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(currentGrid)))
                    {
                        continue;
                    }
                    allOrganizedSingleGrids.Add(currentGrid);
                }

                IList <Grid> allOrganizedHorizontalGrids = new List <Grid>();
                IList <Grid> allOrganizedVerticalGrids   = new List <Grid>();

                IList <Grid> allOrganizedHorizontalMainGridsFromMultiGrids = new List <Grid>();
                IList <Grid> allOrganizedVerticalMainGridsFromMultiGrids   = new List <Grid>();

                foreach (Grid currentGrid in allOrganizedSingleGrids)
                {
                    if (verifyGridOrientation(currentGrid) == "isVertical")
                    {
                        allOrganizedVerticalGrids.Add(currentGrid);
                    }
                    else
                    {
                        allOrganizedHorizontalGrids.Add(currentGrid);
                    }
                }

                foreach (Element e in allMultiGrids)
                {
                    MultiSegmentGrid  curentMultiGrid = e as MultiSegmentGrid;
                    IList <ElementId> GridsIds        = curentMultiGrid.GetGridIds().ToList();
                    IList <Curve>     gridCurves      = new List <Curve>();
                    Grid MainGrid = null;

                    foreach (ElementId eID in GridsIds)
                    {
                        gridCurves.Add((doc.GetElement(eID) as Grid).Curve);
                    }

                    XYZ farAwayPoint = new XYZ(9999999, -9999999, 9999999);
                    gridCurves = gridCurves.Where(c => c is Curve).OrderBy(p => p.Distance(farAwayPoint)).ToList();

                    Curve lastCurve = gridCurves.Last();

                    //Organize the lists to the order of positioning
                    //I dont know why, but I had to put a "where" query that always pass just to make "OrderBy" and "OrderByDescending" work
                    ElementId MainGridID = allGrids.Where(g => g is Grid).OrderBy(d => lastCurve.Distance((d as Grid).Curve.GetEndPoint(1))).First().Id;

                    MainGrid = doc.GetElement(MainGridID) as Grid;

                    if (verifyGridOrientation(MainGrid) == "isVertical")
                    {
                        allOrganizedVerticalMainGridsFromMultiGrids.Add(MainGrid);
                    }
                    else
                    {
                        allOrganizedHorizontalMainGridsFromMultiGrids.Add(MainGrid);
                    }
                }

                //Organize the lists to the order of positioning
                //I dont know why, but I had to put a "where" query that always pass just to make "OrderBy" and "OrderByDescending" work
                allOrganizedHorizontalGrids = allOrganizedHorizontalGrids.Union(allOrganizedHorizontalMainGridsFromMultiGrids).Where(g => g is Grid).OrderByDescending(f => f.Curve.GetEndPoint(0).Y).ToList();
                allOrganizedVerticalGrids   = allOrganizedVerticalGrids.Union(allOrganizedVerticalMainGridsFromMultiGrids).Where(g => g is Grid).OrderBy(f => f.Curve.GetEndPoint(0).X).ToList();

                using (TransactionGroup tG = new TransactionGroup(doc, "Renumerar Eixos"))
                {
                    tG.Start();

                    using (Transaction RenameAllGrids = new Transaction(doc, "Ajustar Nomes"))
                    {
                        RenameAllGrids.Start();
                        for (int i = 0; i < allGrids.Count; i++)
                        {
                            Grid currentGrid = allGrids.ElementAt(i) as Grid;
                            currentGrid.Name = string.Format("ONBOX {0}", i.ToString());
                        }
                        RenameAllGrids.Commit();
                    }

                    using (Transaction RenumberVerticalGrids = new Transaction(doc, "Renumerar Eixos Verticais"))
                    {
                        RenumberVerticalGrids.Start();

                        bool isNumber = true;

                        if (isVerticalGridsNumbered == false)
                        {
                            isNumber = false;
                        }

                        doTheRenumberingOrLettering(doc, allOrganizedVerticalGrids, allOrganizedVerticalMainGridsFromMultiGrids, allMultiGridsIDs, isNumber);

                        RenumberVerticalGrids.Commit();
                    }

                    using (Transaction RenumberHorizontalGrids = new Transaction(doc, "Renumerar Eixos Verticais"))
                    {
                        RenumberHorizontalGrids.Start();

                        bool isNumber = false;

                        if (isVerticalGridsNumbered == false)
                        {
                            isNumber = true;
                        }

                        doTheRenumberingOrLettering(doc, allOrganizedHorizontalGrids, allOrganizedHorizontalMainGridsFromMultiGrids, allMultiGridsIDs, isNumber);

                        RenumberHorizontalGrids.Commit();
                    }

                    using (Transaction regenerate = new Transaction(doc, "Regen"))
                    {
                        regenerate.Start();
                        doc.Regenerate();
                        uidoc.RefreshActiveView();
                        regenerate.Commit();
                    }

                    tG.Assimilate();
                }
                Debug.Print("end");
            }
            catch (Exception excep)
            {
                ExceptionManager eManager = new ExceptionManager(excep);
                return(Result.Cancelled);
            }
            return(Result.Succeeded);
        }
Ejemplo n.º 18
0
        private void doTheRenumberingOrLettering(Document doc, IList <Grid> targetListOfGrids, IList <Grid> targetListOfGridsFromMultiSegGrids, IList <ElementId> allMultiGridsIDs, bool isNumber)
        {
            Grid prevGrid      = null;
            bool prevGridIsSub = false;
            int  counter       = 0;
            int  subCounter    = 1;
            char letter        = 'A';
            char subLetter     = 'a';


            double currentGridLength = 0;
            double prevGridLength    = 0;

            foreach (Grid currentGrid in targetListOfGrids)
            {
                if (targetListOfGridsFromMultiSegGrids.Contains(currentGrid))
                {
                    MultiSegmentGrid currentMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(currentGrid)) as MultiSegmentGrid;
                    currentGridLength = getMultiGridLengthSameOrientationMainGrid(doc, currentMultiSegGrid, currentGrid);

                    if (prevGrid != null)
                    {
                        if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)))
                        {
                            MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid;
                            prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid);
                        }
                        else
                        {
                            prevGridLength = getTheoricalLengthOfTheGrid(prevGrid);
                        }
                        if (canUseSubNumering)
                        {
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isEqual")
                            {
                                if (prevGridIsSub == false)
                                {
                                    if (isNumber)
                                    {
                                        increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub);
                                    }
                                    else
                                    {
                                        increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub);
                                    }
                                }
                                if (prevGridIsSub == true)
                                {
                                    if (isNumber)
                                    {
                                        increaseSubNumber(doc, ref currentMultiSegGrid, ref prevGrid, ref subCounter, ref prevGridIsSub);
                                    }
                                    else
                                    {
                                        increaseSubLetter(doc, ref currentMultiSegGrid, ref prevGrid, ref subLetter, ref prevGridIsSub);
                                    }
                                }
                            }
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isBigger")
                            {
                                if (isNumber)
                                {
                                    increaseSubNumber(doc, ref currentMultiSegGrid, ref prevGrid, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    increaseSubLetter(doc, ref currentMultiSegGrid, ref prevGrid, ref subLetter, ref prevGridIsSub);
                                }
                            }
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isSmaller")
                            {
                                if (isNumber)
                                {
                                    increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub);
                                }
                            }
                        }
                        else
                        {
                            if (isNumber)
                            {
                                increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub);
                            }
                            else
                            {
                                increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub);
                            }
                        }
                    }
                    else
                    {
                        if (isNumber)
                        {
                            increaseWholeNumber(doc, ref currentMultiSegGrid, ref counter, ref subCounter, ref prevGridIsSub);
                        }
                        else
                        {
                            increaseWholeLetter(doc, ref currentMultiSegGrid, ref letter, ref subLetter, ref prevGridIsSub);
                        }
                    }
                }
                else
                {
                    currentGridLength = getTheoricalLengthOfTheGrid(currentGrid);

                    if (prevGrid != null)
                    {
                        if (allMultiGridsIDs.Contains(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)))
                        {
                            MultiSegmentGrid PrevMultiSegGrid = doc.GetElement(MultiSegmentGrid.GetMultiSegementGridId(prevGrid)) as MultiSegmentGrid;
                            prevGridLength = getMultiGridLengthSameOrientationMainGrid(doc, PrevMultiSegGrid, prevGrid);
                        }
                        else
                        {
                            prevGridLength = getTheoricalLengthOfTheGrid(prevGrid);
                        }
                        if (canUseSubNumering)
                        {
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isEqual")
                            {
                                if (prevGridIsSub == false)
                                {
                                    if (isNumber)
                                    {
                                        currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub);
                                    }
                                    else
                                    {
                                        currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub);
                                    }
                                }
                                if (prevGridIsSub == true)
                                {
                                    if (isNumber)
                                    {
                                        currentGrid.Name = increaseSubNumber(doc, currentGrid, ref prevGrid, ref subCounter, ref prevGridIsSub);
                                    }
                                    else
                                    {
                                        currentGrid.Name = increaseSubLetter(doc, currentGrid, ref prevGrid, ref subLetter, ref prevGridIsSub);
                                    }
                                }
                            }
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isBigger")
                            {
                                if (isNumber)
                                {
                                    currentGrid.Name = increaseSubNumber(doc, currentGrid, ref prevGrid, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    currentGrid.Name = increaseSubLetter(doc, currentGrid, ref prevGrid, ref subLetter, ref prevGridIsSub);
                                }
                            }
                            if (isBiggerEqualSmaller(prevGridLength, currentGridLength) == "isSmaller")
                            {
                                if (isNumber)
                                {
                                    currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub);
                                }
                                else
                                {
                                    currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub);
                                }
                            }
                        }
                        else
                        {
                            if (isNumber)
                            {
                                currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub);
                            }
                            else
                            {
                                currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub);
                            }
                        }
                    }
                    else
                    {
                        if (isNumber)
                        {
                            currentGrid.Name = increaseWholeNumber(doc, currentGrid, ref counter, ref subCounter, ref prevGridIsSub);
                        }
                        else
                        {
                            currentGrid.Name = increaseWholeLetter(doc, currentGrid, ref letter, ref subLetter, ref prevGridIsSub);
                        }
                    }
                }
                prevGrid = currentGrid;
            }
        }
Ejemplo n.º 19
0
        void ReconstructGridByCurve
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Curve curve,
            Optional <Autodesk.Revit.DB.GridType> type
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;

            if (scaleFactor != 1.0)
            {
                curve.Scale(scaleFactor);
            }

            SolveOptionalType(ref type, doc, ElementTypeGroup.GridType, nameof(type));

            if (curve.TryGetLine(out var line, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, line.ToHost()));
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else if (curve.TryGetArc(out var arc, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, arc.ToHost()));
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else
            {
                using (var curveLoop = new CurveLoop())
                    using (var polyline = curve.ToArcsAndLines(Revit.VertexTolerance, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                    {
                        int count = polyline.SegmentCount;
                        for (int s = 0; s < count; ++s)
                        {
                            var segment = polyline.SegmentCurve(s);

                            if (segment is Rhino.Geometry.LineCurve l)
                            {
                                curveLoop.Append(l.ToHost());
                            }
                            else if (segment is Rhino.Geometry.ArcCurve a)
                            {
                                curveLoop.Append(a.ToHost());
                            }
                            else
                            {
                                ThrowArgumentException(nameof(curve), "Invalid curve type.");
                            }
                        }

                        curve.TryGetPlane(out var plane);
                        var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                        var parametersMask = new BuiltInParameter[]
                        {
                            BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                            BuiltInParameter.ELEM_FAMILY_PARAM,
                            BuiltInParameter.ELEM_TYPE_PARAM
                        };

                        ReplaceElement(ref element, doc.GetElement(MultiSegmentGrid.Create(doc, type.Value.Id, curveLoop, sketchPlane.Id)), parametersMask);
                    }
            }
        }
Ejemplo n.º 20
0
        void CommitInstance
        (
            Document doc, IGH_DataAccess DA, int Iteration,
            Rhino.Geometry.Curve axis,
            GridType gridType
        )
        {
            var element = PreviousElement(doc, Iteration);

            if (!element?.Pinned ?? false)
            {
                ReplaceElement(doc, DA, Iteration, element);
            }
            else
            {
                try
                {
                    var scaleFactor = 1.0 / Revit.ModelUnits;
                    if (scaleFactor != 1.0)
                    {
                        axis.Scale(scaleFactor);
                    }

                    {
                        if (axis is Rhino.Geometry.PolyCurve polycurve && polycurve.SegmentCount == 1)
                        {
                            axis = polycurve.SegmentCurve(0);
                        }

                        if (axis is Rhino.Geometry.LineCurve line)
                        {
                            element = CopyParametersFrom(Grid.Create(doc, line.ToHost()), element);
                        }
                        else if (axis is Rhino.Geometry.ArcCurve arc)
                        {
                            element = CopyParametersFrom(Grid.Create(doc, arc.ToHost()), element);
                        }
                        else
                        {
                            using (var curveLoop = new CurveLoop())
                                using (var polyline = axis.ToArcsAndLines(Revit.VertexTolerance * 10.0, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                                {
                                    int count = polyline.SegmentCount;
                                    for (int s = 0; s < count; ++s)
                                    {
                                        var segment = polyline.SegmentCurve(s);

                                        if (segment is Rhino.Geometry.LineCurve l)
                                        {
                                            curveLoop.Append(l.ToHost());
                                        }
                                        else if (segment is Rhino.Geometry.ArcCurve a)
                                        {
                                            curveLoop.Append(a.ToHost());
                                        }
                                        else
                                        {
                                            throw new ArgumentException();
                                        }
                                    }

                                    axis.TryGetPlane(out var plane);
                                    var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                                    element = CopyParametersFrom(doc.GetElement(MultiSegmentGrid.Create(doc, gridType.Id, curveLoop, sketchPlane.Id)), element);
                                }
                        }
                    }

                    if (gridType.Id != element.GetTypeId())
                    {
                        var newElmentId = element.ChangeTypeId(gridType.Id);
                        if (newElmentId != ElementId.InvalidElementId)
                        {
                            element = doc.GetElement(newElmentId);
                        }
                    }

                    ReplaceElement(doc, DA, Iteration, element);
                }
                catch (Exception e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message);
                    ReplaceElement(doc, DA, Iteration, null);
                }
            }
        }
Ejemplo n.º 21
0
 protected AGCGridBase(MultiSegmentGrid grid)
     : base(grid)
 {
 }