2015-12-09 3 views
0

Я работаю над рутиной Revit 2015, показанной ниже. Подпрограмма предназначена для выбора элемента и создания фильтра просмотра, который автоматически скроет все элементы в этой системе. Он работает только один раз в проекте из-за того, что фильтр просмотра может быть создан только один раз в проекте, а затем повторно использован для других представлений. Кто-нибудь знает, как я могу собрать все видоискатели в модели и сравнить имя с фильтром представления, который я бы хотел создать?Revit View Filter

public void HideSystems() 
     { 


      UIDocument uidoc = this.ActiveUIDocument; 
      Document doc = uidoc.Document; 

      Reference r = uidoc.Selection.PickObject(ObjectType.Element,new SystemElementFilter(),"Select an element of a system"); 
       if (r == null) 
       { 
       return; 
      } 

      Element elem = doc.GetElement(r.ElementId); 


      var systemNameParam =elem.get_Parameter(BuiltInParameter.RBS_DUCT_PIPE_SYSTEM_ABBREVIATION_PARAM); 
      if (systemNameParam == null) 

      { 


      } 


      var view = doc.ActiveView; 


      var categoriesWithSystem = 
       GetCategoriesApplicableForParameter(doc, BuiltInParameter.RBS_DUCT_PIPE_SYSTEM_ABBREVIATION_PARAM); 


      var categoriesWithoutSystemNameParameter = 
       GetCategoriesApplicableForParameter(doc, BuiltInParameter.RBS_DUCT_PIPE_SYSTEM_ABBREVIATION_PARAM, true); 


      var systemName = systemNameParam.AsString(); 


      // An element can be assigned to the several systems 
      // In this case System Name parameter has a comma separated 
      // list of the systems 
      // Create several rules    
      IList<FilterRule> rules = new List<FilterRule>(); 


      var systems = systemName.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 


      foreach (var system in systems) 
      { 
       rules.Add(ParameterFilterRuleFactory.CreateContainsRule(new ElementId(BuiltInParameter.RBS_DUCT_PIPE_SYSTEM_ABBREVIATION_PARAM),system.Trim(),true)); 

      } 




      using (var t = new Transaction(doc, "System hide")) 
      { 
       t.Start(); 
       string sysName=string.Concat("Remove ",systemName); 

       // Hide elements which are in the selected system     
       ParameterFilterElement filter2 = ParameterFilterElement.Create(doc,sysName,categoriesWithSystem,rules); 

       view.AddFilter(filter2.Id); 
       view.SetFilterVisibility(filter2.Id, false); 

vi 

       t.Commit(); 
      } 





     } 


/// <summary>   
/// Returns the list of the categories what can be used in filter 
/// by the specific parameter 
/// </summary> 
/// <param name="doc">Document on which the filter is applying</param> 
/// <param name="bip">BuiltInParameter</param> 
/// <param name="inverse">If true, the list will be inverted. I.e. you will get 
/// the list of the categories what cannot be used in filter 
/// by the specific parameter </param> 
/// <returns></returns> 
    ICollection<ElementId> GetCategoriesApplicableForParameter(Document doc,BuiltInParameter bip,bool inverse = false) 
{ 
    // All categories available for filter 
    var allCategories = ParameterFilterUtilities.GetAllFilterableCategories(); 
    allCategories.Remove(new ElementId(BuiltInCategory.OST_DuctTerminal)); 
    allCategories.Remove(new ElementId(BuiltInCategory.OST_PlumbingFixtures)); 
    ICollection<ElementId> retResult = new List<ElementId>(); 



    foreach (ElementId categoryId in allCategories) 
    { 
     // get the list of parameters, compatible with the category.     
     var applicableParameters = 
      ParameterFilterUtilities.GetFilterableParametersInCommon(doc, new[] {categoryId}); 


     // if the parameter we are interested in the collection 
     // add it to the result 
     if (applicableParameters.Contains(new ElementId(bip))) 
     { 
      retResult.Add(categoryId); 
     } 
    } 


    // Invert if needed. 
    if (inverse) 
     retResult = 
      allCategories.Where(x => !retResult.Contains(x)).ToList(); 


    return retResult; 
} 
    } 


    /// <summary> 
    /// Allow to select only element what has the parameter 
    /// 'System Name' and has value. 
    /// </summary> 
    public class SystemElementFilter : ISelectionFilter 
    { 
     public bool AllowElement(Element elem) 
     { 
      var systemNameParam = 
       elem.get_Parameter(BuiltInParameter.RBS_DUCT_PIPE_SYSTEM_ABBREVIATION_PARAM); 
      return systemNameParam != null && systemNameParam.HasValue; 
     } 


     public bool AllowReference(Reference reference, XYZ position) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
    } 
