Ejemplo n.º 1
0
        protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            DB.Category category = null;
            if (!DA.GetData("Category", ref category))
            {
                return;
            }

            DA.SetData("Name", category?.Name);
            DA.SetData("Parent", category?.Parent);
            DA.SetData("Type", category?.CategoryType);
            DA.SetData("AllowsSubcategories", category?.CanAddSubcategory);
            DA.SetData("AllowsParameters", category?.AllowsBoundParameters);
            DA.SetData("HasMaterialQuantities", category?.HasMaterialQuantities);
        }
Ejemplo n.º 2
0
        private static Autodesk.Revit.DB.Category GetCategory(String name)
        {
            Autodesk.Revit.DB.Category category = null;
            Settings documentSettings           = DocumentManager.Instance.CurrentDBDocument.Settings;
            var      groups = documentSettings.Categories;

            var splits = name.Split('-');

            if (groups.Contains(name))
            {
                category = groups.get_Item(name);
            }
            else if (splits.Count() > 1)
            {
                var indexs = FindAllChars(name, '-');
                foreach (var index in indexs)
                {
                    var parentName = name.Substring(0, index).TrimEnd(' ');
                    var subName    = name.Substring(index + 1).TrimStart(' ');
                    if (groups.Contains(parentName))
                    {
                        var parentCategory = groups.get_Item(parentName);
                        if (parentCategory != null)
                        {
                            if (parentCategory.SubCategories.Contains(subName))
                            {
                                category = parentCategory.SubCategories.get_Item(subName);
                                break;
                            }
                        }
                    }
                }
            }
            else
            {
                // Fall back
                // Use category enum name with or without OST_ prefix
                var fullName = name.Length > 3 && name.Substring(0, 4) == "OST_" ? name : "OST_" + name;
                var names    = Enum.GetNames(typeof(BuiltInCategory));
                if (System.Array.Exists(names, entry => entry == fullName))
                {
                    var builtInCat = (BuiltInCategory)Enum.Parse(typeof(BuiltInCategory), fullName);
                    category = groups.get_Item(builtInCat);
                }
            }

            return(category);
        }
Ejemplo n.º 3
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Autodesk.Revit.DB.Category category = null;
            if (!DA.GetData("Category", ref category))
            {
                return;
            }

            DA.SetData("Name", category?.Name);
            DA.SetData("Parent", category?.Parent);
            DA.SetData("Type", category?.CategoryType);
            DA.SetData("AllowsParameters", category?.AllowsBoundParameters);
            DA.SetData("HasMaterialQuantities", category?.HasMaterialQuantities);
            DA.SetData("Cuttable", category?.IsCuttable);
            DA.SetData("Hidden", category is null ? (object)null : category.IsHidden());
        }
Ejemplo n.º 4
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            Autodesk.Revit.DB.Category category = null;
            if (!DA.GetData("Category", ref category))
            {
                return;
            }

            var doc = Revit.ActiveDBDocument;

            DA.SetData("LineWeight [projection]", category?.GetLineWeight(GraphicsStyleType.Projection));
            DA.SetData("LineWeight [cut]", category?.GetLineWeight(GraphicsStyleType.Cut));
            DA.SetData("LineColor", category?.LineColor.ToRhino());
            DA.SetData("LinePattern [projection]", doc.GetElement(category?.GetLinePatternId(GraphicsStyleType.Projection)));
            DA.SetData("LinePattern [cut]", doc.GetElement(category?.GetLinePatternId(GraphicsStyleType.Cut)));
            DA.SetData("Material", category?.Material);
        }
