Exemplo n.º 1
0
        private void DoTheRenumberingBeams()
        {
            Document  doc = uidoc.Document;
            Selection sel = uidoc.Selection;

            IList <Level> allLevel = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).OfClass(typeof(Level))
                                     .WhereElementIsNotElementType().Cast <Level>().OrderBy(l => l.Elevation).ToList();

            XYZ pointOfInterest = new XYZ(-9999, 9999, -9999);

            IList <Element> HorizontalBeams = allBeams.Where(b => verifyBeamOrientation(b) == BeamOrientation.Horizontal).OrderBy(e => GetNearestEndPoint(e, pointOfInterest).DistanceTo(pointOfInterest)).ToList();
            IList <Element> VerticalBeams   = allBeams.Where(b => verifyBeamOrientation(b) == BeamOrientation.Vertical).OrderBy(e => GetNearestEndPoint(e, pointOfInterest).DistanceTo(pointOfInterest)).ToList();

            int    counter       = 0;
            string prefix        = "V";
            int    decimalPlaces = 2;

            try
            {
                using (Transaction t = new Transaction(doc, Properties.Messages.RenumberBeams_RenumberBeams))
                {
                    t.Start();
                    foreach (Level currentLevel in allLevel)
                    {
                        LevelInfo lvlInfo = ONBOXApplication.storedBeamLevelInfo.Where(l => l.levelId == currentLevel.Id.IntegerValue).First() as LevelInfo;

                        //checks if the current level will be numbered
                        if (lvlInfo.willBeNumbered == false)
                        {
                            continue;
                        }

                        prefix        = lvlInfo.levelPrefix;
                        decimalPlaces = ONBOXApplication.BeamsDecimalPlaces;

                        IList <Element> HorizontalBeamsInLevel = HorizontalBeams.Where(b => b.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId() == currentLevel.Id).ToList();
                        IList <Element> VerticalBeamsInLevel   = VerticalBeams.Where(b => b.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId() == currentLevel.Id).ToList();
                        IList <Element> allBeamsInLevel        = allBeams.Where(b => b.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId() == currentLevel.Id).ToList();

                        //Checks if the horizontal or vertical comes first, or allbeams
                        if (ONBOXApplication.storedBeamRenumOrder == BeamRenumberOrder.Horizontal)
                        {
                            RenumberListOfBeams(HorizontalBeamsInLevel, ref counter, prefix, decimalPlaces);
                            RenumberListOfBeams(VerticalBeamsInLevel, ref counter, prefix, decimalPlaces);
                        }
                        else if (ONBOXApplication.storedBeamRenumOrder == BeamRenumberOrder.Vertical)
                        {
                            RenumberListOfBeams(VerticalBeamsInLevel, ref counter, prefix, decimalPlaces);
                            RenumberListOfBeams(HorizontalBeamsInLevel, ref counter, prefix, decimalPlaces);
                        }
                        else
                        {
                            RenumberListOfBeams(allBeamsInLevel, ref counter, prefix, decimalPlaces);
                        }

                        //Reset counter for the next level if the user wants to
                        if (ONBOXApplication.isNumBeamLevel == true)
                        {
                            counter = 0;
                        }
                    }
                    t.Commit();
                }
            }
            catch (Exception excep)
            {
                ExceptionManager eManager = new ExceptionManager(excep);
            }
        }
Exemplo n.º 2
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document   doc   = uidoc.Document;
            Selection  sel   = uidoc.Selection;

            try
            {
                FamilyInstance selectedBeam = doc.GetElement(sel.PickObject(ObjectType.Element, new BeamSelectionFilter(), Properties.Messages.CopyBeamsToLevels_SelectBeam)) as FamilyInstance;

                ElementId levelID = selectedBeam.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId();

                IList <Element> beamInSourceLevel = Utils.FindElements.GetElementsInLevelBounds(doc, levelID, 3.00, BuiltInCategory.OST_StructuralFraming);

                beamInSourceLevel = beamInSourceLevel.Where(b => b.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId() == levelID).ToList();

                IList <LevelInfo> allLevelInfo = Utils.GetInformation.GetAllLevelsInfo(doc);

                ElementsCopyUI currentUI = new ElementsCopyUI(allLevelInfo);

                currentUI.ShowDialog();

                if (currentUI.DialogResult == false)
                {
                    return(Result.Cancelled);
                }


                var selectedLevelsInfo = currentUI.listLevels.SelectedItems;

                if (selectedLevelsInfo.Count == 0)
                {
                    return(Result.Cancelled);
                }

                using (Transaction t = new Transaction(doc, Properties.Messages.CopyBeamsToLevels_Transaction))
                {
                    t.Start();
                    foreach (LevelInfo currentLevelInfo in selectedLevelsInfo)
                    {
                        ElementId currentLevelID = new ElementId(currentLevelInfo.levelId);
                        Level     currentLevel   = doc.GetElement(currentLevelID) as Level;

                        if (currentUI.checkEraseBeamsOnTarget.IsChecked == true)
                        {
                            IList <Element> beamsTodelete = Utils.FindElements.GetElementsInLevelBounds(doc, currentLevelID, 3.00, BuiltInCategory.OST_StructuralFraming);

                            beamsTodelete = beamsTodelete.Where(b => b.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).AsElementId() == currentLevelID).ToList();

                            foreach (Element currentBeamToDelete in beamsTodelete)
                            {
                                doc.Delete(currentBeamToDelete.Id);
                            }
                        }

                        foreach (Element currentBeam in beamInSourceLevel)
                        {
                            IList <ElementId> copiedElementsIDs = ElementTransformUtils.CopyElement(doc, currentBeam.Id, XYZ.Zero).ToList();

                            foreach (ElementId currentcopiedID in copiedElementsIDs)
                            {
                                Element currentCopiedElement = doc.GetElement(currentcopiedID);

                                if (currentCopiedElement is FamilyInstance)
                                {
                                    currentCopiedElement.get_Parameter(BuiltInParameter.STRUCTURAL_BEAM_END0_ELEVATION).Set(1);
                                    currentCopiedElement.get_Parameter(BuiltInParameter.STRUCTURAL_BEAM_END1_ELEVATION).Set(1);

                                    currentCopiedElement.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM).Set(currentLevelID);

                                    currentCopiedElement.get_Parameter(BuiltInParameter.STRUCTURAL_BEAM_END0_ELEVATION).Set(0);
                                    currentCopiedElement.get_Parameter(BuiltInParameter.STRUCTURAL_BEAM_END1_ELEVATION).Set(0);

                                    if (currentUI.checkEraseBeamsOnTarget.IsChecked == false)
                                    {
                                        doc.Regenerate();
                                        Utils.CheckFamilyInstanceForIntersection.checkForDuplicates(currentCopiedElement as FamilyInstance, doc);
                                    }
                                }
                            }
                        }
                    }
                    t.Commit();
                }
            }
            catch (Exception excep)
            {
                ExceptionManager eManager = new ExceptionManager(excep);
            }

            return(Result.Succeeded);
        }