# Attributes<T> class

Namespace: [Grasshopper2.Doc](https://developer.rhino3d.com/api/gh2/namespace/grasshopper2.doc.md) · Assembly: [Grasshopper2](https://developer.rhino3d.com/api/gh2/assembly/grasshopper2.md)

```cs
public abstract class Attributes<T> : IAttributes
```

Base abstract implementation of IAttributes.

**Type parameters:**

- `T` (where IDocumentObject)

**Derived types:** [ComponentAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.componentattributes.md), [DataRecorderAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.parameters.special.datarecorderattributes.md), [FloatingParameterAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.floatingparameterattributes.md), [GroupAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.specialobjects.groupattributes.md), [InputParameterAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.inputparameterattributes.md), [OutputParameterAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.outputparameterattributes.md), [ParameterAttributes<T>](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.parameterattributes-1.md), [PinAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.pinattributes.md), [ResizableAttributes<T>](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes.resizableattributes-1.md), [ScratchAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.specialobjects.scratchattributes.md), [ScribbleAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.specialobjects.scribbleattributes.md), [TimerAttributes](https://developer.rhino3d.com/api/gh2/type/grasshopper2.parameters.special.timerattributes.md)

## Constructors

- [Attributes<T>](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/ctor.md)

## Properties

- [AggregateBounds](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/aggregatebounds.md): Gets the aggregate bounds of this object. This will include the bounds of all objects attached in some way to this object.
- [Bounds](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/bounds.md): Gets the total outer bounds of the attributes. The attributes are assumed not to exist beyond this limit. Note that the bounds are updated during calls to Layout(), so may be out-of-date or even unset when called outside of the usual process.
- [IAttributes.Owner](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/grasshopper2-doc-iattributes-owner.md)
- [IntegerPivot](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/integerpivot.md): Gets whether the pivot of these attributes is always rounded to integer coordinates. By default this property returns true, as the vast majority of objects ought to be laid out in integer coordinates.
- [Owner](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/owner.md)
- [Pivot](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/pivot.md): Gets or sets the pivot point for these attributes. The pivot is the main point around which the attribute geometry is positioned during layout.
- [Snappable](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/snappable.md): Gets whether these attributes can be used to align other objects on the canvas. Return false specifically when your object shape is not rectangular.
- [Stack](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/stack.md): The horizontal layout stack along the apex row. Derived classes typically (re)assign this during [Attributes<T>.Layout(Shape)](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/layout.md) and reference sub-regions via class-local index constants. The default [Attributes<T>.PivotMoved(PointF, PointF)](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/pivotmoved.md) translates the stack along with [Attributes<T>.Bounds](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/bounds.md).

## Methods

- [DefaultTooltipContent](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/defaulttooltipcontent.md): Create the tooltip fields which are associated with this object by default.
- [Draw](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/draw.md): (2 overloads) Internal drawing method. Consider overriding this one instead of [Attributes<T>.Draw(Context, Skin)](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/draw.md).
- [HandleDoubleClick](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/handledoubleclick.md): Handle a double click operation on these attributes. Since this is such a common operation it is provided by the base interface, rather than requiring an IResponseAttribues implementation.
- [Intersects](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/intersects.md): Test whether a given rectangle intersects the shape of these attributes.
- [InvalidateDisplay](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/invalidatedisplay.md): Signals that the attribute's visual appearance has changed without affecting layout. Fires the owner's [DocumentObject.OnDisplayChanged()](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.documentobject/ondisplaychanged.md), which propagates through the document to the canvas redraw subscription.
- [InvalidateLayout](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/invalidatelayout.md): Marks the layout as dirty so it gets recomputed on the next draw cycle. Subclasses typically flip an internal `_layoutValid` flag. Most callers should also raise [DocumentObject.OnLayoutChanged()](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.documentobject/onlayoutchanged.md) on the owner to actually trigger a canvas redraw.
- [IsCoincident](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/iscoincident.md): Test whether a given point is considered to be on the interior of these attributes.
- [IsContained](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/iscontained.md): Test whether the shape of these attributes is fully contained within a given rectangle.
- [Layout](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/layout.md): Perform a layout operation on these attributes. Layout() ought to be called as part of every control painting process.
- [Move](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/move.md): Move these attributes a certain amount in X and Y.
- [PivotMoved](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/pivotmoved.md): Override this method if your attributes need to handle pivot motion. The default implementation translates [Attributes<T>.Bounds](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/bounds.md) and [Attributes<T>.Stack](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/stack.md) by the pivot delta. Overrides should typically chain to this base implementation.
- [ShowTooltipAt](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/showtooltipat.md): Display the tooltip at the given point. The tooltip can be accessed via `Tooltip`.
- [TooltipDetails](https://developer.rhino3d.com/api/gh2/type/grasshopper2.doc.attributes-1/tooltipdetails.md): Override this method to return custom details for a tooltip.