Ejemplo n.º 5
0
        public void ModifyOverrideGraphicSettings(RevitView view)
        {
            RevitDoc document = view.Document;

            RevitDB.Category category = Category.GetCategory(document);

            if (category != null)
            {
                view.SetCategoryHidden(category.Id, this.IsHidden);

                if (this.GraphicOverride != null)
                {
                    RevitDB.OverrideGraphicSettings ogs = this.GraphicOverride.ToOverrideGraphicSettings();
                    view.SetCategoryOverrides(category.Id, ogs);
                }
            }
        }
        /// <summary>
        /// Get all objects of a certain category from a linked interface
        /// </summary>
        /// <param name="LinkInstance">Link Instance</param>
        /// <param name="Category">Category</param>
        /// <returns></returns>
        public static Autodesk.Revit.DB.Category GetRevitCategory(Revit.Elements.Category Category)
        {
            System.Reflection.PropertyInfo IntProp = Category.GetType().GetProperty("InternalCategory", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

            if (IntProp == null)
            {
                throw new ArgumentException("No category matching");
            }

            Autodesk.Revit.DB.Category Cat1 = IntProp.GetValue(Category) as Autodesk.Revit.DB.Category;

            if (Cat1 == null)
            {
                throw new ArgumentException("Could not find category");
            }

            return(Cat1);
        }
Ejemplo n.º 7
0
        private static string getFullName(Autodesk.Revit.DB.Category category)
        {
            string result = string.Empty;

            if (category != null)
            {
                Autodesk.Revit.DB.Category parent = category.Parent;
                if (parent == null)
                {
                    result = category.Name.ToString();
                }
                else
                {
                    result = parent.Name.ToString() + " - " + category.Name.ToString();
                }
            }
            return(result);
        }
Ejemplo n.º 8
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            DB.Category category = null;
            if (!DA.GetData("Category", ref category))
            {
                return;
            }

            var doc = category?.Document();

            DA.SetData("LineWeight [projection]", category?.GetLineWeight(DB.GraphicsStyleType.Projection));
            DA.SetData("LineWeight [cut]", category?.GetLineWeight(DB.GraphicsStyleType.Cut));
            DA.SetData("LineColor", category?.LineColor.ToRhino());
            DA.SetData("LinePattern [projection]", doc?.GetElement(category.GetLinePatternId(DB.GraphicsStyleType.Projection)));
            DA.SetData("LinePattern [cut]", doc?.GetElement(category.GetLinePatternId(DB.GraphicsStyleType.Cut)));
            DA.SetData("Material", category?.Material);
            DA.SetData("Cuttable", category?.IsCuttable);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Gets a Revit category by the built-in category name.
        /// </summary>
        /// <param name="name">The built in category name.</param>
        /// <returns></returns>
        public static Category ByName(string name)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            // Find category using localized name
            Autodesk.Revit.DB.Category category = null;
            category = GetCategory(name);

            if (category == null)
            {
                throw new ArgumentException(Properties.Resources.InvalidCategory);
            }

            return(new Category(category));
        }
Ejemplo n.º 10
0
        public static List <int?> CutLineweight(List <global::Revit.Elements.Category> category)
        {
            //obtains the current document for later use
            Autodesk.Revit.DB.Document doc = DocumentManager.Instance.CurrentDBDocument;
            //category stuff - list to append the results to
            List <int?> categoryCutLineweight = new List <int?>();

            //iterates through each of the input items.
            foreach (global::Revit.Elements.Category c in category)
            {
                //generate the category id from the input user viewable category
                Autodesk.Revit.DB.ElementId categoryId = new ElementId(c.Id);
                //obtain the internal Revit category from the id
                Autodesk.Revit.DB.Category internalRevitCat = Autodesk.Revit.DB.Category.GetCategory(doc, categoryId);
                categoryCutLineweight.Add(internalRevitCat.GetLineWeight(GraphicsStyleType.Cut));
            }
            return(categoryCutLineweight);
        }
Ejemplo n.º 11
0
        public static Category ById(int id)
        {
            try
            {
                var                        categories = DocumentManager.Instance.CurrentDBDocument.Settings.Categories;
                BuiltInCategory            categoryId = (BuiltInCategory)id;
                Autodesk.Revit.DB.Category category   = categories.get_Item(categoryId);
                if (null == category)
                {
                    throw new ArgumentException(Properties.Resources.InvalidCategory);
                }

                return(new Category(category));
            }
            catch
            {
                throw new ArgumentException(Properties.Resources.InvalidCategory);
            }
        }
