Esempio n. 1
0
def copy_view_range():
    """Copy view range from source views to target views"""
    prompt_text = "Select one or multiple source views"
    with forms.WarningBar(title=prompt_text):
        source_list = forms.select_views(
            title=prompt_text, filterfunc=lambda x: isinstance(x, ViewPlan))

    if not source_list:
        return False

    prompt_text = "Select target views"
    with forms.WarningBar(title=prompt_text):
        target_list = forms.select_views(
            title=prompt_text, filterfunc=lambda x: isinstance(x, ViewPlan))

    if not target_list:
        return True

    with rpw.db.Transaction("Copy view range", doc):
        logger.info("VIEW RANGE applied from following source to target :")
        if len(source_list) == 1:
            view_range = source_list[0].GetViewRange()
            for target in target_list:  # type:ViewPlan
                target.SetViewRange(view_range)
                logger.info("{} -> {}".format(source_list[0].Name,
                                              target.Name))
        else:
            for source, target in zip(source_list,
                                      target_list):  # type:ViewPlan, ViewPlan
                target.SetViewRange(source.GetViewRange())
                logger.info("{} -> {}".format(source.Name, target.Name))
    return True
Esempio n. 2
0
def get_view3d(doc=doc, uidoc=uidoc):
    # type: (Document ,UIDocument) -> View3D
    if isinstance(uidoc.ActiveView, View3D):
        return uidoc.ActiveView
    return select_views("Select target 3D View",
                        multiple=False,
                        filterfunc=lambda x: isinstance(x, View3D))
Esempio n. 3
0
    def selected_views(self):
        """Property that retrieves selected views or promt user to select some from the dialog box."""
        selected_views = []
        selected_schedules_legends = []

        # VIEWS SELECTED IN UI
        for element_id in uidoc.Selection.GetElementIds():
            element = doc.GetElement(element_id)

            # FILTER SELECTION: VIEWS
            if type(element) in self.VIEW_TYPES:
                selected_views.append(element)

            # # FILTER SELECTION: SCHEDULES
            # if type(element) in [ViewSchedule]:
            #     selected_schedules_legends.append(element)

        # SELECT VIEWS IF NONE SELECTED IN UI
        if not selected_views or selected_schedules_legends:
            selected_views = forms.select_views(title="Select views to duplicate.",
                                                button_name="Duplicate selected views", width=1000) #FIXME replace with custom view selection box later...
            if not selected_views:
                forms.alert("No views were selected.\nPlease, try again.", exitscript=True, title=__title__)
        return selected_views
Esempio n. 4
0
    source_element = selected_elements[0]
    target_type = "Views" if isinstance(source_element, DB.View)\
        else "Elements"
else:
    source_element = None
    # ask for type of elements to match
    # some are not selectable in graphical views
    target_type = \
        forms.CommandSwitchWindow.show(
            ["Elements", "Views"],
            message="Pick type of targets:")

    # determine source element
    if target_type == "Elements":
        with forms.WarningBar(title="Pick source object:"):
            source_element = revit.pick_element()
    elif target_type == "Views":
        source_element = \
            forms.select_views(title="Select Source View", multiple=False)

# grab parameters from source element
if source_element:
    target_element = None
    if target_type == "Elements":
        target_element = revit.pick_element(message="Pick target element:")
    elif target_type == "Views":
        target_element = \
            forms.select_views(title="Select Target View", multiple=False)
    if target_element:
        compare_props(source_element, target_element)
Esempio n. 5
0
def duplicate_views(viewlist, dupop):
    dup_view_ids = []
    with revit.Transaction('Duplicate selected views'):
        for el in viewlist:
            try:
                dup_view_ids.append(el.Duplicate(dupop))
            except Exception as duplerr:
                logger.error('Error duplicating view "{}" | {}'.format(
                    revit.query.get_name(el), duplerr))
        if dup_view_ids:
            revit.doc.Regenerate()
    return dup_view_ids


selected_views = forms.select_views(filterfunc=duplicableview,
                                    use_selection=True)

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

    if selected_option:
        dupop = DB.ViewDuplicateOption.AsDependent
        if selected_option == 'WITH Detailing':
            dupop = DB.ViewDuplicateOption.WithDetailing
        if selected_option == 'WITHOUT Detailing':
Esempio n. 6
0
logger = script.get_logger()


class CopyUseDestination(DB.IDuplicateTypeNamesHandler):
    def OnDuplicateTypeNamesFound(self, args):
        return DB.DuplicateTypeAction.UseDestinationTypes


# find open documents other than the active doc
open_docs = forms.select_open_docs(title='Select Destination Documents')
if not open_docs:
    sys.exit(0)

# get a list of selected legends
legends = forms.select_views(
    title='Select Drafting Views',
    filterfunc=lambda x: x.ViewType == DB.ViewType.Legend)

