Ejemplo n.º 1
0
def get_elements_by_param_value(param_name,
                                param_value,
                                inverse=False,
                                doc=None):
    doc = doc or HOST_APP.doc
    param_id = get_project_parameter_id(param_name)
    if param_id:
        pvprov = DB.ParameterValueProvider(param_id)
        pfilter = DB.FilterStringEquals()
        vrule = DB.FilterStringRule(pvprov, pfilter, param_value, True)
        if inverse:
            vrule = DB.FilterInverseRule(vrule)
        param_filter = DB.ElementParameterFilter(vrule)
        return DB.FilteredElementCollector(doc)\
                 .WherePasses(param_filter)\
                 .ToElements()
    else:
        return []
Ejemplo n.º 2
0
def get_vp_by_name(name, doc=revit.doc):
    #
    bip_id = DB.ElementId(DB.BuiltInParameter.VIEWPORT_ATTR_SHOW_LABEL)
    bip_provider = DB.ParameterValueProvider(bip_id)
    rule = DB.FilterIntegerRule(bip_provider, DB.FilterNumericGreaterOrEqual(), 0)
    param_filter = DB.ElementParameterFilter(rule)

    type_bip_id = DB.ElementId(DB.BuiltInParameter.ALL_MODEL_TYPE_NAME)
    type_bip_provider = DB.ParameterValueProvider(type_bip_id)
    type_filter_rule = DB.FilterStringRule(type_bip_provider, DB.FilterStringEquals(), name, True)
    type_filter = DB.ElementParameterFilter(type_filter_rule)

    and_filter = DB.LogicalAndFilter(param_filter, type_filter)



    collector = DB.FilteredElementCollector(doc) \
        .WherePasses(and_filter) \
        .WhereElementIsElementType()\
        .FirstElement()

    return collector
Ejemplo n.º 3
0
    #         para = para.lower()
        
    #         if para == target_tag.lower():
    #             wall_id.append(wall.Id) # returns element id
    #             wall_id_list = List[DB.ElementId](wall_id)
    #     try:
    #         uidoc.Selection.SetElementIds(wall_id_list)
    #     except :
    #         forms.alert("Tag \"{0}\" not found!!!".format(target_tag))
    #         pass
            
    if True: 
        param_id = DB.ElementId(target_parameter)
        param_prov = DB.ParameterValueProvider(param_id)
        param_equality = DB.FilterStringEquals() # equality class
            
        value_rule = DB.FilterStringRule(param_prov,param_equality,target_tag ,True)
        param_filter = DB.ElementParameterFilter(value_rule)

        elements = DB.FilteredElementCollector(doc)\
                .OfCategory(target_category)\
                .WhereElementIsNotElementType()\
                .WherePasses(param_filter)\
                .ToElementIds() # select category based on the rule
        if elements:
            uidoc.Selection.SetElementIds(elements) 
        else:
            forms.alert("Tag \"{0}\" not found!!!".format(target_tag))

except: # exception to deal with user exiting form
    pass
Ejemplo n.º 4
0
viewTypeId = threeD_view.GetTypeId()

today = date.today()
today = today.strftime("%m/%d/%Y")

with forms.WarningBar(title="Pick source object:"):
    source_elements = revit.pick_elements()