Ejemplo n.º 12
0
        public static Category ById(int id)
        {
            try
            {
                var                        document   = DocumentManager.Instance.CurrentDBDocument;
                BuiltInCategory            categoryId = (BuiltInCategory)id;
                Autodesk.Revit.DB.Category category   = Autodesk.Revit.DB.Category.GetCategory(document, categoryId);
                if (null == category)
                {
                    throw new ArgumentException(Properties.Resources.InvalidCategory);
                }

                return(new Category(category));
            }
            catch
            {
                throw new ArgumentException(Properties.Resources.InvalidCategory);
            }
        }
Ejemplo n.º 13
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            var geometry = new List <Rhino.Geometry.GeometryBase>();

            DA.GetDataList("Geometry", geometry);

            Autodesk.Revit.DB.Category category = null;
            if (!DA.GetData("Category", ref category) && Params.Input[1].Sources.Count == 0)
            {
                category = Autodesk.Revit.DB.Category.GetCategory(Revit.ActiveDBDocument, BuiltInCategory.OST_GenericModel);
            }

            string name = string.Empty;

            DA.GetData("Name", ref name);

            DA.DisableGapLogic();
            int Iteration = DA.Iteration;

            Revit.EnqueueAction((doc) => CommitInstance(doc, DA, Iteration, geometry, category, name));
        }
Ejemplo n.º 14
0
        public SerialElementId(RevitElemId Id,
                               [DefaultArgument("Synthetic.Revit.Document.Current()")] RevitDoc Document)
        {
            this.Id = Id.IntegerValue;

            RevitElem elem = Document.GetElement(Id);

            if (elem != null)
            {
                this.Name     = elem.Name;
                this.Class    = elem.GetType().FullName;
                this.UniqueId = elem.UniqueId;

                RevitDB.Category cat = elem.Category;

                if (cat != null)
                {
                    this.Category = elem.Category.Name;
                }
            }
        }
Ejemplo n.º 15
0
        protected override void TrySolveInstance(IGH_DataAccess DA)
        {
            DB.Category parent = null;
            if (!DA.GetData("Parent", ref parent))
            {
                return;
            }

            string newSubcatName = default;

            if (!DA.GetData("Name", ref newSubcatName))
            {
                return;
            }

            // find existing subcat if exists
            var newSubcat = parent.SubCategories.Cast <DB.Category>().
                            Where(x => x.Name == newSubcatName).
                            FirstOrDefault();

            // if not found, create one
            if (newSubcat is null && newSubcatName != string.Empty)
            {
                var doc = parent.Document();
                using (var transaction = NewTransaction(doc))
                {
                    transaction.Start();

                    using (var categories = doc.Settings.Categories)
                        newSubcat = categories.NewSubcategory(parent, newSubcatName);

                    CommitTransaction(doc, transaction);
                }
            }

            // return data to DA
            DA.SetData("SubCategory", newSubcat);
        }
        //method to display the category name
        private static string getFullName(Autodesk.Revit.DB.Category category)
        {
            string name = string.Empty;

            if (category != null)
            {
                var parent = category.Parent;

                if (parent == null)
                {
                    // Top level category
                    // For example "Cable Trays"
                    name = category.Name.ToString();
                }
                else
                {
                    // Sub-category
                    // For example "Cable Tray - Center Lines"
                    name = parent.Name.ToString() + " - " + category.Name.ToString();
                }
            }
            return(name);
        }
Ejemplo n.º 17
0
    protected override void SolveInstance(IGH_DataAccess DA)
    {
      Autodesk.Revit.DB.Category category = null;
      DA.GetData("Category", ref category);

      var elements = new List<Types.Element>();

      using (var collector = new FilteredElementCollector(Revit.ActiveDBDocument))
      {
        if (category == null)
        {
          foreach (var element in collector.WhereElementIsNotElementType().ToElementIds())
            elements.Add(Types.Element.Make(element));
        }
        else
        {
          foreach (var element in collector.WhereElementIsNotElementType().OfCategoryId(category.Id).ToElementIds())
            elements.Add(Types.Element.Make(element));
        }
      }

      DA.SetDataList("Elements", elements);
    }
