如何检查给定阶段中是否存在家族实例?
How can I check if a family instance exists in a given phase?
我正在尝试编写一个函数来告诉我某个家族实例是否存在于特定阶段。像这样:
public static bool FamilyExists(FamilyInstance fi, Phase phase)
和returns判断对错。对于“存在”,我的意思是它在输入阶段之前已经创建,并且还没有被拆除。
我看到的问题是我只能从元素中获取 CreatedPhaseId 和 DemolishedPhaseId。由于输入阶段可能与这两个不同,因此仅获取我需要的信息是不够的。理想情况下,我希望 API 提供 属性“ElementExists”或类似的。
我一直在互联网上搜索解决方案,但没有成功。
如果你能帮助我,我将不胜感激。
谢谢。
您要查找的参数是内置参数“PHASE_SEQUENCE_NUMBER”
这是“FamilyExistsInPhase”的示例:
public static bool FamilyExistsInPhase(Document doc, FamilyInstance fi, Phase phase)
{
bool exists = true;
var seqNumber = GetPhaseSequenceNumber(phase);
var createdParam = fi.get_Parameter(BuiltInParameter.PHASE_CREATED);
var createdPhaseId = createdParam.AsElementId();
var createdPhase = doc.GetElement(createdPhaseId) as Phase;
var createdPhaseSeqNumber = GetPhaseSequenceNumber(createdPhase);
var demolParam = fi.get_Parameter(BuiltInParameter.PHASE_DEMOLISHED);
var demolPhaseId = demolParam.AsElementId();
Phase demolPhase = (demolPhaseId != null) ? doc.GetElement(demolPhaseId) as Phase : null;
// if demolished phase equals null --> element won't be demolished --> set to high number
var demolPhaseSeqNumber = (demolPhase != null) ? GetPhaseSequenceNumber(demolPhase) : 1000;
// if the element is constructed before or in same phase
if (createdPhaseSeqNumber <= seqNumber)
{
// if it gets demolished later
// or not at all if 1000
if (demolPhaseSeqNumber > seqNumber)
{
exists = true;
}
}
return exists;
}
public static int GetPhaseSequenceNumber(Phase p)
{
return p.get_Parameter(BuiltInParameter.PHASE_SEQUENCE_NUMBER).AsInteger();
}
我希望这对你有用。
不是最好的解决方案,但它完成了工作。
简单多了。使用 Element.GetPhaseStatus() 怎么样?
你给它一个阶段,它会告诉你元素在那个阶段的状态?
我正在尝试编写一个函数来告诉我某个家族实例是否存在于特定阶段。像这样:
public static bool FamilyExists(FamilyInstance fi, Phase phase)
和returns判断对错。对于“存在”,我的意思是它在输入阶段之前已经创建,并且还没有被拆除。
我看到的问题是我只能从元素中获取 CreatedPhaseId 和 DemolishedPhaseId。由于输入阶段可能与这两个不同,因此仅获取我需要的信息是不够的。理想情况下,我希望 API 提供 属性“ElementExists”或类似的。 我一直在互联网上搜索解决方案,但没有成功。
如果你能帮助我,我将不胜感激。
谢谢。
您要查找的参数是内置参数“PHASE_SEQUENCE_NUMBER”
这是“FamilyExistsInPhase”的示例:
public static bool FamilyExistsInPhase(Document doc, FamilyInstance fi, Phase phase)
{
bool exists = true;
var seqNumber = GetPhaseSequenceNumber(phase);
var createdParam = fi.get_Parameter(BuiltInParameter.PHASE_CREATED);
var createdPhaseId = createdParam.AsElementId();
var createdPhase = doc.GetElement(createdPhaseId) as Phase;
var createdPhaseSeqNumber = GetPhaseSequenceNumber(createdPhase);
var demolParam = fi.get_Parameter(BuiltInParameter.PHASE_DEMOLISHED);
var demolPhaseId = demolParam.AsElementId();
Phase demolPhase = (demolPhaseId != null) ? doc.GetElement(demolPhaseId) as Phase : null;
// if demolished phase equals null --> element won't be demolished --> set to high number
var demolPhaseSeqNumber = (demolPhase != null) ? GetPhaseSequenceNumber(demolPhase) : 1000;
// if the element is constructed before or in same phase
if (createdPhaseSeqNumber <= seqNumber)
{
// if it gets demolished later
// or not at all if 1000
if (demolPhaseSeqNumber > seqNumber)
{
exists = true;
}
}
return exists;
}
public static int GetPhaseSequenceNumber(Phase p)
{
return p.get_Parameter(BuiltInParameter.PHASE_SEQUENCE_NUMBER).AsInteger();
}
我希望这对你有用。 不是最好的解决方案,但它完成了工作。
简单多了。使用 Element.GetPhaseStatus() 怎么样? 你给它一个阶段,它会告诉你元素在那个阶段的状态?