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
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))
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
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)
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':
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):
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
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'])
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:
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))
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)
"""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)
# 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?",
"""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),
"""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,
"""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)