Ejemplo n.º 18
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            var geometry = new List <IGH_GeometricGoo>();

            DA.GetDataList("Geometry", geometry);

            Autodesk.Revit.DB.Category category = null;
            if (!DA.GetData("Category", ref category) && Params.Input[1].Sources.Count == 0)
            {
                category = Autodesk.Revit.DB.Category.GetCategory(Revit.ActiveDBDocument, BuiltInCategory.OST_GenericModel);
            }

            string name = null;

            if (!DA.GetData("Name", ref name) && geometry.Count == 1 && (geometry[0]?.IsReferencedGeometry ?? false))
            {
                name = Rhino.RhinoDoc.ActiveDoc.Objects.FindId(geometry[0].ReferenceID)?.Name;
            }

            DA.DisableGapLogic();
            int Iteration = DA.Iteration;

            Revit.EnqueueAction((doc) => CommitInstance(doc, DA, Iteration, geometry, category, name));
        }
Ejemplo n.º 19
0
        void Add
        (
            DB.Document doc,
            DB.Document familyDoc,
            Rhino.Geometry.Curve curve,
            List <KeyValuePair <double[], DB.SketchPlane> > planesSet,
            DeleteElementEnumerator <DB.CurveElement> curves
        )
        {
            if (curve.TryGetPlane(out var plane))
            {
                var abcd  = plane.GetPlaneEquation();
                int index = planesSet.BinarySearch(new KeyValuePair <double[], DB.SketchPlane>(abcd, null), PlaneComparer.Instance);
                if (index < 0)
                {
                    var entry = new KeyValuePair <double[], DB.SketchPlane>(abcd, DB.SketchPlane.Create(familyDoc, plane.ToPlane()));
                    index = ~index;
                    planesSet.Insert(index, entry);
                }
                var sketchPlane = planesSet[index].Value;

                DB.GraphicsStyle familyGraphicsStyle = null;
                {
                    DB.Category familySubCategory = null;
                    if
                    (
                        curve.TryGetUserString(DB.BuiltInParameter.FAMILY_ELEM_SUBCATEGORY.ToString(), out DB.ElementId subCategoryId) &&
                        DB.Category.GetCategory(doc, subCategoryId) is DB.Category subCategory
                    )
                    {
                        if (subCategoryId == familyDoc.OwnerFamily.FamilyCategory.Id)
                        {
                            familySubCategory = MapCategory(doc, familyDoc, subCategoryId, true);
                        }
                        else if (subCategory?.Parent?.Id == familyDoc.OwnerFamily.FamilyCategory.Id)
                        {
                            familySubCategory = MapCategory(doc, familyDoc, subCategoryId, true);
                        }
                        else
                        {
                            if (subCategory.Parent is null)
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{subCategory.Name}' is not subcategory of '{familyDoc.OwnerFamily.FamilyCategory.Name}'");
                            }
                            else
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{subCategory.Parent.Name} : {subCategory.Name}' is not subcategory of '{familyDoc.OwnerFamily.FamilyCategory.Name}'");
                            }
                        }
                    }

                    curve.TryGetUserString(DB.BuiltInParameter.FAMILY_CURVE_GSTYLE_PLUS_INVISIBLE.ToString(), out var graphicsStyleType, DB.GraphicsStyleType.Projection);

                    familyGraphicsStyle = familySubCategory?.GetGraphicsStyle(graphicsStyleType);
                }

                curve.TryGetUserString(DB.BuiltInParameter.MODEL_OR_SYMBOLIC.ToString(), out bool symbolic, false);
                curve.TryGetUserString(DB.BuiltInParameter.IS_VISIBLE_PARAM.ToString(), out var visible, true);
                curve.TryGetUserString(DB.BuiltInParameter.GEOM_VISIBILITY_PARAM.ToString(), out var visibility, 57406);

                foreach (var c in curve.ToCurveMany())
                {
                    curves.MoveNext();

                    if (symbolic)
                    {
                        if (curves.Current is DB.SymbolicCurve symbolicCurve && symbolicCurve.GeometryCurve.IsSameKindAs(c))
                        {
                            symbolicCurve.SetSketchPlaneAndCurve(sketchPlane, c);
                            curves.DeleteCurrent = false;
                        }
                        else
                        {
                            symbolicCurve = familyDoc.FamilyCreate.NewSymbolicCurve(c, sketchPlane);
                        }

                        symbolicCurve.get_Parameter(DB.BuiltInParameter.IS_VISIBLE_PARAM).Set(visible ? 1 : 0);
                        symbolicCurve.get_Parameter(DB.BuiltInParameter.GEOM_VISIBILITY_PARAM).Set(visibility);

                        if (familyGraphicsStyle is object)
                        {
                            symbolicCurve.Subcategory = familyGraphicsStyle;
                        }
                    }
                    else
                    {
                        if (curves.Current is DB.ModelCurve modelCurve && modelCurve.GeometryCurve.IsSameKindAs(c))
                        {
                            modelCurve.SetSketchPlaneAndCurve(sketchPlane, c);
                            curves.DeleteCurrent = false;
                        }
Ejemplo n.º 20
0
        bool Add
        (
            DB.Document doc,
            DB.Document familyDoc,
            Rhino.Geometry.Brep brep,
            DeleteElementEnumerator <DB.GenericForm> forms
        )
        {
            forms.MoveNext();
            if (brep.ToSolid() is DB.Solid solid)
            {
                if (forms.Current is DB.FreeFormElement freeForm)
                {
                    freeForm.UpdateSolidGeometry(solid);
                    forms.DeleteCurrent = false;
                }
                else
                {
                    freeForm = DB.FreeFormElement.Create(familyDoc, solid);
                }

                brep.TryGetUserString(DB.BuiltInParameter.ELEMENT_IS_CUTTING.ToString(), out bool cutting, false);
                freeForm.get_Parameter(DB.BuiltInParameter.ELEMENT_IS_CUTTING).Set(cutting ? 1 : 0);

                if (!cutting)
                {
                    DB.Category familySubCategory = null;
                    if
                    (
                        brep.TryGetUserString(DB.BuiltInParameter.FAMILY_ELEM_SUBCATEGORY.ToString(), out DB.ElementId subCategoryId) &&
                        DB.Category.GetCategory(doc, subCategoryId) is DB.Category subCategory
                    )
                    {
                        if (subCategory.Parent.Id == familyDoc.OwnerFamily.FamilyCategory.Id)
                        {
                            familySubCategory = MapCategory(doc, familyDoc, subCategoryId, true);
                        }
                        else
                        {
                            if (subCategory.Parent is null)
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{subCategory.Name}' is not subcategory of '{familyDoc.OwnerFamily.FamilyCategory.Name}'");
                            }
                            else
                            {
                                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, $"'{subCategory.Parent.Name} : {subCategory.Name}' is not subcategory of '{familyDoc.OwnerFamily.FamilyCategory.Name}'");
                            }
                        }
                    }

                    if (familySubCategory is null)
                    {
                        freeForm.get_Parameter(DB.BuiltInParameter.FAMILY_ELEM_SUBCATEGORY).Set(DB.ElementId.InvalidElementId);
                    }
                    else
                    {
                        freeForm.Subcategory = familySubCategory;
                    }

                    brep.TryGetUserString(DB.BuiltInParameter.IS_VISIBLE_PARAM.ToString(), out var visible, true);
                    freeForm.get_Parameter(DB.BuiltInParameter.IS_VISIBLE_PARAM).Set(visible ? 1 : 0);

                    brep.TryGetUserString(DB.BuiltInParameter.GEOM_VISIBILITY_PARAM.ToString(), out var visibility, 57406);
                    freeForm.get_Parameter(DB.BuiltInParameter.GEOM_VISIBILITY_PARAM).Set(visibility);

                    brep.TryGetUserString(DB.BuiltInParameter.MATERIAL_ID_PARAM.ToString(), out DB.ElementId materialId);
                    var familyMaterialId = MapMaterial(doc, familyDoc, materialId, true);
                    freeForm.get_Parameter(DB.BuiltInParameter.MATERIAL_ID_PARAM).Set(familyMaterialId);
                }

                return(cutting);
            }

            return(false);
        }
