def action(doc, curview, filter_class, eq_symbol):
    walls = \
            DB.FilteredElementCollector(doc,curview.Id)\
            .OfCategory(DB.BuiltInCategory.OST_Walls)\
            .WhereElementIsNotElementType()\
            .ToElements()
    if walls:
        target_parameter = DB.BuiltInParameter.CURVE_ELEM_LENGTH
        cur_units = get_type(walls[0], target_parameter)
        length = float(
            forms.ask_for_string("Enter length in {0}".format(cur_units)))
        length_feet = convert_to_internal(length, cur_units)
        param_filter = filter_rule(target_parameter, filter_class, length_feet)

        same_cat_elements = \
                DB.FilteredElementCollector(doc,curview.Id)\
                .OfCategory(DB.BuiltInCategory.OST_Walls)\
                .WhereElementIsNotElementType()\
                .WherePasses(param_filter)\
                .ToElements()

        filered_elements = [i.Id for i in same_cat_elements]
        num_walls = len(filered_elements)
        revit.get_selection().set_to(filered_elements)

        print_output(num_walls, length, cur_units, eq_symbol)
    else:
        forms.alert("No wall found in current view", exitscript=True)
Beispiel #2
0
def write_to_excel():
    """Option to write to excel by reading existing sheets groups from excel"""

    sheet_group_para = str(
        forms.ask_for_string("Sheet Group",
                             prompt='Enter unique sheet group parameter name',
                             title=dest))
    title = [
        "Sheet Number", "Sheet Name", sheet_group_para, "Approved By",
        "Designed By", "Reviewed By", "Drawn By", "Date"
    ]

    try:
        workbook = xlsxwriter.Workbook(dest)
        worksheet = workbook.add_worksheet()
        # writing title into excel
        for i, v in enumerate(title):
            worksheet.write(0, i, v)
        read_sheets(sheet_group_para)
        row = 1
        zipped_lists = zip(sheet_num, sheet_name, sheet_group, sheet_approved,
                           sheet_designed, sheet_checked, sheet_drawn,
                           sheet_issue)
        sorted_zipped_lists = sorted(zipped_lists)
        for inpu in sorted_zipped_lists:
            worksheet.write(row, 0, inpu[0])
            worksheet.write(row, 1, inpu[1])
            worksheet.write(row, 2, inpu[2])
            worksheet.write(row, 3, inpu[3])
            worksheet.write(row, 4, inpu[4])
            worksheet.write(row, 5, inpu[5])
            worksheet.write(row, 6, inpu[6])
            worksheet.write(row, 7, inpu[7])
            row += 1

        column = 0
        for col in [
                sheet_num, sheet_name, sheet_group, sheet_approved,
                sheet_designed, sheet_checked, sheet_drawn, sheet_issue
        ]:
            width = max_width(col)
            worksheet.set_column(column, column,
                                 width)  #( first column,last_column,width)
            column += 1

        workbook.close()
        open_excel()

    except Exception as ex:
        error = str(ex)
        if "len() of unsized object" in error:
            forms.alert("{0} parameter has no value".format(sheet_group_para),
                        exitscript=True)
        elif "[Errno 32] The process cannot access the file " in error:
            forms.alert("Close the open excel Sheet_groups and try again",
                        exitscript=True)
        elif "'NoneType' object has no attribute 'AsString'" in error:
            forms.alert("Sheet Group parameter not defined", exitscript=True)
        else:
            print(traceback.format_exc())
def get_adder_number_from_user(count):
    prompt = 'Выбрано [{}]. Введите число, которое нужно добавить к марке:'.format(count)
    user_number = ask_for_string(default='0', prompt=prompt, title='Add number to mark')
    if user_number is None:
        raise UserCancelOperation
    adder_number = int(user_number)

    logger.debug('Get adder number from user [{}]'.format(adder_number))
    return adder_number
