Example #1
0
    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
Example #2
0
 def context(self, doc=False):
     if not doc:
         doc = self.mainDoc
     self.doc = doc
     revitron.DOC = self.doc
     revitron.APP = self.doc.Application
     self.level = revitron.Filter().byCategory(
         'Levels').noTypes().getElements()[0]
     revitron.ACTIVE_VIEW = revitron.Filter().byCategory(
         'Views').noTypes().getElements()[0]
    def isBoundToCategory(category, paramName):
        """
        Test if a parameter is bound to a given category.

        Args:
            category (string): The category name
            paramName (string): The parameter name

        Returns:
            boolean: Returns True if parameter is bound already
        """
        import revitron

        definition = None

        for param in revitron.Filter().byClass(
                revitron.DB.SharedParameterElement).getElements():
            if param.GetDefinition().Name == paramName:
                definition = param.GetDefinition()
                break

        if definition:
            binding = revitron.DOC.ParameterBindings[definition]
            for cat in binding.Categories:
                if cat.Name == category:
                    return True
Example #4
0
	def __init__(self):
		"""
		Inits a new ParameterNameList instance including all parameter names in the document.
		"""            
		import revitron
			
		self.parameters = []
		
		for name in BuiltInParameterNameMap().map:
			self.parameters.append(name)
		
		for param in revitron.Filter().byClass(revitron.DB.SharedParameterElement).getElements():
			self.parameters.append(param.GetDefinition().Name)
			
		for param in revitron.Filter().byClass(revitron.DB.ParameterElement).getElements():
			self.parameters.append(param.GetDefinition().Name)    
			
		self.parameters = sorted(list(set(self.parameters)))
Example #5
0
 def add(method, title):
     import revitronui
     roomTagTypes = revitron.Filter().byCategory(
         'Room Tags').onlyTypes().getElements()
     roomTagType = revitronui.SelectType(roomTagTypes, title).show()
     scope = revitron.Selection.get()
     if not scope:
         scope = revitron.ACTIVE_VIEW.Id
     if roomTagType:
         rooms = revitron.Filter(scope).byCategory(
             'Rooms').noTypes().getElements()
         max_value = len(rooms)
         counter = 0
         with forms.ProgressBar(
                 title='Tagging rooms ... ({value} of {max_value})') as pb:
             for room in rooms:
                 counter = counter + 1
                 try:
                     method(room, roomTagType.Id)
                 except:
                     pass
                 pb.update_progress(counter, max_value)
Example #6
0
	def _filterElements(self):
		"""
		Filter elements in the target model by applying all filters that
		are defined in the configuration.

		Returns:
			list: The list of filtered elements
		"""
		import revitron
		filters = self.config.get('filters')
		fltr = revitron.Filter()
		for f in filters:
			evaluator = getattr(revitron.Filter, f.get('rule'))
			fltr = evaluator(fltr, *f.get('args'))
		return fltr.noTypes().getElements()
Example #7
0
    def view3D():
        """
		Create a new 3D view.

		Returns:
			object: A Revit 3D view element
		"""
        import revitron
        view3DType = None

        for viewFamilyType in revitron.Filter().byClass(
                revitron.DB.ViewFamilyType).onlyTypes().getElements():
            if viewFamilyType.FamilyName == '3D View':
                view3DType = viewFamilyType
                break

        return revitron.DB.View3D.CreateIsometric(revitron.DOC, view3DType.Id)
    def applyStringFilter(self, paramName, value, evaluator, invert = False):
        """
        Applies a string filter.

        Args:
            paramName (string): The parameter name
            value (mixed): the value
            evaluator (object): The FilterStringRuleEvaluator
            invert (boolean): Inverts the filter
        """   
        import revitron
        
        filters = []
    
        # Since a visible parameter name could match multiple built-in parameters,
        # we get a list of value providers. 
        # While iterating that list, the parameter filter is applied each time 
        # to a fresh element collector that will be later merged or intersected with the others. 
        for valueProvider in revitron.ParameterValueProviders(paramName).get():
            rule = revitron.DB.FilterStringRule(valueProvider, evaluator, value, True)
            _filter = Filter()
            # Try to get elements from the collector as base for the fresh collector.
            # In case there was never a filter applied before, getting elements will raise an exception
            # and new Filter() instance is created with the same scope.
            try:
                _filter.collector = revitron.DB.FilteredElementCollector(revitron.DOC, self.collector.ToElementIds())
            except:
                _filter.collector = revitron.Filter(self.scope).collector
            _filter.applyParameterFilter(rule, invert) 
            filters.append(_filter)
        
        self.collector = filters[0].collector
        
        if len(filters) > 1:
            for i in range(1, len(filters)):
                if not invert:
                    self.collector.UnionWith(filters[i].collector)
                else:
                    self.collector.IntersectWith(filters[i].collector)
