def testCreate(self): room = self.fixture.createRoom() t = revitron.Transaction() tag = revitron.RoomTag.center(room) t.commit() self.assertEquals(tag.Id.IntegerValue, _(room).getTags()[0].Id.IntegerValue) t = revitron.Transaction() tag = revitron.RoomTag.topLeft(room) t.commit() self.assertEquals(tag.Id.IntegerValue, _(room).getTags()[0].Id.IntegerValue) t = revitron.Transaction() tag = revitron.RoomTag.topRight(room) t.commit() self.assertEquals(tag.Id.IntegerValue, _(room).getTags()[0].Id.IntegerValue) t = revitron.Transaction() tag = revitron.RoomTag.bottomLeft(room) t.commit() self.assertEquals(tag.Id.IntegerValue, _(room).getTags()[0].Id.IntegerValue) t = revitron.Transaction() tag = revitron.RoomTag.bottomRight(room) t.commit() self.assertEquals(tag.Id.IntegerValue, _(room).getTags()[0].Id.IntegerValue)
def testOrthoGridIntersections(self): ortho = revitron.OrthoGrid xyz = revitron.DB.XYZ with revitron.Transaction(): x1 = ortho.newLineX(10, 'x1') x2 = ortho.newLineX(20, 'x2') x3 = ortho.newLineX(30, 'x3') x4 = ortho.newLineX(40, 'x4') y1 = ortho.newLineY(40, 'y1') y2 = ortho.newLineY(30, 'y2') y3 = ortho.newLineY(20, 'y3') y4 = ortho.newLineY(10, 'y4') point = xyz(22, 33, 0) grid = ortho() intersectionTopLeft = grid.closestIntersectionToPointTopLeft(point) intersectionBottomRight = grid.closestIntersectionToPointBottomRight( point) self.assertEquals(intersectionTopLeft.nameX, 'x2') self.assertEquals(intersectionTopLeft.X, 20) self.assertEquals(intersectionTopLeft.nameY, 'y1') self.assertEquals(intersectionTopLeft.Y, 40) self.assertEquals(intersectionBottomRight.nameX, x3.Name) self.assertNotEquals(intersectionBottomRight.nameX, x2.Name) self.assertEquals(intersectionBottomRight.X, 30) self.assertEquals(intersectionBottomRight.nameY, y2.Name) self.assertEquals(intersectionBottomRight.Y, 30)
def createGenericModelFamily(self): temp = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'temp') file = os.path.join( temp, '{}-genericModel-Revit{}.rfa'.format(int(time.time()), revitron.APP.VersionNumber)) try: os.mkdir(temp) except: pass famDoc = revitron.Create.familyDoc('Metric Generic Model', file) self.context(famDoc) p = revitron.DB.XYZ points = [p(0, 0, 0), p(10, 0, 0), p(10, 10, 0), p(0, 10, 0)] crvArrArr = revitron.DB.CurveArrArray() crvArrArr.Append(self.polygon(points)) transaction = revitron.Transaction(famDoc) transaction.commit() opt = revitron.DB.SaveAsOptions() opt.OverwriteExistingFile = True famDoc.SaveAs(file, opt) loaded = famDoc.LoadFamily(self.mainDoc) famDoc.Close(True) self.context() return loaded
def getDependent(self, filterClass=None): """ Returns a list of dependent elements. Args: filterClass (class, optional): An optional class to filter the list of dependent elements by. Defaults to None. Returns: list: The list with the dependent Revit elements. """ import revitron from revitron import _ # The GetDependentElements() method doesn't exist in older Revit API versions. # Therefore it is required to fallback to a more compatible way of getting those dependent elements # in case an execption is raised. # The fallback solution basically tries to get the list of affected IDs when trying to delete # the actual parent element within a transaction that will be cancelled. try: fltr = None if filterClass: fltr = revitron.DB.ElementClassFilter(filterClass) dependentIds = self._element.GetDependentElements(fltr) except: sub = revitron.Transaction() ids = revitron.DOC.Delete(self._element.Id) sub.rollback() if filterClass: dependentIds = revitron.Filter(ids).byClass( filterClass).noTypes().getElementIds() else: dependentIds = revitron.Filter(ids).noTypes().getElementIds() dependent = [] for eId in dependentIds: dependent.append(_(eId).element) return dependent
def testGetSet(self): wall = self.fixture.createWall() t = revitron.Transaction() _(wall).set('Test', 'Value') _(wall).set('Comments', 'Some comment') t.commit() self.assertEquals(_(wall).get('Test'), 'Value') self.assertEquals(_(wall).get('Comments'), 'Some comment')
def testNumericFilters(self): w1 = self.fixture.createWall([0, 10], [10, 10]) w2 = self.fixture.createWall([0, 20], [10, 20]) with revitron.Transaction(): _(w1).set('num', 1, 'Number').set('int', 1, 'Integer') _(w2).set('num', 5, 'Number').set('int', 5, 'Integer') f = revitron.Filter toStr = utils.idsToStr self.assertEquals( toStr([w1.Id]), toStr(f().byCategory('Walls').byNumberIsEqual( 'num', 1).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id]), toStr(f().byCategory('Walls').byNumberIsEqual( 'int', 1).noTypes().getElementIds())) self.assertEquals( toStr([w2.Id]), toStr(f().byCategory('Walls').byNumberIsEqual( 'num', '5').noTypes().getElementIds())) self.assertEquals( toStr([w2.Id]), toStr(f().byCategory('Walls').byNumberIsEqual( 'int', '5').noTypes().getElementIds())) self.assertEquals( toStr([w2.Id]), toStr(f().byCategory('Walls').byNumberIsGreater( 'num', 1).noTypes().getElementIds())) self.assertEquals( toStr([w2.Id]), toStr(f().byCategory('Walls').byNumberIsGreater( 'int', 1).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w2.Id]), toStr(f().byCategory('Walls').byNumberIsGreaterOrEqual( 'num', 1).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w2.Id]), toStr(f().byCategory('Walls').byNumberIsGreaterOrEqual( 'int', 1).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id]), toStr(f().byCategory('Walls').byNumberIsLess( 'num', 5).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id]), toStr(f().byCategory('Walls').byNumberIsLess( 'int', 5).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w2.Id]), toStr(f().byCategory('Walls').byNumberIsLessOrEqual( 'num', 5).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w2.Id]), toStr(f().byCategory('Walls').byNumberIsLessOrEqual( 'int', 5).noTypes().getElementIds()))
def testGridLines(self): newLine = revitron.Create.GridLineLinear xyz = revitron.DB.XYZ with revitron.Transaction(): l1 = newLine(xyz(0, 0, 0), xyz(20, 10, 0), 'A') l2 = newLine(xyz(0, 0, 0), xyz(0, 20, 0), 'B') l3 = newLine(xyz(10, 0, 0), xyz(10, 100, 0), 'C') l4 = newLine(xyz(10, 5, 0), xyz(0, 5, 0), 'D') grid = revitron.Grid() ortho = revitron.OrthoGrid() gridNames = sorted(grid.lines.keys()) orthoXNames = sorted(ortho.lines.X.keys()) orthoYNames = sorted(ortho.lines.Y.keys()) self.assertEqual(''.join(gridNames), 'ABCD') self.assertEqual(''.join(orthoXNames), 'BC') self.assertEqual(''.join(orthoYNames), 'D') self.assertNotEquals(''.join(orthoXNames), 'BCD')
def testParameterStorageTypes(self): wall = _(self.fixture.createWall()) with revitron.Transaction(): wall.set('param1', 'Test & Text').set('param2', 10, 'Integer') self.assertEquals( str(revitron.ParameterUtils.getStorageType('param1')), 'String') self.assertEquals( str(revitron.ParameterUtils.getStorageType('param2')), 'Integer') self.assertEquals( str(revitron.ParameterUtils.getStorageType('Comments')), 'String') self.assertEquals(str(revitron.ParameterUtils.getStorageType('Area')), 'Double') self.assertEquals( str(revitron.ParameterUtils.getStorageType('Number')), 'Integer')
def testParameterTemplate(self): wall = _(self.fixture.createWall()) info = _(revitron.DOC.ProjectInformation) with revitron.Transaction(): wall.set('param1', 'Test & Text').set('param2', 10, 'Integer') info.set('projectParam', 'Project Name') self.assertEquals( 'Project_Name: Test_Text-10', revitron.ParameterTemplate( wall.element, '{%projectParam%}: {param1}-{param2}').render()) self.assertEquals( 'Project Name: Test & Text-10', revitron.ParameterTemplate(wall.element, '{%projectParam%}: {param1}-{param2}', False).render())
def set(self, key, data): """ Updates or creates a config storage entry. Example:: config = revitron.DocumentConfigStorage() config.set('name', value) Args: key (string): The storage entry key data (mixed): The value of the entry """ import revitron self.storage[key] = data # Remove empty items. self.storage = dict((k, v) for k, v in self.storage.iteritems() if v) raw = json.dumps(self.storage, sort_keys=True, ensure_ascii=False) t = revitron.Transaction() revitron._(self.info).set(self.storageName, raw) t.commit()
def printSheet(self, sheet, size, orientation='Landscape', directory=False, template=False): """ Prints a sheet. Args: sheet (object): A Revit sheet size (string): A size name like A0 or A4 orientation (string, optional): The orientation, 'Landscape' or 'Portrait'. Defaults to 'Landscape'. directory (string, optional): A custom output directory. Defaults to False. template (string, optional): A name template. Defaults to '{Sheet Number}-{Sheet Name}'. Returns: bool: False on error, True on success """ import revitron if revitron.Element(sheet).getClassName() != 'ViewSheet': print(':face_with_rolling_eyes: Element is not a sheet!') return False if not directory: directory = self.output if not template: template = '{Sheet Number}-{Sheet Name}' path = os.path.join( directory, revitron.ParameterTemplate(sheet, template).render() + '.pdf') if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) transaction = revitron.Transaction() viewSet = revitron.DB.ViewSet() viewSet.Insert(sheet) viewSheetSetting = self.manager.ViewSheetSetting viewSheetSetting.CurrentViewSheetSet.Views = viewSet viewSheetSetting.SaveAs("_temp_") self.manager.PrintSetup.SaveAs("_temp_") self.manager.Apply() orientation = getattr(revitron.DB.PageOrientationType, orientation) # Set current print page settings. printParameters = self.manager.PrintSetup.CurrentPrintSetting.PrintParameters printParameters.ZoomType = revitron.DB.ZoomType.Zoom printParameters.Zoom = 100 printParameters.PaperPlacement = revitron.DB.PaperPlacementType.Center printParameters.PageOrientation = orientation printParameters.PaperSize = self.sizes[size] printParameters.RasterQuality = revitron.DB.RasterQualityType.High # Set in-session print settings. printParameters = self.manager.PrintSetup.InSession.PrintParameters printParameters.ZoomType = revitron.DB.ZoomType.Zoom printParameters.Zoom = 100 printParameters.PaperPlacement = revitron.DB.PaperPlacementType.Center printParameters.PageOrientation = orientation printParameters.PaperSize = self.sizes[size] printParameters.RasterQuality = revitron.DB.RasterQualityType.High # Again save settings. try: self.manager.PrintSetup.Save() except: self.manager.PrintSetup.SaveAs("_temp2_") self.manager.Apply() self.manager.SubmitPrint(sheet) viewSheetSetting.Delete() transaction.rollback() # Move file form temp output to directory. timePassed = time.time() moved = False while (time.time() - timePassed) < 30 and not moved: time.sleep(0.5) tempFiles = glob.glob(self.tempOutputPattern(sheet)) if tempFiles: tempFile = tempFiles[0] time.sleep(2) if os.access(tempFile, os.W_OK): try: shutil.move(tempFile, path) moved = True except: pass if moved: return path return False
def testStringFilters(self): w1 = self.fixture.createWall([0, 10], [10, 10]) w2 = self.fixture.createWall([0, 20], [10, 20]) w3 = self.fixture.createWall([0, 30], [10, 30]) w4 = self.fixture.createWall([0, 40], [10, 40]) w5 = self.fixture.createWall([0, 50], [10, 50]) with revitron.Transaction(): _(w1).set('test', 'an awesome test wall') _(w2).set('test', 'another awesome test wall') _(w3).set('test', 'and one more wall') _(w4).set('Comments', 'test comment') f = revitron.Filter toStr = utils.idsToStr self.assertEquals( toStr([w1.Id, w2.Id]), toStr(f().byStringContains('test', 'awesome').noTypes().getElementIds())) self.assertEquals( toStr([w4.Id, w5.Id]), toStr(f().byCategory('Walls').byStringContains( 'test', 'wall', True).noTypes().getElementIds())) self.assertEquals( toStr([w4.Id, w5.Id]), toStr(f().byCategory('OST_Walls').byStringContains( 'test', 'wall', True).noTypes().getElementIds())) self.assertEquals( toStr([w3.Id]), toStr(f().byStringBeginsWith('test', 'and one').noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w2.Id, w3.Id]), toStr(f().byStringEndsWith('test', 'wall').noTypes().getElementIds())) self.assertEquals( toStr([w3.Id]), toStr(f().byStringEquals( 'test', 'and one more wall').noTypes().getElementIds())) self.assertEquals( toStr([w4.Id]), toStr(f().byStringEquals( 'Comments', 'test comment').noTypes().getElementIds())) self.assertEquals( toStr([w2.Id, w3.Id]), toStr(f().byStringContainsOneInCsv( 'test', 'one, another').noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w4.Id, w5.Id]), toStr(f().byCategory('Walls').byStringContainsOneInCsv( 'test', 'one, another', True).noTypes().getElementIds())) self.assertEquals( toStr([w1.Id, w3.Id]), toStr(f().byStringEqualsOneInCsv( 'test', 'an awesome test wall, and one more wall').noTypes(). getElementIds()))
import revitron from revitronui import RoomTags transaction = revitron.Transaction() RoomTags.add(revitron.RoomTag.bottomRight, 'Select Room Tag Type (Bottom Right)') transaction.commit()
def createGenericModelInstance(self, family, location): for symbolId in family.GetFamilySymbolIds(): transaction = revitron.Transaction(suppressWarnings=True) instance = revitron.Create.familyInstance(symbolId, location) transaction.commit() return instance
def testParameterSet(self): wall = self.fixture.createWall() with revitron.Transaction(): _(wall).set('text', 'some text') _(wall).set('integer', 5, 'Integer') _(wall).set('integerAuto', 5) _(wall).set('number', 10.5, 'Number') _(wall).set('numberAuto', 10.5) _(wall).set('length', 5, 'Length') _(wall).set('Comments', 'some comment') self.assertEquals( str(revitron.Parameter(wall, 'integer').parameter.StorageType), 'Integer') self.assertEquals( str(revitron.Parameter(wall, 'integerAuto').parameter.StorageType), 'Integer') self.assertEquals( str(revitron.Parameter(wall, 'number').parameter.StorageType), 'Double') self.assertEquals( str(revitron.Parameter(wall, 'numberAuto').parameter.StorageType), 'Double') self.assertEquals( str(revitron.Parameter(wall, 'length').parameter.StorageType), 'Double') self.assertEquals( 'Text', str( revitron.Parameter(wall, 'text').parameter.Definition.ParameterType)) self.assertEquals( 'Integer', str( revitron.Parameter( wall, 'integer').parameter.Definition.ParameterType)) self.assertEquals( 'Integer', str( revitron.Parameter( wall, 'integerAuto').parameter.Definition.ParameterType)) self.assertEquals( 'Number', str( revitron.Parameter( wall, 'number').parameter.Definition.ParameterType)) self.assertEquals( 'Number', str( revitron.Parameter( wall, 'numberAuto').parameter.Definition.ParameterType)) self.assertEquals( 'Length', str( revitron.Parameter( wall, 'length').parameter.Definition.ParameterType)) self.assertEquals(_(wall).get('text'), 'some text') self.assertEquals(_(wall).get('integer'), 5) self.assertEquals(_(wall).get('integerAuto'), 5) self.assertEquals(_(wall).get('number'), 10.5) self.assertEquals(_(wall).get('numberAuto'), 10.5) self.assertEquals(_(wall).get('length'), 5) self.assertEquals(_(wall).get('Comments'), 'some comment')
if field.label: components.append(field.label) components.append(field.input) components.append(forms.Button('Open Documentation', on_click=openHelp)) components.append(TabWindowButton('Start')) form = TabWindow('Calculate Room Heights', components) form.show() values = revitron.AttrDict(form.values) if form.values: transaction = revitron.Transaction(suppressWarnings=True) revitron.DocumentConfigStorage().set('revitron.rooms.calculateRoomHeights', form.values) max_value = 4 with ProgressBar(indeterminate=True, title='Preparing ... ({value} of {max_value})') as pb: pb.update_progress(0, max_value) roomFilter = revitron.Filter().noTypes().byCategory('Rooms') if values.roomFltrParam and values.roomFltrList: roomFilter = roomFilter.byStringContainsOneInCsv(