def door_by_room_renumber(): """Main renumbering routine for elements of given categories.""" # all actions under one transaction with revit.TransactionGroup("Renumber Doors by Room"): # collect existing elements number:id data existing_doors_data = get_elements_dict("Doors") renumbered_door_ids = [] # make sure target elements are easily selectable with EasilySelectableElements(revit.active_view, "Doors") \ and EasilySelectableElements(revit.active_view, "Rooms"): while True: # pick door picked_door = \ revit.pick_element_by_category("Doors", message="Select a door") if not picked_door: # user cancelled return _unmark_collected("Doors", renumbered_door_ids) # grab the associated rooms from_room, to_room = revit.query.get_door_rooms(picked_door) # if more than one option for room, ask to pick if all([from_room, to_room]) or not any([from_room, to_room]): # pick room picked_room = \ revit.pick_element_by_category("Rooms", message="Select a room") if not picked_room: # user cancelled return _unmark_collected("Doors", renumbered_door_ids) else: picked_room = from_room or to_room # get data on doors associated with picked room room_doors = revit.query.get_doors(room_id=picked_room.Id) room_number = get_number(picked_room) with revit.Transaction("Renumber Door"): door_count = len(room_doors) if door_count == 1: # match door number to room number renumber_element(picked_door, room_number, existing_doors_data) renumbered_door_ids.append(picked_door.Id) elif door_count > 1: # match door number to extended room number e.g. 100A # check numbers of existing room doors and pick the next room_door_numbers = [get_number(x) for x in room_doors] new_number = coreutils.extend_counter(room_number) # attempts = 1 # max_attempts = len([x for x in room_door_numbers if x]) while new_number in room_door_numbers: new_number = increment(new_number) renumber_element(picked_door, new_number, existing_doors_data) renumbered_door_ids.append(picked_door.Id)
def pick_and_match_styles(src_style): with forms.WarningBar(title='Pick objects to match overrides:'): while True: dest_element = revit.pick_element() if not dest_element: break with revit.Transaction('Match Graphics Overrides'): revit.activeview.SetElementOverrides(dest_element.Id, src_style)
def _change_kfile(self): kfile = forms.pick_file('txt') if kfile: logger.debug('Setting keynote file: %s' % kfile) try: with revit.Transaction("Set Keynote File"): revit.update.set_keynote_file(kfile, doc=revit.doc) self._kfile = revit.query.get_keynote_file(doc=revit.doc) except Exception as skex: forms.alert(str(skex)) return
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))
def make_tag_3dview(self, sender, args): if self.selected_tags: self.Close() try: with revit.Transaction('Create Tag 3D View', log_errors=False): tag_view = \ tagsmgr.create_tag_3dview(self.selected_tags) revit.active_view = tag_view except Exception as e: forms.alert(getattr(e, 'msg', str(e)))
def pick_and_match_types(src_props): """Match property values for selected types.""" with forms.WarningBar(title="Pick objects to match type properties:"): while True: dest_element = revit.pick_element() if not dest_element: break dest_type = revit.query.get_type(dest_element) with revit.Transaction("Match Type Properties"): match_prop(dest_element, dest_type, src_props)
def override_dim_value(): with revit.Transaction('Overrride dims value'): for el in revit.get_selection(): if isinstance(el, DB.Dimension): if len(list(el.Segments)) > 0: for seg in el.Segments: exitingValue = seg.ValueString seg.ValueOverride = u'\u200e' + exitingValue else: exitingValue = el.ValueString el.ValueOverride = u'\u200e' + exitingValue
def set_to_vfrmfr(): with revit.Transaction('VWM dimensions'): for el in revit.get_selection(): if isinstance(el, DB.Dimension): if len(list(el.Segments)) > 0: for seg in el.Segments: seg.Suffix = 'R.O.' seg.Below = 'VERIFY W/ MFR' else: el.Suffix = 'R.O.' el.Below = 'VERIFY W/ MFR'
def load_all(self): """ Loads family and all its symbols. """ with revit.Transaction('Loaded {}'.format(self.name)): try: revit.doc.LoadFamily(self.path) logger.debug('Successfully loaded family: {}'.format( self.name)) except Exception as load_err: logger.error('Error loading family symbol from {} | {}'.format( self.path, load_err)) raise load_err
def _make_filledregion(fillpattern_name, fillpattern_id): filledregion_types = DB.FilteredElementCollector(revit.doc)\ .OfClass(framework.get_type(DB.FilledRegionType)) source_fr = filledregion_types.FirstElement() with revit.Transaction('Create Filled Region'): new_fr = source_fr.Duplicate(fillpattern_name) if HOST_APP.is_newer_than(2018): new_fr.ForegroundPatternId = fillpattern_id else: new_fr.FillPatternId = fillpattern_id
def paste(self): cr_data = script.load_data(slot_name=self.__class__.__name__) crv_loop = cr_data.cropregion_curveloop with revit.Transaction('Paste Crop Region'): for view in CropRegionAction.get_cropable_views(): if isinstance(view, DB.View3D): if cr_data.crop_bbox: view.CropBox = cr_data.crop_bbox else: revit.update.set_crop_region(view, crv_loop) view.CropBoxActive = cr_data.is_active revit.uidoc.RefreshActiveView()
def pick_and_match_dim_overrides(src_dim_id): with forms.WarningBar(title='Pick dimensions to match overrides:'): src_dim = revit.doc.GetElement(src_dim_id) while True: dest_dim = revit.pick_element() if not dest_dim: break if isinstance(dest_dim, DB.Dimension): with revit.Transaction('Match Dimension Overrides'): setup_dim_overrides_per_config(src_dim, dest_dim)
def RemoveViewTemplate(viewtype_id): view_type = doc.GetElement(viewtype_id) template_id = view_type.DefaultTemplateId if template_id.IntegerValue != -1: if forms.alert( "You are about to remove the ViewTempalte associated with this View Type. Is that cool with ya?", ok=False, yes=True, no=True, exitscript=True): with revit.Transaction("Remove ViewTemplate"): view_type.DefaultTemplateId = DB.ElementId(-1)
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
def clear_view_contents(dest_doc, dest_view): logger.debug('Removing view contents: {}'.format(dest_view.Name)) elements_ids = get_view_contents(dest_doc, dest_view) with revit.Transaction('Delete View Contents', doc=dest_doc): for el_id in elements_ids: try: dest_doc.Delete(el_id) except Exception as err: continue return True
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)))
def text_totitle(): with revit.Transaction('to Sentence case'): for el in selection.elements: new_sentence = '' for word in unicode(el.Text).split(): idx = get_first_alpha_index(word) if idx is not None: new_sentence += ' ' \ + word[:idx].lower() \ + word[idx].upper() \ + word[idx+1:].lower() el.Text = new_sentence
def shake_filled_regions(view): fregions = DB.FilteredElementCollector(revit.doc)\ .OwnedByView(view.Id)\ .OfClass(framework.get_type(DB.FilledRegion))\ .WhereElementIsNotElementType()\ .ToElements() print('Shaking Filled Regions in: {}'.format(revit.query.get_name(view))) for i, fr in enumerate(fregions): with revit.Transaction('Shake Filled Region #{}'.format(i)): fr.Location.Move(DB.XYZ(0.01, 0, 0)) fr.Location.Move(DB.XYZ(-0.01, 0, 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))
def pick_and_match_styles(src_style): with forms.WarningBar(title='Pick objects to match overrides:'): while True: dest_element = revit.pick_element() if not dest_element: break dest_element_ids = [dest_element.Id] if hasattr(dest_element, 'GetSubComponentIds'): dest_element_ids.extend(dest_element.GetSubComponentIds()) with revit.Transaction('Match Graphics Overrides'): for dest_elid in dest_element_ids: revit.active_view.SetElementOverrides(dest_elid, src_style)
def change_case(view_list, upper=True, verbose=False): with revit.Transaction('Viewnames to Upper'): for view in view_list: if isinstance(view, DB.Viewport): view = revit.doc.GetElement(view.ViewId) orig_name = revit.query.get_name(view) revit.update.set_name( view, 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, revit.query.get_name(view)))
def duplicate_sheet_contents(sheet, new_sheet): copy_element_ids = [] elements_on_sheet = db.Collector(view=sheet.Id, is_not_type=True).get_elements() for element in elements_on_sheet: if not isinstance(element.unwrap(), DB.Viewport): copy_element_ids.append(element.Id) if copy_element_ids: with revit.Transaction('Copy View Contents'): new_contents = DB.ElementTransformUtils.CopyElements( sheet.unwrap(), List[DB.ElementId](copy_element_ids), new_sheet, None, None) return new_contents
def set_value(self): scolumn_els = (FilteredElementCollector(doc).OfCategory( BuiltInCategory.OST_StructuralColumns). WhereElementIsNotElementType().ToElements()) with revit.Transaction("set value"): for scolumn_el in scolumn_els: db.Element( scolumn_el).parameters['Baseplate-Type'].value = 'A4' db.Element( scolumn_el).parameters['Baseplate-Width'].value = 0.15 db.Element( scolumn_el).parameters['Baseplate-Height'].value = 0.15 db.Element( scolumn_el).parameters['Baseplate-Thickness'].value = 0.05
def shake_filled_regions(target_view): filled_regions = \ DB.FilteredElementCollector(target_view.Document, target_view.Id)\ .OfClass(DB.FilledRegion)\ .WhereElementIsNotElementType()\ .ToElements() print('Shaking Filled Regions in: {}'.format( revit.query.get_name(target_view))) for fregion in filled_regions: with revit.Transaction('Shake Filled Region'): fregion.Location.Move(DB.XYZ(0.1, 0, 0)) fregion.Location.Move(DB.XYZ(-0.1, 0, 0))
def copy_sheet_revisions(activedoc, source_sheet, dest_doc, dest_sheet): all_src_revs = query.get_revisions(doc=activedoc) all_dest_revs = query.get_revisions(doc=dest_doc) revisions_to_set = [] with revit.Transaction('Copy and Set Revisions', doc=dest_doc): for src_revid in source_sheet.GetAdditionalRevisionIds(): set_rev = ensure_dest_revision(activedoc.GetElement(src_revid), all_dest_revs, dest_doc) revisions_to_set.append(set_rev) if revisions_to_set: revit.update.update_sheet_revisions(revisions_to_set, [dest_sheet], state=True, doc=dest_doc)
def DeleteExistingView(views, worksets): with revit.Transaction("Delete existing views"): for view in views: for workset in worksets: name = "WORKSET VIEW - " + workset.Name if view.Name == name: try: doc.Delete(view.Id) break except: forms.alert( 'Current view was cannot be deleted. Close view and try again.' ) return False return True
def main(): source_vp_reference = uidoc.Selection.PickObject( UI.Selection.ObjectType.Element, CustomISelectionFilter(DB.Viewport), "Select Source Viewport") target_vps_reference = uidoc.Selection.PickObjects( UI.Selection.ObjectType.Element, CustomISelectionFilter(DB.Viewport), "Select Target Viewport(s)") source_vp = doc.GetElement(source_vp_reference.ElementId) source_vp_xyz = source_vp.GetBoxCenter() with revit.Transaction("Aign ViewPort - Vertical"): for target_vp_reference in target_vps_reference: target_vp = doc.GetElement(target_vp_reference.ElementId) delta = DB.XYZ(0.0, source_vp_xyz.Y - target_vp.GetBoxCenter().Y, 0.0) target_vp.Location.Move(delta)
def merge_texts(): with revit.Transaction('Merge Text Notes'): tnotes = sorted(selection, key=lambda txnote: 0 - txnote.Coord.Y) if len(tnotes) > 1: mtxt = tnotes[0] mtxtwidth = mtxt.Width for txt in tnotes[1:]: if txt.Text[0] == ' ': mtxt.Text = mtxt.Text + txt.Text else: mtxt.Text = mtxt.Text + ' ' + txt.Text revit.doc.Delete(txt.Id) mtxt.Width = mtxtwidth
def match_orientation(tagType, starting_or): # all actions under one transaction with revit.TransactionGroup("Match tag orientation"): # make sure target elements are easily selectable # with EasilySelectableElements(revit.active_view, BIC.OST_Tags): # ask user to pick a tag and allign them for picked_element in revit.get_picked_elements_by_category( revit.query.get_category(tagType), message="Select a tag to match"): # need nested transactions to push revit to update view # on each allignment with revit.Transaction("Setting tag \'{}\' orientation".format( picked_element.Id)): picked_element.TagOrientation = starting_or
def apply_viewport_type(activedoc, vport_id, dest_doc, newvport_id): with revit.Transaction('Apply Viewport Type', doc=dest_doc): vport = activedoc.GetElement(vport_id) vport_type = activedoc.GetElement(vport.GetTypeId()) vport_typename = DBElement.Name.GetValue(vport_type) newvport = dest_doc.GetElement(newvport_id) copy_viewport_types(activedoc, vport_type, vport_typename, dest_doc, newvport) for vtype_id in newvport.GetValidTypes(): vtype = dest_doc.GetElement(vtype_id) if DBElement.Name.GetValue(vtype) == vport_typename: newvport.ChangeTypeId(vtype_id)