Hi,
I am now testing a script to modify family instances using API, but transaction errors occur.
Transaction was set to manual, and I think I set proper transaction start and commit.
The code simply takes a family instances, create new type, and reload the instance.
Could anyone please look at my code and give me some help?
in advance, Thank for your help!
Code:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
[TransactionAttribute(TransactionMode.Manual)]
[RegenerationAttribute(RegenerationOption.Manual)]
class familyExtract : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref String massage, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
Document doc = uiApp.ActiveUIDocument.Document;
Selection sel = uiApp.ActiveUIDocument.Selection;
Reference selected = null;
FamSelectionFilter famFilter = new FamSelectionFilter();
selected = sel.PickObject(ObjectType.Element, famFilter, "select family");
Element elem = doc.GetElement(selected);
FamilyInstance familyInstance = elem as FamilyInstance;
Transaction trans = new Transaction(doc, "excomm");
trans.Start();
editFamilyProperties(doc, familyInstance);
trans.Commit();
return Result.Succeeded;
}
public void editFamilyProperties(Document document, FamilyInstance familyInstance)
{
if (null != familyInstance.Symbol)
{
Family family = familyInstance.Symbol.Family;
Document familyDoc = document.EditFamily(family);
if (null != familyDoc)
{
FamilyManager familyManager = familyDoc.FamilyManager;
FamilyType newFamType = familyManager.NewType("Test");
FamilyParameter familyParam = familyManager.get_Parameter("width");
if (null != familyParam)
{
familyManager.Set(familyParam, 200);
}
family = familyDoc.LoadFamily(document);
FamilySymbolSetIterator symbolsItor = family.Symbols.ForwardIterator();
symbolsItor.Reset();
while (symbolsItor.MoveNext())
{
FamilySymbol familySymbol = symbolsItor.Current as FamilySymbol;
if (familySymbol.Name == "mass_Ctype")
{
familyInstance.Symbol = familySymbol;
break;
}
}
}
}
}
public class FamSelectionFilter : ISelectionFilter
{
public bool AllowElement(Element element)
{
if (element is FamilyInstance)
{
return true;
}
return false;
}
public bool AllowReference(Reference refer, XYZ point)
{
return false;
}
}
}