Ejemplo n.º 21
0
 public Category(DB.Category category)             : base(category.Document(), category.Id)
 {
 }
Ejemplo n.º 22
0
        void CommitInstance
        (
            Document doc, IGH_DataAccess DA, int Iteration,
            IEnumerable <IGH_GeometricGoo> geometries,
            Autodesk.Revit.DB.Category category,
            string name
        )
        {
            var element = PreviousElement(doc, Iteration);

            if (!element?.Pinned ?? false)
            {
                ReplaceElement(doc, DA, Iteration, element);
            }
            else
            {
                try
                {
                    var shape = new List <GeometryObject>();

                    if (geometries != null)
                    {
                        if (category == null || !DirectShape.IsValidCategoryId(category.Id, doc))
                        {
                            AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, string.Format("Parameter '{0}' is not valid for DirectShape.", Params.Input[1].Name));
                            category = Autodesk.Revit.DB.Category.GetCategory(doc, BuiltInCategory.OST_GenericModel);
                        }

                        foreach (var geometry in geometries.Select((x) => AsGeometryBase(x)).ToHost())
                        {
                            // DirectShape only accepts those types and no nulls
                            foreach (var g in geometry.SelectMany(g => g.ToDirectShapeGeometry()))
                            {
                                switch (g)
                                {
                                case Point p: shape.Add(p); break;

                                case Curve c: shape.Add(c); break;

                                case Solid s: shape.Add(s); break;

                                case Mesh m: shape.Add(m); break;
                                }
                            }
                        }
                    }

                    if (element?.Category.Id != category.Id)
                    {
                        element = null;
                    }

                    var ds = element as DirectShape ?? CopyParametersFrom(DirectShape.CreateElement(doc, category.Id), element);
                    ds.SetShape(shape);
                    ds.Name = name ?? string.Empty;
                    element = ds;

                    ReplaceElement(doc, DA, Iteration, element);
                }
                catch (Exception e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message);
                    ReplaceElement(doc, DA, Iteration, null);
                }
            }
        }
        /// <summary>
        /// Get all subcategory.
        /// </summary>
        /// <param name="category"></param>
        /// <param name="view">Current view.</param>
        /// <returns></returns>
        private TreeNode GetChildNode(Category category,Autodesk.Revit.DB.View view)
        {
            if(category == null)
                return null;

            if (!category.get_AllowsVisibilityControl(view))
                return null;

            TreeNode treeNode = new TreeNode(category.Name);
            treeNode.Tag = category;
            treeNode.Checked = true;

            if(category.SubCategories.Size == 0)
            {
                return treeNode;
            }

            foreach (Category subCategory in category.SubCategories)
            {
                TreeNode child = GetChildNode(subCategory,view);
                if(child !=null)
                    treeNode.Nodes.Add(child);
            }

            return treeNode;
        }
