注明
测试版本为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 InterruptionPoint)
{
;
}
}
}
}
}
}
2.定义需要使用的变量
//关联字符串定义
int i = 0, j = 0;
//用于最后的页面的字符串输出
string PageNameSum = "";
//用于记录未关联中断点所处的页面
string[] PageName = new string[1000];
3.判断中断点的标识符属性是否为空,如果为空记录下改中断点所处的页面。
//判断中断点是否有标识符
if (((InterruptionPoint)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString() == "")
{
if (i < 1000)
{
//记录未关联中断点的页面名字
PageName[i] = ((InterruptionPoint)placement).Page.Name.ToString();
i++;
j++;
}
}
4.把统计的未关联页面名称和成一个字符串,放便输出
for (i = 0; i < j; i++)
{
PageNameSum = PageNameSum + PageName[i] + " 存在未关联" + "\n";
}
检查中断点是否重复
1.中断点重复必须记录下所有的中断点,然后处理判断次数,超过3次表示重复关联。并且还需要记录下出现过的页面名字。
//重复字符串定义
string PageNameRepetSum = "";
string PageNameRepetPageSum = "";
bool MidStates;
string[] PageNameRepet = new string[10000];
string[] PageNameRepetPage = new string[10000];
int[,] Counts = new int[10000, 1];
int a = 0, b = 0, c = 0;
2.记录下所有中断点,,然后遍历记录的数组,次数用一个二维数组表示,暂时不用担心重复计数的问题,后面专门处理。*[注]
//获取中断点的标识符,同时记录重复次数,方便后续判断
PageNameRepet[a] = ((InterruptionPoint)placement).Properties.FUNC_DEVICETAG_MAIN_WITHSEPARATOR.ToString();
PageNameRepetPage[a] = ((InterruptionPoint)placement).Page.Name;
Counts[a, 0] = 0;
foreach (string str in PageNameRepet)
{
if (str == PageNameRepet[a])
{
Counts[a, 0]++;
}
}
a++;
3.由于记录的顺序是从小到大,中断点重复就会在后面重复计数,我们实际只取同名中断点最高次数的值,所以从大到小判断,同时滤过同名中断点的记录值。*[注]
//逆序,方便取次数的最大值
for (i = a - 1; i >= 0; i--)
{
if (Counts[i, 0] > 2)
{
//定义中间量
MidStates = true;
for (c = i + 1; c < a; c++)
{
//如果后续有重复则不再记录
if (PageNameRepet[i] == PageNameRepet[c])
{
MidStates = false;
}
}
if (MidStates)
{
PageNameRepetPageSum = "";
for (c = 0; c < a; c++)
{
//如果后续有重复则不再记录
if (PageNameRepet[c] == PageNameRepet[i])
{
PageNameRepetPageSum = PageNameRepetPageSum + PageNameRepetPage[c] + " ";
}
}
PageNameRepetPageSum =
PageNameRepetSum = PageNameRepetSum + PageNameRepet[i] + " 存在关联重复,关联次数 " + Counts[i, 0] + " " + "关联位置:" + PageNameRepetPageSum + "\n";
}
}
}
效果演示
为了方便查看,新建了一个界面,显示字符串。同时也方便把窗口放在一旁,一边去图纸中找有问题的位置。
对于一些特殊的中断点,可以在程序中&&条件,防止误提示,毕竟一些特殊中断点是需要重复使用的。