In response to a tweet asking to save all groups, I responded that there is no API for Save Group. That’s true, but all hope is not lost.
This video shows how the API can be used to generate a text file listing all model groups. Then this text file is used as input to a journal file that saves each group to its own file.
Scott sent a tweet about deleting all revisions from a project. The tricky part is that, just like how the UI grays out the Delete button when there is only one revision in the project, we can’t use the API to delete the last revision.
This code uses the Revit 2015 API because the Revision class is new to 2015.
publicvoid DeleteRevisions()
{
Document doc = this.ActiveUIDocument.Document;
// get list of all revisions in the document
ICollection<ElementId> elementIds = new FilteredElementCollector(doc)
.OfClass(typeof(Revision))
.ToElementIds();
// Remove the first revision from the list// Revit must have one revision in the document, so we can't delete them all
elementIds.Remove(elementIds.First());
using (Transaction t = new Transaction(doc,"Delete Revisions"))
{
t.Start();
doc.Delete(elementIds);
t.Commit();
}
}
Last night at the API Open House, we talked about the power and limitations of the Dimensions API.
This example shows how to create dimensions that reference two parallel faces. The video shows running the command in a locked 3D view and selecting the end faces of beams. It is also necessary to set the view’s workplane so that the direction of the dimension lies in this plane.
More automated creation of these dimensions could be achieved by programatically getting the faces from the beams so that the user need only select the beam instead of the 3 faces shown in this sample.
publicvoid CreateDimFromFaces()
{
Document doc = this.ActiveUIDocument.Document;
UIDocument uidoc = this.ActiveUIDocument;
Reference r1 = uidoc.Selection.PickObject(ObjectType.Face, "Pick face for dimension reference");
Reference r2 = uidoc.Selection.PickObject(ObjectType.Face, "Pick face for dimension reference");
Reference r3 = uidoc.Selection.PickObject(ObjectType.Face, "Pick face for view work plane");
ReferenceArray ra = new ReferenceArray();
ra.Append(r1);
ra.Append(r2);
Element e = doc.GetElement(r2);
Location l = e.Location;
LocationCurve lc = l as LocationCurve;
Curve curve = lc.Curve;
Line line = curve as Line;
using (Transaction t = new Transaction(doc,"dim"))
{
t.Start();
doc.ActiveView.SketchPlane = SketchPlane.Create(doc, r3);
Dimension dim = doc.Create.NewDimension(doc.ActiveView, line, ra);
t.Commit();
}
}
Steve wishes for an easy way to use the API to find pinned elements. Wish granted!
publicvoid findPinned()
{
UIDocument uidoc = this.ActiveUIDocument;
Document doc = this.ActiveUIDocument.Document;
// create new SelElementSet to store elements that will be selected
SelElementSet selSet = SelElementSet.Create();
// find all elements in the active view that are pinnedforeach (Element e innew FilteredElementCollector(doc, doc.ActiveView.Id).WhereElementIsNotElementType().Where(q => q.Pinned))
{
// add each of these elements to the set
selSet.Add(e);
}
// select all elements in the set
uidoc.Selection.Elements = selSet;
// refresh the view so that the newly selected elements are highlighted
uidoc.RefreshActiveView();
TaskDialog.Show("Elements Pinned","Elements pinned in view '" + doc.ActiveView.Name + "' = " + selSet.Size.ToString());
}