【Eplan-Api】检查项目内元件是否已经选择部件
注明
测试版本为EplanP8,版本为2.9。
初步学习,程序非最优方式,仅提供思路,欢迎交流。
点击进入Eplan官方Api链接,注意文档为全英文。
思路
- 首先必须选中项目,判断是项目效率才高,如果只是单纯的某一页,不如直接用肉眼看。
- 遍历项目内所有页面,遍历页面内部件,然后判断元件是否已经选择部件。
- 由于元件的类型太多,实际我们需要选出我们需要的某些类型的元件。
- 注意元件只有“主功能”才需要选择部件,端子同理。
- 对于未选择部件的元件,返回页面名称和标识符,方便后续纠错。
检查元件是否已经选择部件
1:判断选取焦点是否为项目,然后遍历项目出我们需要的元件
SelectionSet 类
可以使用 SelectionSet::GetCurrentProject 方法获取用户当前正在处理的项目。
也可以通过 SelectionSet::GetSelectedPages 方法获取当前选定的页面。
根据图形编辑器或页面概述对话框当前是否具有焦点,可以选择一个或多个页面。
最重要的是,可以通过 SelectionSet.Select 属性从任何焦点(非模态)对话框中选择任何对象集。这些对象由函数作为 StorableObject 数组返回。可以遍历数组并确定有关对象的类型(以及任何其他信息)。
SelectionSet selectionSet = new SelectionSet();
StorableObject[] storableObjects = selectionSet.Selection;
if (storableObjects.Length == 0)
{
MessageBox.Show("未选择项目!");
}
else
{
foreach (StorableObject storableObject in storableObjects)
{
//选择的是项目
if (storableObject is Project)
{
//遍历项目内所有界面
foreach (Page page in ((Project)storableObject).Pages)
{
//遍历界面内所有可放置的部件符号等等
foreach (Placement placement in page.AllPlacements)
{
如果Placement是逻辑设备(例如端子,断路器等等)
if (placement is Function)
{
;
}
}
}
}
}
}
2.定义需要使用的变量
//部件选择数量
int PartCount;
//元件类型
string PartCctegory = "";
int i = 0, j = 0;
//用于最后的页面的字符串输出
string PageNameSum = "";
string[] PageName = new string[1000];
3.获取元件的类型和部件选择数量。
//部件选型数量
PartCount = ((Function)placement).ArticleReferences.Length;
//部件类型
PartCctegory = ((Function)placement).Category.ToString();
4.这里提供几种元件类型的名字。
安全开关:CircuitBreaker 端子:Terminal 漏电保护:CurrentCircuitBreaker 开关:Switch 断路器:Overload 线缆:Cable 接触器:Coil
5.判断是否是我们需要判断的元件,然后部件数量为0,元件是主功能。
((Function)placement).IsMainFunction),返回TRUE则代表是主功能。
if ((PartCctegory == "CircuitBreaker" || PartCctegory == "CurrentCircuitBreaker" ||
PartCctegory == "Overload" || PartCctegory == "Cable" ||PartCctegory == "Coil")
&& PartCount==0 && ((Function)placement).IsMainFunction)//注意设备还必须是主功能
{
PageName[i] = ((Function)placement).Page.Name.ToString() + " " + PartCctegory + " " + ((Function)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
i++;
j++;
}
//如果是端子则只有主端子需要选部件
else if(PartCctegory == "Terminal" && ((Terminal)placement).IsMainTerminal && PartCount == 0)
{
PageName[i] = ((Function)placement).Page.Name.ToString() + " " + PartCctegory + " " + ((Function)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
i++;
j++;
}
6.需要补充的是端子分为主端子和分布式端子,端子不用用元件是否是主功能来判断,只能用端子自己的主端子来判断。
((Terminal)placement).IsMainTerminal,返回TRUE则代表主端子。
7.最后输出结果,这里为了方便查看,新建了一个界面显示。
for (i = 0; i < j; i++)
{
PageNameSum = PageNameSum + PageName[i] +" "+ "存在未选型" + "\n";
}
FormAll.FormLabel.Variable.Label = PageNameSum;
FormAll.FormLabel form = new FormAll.FormLabel();
form.Show();
效果演示
可以自由对需要检查的元件加入IF条件中,不知道元件名字可以用该指令查询。
PartCctegory = ((Function)placement).Category.ToString();