Beispiel #4
0
 def rename_tag(self, sender, args):
     if self.selected_tags:
         self.Close()
         new_tag = forms.ask_for_string(default=self.selected_tags[0].name,
                                        prompt='Enter new tag name:',
                                        title='Tag Manager')
         if new_tag:
             try:
                 with revit.Transaction('Rename Tag', log_errors=False):
                     tagsmgr.rename_tag(self.selected_tags[0], new_tag,
                                        self._target_elements)
             except Exception as e:
                 forms.alert(getattr(e, 'msg', str(e)))
    cat).WhereElementIsNotElementType().ToElements()
data = list()

for e in collector:
    try:
        room = linkDoc.GetRoomAtPoint(e.GetSpatialElementCalculationPoint(), p)
    except:
        room = linkDoc.GetRoomAtPoint(e.Location.Point, p)
    if room:
        number = room.LookupParameter("Number").AsString(
        ) if room.LookupParameter("Number") else "No number"
        name = room.LookupParameter("Name").AsString() if room.LookupParameter(
            "Name") else "No name"
        line = number + "-" + name
        data.append(line)
    else:
        data.append("Not in a room")

parName = forms.ask_for_string(
    default='Parameter Name',
    prompt='In which parameter do you want to store the location information?',
    title='Enter Instance Parameter Name')

t = Transaction(doc, "Instance Room Locations")
t.Start()

for e, d in zip(collector, data):
    e.LookupParameter(parName).Set(d)

t.Commit()
Beispiel #6
0
    ttitle = test_title.format('Filter Func')
    print(ttitle)
    kwargs['title'] = ttitle
    kwargs['multiple'] = True
    if 'filterfunc' not in kwargs:
        kwargs['filterfunc'] = lambda x: filterfuncstr in str(x)
    selection = forms_func(*args, **kwargs)
    if selection:
        print(selection)
    else:
        print('No selection...')


print(
    forms.ask_for_string(default='test default',
                         prompt='test prompt',
                         title='test title'))

print(
    forms.ask_for_one_item(['test item 1', 'test item 2', 'test item 3'],
                           default='test item 2',
                           prompt='test prompt',
                           title='test title'))

print(
    forms.ask_for_date(default='2018/11/09',
                       prompt='test prompt',
                       title='test title'))

print(forms.select_swatch(title='test title', button_name='Test button name'))
from pyrevit.framework import List


doc =__revit__.ActiveUIDocument.Document
uidoc =__revit__.ActiveUIDocument

# make sure active view is not a sheet
curview = doc.ActiveView

if isinstance(curview, DB.ViewSheet):
    forms.alert("You're on a Sheet. Activate a model view please.",
                exitscript=True)

try:              
    wall_id = []
    target_tag = str(forms.ask_for_string("Enter tag name"))
    wall_id_list = None

    # Creating a dictionary
    options_category = {'Structural Columns': DB.BuiltInCategory.OST_StructuralColumns,
        'Walls': DB.BuiltInCategory.OST_Walls,
        'Structural Framing': DB.BuiltInCategory.OST_StructuralFraming,
        'Floors': DB.BuiltInCategory.OST_Floors,
        'Foundation':DB.BuiltInCategory.OST_StructuralFoundation
    }

    selected_switch_category = \
        forms.CommandSwitchWindow.show(sorted(options_category.keys()),
            
            message='Search for tag {0} in category:'.format(target_tag))
import clr, re
clr.AddReference('RevitAPI')
clr.AddReference("System")
from Autodesk.Revit.DB import FilteredElementCollector, Transaction, ImportInstance, BuiltInCategory, \
    ModelPathUtils, SaveAsOptions, WorksharingSaveAsOptions, Level, FilledRegionType, FamilySymbol, GraphicsStyleType, \
    CurveElement, Color, DimensionType, BuiltInParameter, Dimension
from Autodesk.Revit.UI import UIApplication
clr. AddReferenceByPartialName('PresentationCore')
clr.AddReferenceByPartialName('PresentationFramework')
clr.AddReferenceByPartialName('System.Windows.Forms')
clr.AddReference('RevitAPIUI')

__doc__ = 'Add custom prefix to families.'

# Ask for string input from user
prefix  = forms.ask_for_string(default='', prompt='Please input custom prefix', title='Add Prefix')

