using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure; using Nice3point.Revit.Toolkit.External; namespace ShrlAlgoToolkit.RevitAddins.RvFamily; /// /// 替换族实例 /// [Transaction(TransactionMode.Manual)] public class ReplaceInstanceCmd : ExternalCommand { public override void Execute() { var elementIds = new List(); if ( UiDocument.SelectObject( new FuncFilter( e => e is FamilyInstance instance && instance.Symbol.Family.FamilyPlacementType is FamilyPlacementType.OneLevelBased or FamilyPlacementType.WorkPlaneBased or FamilyPlacementType.TwoLevelsBased ), "请选择目标族实例" ) is not FamilyInstance instanceToMatch ) { Result = Result.Cancelled; return; } var instancesReplace = UiDocument.SelectObjects( new FuncFilter(e => e is FamilyInstance instance && instance.Id != instanceToMatch.Id), "请选择被替换(修改)的族实例" ).Cast(); if (!instancesReplace.Any()) { Result = Result.Cancelled; return; } Document.Invoke( _ => { instanceToMatch.Symbol.Activate(); foreach (var instanceReplace in instancesReplace) { //跳过相同的实例 if (instanceReplace.Id == instanceToMatch.Id) { continue; } var p1 = instanceReplace.GetLocXYZ(); var p2 = instanceReplace.HandOrientation; //默认当前平面视图标高 var level = Document.ActiveView.GenLevel; var placementType = instanceToMatch.Symbol.Family.FamilyPlacementType; FamilyInstance newInstance = null; switch (placementType) { case FamilyPlacementType.OneLevelBased: { newInstance = Document.Create.NewFamilyInstance( p1, instanceToMatch.Symbol, level, StructuralType.NonStructural ); } break; case FamilyPlacementType.TwoLevelsBased: { level = Document.GetElement(instanceToMatch.LevelId) as Level; newInstance = Document.Create.NewFamilyInstance( p1, instanceToMatch.Symbol, level, StructuralType.NonStructural ); } break; case FamilyPlacementType.WorkPlaneBased: { newInstance = Document.Create.NewFamilyInstance( level.GetPlaneReference(), p1, p2, instanceToMatch.Symbol ); } break; default: break; } foreach (Parameter paramSource in instanceReplace.Parameters) { //var defini = paramSource.Definition as InternalDefinition; var b = paramSource.Definition is InternalDefinition definition && ( definition.BuiltInParameter != BuiltInParameter.INVALID && definition.BuiltInParameter != BuiltInParameter.DOOR_NUMBER && definition.BuiltInParameter != BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS ); if (b || paramSource.IsReadOnly || !paramSource.HasValue) { continue; } foreach (Parameter paramToWrite in newInstance.Parameters) { if (paramSource.Definition.Name == paramToWrite.Definition.Name) { paramToWrite.SetValue(paramSource.GetValue()); } } Document.Regenerate(); } elementIds.Add(instanceReplace.Id); } Document.Delete(elementIds); }, "替换族实例" ); } }