Friday, January 21, 2011

Spot Slope Markers

This is an odd occurrence that we encountered today. When adding slope marker annotations in elevation views, we've noticed that it will pick up the slopes of not only the roof surfaces, but also the adjoining hips and valleys.

Is there any way to make them only pick up the surfaces? Otherwise, it takes a few clicks of the TAB button to find the right one. Not that it's a big deal, but it makes the user double-think the annotation which should be automatic.

Thursday, January 13, 2011

Door Functions and Names

Another part of my material collection process it to gather all doors and group them by Exterior and Interior. I had a bit of trouble getting the door functions- it wasn't the same as the walls. Doors are family instances inside the project document, so in addition to the base family parameters, each has its own family type instance parameters.

By default, a door has its function set to 0 which is Interior (1 is Exterior). If you ever create a type catalog for a door family, remember to use 0 and 1 instead of Interior/Exterior!

Again, this doesn't work and results in an error:
Parameter doorFunc = e.get_Parameter(BuiltInParameter.FUNCTION_PARAM);

This returns the door's function- Interior or Exterior:
static public string GetDoorFunction(Element e)
 Parameter param = e.ObjectType.get_Parameter(BuiltInParameter.FUNCTION_PARAM);
 string doorFuncVal = param.AsInteger().ToString();
 return doorFuncVal;

I noticed that 'ObjectType' is deprecated, but I'm not having any luck with using the ElementId/ElementType right now.

And to get a door's family name:
static public string GetDoorType(Element e)
 FamilyInstance fi = e as FamilyInstance;
 string value = fi.Symbol.Family.Name;
 return value;

And the result:
BASE Interior Doors:
Single swing, 2468
Single swing, 2468
Bi-Fold 2 Panel (TC), 2068
Double bifold, 4068
Single swing, 1668
Single Swing, 2068 

BASE Exterior Doors:
double slider, 6068 SGD
garage door_16ft, 1680

Retrieving Classes and Categories from the 'Main Model'

We just got another 5 or 6 inches of snow over the last couple of days.  After the foot or so that we had over Christmas (that quickly melted once it got up to the 60's for a day!) I believe this is probably the most snow we've had this early for quite some time.

I'm working on a material collection project in Revit right now.  Part of this collection hinges on  obtaining a plus-minus report that lists all elements and their properties for each 'option set' in the house.

Revit has a 'DesignOption' field for each element, whether it be a system family or a custom family, that defaults to 'Main Model.'  Once the item is placed into a design option, this is obviously changed to the design option id in the database. Here I get an IList<T> of the walls in the main model:

/*Walls in Main Model*/
BuiltInParameter bip = BuiltInParameter.DESIGN_OPTION_PARAM;
ParameterValueProvider provider = new ParameterValueProvider(new ElementId(bip));
FilterStringRuleEvaluator evaluator = new FilterStringEquals();
FilterRule rule = new FilterStringRule(provider, evaluator, "Main Model", false);
ElementParameterFilter filter = new ElementParameterFilter(rule);

FilteredElementCollector collectorCoreWalls = new 
IList<Element> coreWalls = collectorCoreWalls.ToElements();

The same can be done for Floors (Floor), Roofs (RoofBase), Ceilings and Floors (CeilingAndFloor) and others.

Next post I'll show how to loop through Design Option Elements.

Tuesday, January 11, 2011

Retrieving a wall's Function Parameter (BuiltInParameter.FUNCTION_PARAM)

For part of a large Revit material-gathering project I'm working on, I need to retrieve a wall's function. Walls can be assigned six functions from within their type properties:

  • Interior
  • Exterior
  • Foundation
  • Retaining
  • Soffit
  • Core-Shaft

At first I thought it would be fairly straight-forward, and I'd just do this grab the valuestring of the 'FUNCTION_PARAM' like so:


But that gave me a NULL value and crashed Revit. The approach that worked for me was this:

static public string IsExterior(Element e, Document doc)
    ElementId id = e.GetTypeId();
    ElementType wallType = doc.get_Element(id) as ElementType;

    Parameter wallFunction = wallType.get_Parameter
    WallFunction value  = (WallFunction)wallFunction.AsInteger();

    return value.ToString();
Thanks to Jeremy Tammik's SDK example for setting me straight.