예제 #1
0
        public static IList <Element> GetWallsIntersectBoundingBox(Document doc, Element elem, double minWallWidth)
        {
            ExclusionFilter exclusionFilter =
                new ExclusionFilter(new List <ElementId> {
                elem.Id
            });

            ElementParameterFilter elementParameterFilter =
                new ElementParameterFilter(ParameterFilterRuleFactory
                                           .CreateEqualsRule(new ElementId(BuiltInParameter.WALL_BASE_CONSTRAINT), elem.LevelId), true);

            BoundingBoxXYZ bndBx = elem.get_Geometry
                                       (new Options {
                IncludeNonVisibleObjects = true
            }).GetBoundingBox();

            BoundingBoxIntersectsFilter bndBxFlt =
                new BoundingBoxIntersectsFilter(new Outline(bndBx.Min, bndBx.Max), 0.1);

            ElementParameterFilter widthFilter =
                new ElementParameterFilter(ParameterFilterRuleFactory
                                           .CreateGreaterOrEqualRule(new ElementId(BuiltInParameter.WALL_ATTR_WIDTH_PARAM),
                                                                     minWallWidth, 0.1));

            IList <Element> elements = new FilteredElementCollector(doc)
                                       .WherePasses(exclusionFilter)
                                       .OfClass(typeof(Wall))
                                       .WherePasses(bndBxFlt)
                                       .WherePasses(widthFilter)
                                       .WherePasses(elementParameterFilter)
                                       .ToElements()
                                       .ToList();

            return(elements);
        }
예제 #2
0
        public static void CreateViewFilter(Document doc, View view)
        {
            List <ElementId> categories = new List <ElementId>();

            categories.Add(new ElementId(BuiltInCategory.OST_Walls));
            List <FilterRule> filterRules = new List <FilterRule>();

            try
            {
                // Create filter element associated to the input categories
                ParameterFilterElement parameterFilterElement = ParameterFilterElement.Create(doc, "Example view filter", categories);

                // Criterion 1 - wall type Function is "Exterior"
                ElementId exteriorParamId = new ElementId(BuiltInParameter.FUNCTION_PARAM);
                filterRules.Add(ParameterFilterRuleFactory.CreateEqualsRule(exteriorParamId, (int)WallFunction.Exterior));

                // Criterion 2 - wall height > some number
                ElementId lengthId = new ElementId(BuiltInParameter.CURVE_ELEM_LENGTH);
                filterRules.Add(ParameterFilterRuleFactory.CreateGreaterOrEqualRule(lengthId, 28.0, 0.0001));

                // Criterion 3 - custom shared parameter value matches string pattern
                // Get the id for the shared parameter - the ElementId is not hardcoded, so we need to get an instance of this type to find it
                Guid spGuid = new Guid("96b00b61-7f5a-4f36-a828-5cd07890a02a");
                FilteredElementCollector collector = new FilteredElementCollector(doc);
                collector.OfClass(typeof(Wall));
                Wall wall = collector.FirstElement() as Wall;

                if (wall != null)
                {
                    Parameter sharedParam   = wall.get_Parameter(spGuid);
                    ElementId sharedParamId = sharedParam.Id;

                    filterRules.Add(ParameterFilterRuleFactory.CreateBeginsWithRule(sharedParamId, "15.", true));
                }

                parameterFilterElement.SetRules(filterRules);

                // Apply filter to view
                view.AddFilter(parameterFilterElement.Id);
                view.SetFilterVisibility(parameterFilterElement.Id, false);
            }
            catch
            {
            }
        }