` 

ответ

1

Я код для подобной задачи некоторое время назад, создавая различные представления для каждой категории элемента, см original here, также копируются ниже:

// get the active document from the command Execute param 
Document doc = commandData.Application.ActiveUIDocument.Document; 

// get all generic models on the current 3D View 
FilteredElementCollector collGenericModels = 
    new FilteredElementCollector(doc, doc.ActiveView.Id); 
collGenericModels.OfClass(typeof(FamilyInstance)); 
collGenericModels.OfCategory(BuiltInCategory.OST_GenericModel); 

// but we need the families of these generic models, 
// so let's create a list with the family IDs 
List<int> genericModelsFamiliesIds = new List<int>(); 
foreach (FamilyInstance equip in collGenericModels) 
{ 
    ElementId symbolId = equip.Symbol.Id; 
    if (!genericModelsFamiliesIds.Contains(symbolId.IntegerValue)) 
    genericModelsFamiliesIds.Add(symbolId.IntegerValue); 
} 

// get the active view 
View3D activeView = doc.ActiveView as View3D; 
if (activeView == null) 
{ 
    // the active view is required in this case 
    // as it will be duplicated with 
    message = "Please run command from a 3D View"; 
    return Result.Failed; 
} 

// control copy numbers 
int copy = 1; 

// this list will store the views created 
List<ElementId> viewIds = new List<ElementId>(); 

foreach (int genericModelId in genericModelsFamiliesIds) 
{ 
    // get the family 
    FamilySymbol famSymbol = doc.GetElement(
    new ElementId(genericModelId)) as FamilySymbol; 

    // create the view by duplicating the active view 
    ElementId genericModelViewId = activeView.Duplicate(
    ViewDuplicateOption.Duplicate); 
    // and add to the list 
    viewIds.Add(genericModelViewId); 
    // and open for further processing 
    View3D genericModelView = doc.GetElement(
    genericModelViewId) as View3D; 

    // here you can adjust the view name 
    // according to internal rules 
    string viewName = string.Format("MM-{0}", famSymbol.Name); 
    try 
    { 
    // try apply a name 
    genericModelView.ViewName = viewName; 
    } 
    catch 
    { 
    // should not happen, except for 
    // wrong project standard 
    viewName = string.Format("{0} - Copy ({1})", viewName, copy); 
    genericModelView.ViewName = viewName; 
    copy++; 
    } 

    // the new view may come without the categories 
    // configured for generic models, so let's set all 
    // as Visible=false, then set GenericModel=true 
    foreach (Category cat in doc.Settings.Categories) 
    { 
    try { genericModelView.SetVisibility(cat, false); } 
    catch { /* não aplicável */} 
    } 
    Category catGenericModel = doc.Settings.Categories. 
    get_Item(BuiltInCategory.OST_GenericModel); 
    genericModelView.SetVisibility(catGenericModel, true); 

    // now create a new filter using the view name 
    // and prefixed by F_ 
    ParameterFilterElement newFilter = 
    ParameterFilterElement.Create(
    doc, string.Format("F_{0}", viewName), 
    new[] { catGenericModel.Id }); 
    // with a rule to show only the family we filter 
    FilterRule rule = ParameterFilterRuleFactory. 
    CreateNotEqualsRule(
    new ElementId(BuiltInParameter.ALL_MODEL_TYPE_NAME), 
    famSymbol.Name, true); 
    // and apply the rule 
    newFilter.SetRules(new[] { rule }); 
    // last step is add the filter and set as false 
    // as the Rule is Not Equals 
    genericModelView.AddFilter(newFilter.Id); 
    genericModelView.SetFilterVisibility(newFilter.Id, false); 
} 

// finally we have all views, one for each element 
// let's export it to DWG files using the view id list 
DWGExportOptions options = DWGExportOptions.GetPredefinedOptions(
    doc, "Standard"); 
doc.Export("c:\\temp_rvt\\", "GenericModels", viewIds, options);