Example #9
0
	def _getLines(self, typeFilterCsv=False):
		"""
		Create the filtered dict of grid lines.

		Args:
			typeFilterCsv (string, optional): A CSV filter. Defaults to False.

		Returns:
			dict: A dict of Revit grid line elements where the grid name serves as key
		"""
		if hasattr(self, '_lines'):
			return self._lines
		import revitron
		fltr = revitron.Filter().byCategory('Grids').noTypes()
		if typeFilterCsv:
			fltr = fltr.byStringContainsOneInCsv('Type', typeFilterCsv)
		lines = dict()
		for line in fltr.getElements():
			try:
				lines[line.Name] = line
			except:
				pass
		return lines
Example #10
0
	def getLinkedDocuments(self, scope = None):
		"""
		Returns a dictionary of all linked documents.
		The key is the ID of the link and the value is the actual document object.

		Args:
			scope (mixed, optional): List or view ID. Defaults to None.

		Returns:
			dict: A dictionary of all linked documents.
		"""
		import revitron
		linkedDocuments = dict()
		extension = '.rvt'
		for link in revitron.Filter(scope).byCategory('RVT Links').noTypes().getElements():
			linkType = revitron.Parameter(link, 'Type').getValueString()
			if linkType.endswith(extension):
				linkType = linkType[:-len(extension)]
			for openDoc in revitron.APP.Documents:
				if openDoc.IsLinked:
					if openDoc.Title == linkType:
						linkedDocuments[link.Id] = openDoc
		return linkedDocuments
if selection:
    components.append(
        CheckBox('selection', 'Search in selection only', default=True))
else:
    components.append(
        CheckBox('viewOnly', 'Search in this view only', default=False))

components.append(
    Button('Select',
           Width=100,
           HorizontalAlignment=System.Windows.HorizontalAlignment.Right))

form = FlexForm('Select by Parameter', components)
form.show()

if 'search' in form.values:

    scope = False

    if 'selection' in form.values and form.values['selection']:
        scope = selection
    else:
        if 'viewOnly' in form.values and form.values['viewOnly']:
            scope = revitron.ACTIVE_VIEW.Id

    ids = revitron.Filter(scope).noTypes().byStringContains(
        form.values['parameter'], form.values['search'],
        form.values['invert']).getElementIds()

    revitron.Selection.set(ids)
Example #12
0
 def testIsType(self):
     for item in revitron.Filter().onlyTypes().getElements():
         self.assertTrue(_(item).isType())
     wall = self.fixture.createWall()
     self.assertFalse(_(wall).isType())
Example #13
0
    components.append(
        CheckBox('viewOnly', 'Search in this view only', default=False))

components.append(
    Button('Select',
           Width=100,
           HorizontalAlignment=System.Windows.HorizontalAlignment.Right))

form = FlexForm('Select by String Parameter', components)
form.show()

if 'search' in form.values:

    scope = False

    if 'selection' in form.values and form.values['selection']:
        scope = selection
    else:
        if 'viewOnly' in form.values and form.values['viewOnly']:
            scope = revitron.ACTIVE_VIEW.Id

    fltr = (revitron.Filter(scope).noTypes().byStringContains(
        form.values['parameter'], form.values['search'],
        form.values['invert']))

    if form.values['category'] != 'All':
        fltr.byCategory(form.values['category'])

    ids = fltr.getElementIds()

    revitron.Selection.set(ids)
Example #14
0
else:
    components.append(
        CheckBox('viewOnly', 'Search in this view only', default=False))

components.append(
    Button('Select',
           Width=100,
           HorizontalAlignment=System.Windows.HorizontalAlignment.Right))

form = FlexForm('Select by Numeric Parameter', components)
form.show()

if 'value' in form.values:

    try:
        el = (revitron.Filter().byNumberIsGreater(
            form.values['parameter'], 0.0).noTypes().getElementIds()[0])
        unit = _(el).getParameter(form.values['parameter']).unit()
        value = revitron.Unit.convertToInternalUnit(form.values['value'], unit)
    except:
        value = float(form.values['value'])
        print('no unit', value)

    scope = False

    if 'selection' in form.values and form.values['selection']:
        scope = selection
    else:
        if 'viewOnly' in form.values and form.values['viewOnly']:
            scope = revitron.ACTIVE_VIEW.Id

    evaluator = getattr(revitron.Filter, form.values['evaluator'])
Example #15
0
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(
                values.roomFltrParam, values.roomFltrList,
                values.roomFltrInvert)
        rooms = roomFilter.getElements()

        rawElements = None
        finElements = None

        pb.update_progress(1, max_value)

        if values.rawEleFltrParam:
            rawFilter = revitron.Filter().byStringContainsOneInCsv(
                values.rawEleFltrParam, values.rawEleFltrList,