如何在施耐德TGML编辑器中获取指定ColNum对象的Width最大值?
问题
需要遍历所有Row和Point对象,捕获ColNum属性等于指定值(例如2)的对象的Width属性值,最终计算这些值的最大值。以下是适配施耐德电气TGML编辑器的原代码:
function load(evt) { var TGMLDocument; var comp; var Point; var Row; var Row_; var colNum; var testArr1 = {}; var testArr2; TGMLDocument = evt.getCurrentTarget().getOwnerDocument().getDocumentElement(); comp = evt.getCurrentTarget(); Row = nodeFilter(TGMLDocument, "Id", "GlobalRowsX"); // Point = nodeFilter(comp, "Id", "Point"); for (var i = 0; i < Row.length; i++) { // console.log("The Row is", i); Point = nodeFilter(Row[i], "Id", "Point"); for (var j = 0; j < Point.length; j++) { console.log("The Row is " + i + ", The Point is " + j); Point[j].setAttribute("ColNum", j); console.log("The Column Number is " + Point[j].getAttribute("ColNum")); } } } function nodeFilter(cComp, attrName, attrValue, searchType) { try { var returnArr = []; switch (searchType) { case 'children': var children = cComp.getChildNodes(); break; case 'nested': var children = cComp.getElementsByTagName('*'); break; default: var children = cComp.getChildNodes(); } for (var i = 0; i < children.length; i++) { try { if (children.item([i]).hasAttribute(attrName)) { if (children.item([i]).getAttribute(attrName) == attrValue) { returnArr.push(children.item([i])); } } } catch (err) {} } if (returnArr.length > 1) { return returnArr; } else if (returnArr.length > 0) { return returnArr[0]; } else { return null; } } catch (err) {} }
尝试过用数组、对象和eval创建动态变量,但未成功实现需求,希望得到正确的实现方式。
解决方案
核心思路是用数组存储符合条件的Width值,再通过Math.max()计算最大值,无需动态变量。具体实现步骤如下:
- 定义目标
ColNum值(比如2),并初始化一个空数组用于存放对应的Width值。 - 遍历所有Row和Point时,判断当前Point的
ColNum是否匹配目标值,若匹配则提取其Width属性,转为数字后存入数组。 - 遍历完成后,用
Math.max()计算数组的最大值,注意处理数组为空的边界情况。
修改后的完整代码:
function load(evt) { var TGMLDocument; var comp; var Point; var Row; // 定义目标ColNum值 const targetColNum = 2; // 存储符合条件的Width值 const widthValues = []; TGMLDocument = evt.getCurrentTarget().getOwnerDocument().getDocumentElement(); comp = evt.getCurrentTarget(); Row = nodeFilter(TGMLDocument, "Id", "GlobalRowsX"); for (var i = 0; i < Row.length; i++) { Point = nodeFilter(Row[i], "Id", "Point"); // 处理nodeFilter可能返回单个元素的情况,统一转为数组 const pointsArray = Array.isArray(Point) ? Point : [Point]; for (var j = 0; j < pointsArray.length; j++) { const currentPoint = pointsArray[j]; currentPoint.setAttribute("ColNum", j); const colNum = parseInt(currentPoint.getAttribute("ColNum"), 10); // 判断是否匹配目标ColNum if (colNum === targetColNum) { // 提取Width并转为数字,存入数组 const width = parseFloat(currentPoint.getAttribute("Width")); if (!isNaN(width)) { widthValues.push(width); } } } } // 计算最大值 let maxWidth = 0; if (widthValues.length > 0) { maxWidth = Math.max(...widthValues); } console.log(`ColNum为${targetColNum}的Width最大值:`, maxWidth); } function nodeFilter(cComp, attrName, attrValue, searchType) { try { var returnArr = []; switch (searchType) { case 'children': var children = cComp.getChildNodes(); break; case 'nested': var children = cComp.getElementsByTagName('*'); break; default: var children = cComp.getChildNodes(); } for (var i = 0; i < children.length; i++) { try { if (children.item([i]).hasAttribute(attrName)) { if (children.item([i]).getAttribute(attrName) == attrValue) { returnArr.push(children.item([i])); } } } catch (err) {} } if (returnArr.length > 1) { return returnArr; } else if (returnArr.length > 0) { return returnArr[0]; } else { return null; } } catch (err) {} }
关键说明
- 统一数组处理:
nodeFilter可能返回单个元素或数组,通过Array.isArray()统一转为数组,避免遍历报错。 - 类型转换:属性值默认是字符串,用
parseInt()/parseFloat()转为数字,确保数值计算正确。 - 边界处理:判断
width是否为有效数字,避免NaN存入数组;数组为空时默认最大值为0,可根据需求调整。 - 避免动态变量:直接用数组存储符合条件的值,比动态变量更安全、易维护。
内容的提问来源于stack exchange,提问作者Kevin Christian
相关产品推荐
相关产品推荐