values = []
if source_elements:

    # Get all SSG Families
    mfg_param_id = DB.ElementId(DB.BuiltInParameter.ALL_MODEL_MANUFACTURER)
    mfg_param_prov = DB.ParameterValueProvider(mfg_param_id)
    param_contains = DB.FilterStringContains()
    mfg_value_rule = DB.FilterStringRule(mfg_param_prov, param_contains,
                                         "Southwest Solutions Group", False)
    param_filter = DB.ElementParameterFilter(mfg_value_rule)
    ssg_fams = (DB.FilteredElementCollector(revit.doc).WherePasses(
        param_filter).WhereElementIsNotElementType().ToElements())

    # Get the secondary titleblock
    title_blocks = (DB.FilteredElementCollector(revit.doc).OfCategory(
        DB.BuiltInCategory.OST_TitleBlocks).WhereElementIsElementType())
    pdf_tb = [
        t for t in title_blocks
        if t.FamilyName + ": " + t.LookupParameter("Type Name").AsString() ==
        "SSG_TB_8.5x11_PDF: Primary"
    ][0]
    pdf_tb_2 = [
        t for t in title_blocks if t.FamilyName + ": " +
        t.LookupParameter("Type Name").AsString() == "SSG_TB_8.5x11_PDF: Empty"
Ejemplo n.º 5
0
def create_param_value_filter(filter_name,
                              param_id,
                              param_values,
                              evaluator,
                              match_any=True,
                              case_sensitive=False,
                              exclude=False,
                              category_list=None,
                              doc=None):
    doc = doc or DOCS.doc

    if HOST_APP.is_newer_than(2019, or_equal=True):
        rules = None
    else:
        rules = framework.List[DB.FilterRule]()
    param_prov = DB.ParameterValueProvider(param_id)

    # decide how to combine the rules
    logical_merge = \
        DB.LogicalOrFilter if match_any else DB.LogicalAndFilter

    # create the rule set
    for pvalue in param_values:
        # grab the evaluator
        param_eval = PARAM_VALUE_EVALUATORS.get(evaluator, None)
        if not param_eval:
            raise PyRevitException("Unknown evaluator")

        # if value is str, eval is expected to be str
        str_eval, num_eval = param_eval
        if isinstance(pvalue, str):
            rule = DB.FilterStringRule(param_prov, str_eval(), pvalue,
                                       case_sensitive)
        # if num_eval is for str, e.g. "contains", or "startswith"
        # convert numeric values to str
        elif isinstance(num_eval, DB.FilterStringRuleEvaluator):
            if isinstance(pvalue, (int, float)):
                rule = DB.FilterStringRule(param_prov, num_eval(), str(pvalue),
                                           False)
            elif isinstance(pvalue, DB.ElementId):
                rule = DB.FilterStringRule(param_prov, num_eval(),
                                           str(pvalue.IntegerValue), False)
        # if value is int, eval is expected to be numeric
        elif isinstance(pvalue, int):
            rule = DB.FilterIntegerRule(param_prov, num_eval(), pvalue)
        # if value is float, eval is expected to be numeric
        elif isinstance(pvalue, float):
            rule = DB.FilterDoubleRule(param_prov, num_eval(), pvalue,
                                       sys.float_info.epsilon)
        # if value is element id, eval is expected to be numeric
        elif isinstance(pvalue, DB.ElementId):
            rule = DB.FilterElementIdRule(param_prov, num_eval(), pvalue)
        if exclude:
            rule = DB.FilterInverseRule(rule)

        if HOST_APP.is_newer_than(2019, or_equal=True):
            if rules:
                rules = logical_merge(rules, DB.ElementParameterFilter(rule))
            else:
                rules = DB.ElementParameterFilter(rule)
        else:
            rules.Add(rule)

    # collect applicable categories
    if category_list:
        category_set = query.get_category_set(category_list, doc=doc)
    else:
        category_set = query.get_all_category_set(doc=doc)

    # filter the applicable categories
    filter_cats = []
    for cat in category_set:
        if DB.ParameterFilterElement.AllRuleParametersApplicable(
                doc, framework.List[DB.ElementId]([cat.Id]), rules):
            filter_cats.append(cat.Id)

    # create filter
    return DB.ParameterFilterElement.Create(
        doc, filter_name, framework.List[DB.ElementId](filter_cats), rules)
Ejemplo n.º 6
0
def create_tag_filter(tags, name_format=None, exclude=False):
    """Create standard rule-based filters for given tags (max of 3 tags).

    Args:
        tags (list[Tag]): list of tags to create filter for (max of 3)
        name_format (str, optional): format for naming the filter,
            must include `{all_or_none}` and `{tag_names}`.
        exclude (bool, optional): create exclusion filter, defaults to False

    Returns:
        list[DB.ParameterFilterElement]: list of created filters

    Example:
        >>> import tagsmgr
        >>> fname = 'CUSTOM {all_or_none} FILTER FOR {tag_names}'
        >>> tag_filters = tagmgr.create_tag_filter(tags,
        ...                                              name_format=fname,
        ...                                              exclude=True)
        [<Autodesk.Revit.DB.ParameterFilterElement object at ...>,
        <Autodesk.Revit.DB.ParameterFilterElement object at ...>]
    """
    sfilters = []
    # create filter name and check availability
    tags_col = join_tags(tags)
    if not name_format:
        name_format = tagscfg.TAG_FILTER_NAMING
    filter_name = name_format.format(all_or_none='NONE' if exclude else 'ALL',
                                     tag_names=tags_col.names)
    for exst_filter in revit.query.get_rule_filters():
        if exst_filter.Name == filter_name:
            sfilters.append(exst_filter)
            return sfilters

    # get tags param id
    param_id = _get_tag_paramid()

    # create filter rule
    if HOST_APP.is_newer_than(2019, or_equal=True):
        rules = None
    else:
        rules = framework.List[DB.FilterRule]()
    param_prov = DB.ParameterValueProvider(param_id)
    param_contains = DB.FilterStringContains()
    for tag in tags:
        rule = DB.FilterStringRule(param_prov,
                                   param_contains,
                                   tag.name,
                                   False)
        if exclude:
            rule = DB.FilterInverseRule(rule)

        if HOST_APP.is_newer_than(2019, or_equal=True):
            if rules:
                rules = DB.LogicalOrFilter(rules,
                                           DB.ElementParameterFilter(rule))
            else:
                rules = DB.ElementParameterFilter(rule)
        else:
            rules.Add(rule)

    # collect applicable categories
    cats = []
    for cat in revit.query.get_all_category_set():
        if DB.ParameterFilterElement.AllRuleParametersApplicable(
                revit.doc,
                framework.List[DB.ElementId]([cat.Id]),
                rules
            ):
            cats.append(cat.Id)

    # create filter
    sfilter = \
        DB.ParameterFilterElement.Create(revit.doc,
                                         filter_name,
                                         framework.List[DB.ElementId](cats),
                                         rules)
    sfilters.append(sfilter)
    return sfilters
Ejemplo n.º 7
0
fam_names = []
type_names = []
for lc in legend_components:
    component_name = lc.get_Parameter(
        DB.BuiltInParameter.LEGEND_COMPONENT).AsValueString()
    fragments = component_name.split(" : ")
    fam_names.append(fragments[1])
    type_names.append(fragments[-1])

# find types of family and type

types_on_legend = []
for f, t in izip(fam_names, type_names):
    fam_bip_id = DB.ElementId(DB.BuiltInParameter.SYMBOL_FAMILY_NAME_PARAM)
    fam_bip_provider = DB.ParameterValueProvider(fam_bip_id)
    fam_filter_rule = DB.FilterStringRule(fam_bip_provider,
                                          DB.FilterStringEquals(), f, True)
    fam_filter = DB.ElementParameterFilter(fam_filter_rule)

    type_bip_id = DB.ElementId(DB.BuiltInParameter.ALL_MODEL_TYPE_NAME)
    type_bip_provider = DB.ParameterValueProvider(type_bip_id)
    type_filter_rule = DB.FilterStringRule(type_bip_provider,
                                           DB.FilterStringEquals(), t, True)
    type_filter = DB.ElementParameterFilter(type_filter_rule)

    and_filter = DB.LogicalAndFilter(fam_filter, type_filter)

    collector = DB.FilteredElementCollector(revit.doc) \
        .WherePasses(and_filter) \
        .WhereElementIsElementType() \
        .FirstElement()
Ejemplo n.º 8
0
                    assetElem = revit.doc.GetElement(
                        selected_mat.AppearanceAssetId)
                    assetName = mat.pop("Asset Name")
                    duplicate_asset = assetElem.Duplicate(assetName.lower())
                    new_mat.AppearanceAssetId = duplicate_asset.Id
                    schema_name = mat.pop("Base Schema")
                else:
                    message = (
                        '"%s" already exists. Attempting to edit parameters' %
                        mat_name)
                    logger.warning(message)
                    # If it already exists, collect it and modify it
                    namePar = DB.ParameterValueProvider(
                        DB.ElementId(DB.BuiltInParameter.MATERIAL_NAME))
                    fRule = DB.FilterStringRule(namePar,
                                                DB.FilterStringEquals(),
                                                mat_name, True)
                    filter = DB.ElementParameterFilter(fRule)
                    new_mat = (DB.FilteredElementCollector(revit.doc).OfClass(
                        DB.Material).WherePasses(filter).FirstElement())
                    assetElem = revit.doc.GetElement(new_mat.AppearanceAssetId)
                    schema_name = assetElem.GetRenderingAsset().Name
                    del mat["Base Schema"]

                # ----- IDENTITY TAB -----
                # Description
                mat_description = mat.pop("Description")
                if mat_description:
                    description = new_mat.get_Parameter(
                        DB.BuiltInParameter.ALL_MODEL_DESCRIPTION)
                    description.Set(mat_description)