启动时通过数据库字符串输入创建AnyLogic网络节点
解决AnyLogic从数据库批量创建PointNode的问题
你的代码存在几个关键问题,导致无法正确创建节点:
- 类型不匹配错误:将数据库返回的字符串类型节点名直接赋值给
PointNode类型变量,编译阶段就会报错。 - PointNode构造方式错误:AnyLogic的可视化元素(包括PointNode)需要关联到模型的agent上下文,不能直接调用无参构造函数
new PointNode()。 - 节点名称未配置:读取了数据库中的节点名,但未将其绑定到创建的PointNode对象。
- 网络添加节点方法错误:
addAll()用于添加节点集合,单个节点应该使用add()方法。
修正后的代码如下:
// 初始化变量 double x, y, z; String nodeName; PointNode pn; // 从数据库读取所有节点坐标数据 List<Tuple> rows = selectFrom(node_coord).list(); // 遍历每一行数据创建节点 for (Tuple row : rows) { // 读取数据库中的节点名称和坐标 nodeName = row.get(node_coord.name); x = row.get(node_coord.x_coord); y = row.get(node_coord.y_coord); z = row.get(node_coord.z_coord); // 创建PointNode,传入当前模型作为上下文(代码在主模型里用this,子agent里用对应上下文) pn = new PointNode(this); // 设置节点名称 pn.setName(nodeName); // 设置节点外观 pn.setRadius(5); pn.setLineColor(red); // 设置节点坐标 pn.setPos(x, y, z); // 将节点添加到网络n中 n.add(pn); }
补充说明:
- 构造
PointNode时传入的this,如果代码在主模型中编写直接用即可;如果在子agent里,需要替换为对应的上下文agent(比如getMain()或getParent(),根据模型结构调整)。 - 后续若需通过节点名称查找节点,可使用
n.findNodeByName(nodeName)获取对应PointNode对象。
内容的提问来源于stack exchange,提问作者bluechimp
相关产品推荐
相关产品推荐

