2024-09-22 11:05:41 +08:00
|
|
|
|
using Autodesk.Revit.Attributes;
|
|
|
|
|
|
using Autodesk.Revit.DB;
|
|
|
|
|
|
using Autodesk.Revit.DB.Structure;
|
|
|
|
|
|
using Autodesk.Revit.UI;
|
|
|
|
|
|
using Nice3point.Revit.Toolkit.External;
|
|
|
|
|
|
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-04-24 20:56:44 +08:00
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.RvFamily;
|
2024-09-22 11:05:41 +08:00
|
|
|
|
|
|
|
|
|
|
/// <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);
|
|
|
|
|
|
},
|
|
|
|
|
|
"替换族实例"
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|