当对象组织到一个组(Group)内,对象就不允许修改,原因是他们已经在组的立面。
有一个解决方案可以修改组内对象。基本思想就是先炸开这个组,获得组内的所有对象,已被后用。然后这些对象就是不在组内了。这时候可以用一般的修改对象的方法来修改这些对象。结束后,可以用创建新组的方法把这些对象重新组织到组内。
因为Revit为提示一些警告,为了避免这个警告,可以使用事务的方式避免警告。
下面例子演示了上面说的方法。这个命令要修改一个组内所有对象上的共享参数的值。(测试是须保证组内对象都有指定的字符型共享参数)
[TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] [RegenerationAttribute(Autodesk.Revit.Attributes.RegenerationOption.Manual)] public class RevitCommand : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { UIApplication app = commandData.Application; Document doc = app.ActiveUIDocument.Document; Transaction trans = new Transaction(doc, "ExComm"); trans.Start(); //pick a group Selection sel = app.ActiveUIDocument.Selection; Reference ref1 = sel.PickObject(ObjectType.Element, "please pick a group"); Group group = ref1.Element as Group; //ungroup it ElementSet es = group.Ungroup(); //change shared paremeter foreach (Element elem in es) { Parameter param = elem.get_Parameter("MyShared"); param.Set("updated3"); } doc.Regenerate(); trans.Commit(); trans = new Transaction(doc, "newgroup"); trans.Start(); //Group it again. group = doc.Create.NewGroup(es); trans.Commit(); return Result.Succeeded ; } }