Ejemplo n.º 24
0
 public Category(Autodesk.Revit.DB.Category category) : base(category.Id)
 {
 }
Ejemplo n.º 25
0
 public static Category Make(Autodesk.Revit.DB.Category category) => Make(category?.Id);
Ejemplo n.º 26
0
 public Category(Autodesk.Revit.DB.Category category) : base(category != null ? category.Id.IntegerValue : ElementId.InvalidElementId.IntegerValue)
 {
 }
Ejemplo n.º 27
0
 protected override bool CategoryIsInSet(DB.Category category) => !category.IsTagCategory && category.CategoryType == DB.CategoryType.AnalyticalModel;
Ejemplo n.º 28
0
 internal Category(Autodesk.Revit.DB.Category category)
 {
     internalCategory = category;
 }
Ejemplo n.º 29
0
 protected override bool CategoryIsInSet(DB.Category category) => category.IsTagCategory;
Ejemplo n.º 30
0
 protected override bool CategoryIsInSet(DB.Category category) => !category.IsTagCategory && category.CategoryType == DB.CategoryType.Annotation;
Ejemplo n.º 31
0
 private Category(Autodesk.Revit.DB.Category category)
 {
     internal_category = category;
 }
Ejemplo n.º 32
0
 protected abstract bool CategoryIsInSet(DB.Category category);