Reference

Reference Wrappers

>>> pick = rpw.ui.Pick()
>>> references = pick.pick_element(multiple=True)
>>> references
[<rpw:Reference>, <rpw:Reference>]
>>> references[0].as_global_pt
<rpw:XYZ>

Linked Element

>>> reference = pick.pick_linked_element()
>>> element = reference.get_element()
class rpw.db.Reference(reference, linked=False)

Bases: rpw.db.element.Element

DB.Reference Wrapper Inherits from Element

>>>
Attribute:
_revit_object (DB.Reference): Wrapped DB.Reference doc (Document): Element Document
__init__(reference, linked=False)

Main Element Instantiation

>>> from rpw import db
>>> wall = db.Element(SomeElementId)
<rpw: WallInstance % DB.Wall >
>>> wall.parameters['Height']
10.0
>>> wall.parameters.builtins['WALL_LOCATION_LINE']
1
Parameters:element (Element Reference) – Can be DB.Element, DB.ElementId, or int.
Returns:Instance of Wrapped Element.
Return type:Element
as_global_pt

Returns GlobalPoint property of Reference

as_uv_pt

Returns UVPoint property of Reference - Face references only

get_element(wrapped=True)

Element of Reference

get_geometry()

GeometryObject from Reference

id

ElementId of Reference


Implementation

"""
Reference Wrappers

>>> pick = rpw.ui.Pick()
>>> references = pick.pick_element(multiple=True)
>>> references
[<rpw:Reference>, <rpw:Reference>]
>>> references[0].as_global_pt
<rpw:XYZ>

Linked Element

>>> reference = pick.pick_linked_element()
>>> element = reference.get_element()

"""

import rpw
from rpw import revit, DB
from rpw.db.element import Element
from rpw.db.xyz import XYZ
from rpw.utils.logger import logger
# from rpw.db.builtins import BipEnum


class Reference(Element):
    """
    `DB.Reference` Wrapper
    Inherits from :any:`Element`

    >>>

    Attribute:
        _revit_object (DB.Reference): Wrapped ``DB.Reference``
        doc (Document): Element Document
    """

    _revit_object_class = DB.Reference

    def __init__(self, reference, linked=False):
        if not linked:
            doc = revit.doc
        else:
            link_instance = revit.doc.GetElement(reference.ElementId)
            doc = link_instance.GetLinkDocument()

        super(Reference, self).__init__(reference, doc=doc)
        self.doc = doc
        self.linked = linked

    def __repr__(self):
        return super(Reference, self).__repr__(data={'id': self.id})

    @property
    def as_global_pt(self):
        """ Returns ``GlobalPoint`` property of Reference """
        pt = self._revit_object.GlobalPoint
        if pt:
            return XYZ(pt)

    @property
    def as_uv_pt(self):
        """ Returns ``UVPoint`` property of Reference - Face references only """
        pt = self._revit_object.UVPoint
        if pt:
            # TODO XYZ needs to handle XYZ
            return pt
            # return XYZ(pt)

    @property
    def id(self):
        """ ElementId of Reference """
        return self._revit_object.ElementId if not self.linked else self._revit_object.LinkedElementId

    def get_element(self, wrapped=True):
        """ Element of Reference """
        element = self.doc.GetElement(self.id)
        return element if not wrapped else Element(element)

    def get_geometry(self):
        """ GeometryObject from Reference """
        ref = self._revit_object
        return self.doc.GetElement(ref).GetGeometryObjectFromReference(ref)