Roof Creation Issue with Revit API

184 views Asked by At

I'm trying to create the roof as shown in below image using the revit api. Selected roof is placed at Offset From Roof Base at 10' 1" and Adjacent roof is placed at 9'1".

enter image description here

But using the revit api I'm getting this as output. Current Output

Please let us know how we can create above roof using revit api

We are using only the model lines from revit document as shown below enter image description here

1

There are 1 answers

4
Jeremy Tammik On

What exact existing elements and detailed steps are you using to create that roof manually in the end user interface? You will probably need to use the same starting point to create the roof programmatically as well. In general, the Revit API just wraps the manual UI functionality.

Creating the roof with the existing elements and their slope settings should be pretty straightforward using the NewFootPrintRoof method. Look at the sample code snippet in the documentation:

// Before invoking this sample, select some walls to add a roof over.
// Make sure there is a level named "Roof" in the document.

// find the Roof level
FilteredElementCollector collector = new FilteredElementCollector(document);
collector.OfClass(typeof(Level));
var elements = from element in collector where element.Name == "Roof" select element;
Level level = elements.Cast<Level>().ElementAt<Level>(0);

collector = new FilteredElementCollector(document);
collector.OfClass(typeof(RoofType));
RoofType roofType = collector.FirstElement() as RoofType; 

// Get the handle of the application
Autodesk.Revit.ApplicationServices.Application application = document.Application;

// Define the footprint for the roof based on user selection
CurveArray footprint = application.Create.NewCurveArray();
UIDocument uidoc = new UIDocument(document);
ICollection<ElementId> selectedIds = uidoc.Selection.GetElementIds();
if (selectedIds.Count != 0)
{
  foreach (ElementId id in selectedIds)
  {
    Element element = document.GetElement(id);
    Wall wall = element as Wall;
    if (wall != null)
    {
      LocationCurve wallCurve = wall.Location as LocationCurve;
      footprint.Append(wallCurve.Curve);
      continue;
    }

    ModelCurve modelCurve = element as ModelCurve;
    if (modelCurve != null)
    {
      footprint.Append(modelCurve.GeometryCurve);
    }
  }

}
else
{
  throw new Exception("You should select a curve loop, or a wall loop, or loops combination \nof walls and curves to create a footprint roof.");
}

ModelCurveArray footPrintToModelCurveMapping = new ModelCurveArray();
FootPrintRoof footprintRoof = document.Create.NewFootPrintRoof(footprint, level, roofType, out footPrintToModelCurveMapping);
ModelCurveArrayIterator iterator = footPrintToModelCurveMapping.ForwardIterator();
iterator.Reset();
while (iterator.MoveNext())
{
  ModelCurve modelCurve = iterator.Current as ModelCurve;
  footprintRoof.set_DefinesSlope(modelCurve, true);
  footprintRoof.set_SlopeAngle(modelCurve, 0.5);
}