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

如何通过脚本创建EA.Propertytype对象及实现Tagged Value Types查询

Tagged Value Type操作脚本问题解答

1. 为啥手动创建EA.Propertytype对象不行?

EA的COM对象(包括EA.Propertytype)不能直接声明后就赋值使用,这类对象都是EA内部管理的,只能从Repository.Propertytypes集合里获取已有的实例,或者通过EA官方提供的合法API创建(不过Tagged Value Type没有直接的创建API,你用SQL插入后刷新集合的路子是对的,但自己手动构造对象实例根本行不通)。你写的var TVT as EA.Propertytype;只是声明了一个空引用,根本没创建EA认可的对象,自然没法赋值。

2. Repository.Propertytypes.GetByName()没返回结果的可能原因

  • 大小写敏感:这个方法对名称大小写较真,你传的参数必须和Tagged Value Type的名称(对应t_propertytypes表的property字段)完全一致,包括大小写、空格都不能错。
  • 没刷新集合:如果刚用SQL新增/修改了类型,必须先调用Repository.Propertytypes.Refresh(),不然集合里还是旧缓存,GetByName()肯定找不到新条目。
  • 名称带特殊字符:如果名称里有单引号、空格这类特殊字符,直接传参可能导致匹配失败,得确保参数是原始的正确名称。

3. 能用的getTV_Type实现方案

方案一:搞定GetByName()的正确用法

只要名称没问题、集合也刷新了,直接用这个方法就行:

function getTV_Type(tagNaam) {
    // 先刷新集合确保数据是最新的
    Repository.Propertytypes.Refresh();
    let tvt = Repository.Propertytypes.GetByName(tagNaam);
    return tvt; // 找到就返回EA.Propertytype对象,找不到返回null
}

方案二:遍历集合(稳得一批的兜底方案)

要是GetByName()还是不好使,遍历集合是最靠谱的方式:

function getTV_Type(tagNaam) {
    Repository.Propertytypes.Refresh();
    let count = Repository.Propertytypes.Count;
    for(let i = 0; i < count; i++) {
        let tvt = Repository.Propertytypes.GetAt(i);
        if(tvt.Tag === tagNaam) { // 注意:Tag属性对应数据库里的property字段
            return tvt;
        }
    }
    return null; // 没找到就返回null
}

方案三:SQL查询+集合取对象(避免手动造对象)

如果你想用SQL先确认存在,再从集合里拿对象(毕竟没法手动造EA.Propertytype):

function getTV_Type(tagNaam) {
    // 先用SQL查有没有这个类型
    let sql = formatString("SELECT property FROM t_propertytypes WHERE property = '{0}';", [tagNaam]);
    let xmlResult = Repository.SQLQuery(sql);
    // EA的SQLQuery返回XML格式,判断有没有结果
    if(xmlResult.indexOf("<Row>") !== -1) {
        Repository.Propertytypes.Refresh();
        // 从集合里拿对象
        return Repository.Propertytypes.GetByName(tagNaam);
        // 也可以换成上面的遍历方式,更稳妥
        // let count = Repository.Propertytypes.Count;
        // for(let i = 0; i < count; i++) {
        //     let tvt = Repository.Propertytypes.GetAt(i);
        //     if(tvt.Tag === tagNaam) return tvt;
        // }
    }
    return null;
}

额外优化:你的新增脚本可以加个去重判断

你提到新增类型仅在类型不存在时生效,给addTV_Type加个判断就行:

function addTV_Type(tagNaam, description, notes) {
    // 先检查有没有这个类型
    let existing = getTV_Type(tagNaam);
    if(existing) {
        return; // 已经存在就不插了
    }
    let sql = formatString("INSERT INTO t_propertytypes (property, description, notes) VALUES ('{0}', '{1}', '{2}');", [tagNaam, description, notes]);
    Repository.SQLQuery(sql);
    Repository.Propertytypes.Refresh();
}

内容的提问来源于stack exchange,提问作者Rob Aarnts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:22:30