if legends:
    for dest_doc in open_docs:
        # get all views and collect names
        all_graphviews = revit.query.get_all_views(doc=dest_doc)
        all_drafting_names = [x.ViewName
                              for x in all_graphviews
                              if x.ViewType == DB.ViewType.DraftingView]

        print('Processing Document: {0}'.format(dest_doc.Title))
        # get the first style for Drafting views.
        # This will act as the default style
        for view_type in DB.FilteredElementCollector(dest_doc)\
                           .OfClass(DB.ViewFamilyType):
Esempio n. 7
0
class CopyUseDestination(DB.IDuplicateTypeNamesHandler):
    def OnDuplicateTypeNamesFound(self, args):
        return DB.DuplicateTypeAction.UseDestinationTypes


# get all views and collect names
all_graphviews = revit.query.get_all_views(doc=revit.doc)
all_drafting_names = [revit.query.get_name(x)
                      for x in all_graphviews
                      if x.ViewType == DB.ViewType.DraftingView]


# get a list of selected legends
legends = forms.select_views(
    title='Select Legends',
    filterfunc=lambda x: x.ViewType == DB.ViewType.Legend,
    use_selection=True)

if legends:
    # get the first style for Drafting views.
    # This will act as the default style
    for view_type in DB.FilteredElementCollector(revit.doc)\
                       .OfClass(DB.ViewFamilyType):
        if view_type.ViewFamily == DB.ViewFamily.Drafting:
            drafting_view_type = view_type
            break

    # iterate over interfacetypes legend views
    for src_legend in legends:
        logger.debug('Copying %s', revit.query.get_name(src_legend))
        # get legend view elements and exclude non-copyable elements
Esempio n. 8
0

def change_case(viewlist, upper=True, verbose=False):
    with revit.Transaction('Viewnames to Upper'):
        for el in viewlist:
            if isinstance(el, DB.Viewport):
                el = revit.doc.GetElement(el.ViewId)
            orig_name = el.ViewName
            el.ViewName = orig_name.upper() if upper else orig_name.lower()
            if verbose:
                print("VIEW: {0}\n"
                      "\tRENAMED TO:\n"
                      "\t{1}\n\n".format(orig_name, el.ViewName))


selected_views = forms.select_views()

if selected_views:
    selected_option, switches = \
        forms.CommandSwitchWindow.show(
            ['to UPPERCASE',
             'to lowercase'],
            switches=['Show Report'],
            message='Select rename option:'
            )

    if selected_option:
        change_case(selected_views,
                    upper=True if selected_option == 'to UPPERCASE' else False,
                    verbose=switches['Show Report'])
Esempio n. 9
0
from pyrevit import script


__author__ = 'Dan Mapes'
__doc__ = 'Adds the selected views (callouts, sections, elevations) to the '\
          'selected sheets. Model views will only be added to the first '\
          'selected sheet since they can not exist on multiple sheets. ' \
          'The command defaults to active view if no views are selected.' \
          '\n\nShift+Click:\n' \
          'Pick source views from list instead of selection or active view.'


logger = script.get_logger()


selected_views = forms.select_views(use_selection=True)


if selected_views:
    logger.debug('Selected views: {}'.format(len(selected_views)))
    # get the destination sheets from user
    dest_sheets = forms.select_sheets()

    if dest_sheets:
        logger.debug('Selected sheets: {}'.format(len(dest_sheets)))
        with revit.Transaction("Add Views to Sheets"):
            for selected_view in selected_views:
                for sheet in dest_sheets:
                    logger.debug('Adding: %s',
                                 revit.query.get_name(selected_view))
                    try:
Esempio n. 10
0

def is_schedule(view):
    """Filter schedule views."""
    if isinstance(view, DB.ViewSchedule):
        isrevsched = view.IsTitleblockRevisionSchedule
        isintkeynote = view.IsInternalKeynoteSchedule
        iskeynotelegend = view.Definition.CategoryId == \
            revit.query.get_category('Keynote Tags').Id

        return not (isrevsched or isintkeynote or iskeynotelegend)

    return False


schedules_to_export = forms.select_views(title='Select Schedules',
                                         filterfunc=is_schedule)

if schedules_to_export:
    vseop = DB.ViewScheduleExportOptions()
    vseop.ColumnHeaders = DB.ExportColumnHeaders.None
    vseop.TextQualifier = DB.ExportTextQualifier.DoubleQuote
    vseop.FieldDelimiter = ','
    vseop.Title = False
    vseop.HeadersFootersBlanks = False

    for sched in schedules_to_export:
        fname = "".join(x for x in sched.ViewName if x not in ['*']) + '.csv'
        sched.Export(basefolder, fname, vseop)
        coreutils.correct_revittxt_encoding(op.join(basefolder, fname))
        print('EXPORTED: {0}\n      TO: {1}\n'.format(sched.ViewName, fname))
Esempio n. 11
0
def duplicate_views(viewlist, with_detailing=True):
    with revit.Transaction('Duplicate selected views'):
        for el in viewlist:
            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))


selected_views = forms.select_views(filterfunc=duplicableview)

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

    if selected_option:
        duplicate_views(selected_views,
                        with_detailing=True
                        if selected_option == 'WITH Detailing' else False)
