You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在施耐德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()计算最大值,无需动态变量。具体实现步骤如下:

  1. 定义目标ColNum值(比如2),并初始化一个空数组用于存放对应的Width值。
  2. 遍历所有Row和Point时,判断当前Point的ColNum是否匹配目标值,若匹配则提取其Width属性,转为数字后存入数组。
  3. 遍历完成后,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:13:22