Files
ShrlAlgoToolkit/Sai.RvKits/RvFamily/ReplaceInstanceCmd.cs
2024-09-22 11:05:41 +08:00

135 lines
5.2 KiB
C#

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External;
namespace Sai.RvKits.RvFamily;
/// <summary>
/// 替换族实例
/// </summary>
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class ReplaceInstanceCmd : ExternalCommand
{
public override void Execute()
{
var elementIds = new List<ElementId>();
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<FamilyInstance>();
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);
},
"替换族实例"
);
}
}