Esempio n. 12
0
"""Removes Underlay From Selected Views."""
#pylint: disable=C0103,E0401
# Original Code by dp-stuff.org
# http://dp-stuff.org/revit-view-underlay-property-python-problem/

from pyrevit import HOST_APP
from pyrevit import revit, DB
from pyrevit import forms


selected_views = \
    forms.select_views(filterfunc=lambda x: isinstance(x, DB.ViewPlan))

if selected_views:
    with revit.Transaction('Batch Set Underlay to None'):
        for view in selected_views:
            if view.Category.Id.IntegerValue == \
                    int(DB.BuiltInCategory.OST_Views) \
                    and (view.CanBePrinted):
                if HOST_APP.is_newer_than(2016):
                    view.SetUnderlayRange(DB.ElementId(-1), DB.ElementId(-1))
                else:
                    p = view.get_Parameter(
                        DB.BuiltInParameter.VIEW_UNDERLAY_ID)

                    if p is not None:
                        p.Set(DB.ElementId.InvalidElementId)
Esempio n. 13
0


# Get printmanager / viewsheetsetting
printmanager = revit.doc.PrintManager
printmanager.PrintRange = DB.PrintRange.Select
viewsheetsetting = printmanager.ViewSheetSetting

# Collect existing ViewSheetSets
print_sets_existing = DB.FilteredElementCollector(revit.doc)\
    .WhereElementIsNotElementType().OfClass(DB.ViewSheetSet).ToElements()
print_sets_names_existing = [vs.Name for vs in print_sets_existing if vs.Name]

# Collect selected views
selected_views = forms.select_views(use_selection=True,
    filterfunc=lambda v: not isinstance(v, DB.ViewSheet)
                         or not v.IsPlaceholder)

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?",
Esempio n. 14
0
"""Query all selected views and determine if referenced or not."""
#pylint: disable=import-error,broad-except,invalid-name
from pyrevit import revit
from pyrevit import forms
from pyrevit import script

output = script.get_output()

selected_views = forms.select_views(title="Select Views to List",
                                    use_selection=True)

if selected_views:
    selected_option, switches = \
        forms.CommandSwitchWindow.show(
            ['List Referenced Views', 'List Non-Referenced Views'],
            switches={'Only Sheeted': False},
            message='Select search option:')

    list_nonsheeted = not switches['Only Sheeted']

    collector_func = \
        revit.query.yield_referenced_views \
            if selected_option == 'List Referenced Views' \
            else revit.query.yield_unreferenced_views

    for ref_viewid in collector_func(doc=revit.doc, all_views=selected_views):
        ref_view = revit.doc.GetElement(ref_viewid)
        sheetrefinfo = revit.query.get_view_sheetrefinfo(ref_view)
        if sheetrefinfo:
            print('\t\t{} \"{}\" {} {}/{} (\"{}\")'
                  .format(output.linkify(ref_viewid),
Esempio n. 15
0
"""Query all selected views and determine if referenced or not."""
#pylint: disable=import-error,broad-except,invalid-name
from pyrevit import revit
from pyrevit import forms
from pyrevit import script

output = script.get_output()

selected_views = forms.select_views(title="Select Views to List")

if selected_views:
    selected_option, switches = \
        forms.CommandSwitchWindow.show(
            ['List Referenced Views', 'List Non-Referenced Views'],
            switches={'Only Sheeted': False},
            message='Select search option:')

    list_nonsheeted = not switches['Only Sheeted']

    collector_func = \
        revit.query.yield_referenced_views \
            if selected_option == 'List Referenced Views' \
            else revit.query.yield_unreferenced_views

    for ref_viewid in collector_func(doc=revit.doc, all_views=selected_views):
        ref_view = revit.doc.GetElement(ref_viewid)
        sheetrefinfo = revit.query.get_view_sheetrefinfo(ref_view)
        if sheetrefinfo:
            print('\t\t{} \"{}\" {} {}/{} (\"{}\")'
                  .format(output.linkify(ref_viewid),
                          revit.query.get_name(ref_view,
Esempio n. 16
0
"""Removes Underlay From Selected Views."""
#pylint: disable=C0103,E0401
# Original Code by dp-stuff.org
# http://dp-stuff.org/revit-view-underlay-property-python-problem/


from pyrevit import HOST_APP
from pyrevit import revit, DB
from pyrevit import forms


selected_views = \
    forms.select_views(filterfunc=lambda x: isinstance(x, DB.ViewPlan), use_selection=True)

if selected_views:
    with revit.Transaction('Batch Set Underlay to None'):
        for view in selected_views:
            if view.Category.Id.IntegerValue == \
                    int(DB.BuiltInCategory.OST_Views) \
                    and (view.CanBePrinted):
                if HOST_APP.is_newer_than(2016):
                    view.SetUnderlayRange(DB.ElementId(-1), DB.ElementId(-1))
                else:
                    p = view.get_Parameter(
                        DB.BuiltInParameter.VIEW_UNDERLAY_ID
                        )

                    if p is not None:
                        p.Set(DB.ElementId.InvalidElementId)