예제 #3
0
        public static Autodesk.Revit.DB.FilterRule GetElementIdRule(ElementId paramId, CriteriaName selectedCriteria, ElementId ruleValue)
        {
            Autodesk.Revit.DB.FilterRule rule = null;
            try
            {
                switch (selectedCriteria)
                {
                case CriteriaName.equals:
                    rule = ParameterFilterRuleFactory.CreateEqualsRule(paramId, ruleValue);
                    break;

                case CriteriaName.isgreaterthan:
                    rule = ParameterFilterRuleFactory.CreateGreaterRule(paramId, ruleValue);
                    break;

                case CriteriaName.isgreaterthanorequalto:
                    rule = ParameterFilterRuleFactory.CreateGreaterOrEqualRule(paramId, ruleValue);
                    break;

                case CriteriaName.islessthan:
                    rule = ParameterFilterRuleFactory.CreateLessRule(paramId, ruleValue);
                    break;

                case CriteriaName.islessthanorequalto:
                    rule = ParameterFilterRuleFactory.CreateLessOrEqualRule(paramId, ruleValue);
                    break;

                case CriteriaName.doesnotequal:
                    rule = ParameterFilterRuleFactory.CreateNotEqualsRule(paramId, ruleValue);
                    break;
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show("Failed to get integer filter rule.\n" + ex.Message, "Get Integer Filter Rule", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            return(rule);
        }
예제 #4
0
        public static Autodesk.Revit.DB.FilterRule GetStringRule(ElementId paramId, CriteriaName selectedCriteria, string ruleValue)
        {
            Autodesk.Revit.DB.FilterRule rule = null;
            try
            {
                switch (selectedCriteria)
                {
                case CriteriaName.beginswith:
                    rule = ParameterFilterRuleFactory.CreateBeginsWithRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.contains:
                    rule = ParameterFilterRuleFactory.CreateContainsRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.endswith:
                    rule = ParameterFilterRuleFactory.CreateEndsWithRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.equals:
                    rule = ParameterFilterRuleFactory.CreateEqualsRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.isgreaterthan:
                    rule = ParameterFilterRuleFactory.CreateGreaterRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.isgreaterthanorequalto:
                    rule = ParameterFilterRuleFactory.CreateGreaterOrEqualRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.islessthan:
                    rule = ParameterFilterRuleFactory.CreateLessRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.islessthanorequalto:
                    rule = ParameterFilterRuleFactory.CreateLessOrEqualRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.doesnotbeginwith:
                    rule = ParameterFilterRuleFactory.CreateNotBeginsWithRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.doesnotcontain:
                    rule = ParameterFilterRuleFactory.CreateNotContainsRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.doesnotendwith:
                    rule = ParameterFilterRuleFactory.CreateNotEndsWithRule(paramId, ruleValue, false);
                    break;

                case CriteriaName.doesnotequal:
                    rule = ParameterFilterRuleFactory.CreateNotEqualsRule(paramId, ruleValue, false);
                    break;
                }
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show("Failed to get string filter rule.\n" + ex.Message, "Get String Filter Rule", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            return(rule);
        }
예제 #5
0
        public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.
                                                ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Tracer.Listeners.Add(new System.Diagnostics.EventLogTraceListener("Application"));

            Autodesk.Revit.UI.UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;

            try {
                // Set the minimum wall width
                double minWallWidth = UnitUtils
                                      .ConvertToInternalUnits(400, DisplayUnitType.DUT_MILLIMETERS); // 400mm

                // Select all walls wider than 400 mm
                ElementParameterFilter widthFilter =
                    new ElementParameterFilter(ParameterFilterRuleFactory
                                               .CreateGreaterOrEqualRule(new ElementId(BuiltInParameter.WALL_ATTR_WIDTH_PARAM),
                                                                         minWallWidth, 0.1));

                IList <Wall> walls = new FilteredElementCollector(doc)
                                     .OfClass(typeof(Wall))
                                     .WhereElementIsNotElementType()
                                     .WherePasses(widthFilter)
                                     .Cast <Wall>()
                                     .ToList();

                Tracer.Write("The number of walls in the project: " + walls.Count);

                using (Transaction t = new Transaction(doc, "Join walls")) {
                    FailureHandlingOptions handlingOptions = t.GetFailureHandlingOptions();
                    handlingOptions.SetFailuresPreprocessor(new AllWarningSwallower());
                    t.SetFailureHandlingOptions(handlingOptions);
                    t.Start();

                    foreach (Wall wall in walls)
                    {
                        IList <Element> intrudingWalls =
                            GetWallsIntersectBoundingBox(doc, wall, minWallWidth);

                        Tracer.Write(string.Format("Wall {0} is intersected by {1} walls",
                                                   wall.Id.ToString(), intrudingWalls.Count));

                        foreach (Element elem in intrudingWalls)
                        {
                            if (//((Wall)elem).WallType.Width < minWallWidth ||
                                ((Wall)elem).WallType.Kind == WallKind.Curtain)
                            {
                                continue;
                            }
                            try {
                                if (!JoinGeometryUtils.AreElementsJoined(doc, wall, elem))
                                {
                                    JoinGeometryUtils.JoinGeometry(doc, wall, elem);
                                }
                            }
                            catch (Exception ex) {
                                Tracer.Write(string.Format("{0}\nWall: {1} cannot be joined to {2}",
                                                           ex.Message, wall.Id.ToString(), elem.Id.ToString()));
                                continue;
                            }
                        }
                    }
                    t.Commit();
                }

                return(Autodesk.Revit.UI.Result.Succeeded);
            }
            catch (Autodesk.Revit.Exceptions.OperationCanceledException) {
                return(Autodesk.Revit.UI.Result.Cancelled);
            }
            catch (Exception ex) {
                Tracer.Write(string.Format("{0}\n{1}",
                                           ex.Message, ex.StackTrace));
                return(Autodesk.Revit.UI.Result.Failed);
            }
        }