cateName = []
families = FilteredElementCollector(doc).OfClass(FamilySymbol).ToElements()
for f in families:
    cate = f.Family.FamilyCategory.Name
    if not cate in cateName:
        cateName.append(cate)
        n
'''
def SetDimensionStyle(doc, source, destination):
    elements = FilteredElementCollector(doc).OfClass(Dimension).ToElements()
    for i in elements:
        if i.LookupParameter('Type').AsValueString() == source:
            i.LookupParameter('Type').Set(destination.Id)
Beispiel #9
0
def ask_for_starting_number(category_name):
    """Ask user for starting number."""
    return forms.ask_for_string(prompt="Enter starting number",
                                title="ReNumber {}".format(category_name))
Beispiel #10
0
    return size_set


def convert_to_internal(value, unit="mm"):
    return UnitUtils.ConvertToInternalUnits(
        float(value), LENGTH_UNIT
    )


csv_path = forms.pick_file(file_ext="csv")

if csv_path:
    with revit.Transaction("Create PipeType from csv"):
        name = forms.ask_for_string(
            default="ScheduleName",
            prompt="Enter a schedule name eg. SDR6 or EN10217-1 serie 2",
            title="PipeTypeCreation",
        )
        schedule_id = PipeScheduleType.Create(doc, name).Id

        size_set = read_csv(csv_path)

        materials = [
            (material.Name, material.Id)
            for material in FilteredElementCollector(doc).OfClass(Material)
        ]
        material = forms.SelectFromList.show(
            materials,
            multiselect=False,
            button_name="Select material",
            title="PipeTypeCreation",
Beispiel #11
0
__author__  = 'Carlos Romero Carballo'

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

from pyrevit import forms

doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument



default_filter_name = forms.ask_for_string(
    default='View All',
    prompt='Enter Phase Filter name:',
    title='Phase Filter Reset'
)

old_filters = FilteredElementCollector(doc).OfClass(PhaseFilter).ToElements()
old_filters_names = [filter.Name for filter in old_filters]

t = Transaction(doc,"Phase Filter Reset")
t.Start()
if default_filter_name in old_filters_names:
    [doc.Delete(filter.Id) for filter in old_filters if filter.Name != default_filter_name]
else:
    new_filter = PhaseFilter.Create(doc,default_filter_name)
    [new_filter.SetPhaseStatusPresentation(eval("ElementOnPhaseStatus." + categ),PhaseStatusPresentation.ShowOverriden)\
     for categ in ["New","Existing","Demolished","Temporary"]]
    [doc.Delete(filter.Id) for filter in old_filters]
Beispiel #12
0
# Getting selection from user
__context__ = 'Selection'

doc = __revit__.ActiveUIDocument.Document

elements = revit.get_selection()  # get selection of familytypes

if elements:  # if elements under different category are selected null is returned

    cat_id = list(set([ele.Category.Id for ele in elements
                       if ele.Category]))[0]

    element_types = DB.FilteredElementCollector(doc).OfCategoryId(
        cat_id).WhereElementIsElementType().ToElements()

    num = int(forms.ask_for_string("Enter number of duplicates"))
    name_list = [DB.Element.Name.__get__(ele) for ele in element_types]

    with DB.Transaction(doc, 'Change Name') as t:
        try:
            t.Start()
            duplicate_counter = 1
            for ele in elements:
                name = DB.Element.Name.__get__(ele)
                for i in range(num):
                    new_name = name + " ({})".format(duplicate_counter)
                    if new_name not in name_list:
                        if DB.NamingUtils.IsValidName(new_name):
                            ele.Duplicate(new_name)
                        else:
                            forms.alert(
Beispiel #13
0
# Getting selection from user
__context__ = 'Selection'

doc =__revit__.ActiveUIDocument.Document

print_mgr = revit.doc.PrintManager
print_settings = [revit.doc.GetElement(x) for x in revit.doc.GetPrintSettingIds()] #List of print settings like A1,A3,..

selected_print_setting = print_mgr.PrintSetup.InSession #If no print setting defined we can use default <in-session>

printers = list(Drawing.Printing.PrinterSettings.InstalledPrinters) # list of printers like Adobe PDF,Blubeam PDF
printers = sorted(printers)
selected_printer = printers[0]

select_sheets = revit.get_selection() # get selection of sheets
sheetsetname = forms.ask_for_string("Sheet set name",prompt='Enter Name of new sheet set',title="Set creator")

if sheetsetname == "" or  sheetsetname == "Sheet set name":
    sheetsetname = "Default set-1"

with DB.Transaction(doc, 'Add range') as t:
    t.Start()
    print_mgr.PrintSetup.CurrentPrintSetting = selected_print_setting
    print_mgr.SelectNewPrintDriver(selected_printer)
    print_mgr.PrintRange = DB.PrintRange.Select
    t.Commit()
    # add non-printable char in front of sheet Numbers
    # to push revit to sort them per user
sheet_set = DB.ViewSet()
original_sheetnums = []
with DB.Transaction(doc,'Add Sheets') as tg:
Beispiel #14
0
        message='Pick only elements of type:'
    )

# vals = list(set(map(lambda x: revitron.Parameter(x, selected_param).getValueString(), scope)))
vals = list(
    set(map(lambda x: x.parameters[selected_param].value_string, scope)))
vals.append('*other')


selected_value = \
    forms.CommandSwitchWindow.show(
        sorted(vals),
        message='Pick only elements of type:'
    )

if selected_value == '*other':

    selected_value = \
        forms.ask_for_string(
            default='some-tag',
            prompt='Enter new tag name:',
            title='Tag Manager'
        )

# ids = revitron.Filter(list(scope)).noTypes().byStringContains(selected_param, selected_value).getElementIds()
col = db.Collector(scope,
                   of_category=selected_category,
                   where=lambda x: selected_value in x.parameters[
                       selected_param].value_string)

revitron.Selection.set(ids)
Beispiel #15
0
    TaskDialog.Show('CHENGYING GONG', msg)


selection = Selection.get_selected_elements(doc)
# convenience variable for first element in selection
if len(selection):
    s0 = selection[0]

selection = Selection.get_selected_elements(doc)
output = []
value1 = []
value2 = []
id = []
# Input Parameter Name
parameter1 = forms.ask_for_string(default='',
                                  prompt='Please input Original Parameter',
                                  title='Parameter Mapper')
parameter2 = forms.ask_for_string(default='',
                                  prompt='Please input Destination Parameter',
                                  title='Parameter Mapper')

# Transaction Start

for x in selection:
    t = Transaction(doc, "Map Parameters")
    t.Start()
    v1 = x.LookupParameter(parameter1)
    v2 = x.LookupParameter(parameter2)
    if v1 is None:
        output = alert("The first input is not a valid parameter.")
        pass
Beispiel #16
0
# coding=utf8
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInParameter, ElementId

from pyrevit import script, forms, revit

logger = script.get_logger()
uidoc = __revit__.ActiveUIDocument
doc = uidoc.Document

text_ids = forms.ask_for_string(
    default="GlobalId",
    prompt="Enter comma separated GlobalId eg. 2N4yNZJ_XDjPMRumXBulXA, 2N4yNZJ_XDjPMRumXBulXD",
    title="Select by GlobalId",
)

if text_ids:
    ifc_globalids = {
        ifc_globalid.strip(): ElementId(-1) for ifc_globalid in text_ids.split(",")
    }
    for element in (
        FilteredElementCollector(doc)
        .WhereElementIsNotElementType()
        .WhereElementIsViewIndependent()
        .ToElements()
    ):
        globalid_parameter = element.get_Parameter(BuiltInParameter.IFC_GUID)
        if not globalid_parameter:
            continue
        ifc_guid = globalid_parameter.AsString()
        for ifc_globalid in ifc_globalids.keys():
            if ifc_guid == ifc_globalid:
Beispiel #17
0
if selected_views:
    myviewset = DB.ViewSet()
    for el in selected_views:
        myviewset.Insert(el)

    if myviewset.IsEmpty:
        forms.alert('At least one view must be selected.')
    else:
        # Ask for a print set name and check if need to be replaced
        sheetsetname = None
        while not sheetsetname\
                or (sheetsetname in print_sets_names_existing
                and not forms.alert("Replace existing Print Set?",
                                yes=True, no=True)):
            sheetsetname = forms.ask_for_string(
                default=print_sets_names_existing[-1]\
                    if print_sets_names_existing else 'ViewPrintSet',
                prompt="Give new Print Set a Name:")
            if not sheetsetname:
                script.exit()

        # Collect existing sheet sets
        viewsheetsets = DB.FilteredElementCollector(revit.doc)\
                          .OfClass(framework.get_type(DB.ViewSheetSet))\
                          .WhereElementIsNotElementType()\
                          .ToElements()

        allviewsheetsets = {vss.Name: vss for vss in viewsheetsets}

        with revit.Transaction('Created Print Set'):
            # Delete existing matching sheet set
            if sheetsetname in allviewsheetsets.keys():
Beispiel #18
0
                if with_detailing:
                    dupop = DB.ViewDuplicateOption.WithDetailing
                else:
                    dupop = DB.ViewDuplicateOption.Duplicate

                try:
                    el.Duplicate(dupop)
                except Exception as duplerr:
                    logger.error('Error duplicating view "{}" | {}'.format(
                        revit.query.get_name(el), duplerr))


try:
    selected_views = forms.select_views(filterfunc=duplicableview)

    num = int(forms.ask_for_string("Enter number of views"))

    if selected_views:
        selected_option = \
            forms.CommandSwitchWindow.show(
                ['WITH Detailing',
                'WITHOUT Detailing'],
                message='Select duplication option:'
                )

        if selected_option:
            duplicate_views(selected_views,
                            num,
                            with_detailing=True
                            if selected_option == 'WITH Detailing' else False)
except:
Beispiel #19
0
from pyrevit.framework import List
from pyrevit import revit, DB
from pyrevit import forms

#getting selection from user
# __context__ = 'Selection'

doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument
curview = doc.ActiveView  # gets current view

if isinstance(curview, DB.ViewSheet):
    forms.alert("You're on a Sheet. Activate a model view please.",
                exitscript=True)

length_feet = float(forms.ask_for_string(
    "Enter length in meters")) / 0.3048  # sometimes revit interprets 1 > 1.0
target_parameter = DB.BuiltInParameter.CURVE_ELEM_LENGTH  # FAMILY_TOP_LEVEL_PARAM, FAMILY_BASE_LEVEL_PARAM
param_id = DB.ElementId(target_parameter)
param_prov = DB.ParameterValueProvider(param_id)
param_equality = DB.FilterNumericEquals()  # equality class

value_rule = DB.FilterDoubleRule(param_prov, param_equality, length_feet,
                                 1e-3 / 0.3048)  # tolerance of 1 mm
param_filter = DB.ElementParameterFilter(value_rule)

same_cat_elements = \
        DB.FilteredElementCollector(doc,curview.Id)\
          .OfCategory(DB.BuiltInCategory.OST_Walls)\
          .WhereElementIsNotElementType()\
          .WherePasses(param_filter)\
          .ToElements()
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory, Transaction, TransactionGroup, BuiltInParameter, ElementId

doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument

sel = [
    el
    for el in [doc.GetElement(id) for id in uidoc.Selection.GetElementIds()]
    if el.Category.Name == 'Текстовые примечания'
]
num = 1
if __shiftclick__:
    from pyrevit import forms

    num = forms.ask_for_string(default='1',
                               prompt='Введите начальное значение',
                               title='Нумеровать текст')
    num = int(num)
t = Transaction(doc, "Нумеровать текст")
t.Start()

for el in sel:
    el.Text = str(num)
    num += 1

t.Commit()

# def natural_sorted(list, key=lambda s: s):
#     """
#     Sort the list into natural alphanumeric order.
#     """