Compare commits

...

191 Commits

Author SHA1 Message Date
joylink_fanyuhong
d31acd3688 环境配置问题修复 2024-10-30 17:19:44 +08:00
joylink_fanyuhong
e04e855c66 创建列车新增列车编组 2024-10-15 09:28:27 +08:00
joylink_fanyuhong
209f42fead 取消拦截器无权限提示 2024-10-11 17:08:21 +08:00
joylink_fanyuhong
dacebbc9ff 接口服务调整 2024-10-09 17:46:51 +08:00
joylink_fanyuhong
0882a88c0a 权限调整 2024-10-09 16:56:14 +08:00
joylink_fanyuhong
0704c6da0c 权限调整 2024-10-09 16:18:48 +08:00
joylink_zhaoerwei
42ff85422e 调整列车驾驶台元素大小 2024-10-09 15:10:06 +08:00
joylink_fanyuhong
7f102ad837 项目启动添加loading 2024-10-09 14:11:13 +08:00
joylink_fanyuhong
fbdf490a30 列车操作顺序调整 2024-10-08 16:17:22 +08:00
joylink_fanyuhong
bbcb8edaaa 列车操作顺序调整 2024-10-08 15:37:17 +08:00
joylink_fanyuhong
34af6397ae Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-10-08 15:33:45 +08:00
joylink_fanyuhong
5aaec3388f 列车右键和面板操作同步 2024-10-08 15:33:44 +08:00
tiger_zhou
c2e79a73f7 proto文件更新 2024-10-08 09:10:32 +08:00
tiger_zhou
dcb01159b3 proto文件更新 2024-10-08 09:02:21 +08:00
tiger_zhou
6e2079aa65 proto文件更新 2024-09-09 09:15:31 +08:00
joylink_fanyuhong
a4c35bb464 添加紧急制动减速度参数 2024-08-30 16:58:17 +08:00
fan
e426a09ea7 proto同步 2024-08-30 16:48:07 +08:00
joylink_fanyuhong
30681803ec 删除基本参数 -最大速度 2024-08-30 10:20:17 +08:00
joylink_zhaoerwei
78b7b6be9f 手柄操作请求频率+显示位置百分比 2024-08-30 10:13:13 +08:00
joylink_fanyuhong
cfd27e6539 拼写错误调整 2024-08-29 19:00:18 +08:00
joylink_fanyuhong
34edce551b 参数拼写错误调整 2024-08-29 18:28:02 +08:00
joylink_fanyuhong
94607edcfe Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-08-29 17:40:37 +08:00
joylink_fanyuhong
0db11ff3da 列车添加基本信息 2024-08-29 17:40:35 +08:00
joylink_zhaoerwei
e39774e4bc 驾驶台手柄0位范围扩大,在范围内自动吸附到0位 2024-08-29 17:27:47 +08:00
fan
f61ee0610c proto同步 2024-08-29 16:55:59 +08:00
fan
3c856ec37c protoc同步 2024-08-29 16:14:30 +08:00
joylink_zhaoerwei
0ac19e5d35 修改请求参数(门模式) 2024-08-27 11:44:09 +08:00
joylink_zhaoerwei
8f9c0c852a 驾驶台旋钮操作bug修复 2024-08-22 14:31:15 +08:00
joylink_fanyuhong
e5e632104c 引入文件问题调整 2024-08-22 11:26:35 +08:00
joylink_zhaoerwei
67ae3156c6 驾驶台钥匙增加列车门模式类型 2024-08-22 08:45:02 +08:00
joylink_fanyuhong
191203c274 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-08-22 08:41:59 +08:00
joylink_fanyuhong
3773aef4ac 添加公里标长短链数据 2024-08-22 08:41:56 +08:00
joylink_zhaoerwei
1b85571005 驾驶台接收信息修改(待与后端测试) 2024-08-21 18:23:43 +08:00
joylink_zhaoerwei
fe56bdc27d 旋钮请求更改 2024-08-21 17:37:48 +08:00
fan
5313a00dc6 proto同步 2024-08-21 16:57:21 +08:00
joylink_zhaoerwei
f73b171f15 计轴区段的显示和状态(待与后端测试) 2024-08-12 18:00:50 +08:00
joylink_fanyuhong
eabfd3ddb7 联锁编号映射数据调整 2024-08-12 16:25:16 +08:00
fan
21d4c0aa8f proto同步数据 2024-08-12 16:05:39 +08:00
joylink_fanyuhong
73fc258109 应答器报文编辑调整 2024-08-08 15:11:55 +08:00
joylink_fanyuhong
62cdb1e8d9 草稿应答器报文属性可编辑 2024-08-08 14:58:28 +08:00
joylink_zhaoerwei
a6f0604423 同步protoc 2024-08-06 13:15:20 +08:00
joylink_zhaoerwei
4c1889c250 第三方接口增加服务描述 2024-07-19 14:32:32 +08:00
joylink_fanyuhong
87eb3906e1 列车链接状态调整 2024-07-19 14:25:21 +08:00
joylink_fanyuhong
f6ba3de79d 链接key值调整 2024-07-19 10:21:59 +08:00
joylink_fanyuhong
9be34a00c7 列车连击调整 2024-07-19 09:21:32 +08:00
joylink_fanyuhong
9112a3c73a 应答器添加LEU索引数据 2024-07-11 16:29:10 +08:00
joylink_fanyuhong
2136bd3c0f message同步 2024-07-11 16:12:47 +08:00
joylink_zhaoerwei
516e1d33d5 灯的状态信息处理 2024-07-04 17:37:10 +08:00
joylink_zhaoerwei
c2338efaf9 驾驶台高度微调 2024-07-04 16:30:15 +08:00
joylink_zhaoerwei
7a1925cfbe 列车驾驶台按钮+灯备用 2024-07-04 15:29:41 +08:00
joylink_zhaoerwei
6d54d2e5d5 更改前端pixi绘图版本 2024-07-04 09:17:51 +08:00
joylink_zhaoerwei
9de360e84e 驱采表显示固定表头 2024-07-01 13:48:42 +08:00
joylink_zhaoerwei
6f013e709e 不覆盖驱采时增加校验:如果驱采的继电器id改变,变为新的id;如果驱采的继电器没有生成,删除针对该继电器的驱采数据 2024-06-28 17:21:33 +08:00
joylink_zhaoerwei
7cb3586ad5 拖拽组件添加可变宽高配置(鼠标放置左边和上方移动改变弹框大小) 2024-06-27 18:06:32 +08:00
joylink_zhaoerwei
530a6cf1a3 驱采绘制点击变背景色 2024-06-27 16:40:19 +08:00
joylink_zhaoerwei
d4c5e5a4a8 继电器增加批量操作 2024-06-27 15:41:42 +08:00
joylink_zhaoerwei
71f0346bf0 增加空的枚举,生成的时候是空 2024-06-27 14:40:05 +08:00
joylink_zhaoerwei
9bbbe7b3e2 默认初始位置 2024-06-27 13:53:58 +08:00
joylink_zhaoerwei
4373cb7dc2 增加空格跳到下一个位置 2024-06-26 15:25:44 +08:00
joylink_zhaoerwei
7e62e88ac0 继电器图增加Ctrl和alt快捷键 2024-06-26 14:44:19 +08:00
joylink_zhaoerwei
0e7de4afa8 增加数据位置调整功能 2024-06-25 19:02:34 +08:00
joylink_zhaoerwei
35eab5ac87 驱采数据加清空 2024-06-25 15:48:06 +08:00
joylink_zhaoerwei
54ee649581 微调 2024-06-25 11:25:09 +08:00
joylink_zhaoerwei
94060bd5e8 修改继电器布局 2024-06-25 11:21:30 +08:00
joylink_zhaoerwei
8e62b39f34 继电器状态图显示调整+spks生成调整 2024-06-25 09:16:17 +08:00
joylink_zhaoerwei
059a333370 生成继电器增加展示编号配置 2024-06-24 21:08:58 +08:00
joylink_zhaoerwei
ad7a1a8451 增加IBP盘扣车继电器(IKCJ)、增加GDJ(计轴电源故障继电器)和ZFWJ 2024-06-24 18:35:14 +08:00
joylink_zhaoerwei
b7a3200560 道岔物理区段也生成GJ继电器 2024-06-24 08:41:16 +08:00
joylink_zhaoerwei
3a372610cf 集中区分割线代码优化(风格线位于边界处一侧未关联区段) 2024-06-20 17:41:27 +08:00
joylink_zhaoerwei
d784e2f0e6 一键关联集中站加道岔物理区段也关联 2024-06-19 10:56:19 +08:00
joylink_zhaoerwei
00d413d494 1.生成计轴时删除区段有问题的计轴(区段延伸处)2.隐藏使用集中区分割线的其他线边界处3.隐藏数据校验 2024-06-19 09:56:52 +08:00
fan
e83a0211ed Merge branch 'develop' of https://gitea.joylink.club/joylink/rts-sim-testing-client into develop 2024-06-12 17:36:51 +08:00
fan
542745ef84 连锁映射数据调整 2024-06-12 17:36:47 +08:00
joylink_fanyuhong
0ca1979eba Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-06-06 17:47:19 +08:00
joylink_fanyuhong
97b767248e 通信状态提示位置调整 2024-06-06 17:47:17 +08:00
joylink_zhaoerwei
d621373abb url更改 2024-06-05 10:03:51 +08:00
fan
13e5b77a97 连锁映射数据切换丢失数据问题调整 2024-05-29 14:16:34 +08:00
fan
6e6c665e6b 连锁映射问题调整 2024-05-29 14:03:01 +08:00
fan
e0714ffbde 删除日志 2024-05-28 13:23:06 +08:00
fan
f63c639dc1 连锁编号映射数据调整 2024-05-28 13:19:56 +08:00
fan
cb7037dcee 联锁映射调整暂提 2024-05-27 22:25:12 +08:00
fan
c1741e0aba 扣车按钮&无人折返按钮 2024-05-27 20:52:52 +08:00
joylink_fanyuhong
b504c7482b 联锁编号映射暂提 2024-05-25 10:06:05 +08:00
fan
1035f1751a protoc同步 2024-05-25 08:58:58 +08:00
joylink_fanyuhong
d45232e6c9 联锁编号映射暂提 2024-05-24 20:45:37 +08:00
joylink_fanyuhong
e769e16fc3 列车链接平台调整 2024-05-23 16:39:14 +08:00
fan
d7099b3163 Merge branch 'develop' of https://gitea.joylink.club/joylink/rts-sim-testing-client into develop 2024-05-23 16:29:31 +08:00
fan
8acf4b0308 同步protoc 2024-05-23 16:29:27 +08:00
fan
0fe4de834f 同步protoc 2024-05-23 16:28:58 +08:00
tiger_zhou
d8600d9460 添加北京现场打包脚本及地址 2024-05-21 17:28:27 +08:00
tiger_zhou
c3fc0c18e6 添加北京现场打包脚本及地址 2024-05-21 16:46:53 +08:00
joylink_fanyuhong
f0db718c54 列车调整 2024-05-13 10:32:13 +08:00
joylink_fanyuhong
cc8c2cf8de Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-05-11 17:05:14 +08:00
joylink_fanyuhong
c4b35b3493 列车调整 2024-05-11 17:05:11 +08:00
joylink_zhaoerwei
4acd4ccfe5 前端pixi框架版本更新 2024-05-11 15:34:35 +08:00
joylink_fanyuhong
aa7ad1edac 列车激活端方向调整 2024-05-11 11:00:54 +08:00
joylink_fanyuhong
a4231d1813 列车车头调整 2024-05-11 09:58:23 +08:00
joylink_fanyuhong
182ea7c099 列车车头激活端调整 2024-05-11 09:27:48 +08:00
joylink_zhaoerwei
959592c17b 同步protoc 2024-05-11 08:27:32 +08:00
joylink_zhaoerwei
00b61a2891 配置生成区段继电器 2024-05-10 15:27:30 +08:00
joylink_zhaoerwei
9738678e54 打开列车驾驶台优化 2024-05-09 17:23:28 +08:00
joylink_zhaoerwei
89012e6290 列车驾驶台方向按钮操作失败会回到之前的位置 2024-05-09 16:08:02 +08:00
joylink_fanyuhong
bdefc71cef 列车位置计算浮点数误差 2024-05-09 15:43:27 +08:00
joylink_zhaoerwei
2e3fc1a1f2 切换列车驾驶台重新加载(订阅路径变) 2024-05-07 15:12:28 +08:00
joylink_zhaoerwei
a337216236 列车驾驶台加对应列车索引+生成继电器时加是否覆盖之前的采集驱动数据 2024-05-07 13:09:16 +08:00
joylink_fanyuhong
e71ff9a5c7 添加列车fooder调整 2024-04-30 14:21:47 +08:00
joylink_fanyuhong
ac8c193586 列车连接处理 2024-04-29 14:40:34 +08:00
joylink_fanyuhong
203525e371 message 2024-04-26 15:52:15 +08:00
joylink_fanyuhong
5e51dcc295 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-26 15:50:12 +08:00
joylink_fanyuhong
917630d099 列车参数状态调整 2024-04-26 15:50:09 +08:00
fan
eaf84b5fe6 dialog调整 2024-04-19 20:38:01 +08:00
fan
e5336ed74e 列车参数设置调整 2024-04-18 13:34:55 +08:00
fan
e379b58871 列车连接调整 2024-04-16 17:52:54 +08:00
fan
a4c4ae1ab3 列车连接调整 2024-04-16 16:32:39 +08:00
fan
0b0daba16e draggabelDialog调整暂提 2024-04-12 17:52:56 +08:00
joylink_zhaoerwei
2d24b69694 第三方连接加个列车PC仿真 2024-04-12 10:03:56 +08:00
joylink_fanyuhong
7ecac37766 url调整 2024-04-11 17:31:27 +08:00
joylink_fanyuhong
a3485c94f7 列车添加载荷参数 2024-04-11 17:18:44 +08:00
joylink_fanyuhong
870856f3d7 diglog调整 2024-04-11 15:36:41 +08:00
joylink_zhaoerwei
0330c00cbc 钥匙交互传参修改 2024-04-09 10:33:17 +08:00
joylink_zhaoerwei
4c9a9b29b7 驾驶台弹框调整 2024-04-09 10:28:37 +08:00
joylink_zhaoerwei
d726b1ac76 所有弹框点击界面不关闭弹框 2024-04-09 10:08:21 +08:00
joylink_fanyuhong
f810b63589 列车添加取消连接选项 2024-04-08 15:29:07 +08:00
joylink_fanyuhong
2f0ab96b68 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-07 17:54:36 +08:00
joylink_fanyuhong
fde31acc72 代码调整 2024-04-07 17:54:31 +08:00
joylink_zhaoerwei
85a5ad1d35 列车驾驶台调整--改变位置后调接口 2024-04-07 10:59:07 +08:00
joylink_fanyuhong
5f7c04ee99 洗车机调整 2024-04-07 09:55:52 +08:00
joylink_fanyuhong
7c8bd92030 删除日志&洗车机调整 2024-04-03 16:43:53 +08:00
joylink_fanyuhong
bdcd3ac6b2 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-03 16:37:14 +08:00
joylink_zhaoerwei
1c99ed9b50 执行protoc 2024-04-03 16:36:39 +08:00
joylink_fanyuhong
be50562f0e 车库门防淹门状态调整 2024-04-03 16:36:01 +08:00
joylink_fanyuhong
2517ab5e8d Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-03 15:22:53 +08:00
joylink_fanyuhong
f4ed04eed3 洗车机显示调整 2024-04-03 15:22:50 +08:00
joylink_zhaoerwei
bd73f65860 列车驾驶台交互优化 2024-04-03 14:56:06 +08:00
joylink_zhaoerwei
e894f02e38 列车驾驶台交互调整 2024-04-03 11:17:12 +08:00
joylink_fanyuhong
548930fd3c Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-03 10:14:21 +08:00
joylink_fanyuhong
3e44d8fae4 关闭列车连接调整 2024-04-03 10:13:53 +08:00
joylink_zhaoerwei
2ab1396e33 列车驾驶台交互 2024-04-03 09:32:00 +08:00
joylink_fanyuhong
3d3d614f3c 修改打包命令&CI 2024-04-02 20:30:55 +08:00
joylink_fanyuhong
9f8d45f450 环境变量调整 2024-04-02 20:20:23 +08:00
joylink_fanyuhong
ce211464a9 环境变量测试 2024-04-02 19:43:15 +08:00
joylink_fanyuhong
f80dcbb2f7 环境变量测试 2024-04-02 19:37:32 +08:00
joylink_fanyuhong
c6c1876c29 取消环境变量测试内容 2024-04-02 19:33:54 +08:00
joylink_fanyuhong
c9431b94f4 环境变量测试 2024-04-02 18:49:35 +08:00
joylink_fanyuhong
a4ace6ca8f 环境变量测试 2024-04-02 18:18:39 +08:00
joylink_fanyuhong
d5dff582b2 环境变量测试 2024-04-02 18:13:21 +08:00
joylink_fanyuhong
f12655546a 环境变量测试 2024-04-02 18:12:59 +08:00
joylink_fanyuhong
707c50aa0b 环境变量测试 2024-04-02 17:48:09 +08:00
joylink_fanyuhong
f7895a6ac7 local-test环境变量调整 2024-04-02 17:36:24 +08:00
joylink_zhaoerwei
a3c639b414 根据段数动态生成洗车机继电器(考虑3段以上情况) 2024-04-02 16:37:47 +08:00
joylink_fanyuhong
a07c75db68 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-04-02 15:59:22 +08:00
joylink_fanyuhong
2fcab2d9e9 洗车机操作状态调整 2024-04-02 15:59:19 +08:00
joylink_zhaoerwei
82754e40d9 根据段数动态生成洗车机继电器 2024-04-02 14:43:14 +08:00
joylink_zhaoerwei
107f3e50d9 执行proto 2024-04-02 14:25:37 +08:00
joylink_fanyuhong
d3e57cc444 同步 2024-04-02 11:33:17 +08:00
joylink_fanyuhong
5910740c65 洗车机添加属性 2024-04-02 11:30:45 +08:00
joylink_zhaoerwei
b75bc9b9f0 列车驾驶台交互暂提 2024-04-02 10:47:40 +08:00
joylink_zhaoerwei
a474415b9d 防淹门生成继电器和关联集中站 2024-03-29 18:34:36 +08:00
joylink_fanyuhong
9c9a4b4ccf 取消lossState状态&防淹门调整 2024-03-29 17:29:01 +08:00
joylink_zhaoerwei
8e8b0fc42d 注掉old相关字段 2024-03-29 15:18:31 +08:00
joylink_fanyuhong
6e80d2da85 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-03-28 11:16:03 +08:00
joylink_fanyuhong
9e6c007377 防淹门调整 2024-03-28 11:16:00 +08:00
joylink_zhaoerwei
e964b8bf27 道岔编辑修改 2024-03-28 09:58:05 +08:00
joylink_fanyuhong
dcd7f3322c 防淹门调整 2024-03-28 09:22:06 +08:00
joylink_fanyuhong
7d2a1be457 车库门调整暂提 2024-03-28 09:19:15 +08:00
joylink_fanyuhong
3fb3eb8135 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-03-27 17:20:34 +08:00
joylink_fanyuhong
d9b5841cfb 车库门状态显示调整 2024-03-27 17:20:17 +08:00
joylink_zhaoerwei
5210c9d9cd 屏蔽门右键bug 2024-03-27 17:04:26 +08:00
joylink_fanyuhong
4012e3c2f7 psl场景加载调整 2024-03-27 16:57:44 +08:00
joylink_fanyuhong
2048eb43dd 车库门显示调整 2024-03-27 15:48:27 +08:00
joylink_fanyuhong
9c95c229e5 psl切换地图数据不更新调整 2024-03-27 15:48:12 +08:00
joylink_fanyuhong
f0db7a70ab 本地发布调整 2024-03-27 15:47:56 +08:00
joylink_fanyuhong
b0b0074608 url调整 2024-03-27 14:25:37 +08:00
joylink_fanyuhong
43a8993eb9 Merge branch 'develop' of http://120.46.212.6:3000/joylink/rts-sim-testing-client into develop 2024-03-27 14:11:53 +08:00
joylink_fanyuhong
f21690988d 车库门调整 2024-03-27 14:11:49 +08:00
joylink_zhaoerwei
0a2641c20f 一键生成继电器修改:增加边界条件的判断 2024-03-27 13:43:00 +08:00
joylink_zhaoerwei
e2ac7e4ae5 继电器K变大写 2024-03-27 12:14:15 +08:00
joylink_fanyuhong
6e1b972d2f 同步 2024-03-26 17:32:28 +08:00
joylink_fanyuhong
ebcfbfd891 车库门添加操作&状态 2024-03-26 17:31:37 +08:00
joylink_fanyuhong
504b8cf825 应答器添加原编号并导入
All checks were successful
CI / Docker-Build (push) Successful in 2m27s
2024-03-25 14:06:41 +08:00
joylink_fanyuhong
6c94a8a511 Merge remote-tracking branch 'origin/master' into develop 2024-03-21 13:27:16 +08:00
e13cf51e4e 修改发布tar命令错误
All checks were successful
CI / Docker-Build (push) Successful in 2m26s
2024-03-20 22:50:39 +08:00
bd066d7fc6 修改tar解压bug
All checks were successful
CI / Docker-Build (push) Successful in 2m40s
2024-03-20 22:42:39 +08:00
8d733e2e6f 修改scp添加overwrite标识
Some checks failed
CI / Docker-Build (push) Failing after 1m53s
2024-03-20 22:37:06 +08:00
7a37876dc4 修改scp target问题(target必须是目录,而不是文件)
Some checks failed
CI / Docker-Build (push) Failing after 1m9s
2024-03-20 22:31:50 +08:00
ab15fcf568 完善本地测试发布流程
Some checks failed
CI / Docker-Build (push) Failing after 32m28s
2024-03-20 21:57:05 +08:00
33fc91f9de 测试命令 2024-03-20 15:14:07 +08:00
df535cc73c 修改local-test工作流定义
All checks were successful
CI / Docker-Build (push) Successful in 7m33s
2024-03-19 21:52:16 +08:00
a180682b82 Merge branch 'master' into develop 2024-03-19 21:43:43 +08:00
3b8c7d2b00 message模块同步 2024-03-19 21:42:57 +08:00
feb8edeb44 submodule 地址更新
local-test持续发布集成工作流定义
2024-03-19 21:41:44 +08:00
138 changed files with 12598 additions and 3015 deletions

View File

@ -0,0 +1,54 @@
name: CI
run-name: ${{ gitea.actor }} is testing out Gitea Actions
on:
push:
branches:
- local-test
jobs:
Docker-Build:
runs-on: joylink-local233
steps:
- name: 检出代码
uses: https://gitea.joylink.club/actions/checkout@v4
with:
submodules: recursive
- name: 设置node环境
uses: https://gitea.joylink.club/actions/local-setup-node@v0.1.1
with:
version: 'v18.19.1'
cache: 'yarn'
cache-dependency-path: 'yarn.lock'
- name: 安装yarn,并run build
run: |
node -v
npm -v
npm config set registry https://registry.npmmirror.com
npm install --global yarn
yarn config set registry https://registry.npmmirror.com
yarn
yarn run build:local
tar czvf ./dist-test.tar.gz ./dist
- name: 打包发送到本地测试环境
uses: https://gitea.joylink.club/appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.LOCAL_233_SSH_HOST }}
username: ${{ secrets.LOCAL_233_SSH_USER }}
password: ${{ secrets.LOCAL_233_SSH_PASSWORD }}
port: ${{ secrets.LOCAL_233_SSH_PORT }}
source: ./dist-test.tar.gz
target: /home/minio/oss/rts-sim-testing-client
overwrite: true
- name: SSH连接233并解压发布
uses: https://gitea.joylink.club/appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.LOCAL_233_SSH_HOST }}
port: ${{ secrets.LOCAL_233_SSH_PORT }}
username: ${{ secrets.LOCAL_233_SSH_USER }}
password: ${{ secrets.LOCAL_233_SSH_PASSWORD }}
script: |
cd /home/minio/oss/rts-sim-testing-client
rm -rf /usr/local/joylink/client/bjrtss
mkdir -p /usr/local/joylink/client
tar xz --strip 2 -C /usr/local/joylink/client -f dist-test.tar.gz
- run: echo "This job's status is ${{ job.status }}."

2
.gitmodules vendored
View File

@ -1,3 +1,3 @@
[submodule "rts-sim-testing-message"] [submodule "rts-sim-testing-message"]
path = rts-sim-testing-message path = rts-sim-testing-message
url = http://120.46.212.6:3000/joylink/rts-sim-testing-message.git url = https://gitea.joylink.club/joylink/rts-sim-testing-message.git

View File

@ -11,8 +11,10 @@
"test": "echo \"No test specified\" && exit 0", "test": "echo \"No test specified\" && exit 0",
"dev": "quasar dev", "dev": "quasar dev",
"build": "quasar build", "build": "quasar build",
"build:test": "set NODE_ENV=test&&quasar build", "build:local": "URL_ENV=local_test quasar build",
"build:publish": "set NODE_ENV=publish&&quasar build", "build:pxf": "URL_ENV=local_pxf quasar build",
"build:test": "URL_ENV=test quasar build",
"build:publish": "URL_ENV=publish quasar build",
"protoc": "node scripts/proto.cjs", "protoc": "node scripts/proto.cjs",
"sync": "node scripts/sync.cjs" "sync": "node scripts/sync.cjs"
}, },
@ -22,7 +24,7 @@
"default-passive-events": "^2.0.0", "default-passive-events": "^2.0.0",
"echarts": "^5.4.3", "echarts": "^5.4.3",
"google-protobuf": "^3.21.2", "google-protobuf": "^3.21.2",
"jl-graphic": "git+http://120.46.212.6:3000/joylink/graphic-pixi.git#v0.1.11", "jl-graphic": "git+http://120.46.212.6:3000/joylink/graphic-pixi.git#v0.1.15",
"js-base64": "^3.7.5", "js-base64": "^3.7.5",
"pinia": "^2.0.11", "pinia": "^2.0.11",
"quasar": "^2.6.0", "quasar": "^2.6.0",
@ -37,6 +39,7 @@
"@typescript-eslint/eslint-plugin": "^5.10.0", "@typescript-eslint/eslint-plugin": "^5.10.0",
"@typescript-eslint/parser": "^5.10.0", "@typescript-eslint/parser": "^5.10.0",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"dotenv": "^16.4.5",
"eslint": "^8.10.0", "eslint": "^8.10.0",
"eslint-config-prettier": "^8.1.0", "eslint-config-prettier": "^8.1.0",
"eslint-plugin-vue": "^9.0.0", "eslint-plugin-vue": "^9.0.0",

View File

@ -27,20 +27,30 @@
<path d="M20.7727 14.2727C20.7045 13.697 20.428 13.25 19.9432 12.9318C19.4583 12.6136 18.8636 12.4545 18.1591 12.4545C17.6439 12.4545 17.1932 12.5379 16.8068 12.7045C16.4242 12.8712 16.125 13.1004 15.9091 13.392C15.697 13.6837 15.5909 14.0152 15.5909 14.3864C15.5909 14.697 15.6648 14.964 15.8125 15.1875C15.964 15.4072 16.1572 15.5909 16.392 15.7386C16.6269 15.8826 16.8731 16.0019 17.1307 16.0966C17.3883 16.1875 17.625 16.2614 17.8409 16.3182L19.0227 16.6364C19.3258 16.7159 19.6629 16.8258 20.0341 16.9659C20.4091 17.1061 20.767 17.2973 21.108 17.5398C21.4527 17.7784 21.7367 18.0852 21.9602 18.4602C22.1837 18.8352 22.2955 19.2955 22.2955 19.8409C22.2955 20.4697 22.1307 21.0379 21.8011 21.5455C21.4754 22.053 20.9981 22.4564 20.3693 22.7557C19.7443 23.0549 18.9848 23.2045 18.0909 23.2045C17.2576 23.2045 16.536 23.0701 15.9261 22.8011C15.3201 22.5322 14.8428 22.1572 14.4943 21.6761C14.1496 21.1951 13.9545 20.6364 13.9091 20H15.3636C15.4015 20.4394 15.5492 20.803 15.8068 21.0909C16.0682 21.375 16.3977 21.5871 16.7955 21.7273C17.197 21.8636 17.6288 21.9318 18.0909 21.9318C18.6288 21.9318 19.1117 21.8447 19.5398 21.6705C19.9678 21.4924 20.3068 21.2462 20.5568 20.9318C20.8068 20.6136 20.9318 20.2424 20.9318 19.8182C20.9318 19.4318 20.8239 19.1174 20.608 18.875C20.392 18.6326 20.108 18.4356 19.7557 18.2841C19.4034 18.1326 19.0227 18 18.6136 17.8864L17.1818 17.4773C16.2727 17.2159 15.553 16.8428 15.0227 16.358C14.4924 15.8731 14.2273 15.2386 14.2273 14.4545C14.2273 13.803 14.4034 13.2348 14.7557 12.75C15.1117 12.2614 15.589 11.8826 16.1875 11.6136C16.7898 11.3409 17.4621 11.2045 18.2045 11.2045C18.9545 11.2045 19.6212 11.339 20.2045 11.608C20.7879 11.8731 21.25 12.2367 21.5909 12.6989C21.9356 13.161 22.1174 13.6856 22.1364 14.2727H20.7727Z" fill="white"/> <path d="M20.7727 14.2727C20.7045 13.697 20.428 13.25 19.9432 12.9318C19.4583 12.6136 18.8636 12.4545 18.1591 12.4545C17.6439 12.4545 17.1932 12.5379 16.8068 12.7045C16.4242 12.8712 16.125 13.1004 15.9091 13.392C15.697 13.6837 15.5909 14.0152 15.5909 14.3864C15.5909 14.697 15.6648 14.964 15.8125 15.1875C15.964 15.4072 16.1572 15.5909 16.392 15.7386C16.6269 15.8826 16.8731 16.0019 17.1307 16.0966C17.3883 16.1875 17.625 16.2614 17.8409 16.3182L19.0227 16.6364C19.3258 16.7159 19.6629 16.8258 20.0341 16.9659C20.4091 17.1061 20.767 17.2973 21.108 17.5398C21.4527 17.7784 21.7367 18.0852 21.9602 18.4602C22.1837 18.8352 22.2955 19.2955 22.2955 19.8409C22.2955 20.4697 22.1307 21.0379 21.8011 21.5455C21.4754 22.053 20.9981 22.4564 20.3693 22.7557C19.7443 23.0549 18.9848 23.2045 18.0909 23.2045C17.2576 23.2045 16.536 23.0701 15.9261 22.8011C15.3201 22.5322 14.8428 22.1572 14.4943 21.6761C14.1496 21.1951 13.9545 20.6364 13.9091 20H15.3636C15.4015 20.4394 15.5492 20.803 15.8068 21.0909C16.0682 21.375 16.3977 21.5871 16.7955 21.7273C17.197 21.8636 17.6288 21.9318 18.0909 21.9318C18.6288 21.9318 19.1117 21.8447 19.5398 21.6705C19.9678 21.4924 20.3068 21.2462 20.5568 20.9318C20.8068 20.6136 20.9318 20.2424 20.9318 19.8182C20.9318 19.4318 20.8239 19.1174 20.608 18.875C20.392 18.6326 20.108 18.4356 19.7557 18.2841C19.4034 18.1326 19.0227 18 18.6136 17.8864L17.1818 17.4773C16.2727 17.2159 15.553 16.8428 15.0227 16.358C14.4924 15.8731 14.2273 15.2386 14.2273 14.4545C14.2273 13.803 14.4034 13.2348 14.7557 12.75C15.1117 12.2614 15.589 11.8826 16.1875 11.6136C16.7898 11.3409 17.4621 11.2045 18.2045 11.2045C18.9545 11.2045 19.6212 11.339 20.2045 11.608C20.7879 11.8731 21.25 12.2367 21.5909 12.6989C21.9356 13.161 22.1174 13.6856 22.1364 14.2727H20.7727Z" fill="white"/>
<line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/> <line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/>
</symbol> </symbol>
<symbol id="icon-ibp-box" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="33" height="32" stroke="white" stroke-width="2"/>
<path d="M16.4659 9.81818V20H15.233V9.81818H16.4659Z" fill="white"/>
<line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/>
</symbol>
<symbol id="icon-gated-box" viewBox="0 0 35 34" fill="none"> <symbol id="icon-gated-box" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="33" height="32" stroke="white" stroke-width="2"/> <rect x="1" y="1" width="33" height="32" stroke="white" stroke-width="2"/>
<path d="M14.4091 23V11.3636H18.3409C19.2538 11.3636 20 11.5284 20.5795 11.858C21.1629 12.1837 21.5947 12.625 21.875 13.1818C22.1553 13.7386 22.2955 14.3598 22.2955 15.0455C22.2955 15.7311 22.1553 16.3542 21.875 16.9148C21.5985 17.4754 21.1705 17.9223 20.5909 18.2557C20.0114 18.5852 19.2689 18.75 18.3636 18.75H15.5455V17.5H18.3182C18.9432 17.5 19.4451 17.392 19.8239 17.1761C20.2027 16.9602 20.4773 16.6686 20.6477 16.3011C20.822 15.9299 20.9091 15.5114 20.9091 15.0455C20.9091 14.5795 20.822 14.1629 20.6477 13.7955C20.4773 13.428 20.2008 13.1402 19.8182 12.9318C19.4356 12.7197 18.928 12.6136 18.2955 12.6136H15.8182V23H14.4091Z" fill="white"/> <path d="M14.4091 23V11.3636H18.3409C19.2538 11.3636 20 11.5284 20.5795 11.858C21.1629 12.1837 21.5947 12.625 21.875 13.1818C22.1553 13.7386 22.2955 14.3598 22.2955 15.0455C22.2955 15.7311 22.1553 16.3542 21.875 16.9148C21.5985 17.4754 21.1705 17.9223 20.5909 18.2557C20.0114 18.5852 19.2689 18.75 18.3636 18.75H15.5455V17.5H18.3182C18.9432 17.5 19.4451 17.392 19.8239 17.1761C20.2027 16.9602 20.4773 16.6686 20.6477 16.3011C20.822 15.9299 20.9091 15.5114 20.9091 15.0455C20.9091 14.5795 20.822 14.1629 20.6477 13.7955C20.4773 13.428 20.2008 13.1402 19.8182 12.9318C19.4356 12.7197 18.928 12.6136 18.2955 12.6136H15.8182V23H14.4091Z" fill="white"/>
<line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/> <line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/>
</symbol> </symbol>
<symbol id="icon-garage-door-box" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="33" height="32" stroke="white" stroke-width="2"/>
<path d="M17.1932 14C17.0838 13.6652 16.9396 13.3653 16.7607 13.1001C16.585 12.8317 16.3745 12.603 16.1293 12.4141C15.8873 12.2251 15.6122 12.081 15.304 11.9815C14.9957 11.8821 14.6577 11.8324 14.2898 11.8324C13.6866 11.8324 13.138 11.9882 12.6442 12.2997C12.1503 12.6113 11.7576 13.0703 11.4659 13.6768C11.1742 14.2834 11.0284 15.0275 11.0284 15.9091C11.0284 16.7907 11.1759 17.5348 11.4709 18.1413C11.7659 18.7479 12.1652 19.2069 12.669 19.5185C13.1728 19.83 13.7396 19.9858 14.3693 19.9858C14.9527 19.9858 15.4664 19.8615 15.9105 19.6129C16.358 19.361 16.706 19.0064 16.9545 18.549C17.2064 18.0883 17.3324 17.5464 17.3324 16.9233L17.7102 17.0028H14.6477V15.9091H18.5256V17.0028C18.5256 17.8414 18.3466 18.5705 17.9886 19.1903C17.634 19.8101 17.1435 20.2907 16.517 20.6321C15.8939 20.9702 15.178 21.1392 14.3693 21.1392C13.4678 21.1392 12.6757 20.9271 11.9929 20.5028C11.3134 20.0786 10.7831 19.4754 10.402 18.6932C10.0241 17.911 9.83523 16.983 9.83523 15.9091C9.83523 15.1037 9.94295 14.3795 10.1584 13.7365C10.3771 13.0902 10.6854 12.54 11.0831 12.0859C11.4808 11.6319 11.9515 11.2839 12.495 11.0419C13.0386 10.8 13.6368 10.679 14.2898 10.679C14.8267 10.679 15.3272 10.7602 15.7912 10.9226C16.2585 11.0817 16.6745 11.3087 17.0391 11.6037C17.407 11.8954 17.7135 12.245 17.9588 12.6527C18.2041 13.0571 18.3731 13.5062 18.4659 14H17.1932Z" fill="white"/>
<line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/>
</symbol>
<symbol id="icon-esb-button" viewBox="0 0 35 34" fill="none"> <symbol id="icon-esb-button" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="33" height="32" stroke="white" stroke-width="2"/> <rect x="1" y="1" width="31" height="30" stroke="white" stroke-width="2"/>
<line y1="32" x2="35" y2="32" stroke="white" stroke-width="4"/> <line x1="0.0576497" y1="28.5011" x2="33.0333" y2="29.7694" stroke="white" stroke-width="3"/>
<circle cx="17.5" cy="16.5" r="7.5" fill="white"/> <path d="M13.233 20V9.81818H19.3778V10.9119H14.4659V14.3523H19.0597V15.446H14.4659V18.9062H19.4574V20H13.233Z" fill="white"/>
</symbol>
<symbol id="icon-hold-button" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="31" height="30" stroke="white" stroke-width="2"/>
<line x1="0.0576497" y1="28.5011" x2="33.0333" y2="29.7694" stroke="white" stroke-width="3"/>
<path d="M12.233 19V8.81818H13.4659V13.3523H18.8949V8.81818H20.1278V19H18.8949V14.446H13.4659V19H12.233Z" fill="white"/>
</symbol>
<symbol id="icon-unattenged-button" viewBox="0 0 35 34" fill="none">
<rect x="1" y="1" width="31" height="30" stroke="white" stroke-width="2"/>
<line x1="0.0576497" y1="28.5011" x2="33.0333" y2="29.7694" stroke="white" stroke-width="3"/>
<path d="M12.0824 21L9.2983 10.8182H10.5511L12.679 19.1108H12.7784L14.946 10.8182H16.3381L18.5057 19.1108H18.6051L20.733 10.8182H21.9858L19.2017 21H17.929L15.6818 12.8864H15.6023L13.3551 21H12.0824Z" fill="white"/>
</symbol> </symbol>
<symbol id="icon-psl-light" viewBox="0 0 30 30" fill="none"> <symbol id="icon-psl-light" viewBox="0 0 30 30" fill="none">
<circle cx="15" cy="15" r="14.5" stroke="white"/> <circle cx="15" cy="15" r="14.5" stroke="white"/>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -7,7 +7,7 @@
// Configuration for your app // Configuration for your app
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-js // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js
require('dotenv').config()
const { configure } = require('quasar/wrappers'); const { configure } = require('quasar/wrappers');
const BasePath = 'bjrtss'; const BasePath = 'bjrtss';
@ -55,6 +55,7 @@ module.exports = configure(function (/* ctx */) {
env: { env: {
// test:测试服务器publish正式服务器其他本地 // test:测试服务器publish正式服务器其他本地
ENV_MODE: process.env.NODE_ENV, ENV_MODE: process.env.NODE_ENV,
URL_ENV: process.env.URL_ENV
}, },
target: { target: {
browser: ['es2020'], browser: ['es2020'],

@ -1 +1 @@
Subproject commit a1534096aa1ed2566b93ffe7bfde76750de10a60 Subproject commit a6293366a132680309a62855d4c4e19546ba3aa8

View File

@ -57,6 +57,7 @@ export async function addTrain(data: {
configTrain: TrainConfigData; configTrain: TrainConfigData;
trainEndsA: TrainEnd; trainEndsA: TrainEnd;
trainEndsB: TrainEnd; trainEndsB: TrainEnd;
trainCoachNum: number;
}) { }) {
const response = await api.post(`${UriBase}/train/add`, data); const response = await api.post(`${UriBase}/train/add`, data);
return response.data; return response.data;
@ -184,6 +185,20 @@ export async function ibpKeyOperation(params: IbpKeyOperationParams) {
return await api.post(`${UriBase}/ibp/key/operation`, params); return await api.post(`${UriBase}/ibp/key/operation`, params);
} }
export interface TccOperationParams {
simulationId: string;
trainId: string;
deviceId: number;
controlType: request.TrainControl.TrainControlType;
controlButton?: object;
driverKey?: object;
switchKey?: object;
handler?: object;
}
export async function tccOperation(params: TccOperationParams) {
return await api.post(`${UriBase}/train/control`, params);
}
export function checkMapData(data: { mapProto: string }) { export function checkMapData(data: { mapProto: string }) {
return api.post(`${UriBase}/check/data`, data); return api.post(`${UriBase}/check/data`, data);
} }
@ -427,6 +442,38 @@ export async function updateTrainConn(data: {
id: string; id: string;
simulationId: string; simulationId: string;
connType: number; connType: number;
typeName: string;
}) { }) {
return await api.post(`${UriBase}/train/conn`, data); return await api.post(`${UriBase}/train/conn`, data);
} }
/** 车库门参数修改 */
export async function ckmUpdateParams(data: {
simulationId: string;
mapId: number;
deviceId: number;
operation: request.Ckm.Operation;
param: {
force: request.Ckm.Force;
fault: request.Ckm.Fault;
};
}) {
return await api.put(`${UriBase}/ckm/operation`, data);
}
export async function xcjUpdateParams(data: {
simulationId: string;
mapId: number;
deviceId: number;
operation: request.Xcj.Operation;
param: {
fault: request.Xcj.Fault;
};
}) {
return await api.put(`${UriBase}/xcj/operation`, data);
}
/** 列车取消连接 */
export async function cancelTrainConn(data: { trainId: string; id: string }) {
return await api.delete(`${UriBase}/train/unconn/${data.trainId}/${data.id}`);
}

View File

@ -56,6 +56,11 @@ export interface TrainCreateParams {
total_length: number; total_length: number;
train_model: number; train_model: number;
train_sets: string; train_sets: string;
train_load: number;
train_max_speed: number;
train_max_acc: number;
train_max_brake: number;
train_emergency_brake: number;
trainConfigData?: TrainConfigData; trainConfigData?: TrainConfigData;
trainControlMapId: number; trainControlMapId: number;
} }

View File

@ -67,6 +67,7 @@ export class ApiError {
// for each client) // for each client)
const api = axios.create({ baseURL: getHttpBase() }); const api = axios.create({ baseURL: getHttpBase() });
let isOpenDialog = false; // 认证弹窗是否打开 let isOpenDialog = false; // 认证弹窗是否打开
const quanXianDialog = false; // 权限提示弹窗是否打开
const CancelToken = axios.CancelToken; const CancelToken = axios.CancelToken;
const source = CancelToken.source(); const source = CancelToken.source();
@ -107,6 +108,23 @@ export default boot(({ app, router }) => {
.onCancel(() => { .onCancel(() => {
isOpenDialog = false; isOpenDialog = false;
}); });
// } else if (
// err.response &&
// err.response.status === 403 &&
// !quanXianDialog
// ) {
// quanXianDialog = true;
// Dialog.create({
// title: '无权限',
// message: '你没有该页面访问权限',
// persistent: true,
// })
// .onOk(() => {
// quanXianDialog = false;
// })
// .onCancel(() => {
// quanXianDialog = false;
// });
} }
return Promise.reject(ApiError.from(err)); return Promise.reject(ApiError.from(err));
} }

View File

@ -16,6 +16,13 @@
}" }"
style="max-width: 2000px" style="max-width: 2000px"
> >
<!-- <q-scroll-area
v-if="props.height"
id="draggable-dialog-scroll"
:style="`width: ${props.width}px;height: ${props.height}px`"
style="max-height: 90vh"
> -->
<div style="position: sticky; top: 0px; z-index: 9">
<q-bar <q-bar
ref="headerRef" ref="headerRef"
class="non-selectable q-gutter-l" class="non-selectable q-gutter-l"
@ -32,17 +39,39 @@
{{ props.title }} {{ props.title }}
</div> </div>
<q-space /> <q-space />
<div style="margin-right: 10px"><slot name="titleButton"></slot></div> <div style="margin-right: 10px">
<slot name="titleButton"></slot>
</div>
<q-btn dense flat icon="sym_o_close" v-close-popup></q-btn> <q-btn dense flat icon="sym_o_close" v-close-popup></q-btn>
</q-bar> </q-bar>
</div>
<q-scroll-area <q-scroll-area
:style="`width: ${props.width}px; height: ${props.height}px;`" v-if="props.height"
id="draggable-dialog-scroll"
:style="`width: ${dialogWidth}px;height: ${dialogHeight}px`"
style="max-height: calc(90vh - 100px)"
> >
<slot></slot> <slot></slot>
</q-scroll-area> </q-scroll-area>
<div :style="`width: ${props.width}px`">
<slot name="footer"></slot> <slot name="footer"></slot>
<div
:style="`width: ${dialogWidth}px`"
style="position: sticky; bottom: 0px"
>
<slot name="sticky-footer"></slot>
</div> </div>
<resizable-div-width
v-if="resizableWidth"
:height="dialogHeight - 10"
@drapWidth="drapWidth"
@drapMouseUp="drapMouseUp"
/>
<resizable-div-height
v-if="resizableHeight"
:width="dialogWidth - 10"
@drapHeight="drapHeight"
@drapMouseUp="drapMouseUp"
/>
</q-card> </q-card>
</q-dialog> </q-dialog>
</template> </template>
@ -50,12 +79,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { QBar, useDialogPluginComponent } from 'quasar'; import { QBar, useDialogPluginComponent } from 'quasar';
import { ref, onMounted, onUnmounted, reactive } from 'vue'; import { ref, onMounted, onUnmounted, reactive } from 'vue';
import ResizableDivWidth from './ResizableDivWidth.vue';
import ResizableDivHeight from './ResizableDivHeight.vue';
const emit = defineEmits({ const emit = defineEmits({
...useDialogPluginComponent.emitsObject, ...useDialogPluginComponent.emitsObject,
show: () => true, show: () => true,
}); });
const fixed = ref(false);
const props = withDefaults( const props = withDefaults(
defineProps<{ defineProps<{
title?: string; title?: string;
@ -67,6 +98,8 @@ const props = withDefaults(
height?: number; height?: number;
bgColor?: string; bgColor?: string;
bgBorder?: string; bgBorder?: string;
resizableWidth?: boolean;
resizableHeight?: boolean;
}>(), }>(),
{ {
width: 500, width: 500,
@ -75,6 +108,8 @@ const props = withDefaults(
titleHeight: 36, titleHeight: 36,
fontSize: 20, fontSize: 20,
fontColor: 'white', fontColor: 'white',
resizableWidth: false,
resizableHeight: false,
} }
); );
@ -92,6 +127,10 @@ const start = { x: 0, y: 0 };
const startOffset = { x: 0, y: 0 }; const startOffset = { x: 0, y: 0 };
onMounted(() => { onMounted(() => {
dialogWidth.value = props.width;
lastDialogWidth = props.width;
dialogHeight.value = props.height;
lastDialogHeight = props.height;
window.addEventListener('mousedown', onMouseDown); window.addEventListener('mousedown', onMouseDown);
}); });
@ -125,4 +164,31 @@ function onHide() {
emit('hide'); emit('hide');
onDialogHide(); onDialogHide();
} }
let lastDialogWidth = 0;
const dialogWidth = ref(0);
function drapWidth(width: number) {
if (
(dialogWidth.value > 300 && width > 0) ||
(dialogWidth.value < 1800 && width < 0)
) {
dialogWidth.value = lastDialogWidth - width * 2 + 15;
}
}
let lastDialogHeight = 0;
const dialogHeight = ref(0);
function drapHeight(height: number) {
if (
(dialogHeight.value > 150 && height > 0) ||
(dialogHeight.value < 750 && height < 0)
) {
dialogHeight.value = lastDialogHeight - height * 2 + 15;
}
}
function drapMouseUp() {
lastDialogWidth = dialogWidth.value;
lastDialogHeight = dialogHeight.value;
}
</script> </script>

View File

@ -0,0 +1,61 @@
<template>
<div
ref="drapBox"
class="drapWidth"
:style="{
width: props.width + 'px',
height: props.height + 'px',
}"
@mousedown.stop="onMouseDown"
/>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
const props = withDefaults(
defineProps<{
width?: number;
height?: number;
}>(),
{
width: 300,
height: 15,
}
);
const drapBox = ref();
onMounted(() => {
drapBox.value.onmousedown = () => {
return false;
};
});
const emit = defineEmits(['drapHeight', 'drapMouseUp']);
function onMouseDown(e: MouseEvent) {
drapBox.value.onmousedown = () => {
return false;
};
if (!e.target) return;
const disY = e.clientY - drapBox.value.offsetTop;
document.onmousemove = (e) => {
let top = e.clientY - disY;
emit('drapHeight', top);
};
document.onmouseup = () => {
emit('drapMouseUp');
document.onmousemove = null;
document.onmouseup = null;
};
}
</script>
<style scoped>
.drapWidth {
position: absolute;
top: 0;
z-index: 9999;
background: red;
opacity: 0;
cursor: n-resize;
}
</style>

View File

@ -0,0 +1,61 @@
<template>
<div
ref="drapBox"
class="drapWidth"
:style="{
width: props.width + 'px',
height: props.height + 'px',
}"
@mousedown.stop="onMouseDown"
/>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
const props = withDefaults(
defineProps<{
width?: number;
height?: number;
}>(),
{
width: 15,
height: 500,
}
);
const drapBox = ref();
onMounted(() => {
drapBox.value.onmousedown = () => {
return false;
};
});
const emit = defineEmits(['drapWidth', 'drapMouseUp']);
function onMouseDown(e: MouseEvent) {
drapBox.value.onmousedown = () => {
return false;
};
if (!e.target) return;
const disX = e.clientX - drapBox.value.offsetLeft;
document.onmousemove = (e) => {
let left = e.clientX - disX;
emit('drapWidth', left);
};
document.onmouseup = () => {
emit('drapMouseUp');
document.onmousemove = null;
document.onmouseup = null;
};
}
</script>
<style scoped>
.drapWidth {
position: absolute;
top: 0;
z-index: 9999;
background: red;
opacity: 0;
cursor: e-resize;
}
</style>

View File

@ -139,18 +139,21 @@
drawStore.selectedGraphicType === ConcentrationDividingLine.Type drawStore.selectedGraphicType === ConcentrationDividingLine.Type
" "
/> />
<flood-gate-property
v-else-if="drawStore.selectedGraphicType === FloodGate.Type"
/>
<car-washing-property <car-washing-property
v-else-if="drawStore.selectedGraphicType === CarWashing.Type" v-else-if="drawStore.selectedGraphicType === CarWashing.Type"
></car-washing-property> ></car-washing-property>
<garage-door-property <garage-door-property
v-else-if="drawStore.selectedGraphicType === GarageDoor.Type" v-else-if="drawStore.selectedGraphicType === GarageDoor.Type"
></garage-door-property> ></garage-door-property>
<garage-door-box-property <flood-gate-property
v-else-if="drawStore.selectedGraphicType === GarageDoorBox.Type" v-else-if="drawStore.selectedGraphicType === FloodGate.Type"
></garage-door-box-property> ></flood-gate-property>
<hold-button-property
v-else-if="drawStore.selectedGraphicType === HoldButton.Type"
></hold-button-property>
<unattenged-button-property
v-else-if="drawStore.selectedGraphicType === UnattengedButton.Type"
></unattenged-button-property>
</q-card-section> </q-card-section>
</template> </template>
<template v-else-if="drawStore.selectedGraphics.length > 1"> <template v-else-if="drawStore.selectedGraphics.length > 1">
@ -229,14 +232,16 @@ import { TrackLogicSection } from 'src/graphics/trackLogicSection/TrackLogicSect
import MultipleSelectProperty from './properties/multipleSelectProperty.vue'; import MultipleSelectProperty from './properties/multipleSelectProperty.vue';
import { DepartureTimer } from 'src/graphics/departureTimer/DepartureTimer'; import { DepartureTimer } from 'src/graphics/departureTimer/DepartureTimer';
import DepartureTimerProperty from './properties/DepartureTimerProperty.vue'; import DepartureTimerProperty from './properties/DepartureTimerProperty.vue';
import FloodGateProperty from './properties/FloodGateProperty.vue';
import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import GarageDoorProperty from './properties/GarageDoorProperty.vue'; import GarageDoorProperty from './properties/GarageDoorProperty.vue';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor'; import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
import CarWashingProperty from './properties/CarWashingProperty.vue'; import CarWashingProperty from './properties/CarWashingProperty.vue';
import { CarWashing } from 'src/graphics/carWashing/CarWashing'; import { CarWashing } from 'src/graphics/carWashing/CarWashing';
import GarageDoorBoxProperty from './properties/GarageDoorBoxProperty.vue'; import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import { GarageDoorBox } from 'src/graphics/garageDoorBox/GarageDoorBox'; import FloodGateProperty from './properties/FloodGateProperty.vue';
import { HoldButton } from 'src/graphics/holdButton/HoldButton';
import HoldButtonProperty from './properties/HoldButtonProperty.vue';
import { UnattengedButton } from 'src/graphics/unattengedButton/UnattengedButton';
import UnattengedButtonProperty from './properties/UnattengedButtonProperty.vue';
const drawStore = useDrawStore(); const drawStore = useDrawStore();
</script> </script>

View File

@ -34,6 +34,9 @@
></signalFaultAlarm-property> ></signalFaultAlarm-property>
</q-card-section> </q-card-section>
</template> </template>
<template v-else-if="relayCabinetStore.selectedGraphics.length > 1">
<relay-multiple-select-property />
</template>
</q-card> </q-card>
</div> </div>
</template> </template>
@ -49,6 +52,7 @@ import { PhaseFailureProtector } from 'src/graphics/phaseFailureProtector/PhaseF
import SignalFaultAlarmProperty from './properties/SignalFaultAlarmProperty.vue'; import SignalFaultAlarmProperty from './properties/SignalFaultAlarmProperty.vue';
import { SignalFaultAlarm } from 'src/graphics/signalFaultAlarm/SignalFaultAlarm'; import { SignalFaultAlarm } from 'src/graphics/signalFaultAlarm/SignalFaultAlarm';
import { useRelayCabinetStore } from 'src/stores/relayCabinet-store'; import { useRelayCabinetStore } from 'src/stores/relayCabinet-store';
import RelayMultipleSelectProperty from './properties/RelayMultipleSelectProperty.vue';
const relayCabinetStore = useRelayCabinetStore(); const relayCabinetStore = useRelayCabinetStore();
</script> </script>

View File

@ -27,6 +27,9 @@
<tcc-handle-property <tcc-handle-property
v-else-if="tccDrawStore.selectedGraphicType === TccHandle.Type" v-else-if="tccDrawStore.selectedGraphicType === TccHandle.Type"
/> />
<tcc-light-property
v-else-if="tccDrawStore.selectedGraphicType === TccLight.Type"
/>
</q-card-section> </q-card-section>
</template> </template>
</q-card> </q-card>
@ -44,6 +47,8 @@ import { TccKey } from 'src/graphics/tccKey/TccKey';
import TccKeyProperty from './properties/TccKeyProperty.vue'; import TccKeyProperty from './properties/TccKeyProperty.vue';
import { TccHandle } from 'src/graphics/tccHandle/TccHandle'; import { TccHandle } from 'src/graphics/tccHandle/TccHandle';
import TccHandleProperty from './properties/TccHandleProperty.vue'; import TccHandleProperty from './properties/TccHandleProperty.vue';
import { TccLight } from 'src/graphics/tccLight/TccLight';
import TccLightProperty from './properties/TccLightProperty.vue';
const tccDrawStore = useTccDrawStore(); const tccDrawStore = useTccDrawStore();
</script> </script>

View File

@ -79,18 +79,27 @@
lazy-rules lazy-rules
:rules="wheelDiameterRules" :rules="wheelDiameterRules"
/> />
<q-card-actions align="right" class="text-primary"> </q-form>
</q-card-section>
</q-card>
<template v-slot:sticky-footer>
<div
style="
height: 45px;
line-height: 45px;
text-align: right;
background: #fff;
"
>
<q-btn <q-btn
flat flat
label="取消" label="取消"
@click="showAddTrainOperation = false" @click="showAddTrainOperation = false"
v-close-popup v-close-popup
/> />
<q-btn flat label="确认" type="submit" :disable="!trainConfig" /> <q-btn flat label="确认" @click="onCreate" :disable="!trainConfig" />
</q-card-actions> </div>
</q-form> </template>
</q-card-section>
</q-card>
</draggable-dialog> </draggable-dialog>
</template> </template>
@ -162,8 +171,14 @@ function onCreate() {
trainSpeed: trainSpeed.value, trainSpeed: trainSpeed.value,
wheelDiameter: wheelDiameter.value, wheelDiameter: wheelDiameter.value,
trainLength: trainConfig.value.total_length, trainLength: trainConfig.value.total_length,
trainLoad: trainConfig.value.train_load,
trainMaxSpeed: trainConfig.value.train_max_speed,
trainMaxAcc: trainConfig.value.train_max_acc,
trainMaxBrake: trainConfig.value.train_max_brake,
trainEmergencyBrake: trainConfig.value.train_emergency_brake,
configTrain: trainConfig.value.trainConfigData as TrainConfigData, configTrain: trainConfig.value.trainConfigData as TrainConfigData,
trainControlMapId: trainConfig.value.trainControlMapId, trainControlMapId: trainConfig.value.trainControlMapId,
trainCoachNum: parseInt(trainConfig.value.train_sets),
trainEndsA: { trainEndsA: {
radarCheckSpeedDiff: 0, radarCheckSpeedDiff: 0,
radarCheckTime: 0, radarCheckTime: 0,
@ -209,6 +224,11 @@ const trainConfig = ref<TrainConfigItem | null>({
total_length: 0, total_length: 0,
train_model: 0, train_model: 0,
train_sets: '', train_sets: '',
train_load: 0,
train_max_speed: 0,
train_max_acc: 0,
train_max_brake: 0,
train_emergency_brake: 0,
trainControlMapId: 0, trainControlMapId: 0,
}); });
function setConfigVal(val: TrainConfigItem | null) { function setConfigVal(val: TrainConfigItem | null) {

View File

@ -1,6 +1,18 @@
<template> <template>
<draggable-dialog seamless title="采集列表" :width="865" :height="485"> <draggable-dialog
<div class="row no-wrap" v-for="row in showSetCellMessage.rows" :key="row"> seamless
title="采集列表"
:width="865"
:height="485"
resizableWidth
resizableHeight
>
<div
class="row no-wrap"
v-for="row in showSetCellMessage.rows"
:key="row"
:class="{ stickyRow: row == 1 }"
>
<div <div
class="ceil" class="ceil"
:class="{ :class="{
@ -10,6 +22,10 @@
col > 1 && col > 1 &&
ciCjList?.cjList[col - 2].bitList[row - 2].refRelays.length, ciCjList?.cjList[col - 2].bitList[row - 2].refRelays.length,
changeCellSize: col == 1, changeCellSize: col == 1,
clickHeightLight:
relayCabinetStore.editCiCjConfigIndex &&
relayCabinetStore.editCiCjConfigIndex.row == row - 1 &&
relayCabinetStore.editCiCjConfigIndex.col == col - 1,
}" }"
v-for="col in showSetCellMessage.cols" v-for="col in showSetCellMessage.cols"
:key="col" :key="col"
@ -32,6 +48,12 @@
</div> </div>
</div> </div>
<template v-slot:titleButton> <template v-slot:titleButton>
<q-btn
color="primary"
label="清空"
style="margin-right: 10px"
@click="clearCiCjListData"
/>
<q-btn <q-btn
color="primary" color="primary"
label="设置" label="设置"
@ -85,6 +107,7 @@ import {
loadCiCjList, loadCiCjList,
creatCiCjList, creatCiCjList,
refRelaysListMap, refRelaysListMap,
clearCiCjList,
} from 'src/drawApp/relayCabinetLayoutApp'; } from 'src/drawApp/relayCabinetLayoutApp';
import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics'; import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics';
import { Relay } from 'src/graphics/relay/Relay'; import { Relay } from 'src/graphics/relay/Relay';
@ -175,6 +198,14 @@ function updateMap() {
}); });
} }
function clearCiCjListData() {
clearCiCjList(setCellMessage.value.rows, setCellMessage.value.cols);
ciCjList = loadCiCjList();
updateMap();
setCellDialog.value = true;
setCellDialog.value = false;
}
const showTooltip = ref(false); const showTooltip = ref(false);
function onMouseOver(e: MouseEvent) { function onMouseOver(e: MouseEvent) {
if ((e.target as HTMLElement).clientHeight > 30) { if ((e.target as HTMLElement).clientHeight > 30) {
@ -195,10 +226,23 @@ function onMouseOver(e: MouseEvent) {
word-break: break-all; word-break: break-all;
overflow: hidden; overflow: hidden;
} }
.stickyRow {
position: sticky;
top: 0;
z-index: 11;
background-color: #fff;
}
.changeCellSize { .changeCellSize {
width: 40px; width: 40px;
position: sticky;
left: 0;
z-index: 10;
background-color: #fff;
} }
.heightLight { .heightLight {
background-color: orange; background-color: orange;
} }
.clickHeightLight {
background-color: red;
}
</style> </style>

View File

@ -24,10 +24,12 @@
<q-tab-panels v-model="tab" animated keep-alive> <q-tab-panels v-model="tab" animated keep-alive>
<template v-for="tabInfo in tabList" :key="tabInfo.label"> <template v-for="tabInfo in tabList" :key="tabInfo.label">
<q-tab-panel :name="tabInfo.value"> <q-tab-panel :name="tabInfo.value">
<q-scroll-area :style="`width: ${dialogWidth - 32}px;height: 430px`">
<div <div
class="row no-wrap" class="row no-wrap"
v-for="row in showSetCellMessage.rows" v-for="row in showSetCellMessage.rows"
:key="row" :key="row"
:class="{ stickyRow: row == 1 }"
> >
<div <div
class="ceil" class="ceil"
@ -67,6 +69,7 @@
</div> </div>
</div> </div>
</div> </div>
</q-scroll-area>
</q-tab-panel> </q-tab-panel>
</template> </template>
</q-tab-panels> </q-tab-panels>
@ -117,9 +120,16 @@ let ciCjList = sceneCiCjQdListMap.get(
let ciQdList = sceneCiCjQdListMap.get( let ciQdList = sceneCiCjQdListMap.get(
`${lineStore.sceneName}+ciQdList` `${lineStore.sceneName}+ciQdList`
) as relayCabinetGraphicData.CiQd; ) as relayCabinetGraphicData.CiQd;
setCellMessage.value.rows = Math.max(ciCjList.dsCount, ciQdList.dsCount);
setCellMessage.value.cols = Math.max(
ciCjList.cjList.length,
ciQdList.qdList.length
);
const dialogWidth = computed(() => { const dialogWidth = computed(() => {
if (setCellMessage.value.cols * 134 + 85 <= 1157) {
return setCellMessage.value.cols * 134 + 85; return setCellMessage.value.cols * 134 + 85;
}
return 1157;
}); });
watch( watch(
@ -143,8 +153,6 @@ watch(
); );
onMounted(() => { onMounted(() => {
setCellMessage.value.rows = ciCjList.dsCount;
setCellMessage.value.cols = ciCjList.cjList.length;
tabList.value[0].ListMap = updateCiCjListMap(); tabList.value[0].ListMap = updateCiCjListMap();
tabList.value[1].ListMap = updateCiQdListMap(); tabList.value[1].ListMap = updateCiQdListMap();
}); });
@ -227,7 +235,8 @@ function onMouseOver(e: MouseEvent) {
<style scoped> <style scoped>
.ceil { .ceil {
width: 120px; min-width: 120px;
max-width: 120px;
height: 30px; height: 30px;
border: solid 1px red; border: solid 1px red;
margin: 7px; margin: 7px;
@ -237,8 +246,18 @@ function onMouseOver(e: MouseEvent) {
word-break: break-all; word-break: break-all;
overflow: hidden; overflow: hidden;
} }
.stickyRow {
position: sticky;
top: 0;
z-index: 11;
background-color: #fff;
}
.changeCellSize { .changeCellSize {
width: 40px; min-width: 40px;
position: sticky;
left: 0;
z-index: 10;
background-color: #fff;
} }
.CellGreen { .CellGreen {
border: solid 1px green; border: solid 1px green;

View File

@ -1,6 +1,18 @@
<template> <template>
<draggable-dialog seamless title="驱动列表" :width="865" :height="485"> <draggable-dialog
<div class="row no-wrap" v-for="row in showSetCellMessage.rows" :key="row"> seamless
title="驱动列表"
:width="865"
:height="485"
resizableWidth
resizableHeight
>
<div
class="row no-wrap"
v-for="row in showSetCellMessage.rows"
:key="row"
:class="{ stickyRow: row == 1 }"
>
<div <div
class="ceil" class="ceil"
:class="{ :class="{
@ -10,6 +22,10 @@
col > 1 && col > 1 &&
ciQdList?.qdList[col - 2].bitList[row - 2].refRelays.length, ciQdList?.qdList[col - 2].bitList[row - 2].refRelays.length,
changeCellSize: col == 1, changeCellSize: col == 1,
clickHeightLight:
relayCabinetStore.editCiCjConfigIndex &&
relayCabinetStore.editCiCjConfigIndex.row == row - 1 &&
relayCabinetStore.editCiCjConfigIndex.col == col - 1,
}" }"
v-for="col in showSetCellMessage.cols" v-for="col in showSetCellMessage.cols"
:key="col" :key="col"
@ -32,6 +48,12 @@
</div> </div>
</div> </div>
<template v-slot:titleButton> <template v-slot:titleButton>
<q-btn
color="primary"
label="清空"
style="margin-right: 10px"
@click="clearCiQdListData"
/>
<q-btn <q-btn
color="primary" color="primary"
label="设置" label="设置"
@ -85,6 +107,7 @@ import {
loadCiQdList, loadCiQdList,
creatCiQdList, creatCiQdList,
refRelaysListMap, refRelaysListMap,
clearCiQdList,
} from 'src/drawApp/relayCabinetLayoutApp'; } from 'src/drawApp/relayCabinetLayoutApp';
import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics'; import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics';
import { Relay } from 'src/graphics/relay/Relay'; import { Relay } from 'src/graphics/relay/Relay';
@ -171,6 +194,14 @@ function updateMap() {
}); });
} }
function clearCiQdListData() {
clearCiQdList(setCellMessage.value.rows, setCellMessage.value.cols);
ciQdList = loadCiQdList();
updateMap();
setCellDialog.value = true;
setCellDialog.value = false;
}
const showTooltip = ref(false); const showTooltip = ref(false);
function onMouseOver(e: MouseEvent) { function onMouseOver(e: MouseEvent) {
if ((e.target as HTMLElement).clientHeight > 30) { if ((e.target as HTMLElement).clientHeight > 30) {
@ -191,10 +222,23 @@ function onMouseOver(e: MouseEvent) {
word-break: break-all; word-break: break-all;
overflow: hidden; overflow: hidden;
} }
.stickyRow {
position: sticky;
top: 0;
z-index: 11;
background-color: #fff;
}
.changeCellSize { .changeCellSize {
width: 40px; width: 40px;
position: sticky;
left: 0;
z-index: 10;
background-color: #fff;
} }
.heightLight { .heightLight {
background-color: orange; background-color: orange;
} }
.clickHeightLight {
background-color: red;
}
</style> </style>

View File

@ -0,0 +1,153 @@
<!-- eslint-disable vue/no-mutating-props -->
<template>
<draggable-dialog
v-model="showCkmOperation"
seamless
:title="props.title"
:width="380"
:height="0"
>
<template v-slot:footer>
<q-card>
<q-card-section>
<q-form ref="myForm" @submit="onCreate" class="q-gutter-md">
<q-input
dense
outlined
readonly
label="名称"
v-model="props.code"
/>
<div
class="q-gutter-sm"
style="border: 1px solid #ccc; border-radius: 3px"
>
<div>强制</div>
<q-radio
v-for="option in ckmForceOption"
:key="option.value"
v-model="ckmForce"
:val="option.value"
:label="option.label"
/>
</div>
<div
class="q-gutter-sm"
style="border: 1px solid #ccc; border-radius: 3px"
>
<div>设置故障</div>
<q-radio
v-for="option in ckmFaultOption"
:key="option.value"
v-model="ckmFault"
:val="option.value"
:label="option.label"
/>
</div>
<q-card-actions align="right" class="text-primary">
<q-btn
flat
label="取消"
@click="showCkmOperation = false"
v-close-popup
/>
<q-btn flat label="确认" type="submit" />
</q-card-actions>
</q-form>
</q-card-section>
</q-card>
</template>
</draggable-dialog>
</template>
<script setup lang="ts">
import { QForm } from 'quasar';
import { ckmUpdateParams } from 'src/api/Simulation';
import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { request } from 'src/protos/request';
import { useLineStore } from 'src/stores/line-store';
import { errorNotify } from 'src/utils/CommonNotify';
import { onMounted, onUnmounted, ref } from 'vue';
const props = defineProps({
id: {
type: Number,
required: true,
},
code: {
type: String,
required: true,
},
ckmForceProp: {
type: Number,
required: true,
},
ckmFaultProp: {
type: Number,
required: true,
},
title: {
type: String,
required: true,
},
});
const lineStore = useLineStore();
const showCkmOperation = ref(true);
const ckmForce = ref<request.Ckm.Force>(0);
const ckmForceOption = [
{
label: '无强制',
value: request.Ckm.Force.F_NONE,
},
{
label: '强制开门',
value: request.Ckm.Force.F_KM,
},
{
label: '强制关门',
value: request.Ckm.Force.F_GM,
},
];
const ckmFault = ref<request.Ckm.Fault>(0);
const ckmFaultOption = [
{
label: '无故障',
value: request.Ckm.Fault.FA_NONE,
},
{
label: '状态丢失',
value: request.Ckm.Fault.FA_State_Loss,
},
];
onMounted(() => {
ckmForce.value = props.ckmForceProp;
ckmFault.value = props.ckmFaultProp;
});
const myForm = ref<QForm | null>(null);
function onCreate() {
myForm.value?.validate().then(async (res) => {
if (res) {
const obj = {
simulationId: lineStore?.simulationId || '',
mapId: lineStore.mapId as number,
deviceId: props.id,
operation: request.Ckm.Operation.SetParams,
param: {
force: ckmForce.value,
fault: ckmFault.value,
},
};
ckmUpdateParams(obj).catch((e) => errorNotify('操作失败:' + e.title, e));
showCkmOperation.value = false;
}
});
}
onUnmounted(() => {
lineStore.deviceOpreratDialogInstance = null;
});
</script>
<style scoped></style>

View File

@ -59,6 +59,7 @@ const relayCabinetStore = useRelayCabinetStore();
const $q = useQuasar(); const $q = useQuasar();
const tableRef = ref<QTable>(); const tableRef = ref<QTable>();
const deviceTypeMap = { const deviceTypeMap = {
0: '区段',
1: '道岔', 1: '道岔',
5: '信号机', 5: '信号机',
6: '车站', 6: '车站',
@ -68,6 +69,9 @@ const deviceTypeMap = {
10: '电源屏', 10: '电源屏',
11: '车库门', 11: '车库门',
12: '洗车机', 12: '洗车机',
13: '防淹门',
14: '站台',
15: '零散',
}; };
const columns: QTable['columns'] = [ const columns: QTable['columns'] = [
{ {

View File

@ -0,0 +1,161 @@
<template>
<draggable-dialog
seamless
title="公里标设计-实测数据"
:width="600"
:height="0"
>
<template v-slot:titleButton>
<q-btn
color="primary"
label="新建"
style="margin-right: 10px"
@click="createKilometerConvert"
/>
</template>
<template v-slot:footer>
<q-table
ref="tableRef"
style="max-height: 600px"
v-model:pagination="pagination"
:loading="loading"
:rows="rows"
:columns="columns"
@request="onRequest"
:rows-per-page-options="[5, 10, 20, 50]"
>
<template v-slot:body-cell="props">
<q-td :props="props" class="custom-column">
{{ props.value }}
</q-td>
</template>
<template v-slot:body-cell-operations="props">
<q-td :props="props">
<div class="q-gutter-sm row justify-center">
<q-btn
color="primary"
label="编辑"
@click="editData(props.rowIndex)"
/>
<q-btn
color="red"
label="删除"
@click="deleteData(props.rowIndex)"
/>
</div>
</q-td>
</template>
</q-table>
</template>
</draggable-dialog>
</template>
<script setup lang="ts">
import { onMounted, ref, watch } from 'vue';
import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { QTable, useQuasar } from 'quasar';
import { errorNotify, successNotify } from 'src/utils/CommonNotify';
import {
loadKmChainDataList,
editKmChainData,
deleteKmChainData,
} from 'src/drawApp/commonApp';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import { useDrawStore } from 'src/stores/draw-store';
import { KilometerSystem } from 'src/graphics/signal/Signal';
const drawStore = useDrawStore();
const $q = useQuasar();
const tableRef = ref<QTable>();
const columns: QTable['columns'] = [
{
name: 'designKm',
label: '设计公里标',
field: (row) => getKMName(row.designKm),
align: 'center',
},
{
name: 'actualKm',
label: '实际公里标',
field: (row) => getKMName(row.actualKm),
align: 'center',
},
{ name: 'operations', label: '操作', field: 'operations', align: 'center' },
];
const rows = ref<graphicData.KilometerMarkCalibration[]>([]);
const loading = ref(false);
const pagination = ref({
sortBy: 'desc',
descending: false,
page: 1,
rowsPerPage: 10,
rowsNumber: 10,
});
const onRequest: QTable['onRequest'] = () => {
getList();
};
function getList() {
loading.value = true;
const refDatas = loadKmChainDataList();
rows.value = refDatas;
pagination.value.rowsNumber = refDatas.length;
pagination.value.rowsPerPage = refDatas.length;
loading.value = false;
}
function deleteData(index: number) {
const row = rows.value[index];
const name = getKMName(row.designKm);
$q.dialog({
message: `确定删除 "${name}" 吗?`,
cancel: true,
}).onOk(async () => {
try {
if (drawStore.editKmChainDataIndex == index) {
drawStore.setEditKmChainDataIndex(-1);
}
deleteKmChainData(index);
successNotify('删除数据成功!');
} catch (err) {
errorNotify('删除失败:', err);
} finally {
tableRef.value?.requestServerInteraction();
}
});
}
onMounted(() => {
getList();
});
watch(
() => drawStore.showEditKmChainData,
(val) => {
if (!val) {
tableRef.value?.requestServerInteraction();
}
}
);
function createKilometerConvert() {
drawStore.setEditKmChainDataIndex(loadKmChainDataList().length);
}
function editData(index: number) {
drawStore.setEditKmChainDataIndex(index);
}
function getKMName(km: KilometerSystem) {
return km.coordinateSystem + '_' + km.kilometer;
}
</script>
<style scoped>
.custom-column {
max-width: 250px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

View File

@ -0,0 +1,801 @@
<!-- eslint-disable vue/no-mutating-props -->
<template>
<draggable-dialog
seamless
title="联锁编号映射数据"
v-model="showLianSuoBianHao"
@hide="updateData"
:width="600"
:height="500"
>
<q-splitter v-model="splitterModel" style="height: 480px">
<template v-slot:before>
<q-tabs
v-model="tab"
vertical
class="text-teal"
@update:model-value="tabUpdate"
>
<q-tab name="station" label="联锁站" />
<q-tab name="turnout" label="道岔" />
<q-tab name="screenDoor" label="屏蔽门" />
<q-tab name="signal" label="信号机" />
<!-- <q-tab name="section" label="区段" /> -->
<q-tab name="acSection" label="计轴区段" />
<q-tab name="floodGate" label="防淹门" />
<q-tab name="spksSwitch" label="SPKS" />
<q-tab name="garageDoor" label="车库门" />
<q-tab name="carWashing" label="洗车机" />
<q-tab name="esbButton" label="紧急停车按钮" />
<q-tab name="holdButton" label="扣车按钮"></q-tab>
<q-tab name="unattengedButton" label="无人折返按钮"></q-tab>
</q-tabs>
</template>
<template v-slot:after>
<q-tab-panels
v-model="tab"
animated
swipeable
vertical
transition-prev="jump-up"
transition-next="jump-up"
>
<q-tab-panel name="station">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in stationOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="turnout">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in turnoutOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="screenDoor">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in screenDoorOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="signal">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in signalOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<!-- <q-tab-panel name="section">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in sectionOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel> -->
<q-tab-panel name="acSection">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in acSectionOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="floodGate">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in floodGateOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="spksSwitch">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in spksSwitchOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="garageDoor">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in garageDoorOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="carWashing">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in carWashingOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="esbButton">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in esbButtonOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="holdButton">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in holdButtonOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
<q-tab-panel name="unattengedButton">
<div class="row" style="justify-content: space-around">
<template :key="item.id" v-for="item in unattengedButtonOptions">
<q-input
outlined
class="q-mt-sm"
v-model.number="item.index"
@update:model-value="
(value) => {
updateIndex(value as number, item.id);
}
"
type="number"
:label="item.name + '联锁编号:'"
/>
</template>
</div>
</q-tab-panel>
</q-tab-panels>
</template>
</q-splitter>
</draggable-dialog>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { Station } from 'src/graphics/station/Station';
import { useDrawStore } from 'src/stores/draw-store';
import { Turnout } from 'src/graphics/turnout/Turnout';
import { ScreenDoor } from 'src/graphics/screenDoor/ScreenDoor';
import { Platform } from 'src/graphics/platform/Platform';
import { Signal } from 'src/graphics/signal/Signal';
import { Section } from 'src/graphics/section/Section';
import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import { SpksSwitch } from 'src/graphics/spksSwitch/SpksSwitch';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
import { CarWashing } from 'src/graphics/carWashing/CarWashing';
import { loadLianSuoData, setLianSuoData } from 'src/drawApp/commonApp';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import { EsbButton } from 'src/graphics/esbButton/EsbButton';
import { HoldButton } from 'src/graphics/holdButton/HoldButton';
import { UnattengedButton } from 'src/graphics/unattengedButton/UnattengedButton';
import { AxleCountingSection } from 'src/graphics/axleCountingSection/AxleCountingSection';
import { AxleCounting } from 'src/graphics/axleCounting/AxleCounting';
const drawStore = useDrawStore();
const stationOptions = ref<{ id: number; name: string; index: number }[]>([]);
const turnoutOptions = ref<{ id: number; name: string; index: number }[]>([]);
const screenDoorOptions = ref<{ id: number; name: string; index: number }[]>(
[]
);
const signalOptions = ref<{ id: number; name: string; index: number }[]>([]);
// const sectionOptions = ref<{ id: number; name: string; index: number }[]>([]);
const acSectionOptions = ref<{ id: number; name: string; index: number }[]>([]);
const floodGateOptions = ref<{ id: number; name: string; index: number }[]>([]);
const spksSwitchOptions = ref<{ id: number; name: string; index: number }[]>(
[]
);
const garageDoorOptions = ref<{ id: number; name: string; index: number }[]>(
[]
);
const carWashingOptions = ref<{ id: number; name: string; index: number }[]>(
[]
);
const esbButtonOptions = ref<{ id: number; name: string; index: number }[]>([]);
const holdButtonOptions = ref<{ id: number; name: string; index: number }[]>(
[]
);
const unattengedButtonOptions = ref<
{ id: number; name: string; index: number }[]
>([]);
const tab = ref<string>('');
const splitterModel = ref<number>(20);
const showLianSuoBianHao = ref(true);
const drawApp = drawStore.getDrawApp();
let lianSuoMapData = new Map();
onMounted(() => {
lianSuoMapData = new Map();
const lianSuoData = loadLianSuoData();
lianSuoData.stations.forEach((s) => {
lianSuoMapData.set(s.id, s.index);
});
lianSuoData.switchs.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.screenDoors.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.signals.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.acSections.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.garageDoors.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.spksSwitchs.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.floodGates.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.carWashing.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.esbButtons.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.holdButtons.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
lianSuoData.unattengedButtons.forEach((t) => {
lianSuoMapData.set(t.id, t.index);
});
stationUpdateData();
stationUpdateData();
turnoutUpdateData();
screenDoorUpdateData();
signalUpdateData();
acSectionUpdateData();
floodGateUpdateData();
spksSwitchUpdateData();
garageDoorUpdateData();
carWashingUpdateData();
esbButtonUpdateData();
holdButtonUpdateData();
unattengedButtonUpdateData();
tab.value = 'station';
});
function stationUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const stations = drawApp.queryStore.queryByType<Station>(Station.Type);
stations.forEach((sta) => {
if (sta.datas.concentrationStations) {
const index = lianSuoMapData.get(sta.datas.id) || 0;
list.push({
id: sta.datas.id,
name: sta.datas.stationName,
index: index,
});
stationOptions.value = list;
}
});
}
function turnoutUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const turnouts = drawApp.queryStore.queryByType<Turnout>(Turnout.Type);
turnouts.forEach((turnout) => {
let name = turnout.datas.code;
if (turnout.datas.centralizedStations.length > 0) {
turnout.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
const index = lianSuoMapData.get(turnout.datas.id) || 0;
list.push({ id: turnout.datas.id, name: name, index: index });
turnoutOptions.value = list;
});
}
function screenDoorUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const screenDoors = drawApp.queryStore.queryByType<ScreenDoor>(
ScreenDoor.Type
);
screenDoors.forEach((screenDoor) => {
let name = screenDoor.datas.code;
if (screenDoor.datas.refPlatform) {
const stand = drawApp.queryStore.queryById<Platform>(
screenDoor.datas.refPlatform
);
name = name + '-' + stand.datas.code;
if (stand.datas.refStation) {
const station = drawApp.queryStore.queryById<Station>(
stand.datas.refStation
);
name = name + '-' + station.datas.stationName;
}
}
const index = lianSuoMapData.get(screenDoor.datas.id) || 0;
list.push({
id: screenDoor.datas.id,
name: name,
index: index,
});
screenDoorOptions.value = list;
});
}
function signalUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const signals = drawApp.queryStore.queryByType<Signal>(Signal.Type);
signals.forEach((signal) => {
let name = signal.datas.code;
if (signal.datas.centralizedStations.length > 0) {
signal.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
const index = lianSuoMapData.get(signal.datas.id) || 0;
list.push({
id: signal.datas.id,
name: name,
index: index,
});
signalOptions.value = list;
});
}
function acSectionUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const acSections = drawApp.queryStore.queryByType<AxleCountingSection>(
AxleCountingSection.Type
);
acSections.forEach((acSection) => {
let name = acSection.datas.code;
if (acSection.datas.paRef) {
const axleCounting = drawApp.queryStore.queryById<AxleCounting>(
acSection.datas.paRef.id
);
if (axleCounting.datas.centralizedStations.length > 0) {
axleCounting.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
}
const index = lianSuoMapData.get(acSection.datas.id) || 0;
list.push({
id: acSection.datas.id,
name: name,
index: index,
});
acSectionOptions.value = list;
});
}
function floodGateUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const floodGates = drawApp.queryStore.queryByType<FloodGate>(FloodGate.Type);
floodGates.forEach((floodGate) => {
let name = floodGate.datas.code;
if (floodGate.datas.centralizedStations.length > 0) {
floodGate.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
const index = lianSuoMapData.get(floodGate.datas.id) || 0;
list.push({
id: floodGate.datas.id,
name: name,
index: index,
});
floodGateOptions.value = list;
});
}
function spksSwitchUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const spksSwitches = drawApp.queryStore.queryByType<SpksSwitch>(
SpksSwitch.Type
);
spksSwitches.forEach((spksSwitch) => {
let name = spksSwitch.datas.code;
if (spksSwitch.datas.refStand) {
const stand = drawApp.queryStore.queryById<Platform>(
spksSwitch.datas.refStand
);
name = name + '-' + stand.datas.code;
if (stand.datas.refStation) {
const station = drawApp.queryStore.queryById<Station>(
stand.datas.refStation
);
name = name + '-' + station.datas.stationName;
}
}
const index = lianSuoMapData.get(spksSwitch.datas.id) || 0;
list.push({
id: spksSwitch.datas.id,
name: name,
index: index,
});
spksSwitchOptions.value = list;
});
}
function garageDoorUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const garageDoors = drawApp.queryStore.queryByType<GarageDoor>(
GarageDoor.Type
);
garageDoors.forEach((garageDoor) => {
let name = garageDoor.code;
if (garageDoor.datas.centralizedStations.length > 0) {
garageDoor.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
const index = lianSuoMapData.get(garageDoor.datas.id) || 0;
list.push({
id: garageDoor.datas.id,
name: name,
index: index,
});
garageDoorOptions.value = list;
});
}
function carWashingUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const carWashings = drawApp.queryStore.queryByType<CarWashing>(
CarWashing.Type
);
carWashings.forEach((carWashing) => {
let name = carWashing.code;
if (carWashing.datas.centralizedStations.length > 0) {
carWashing.datas.centralizedStations.forEach((id) => {
const station = drawApp.queryStore.queryById<Station>(id);
name = name + '-' + station.datas.stationName;
});
}
const index = lianSuoMapData.get(carWashing.datas.id) || 0;
list.push({
id: carWashing.datas.id,
name: name,
index: index,
});
carWashingOptions.value = list;
});
}
function esbButtonUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const esbs = drawApp.queryStore.queryByType<EsbButton>(EsbButton.Type);
esbs.forEach((esb) => {
let name = esb.datas.code;
if (esb.datas.refStand) {
const stand = drawApp.queryStore.queryById<Platform>(esb.datas.refStand);
name = name + '-' + stand.datas.code;
if (stand.datas.refStation) {
const station = drawApp.queryStore.queryById<Station>(
stand.datas.refStation
);
name = name + '-' + station.datas.stationName;
}
}
const index = lianSuoMapData.get(esb.datas.id) || 0;
list.push({
id: esb.datas.id,
name: name,
index: index,
});
esbButtonOptions.value = list;
});
}
function holdButtonUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const holdButtons = drawApp.queryStore.queryByType<HoldButton>(
HoldButton.Type
);
holdButtons.forEach((holdButton) => {
let name = holdButton.datas.code;
if (holdButton.datas.refStand) {
const stand = drawApp.queryStore.queryById<Platform>(
holdButton.datas.refStand
);
name = name + '-' + stand.datas.code;
if (stand.datas.refStation) {
const station = drawApp.queryStore.queryById<Station>(
stand.datas.refStation
);
name = name + '-' + station.datas.stationName;
}
}
const index = lianSuoMapData.get(holdButton.datas.id) || 0;
list.push({
id: holdButton.datas.id,
name: name,
index: index,
});
holdButtonOptions.value = list;
});
}
function unattengedButtonUpdateData() {
const list: { id: number; name: string; index: number }[] = [];
const unattengedButtons = drawApp.queryStore.queryByType<UnattengedButton>(
UnattengedButton.Type
);
unattengedButtons.forEach((unattengedButton) => {
let name = unattengedButton.datas.code;
if (unattengedButton.datas.refStand) {
const stand = drawApp.queryStore.queryById<Platform>(
unattengedButton.datas.refStand
);
name = name + '-' + stand.datas.code;
if (stand.datas.refStation) {
const station = drawApp.queryStore.queryById<Station>(
stand.datas.refStation
);
name = name + '-' + station.datas.stationName;
}
}
const index = lianSuoMapData.get(unattengedButton.datas.id) || 0;
list.push({
id: unattengedButton.datas.id,
name: name,
index: index,
});
unattengedButtonOptions.value = list;
});
}
function tabUpdate() {
switch (tab.value) {
case 'station':
stationUpdateData();
break;
case 'turnout':
turnoutUpdateData();
break;
case 'screenDoor':
screenDoorUpdateData();
break;
case 'signal':
signalUpdateData();
break;
case 'acSection':
acSectionUpdateData();
break;
case 'floodGate':
floodGateUpdateData();
break;
case 'spksSwitch':
spksSwitchUpdateData();
break;
case 'garageDoor':
garageDoorUpdateData();
break;
case 'carWashing':
carWashingUpdateData();
break;
case 'esbButton':
esbButtonUpdateData();
break;
case 'holdButton':
holdButtonUpdateData();
break;
case 'unattengedButton':
unattengedButtonUpdateData();
break;
}
}
function updateData() {
const newLianSuoData = new graphicData.LianSuoData();
stationOptions.value.forEach((st) => {
newLianSuoData.stations.push(
new graphicData.LianSuoIndexData({ id: st.id, index: st.index })
);
});
turnoutOptions.value.forEach((tu) => {
newLianSuoData.switchs.push(
new graphicData.LianSuoIndexData({ id: tu.id, index: tu.index })
);
});
screenDoorOptions.value.forEach((sd) => {
newLianSuoData.screenDoors.push(
new graphicData.LianSuoIndexData({ id: sd.id, index: sd.index })
);
});
acSectionOptions.value.forEach((se) => {
newLianSuoData.acSections.push(
new graphicData.LianSuoIndexData({ id: se.id, index: se.index })
);
});
signalOptions.value.forEach((si) => {
newLianSuoData.signals.push(
new graphicData.LianSuoIndexData({ id: si.id, index: si.index })
);
});
spksSwitchOptions.value.forEach((ss) => {
newLianSuoData.spksSwitchs.push(
new graphicData.LianSuoIndexData({ id: ss.id, index: ss.index })
);
});
floodGateOptions.value.forEach((fg) => {
newLianSuoData.floodGates.push(
new graphicData.LianSuoIndexData({ id: fg.id, index: fg.index })
);
});
garageDoorOptions.value.forEach((gd) => {
newLianSuoData.garageDoors.push(
new graphicData.LianSuoIndexData({ id: gd.id, index: gd.index })
);
});
carWashingOptions.value.forEach((cw) => {
newLianSuoData.carWashing.push(
new graphicData.LianSuoIndexData({ id: cw.id, index: cw.index })
);
});
esbButtonOptions.value.forEach((eb) => {
newLianSuoData.esbButtons.push(
new graphicData.LianSuoIndexData({ id: eb.id, index: eb.index })
);
});
holdButtonOptions.value.forEach((hb) => {
newLianSuoData.holdButtons.push(
new graphicData.LianSuoIndexData({ id: hb.id, index: hb.index })
);
});
unattengedButtonOptions.value.forEach((ub) => {
newLianSuoData.unattengedButtons.push(
new graphicData.LianSuoIndexData({ id: ub.id, index: ub.index })
);
});
setLianSuoData(newLianSuoData);
}
function updateIndex(index: number, id: number) {
lianSuoMapData.set(id, index);
}
</script>
<style scoped></style>

View File

@ -105,6 +105,9 @@ function onCreate() {
const messageIndex = titleKeys.findIndex( const messageIndex = titleKeys.findIndex(
(key) => title[key] === '报文1023bits' (key) => title[key] === '报文1023bits'
); );
const originalCodeIndex = titleKeys.findIndex(
(key) => title[key] === '应答器编号'
);
dataList.forEach((data, i) => { dataList.forEach((data, i) => {
if (i > index) { if (i > index) {
const tranCode = const tranCode =
@ -126,6 +129,9 @@ function onCreate() {
datas.fixedUserTelegram = data[ datas.fixedUserTelegram = data[
titleKeys[userMessageIndex] titleKeys[userMessageIndex]
].replaceAll(' ', ''); ].replaceAll(' ', '');
datas.originalCode = data[
titleKeys[originalCodeIndex]
].replaceAll(' ', '');
transpnder.updateData(datas); transpnder.updateData(datas);
} }
} }

View File

@ -38,10 +38,11 @@
<script setup lang="ts"> <script setup lang="ts">
import { QForm } from 'quasar'; import { QForm } from 'quasar';
import { onMounted, ref } from 'vue'; import { onMounted, ref, onUnmounted } from 'vue';
import DraggableDialog from 'src/components/common/DraggableDialog.vue'; import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { getCanLinkPlatForm, updateTrainConn } from 'src/api/Simulation'; import { getCanLinkPlatForm, updateTrainConn } from 'src/api/Simulation';
import { successNotify, errorNotify } from 'src/utils/CommonNotify'; import { successNotify, errorNotify } from 'src/utils/CommonNotify';
import { useLineStore } from 'src/stores/line-store';
const props = defineProps({ const props = defineProps({
simulationId: { simulationId: {
type: String, type: String,
@ -52,22 +53,23 @@ const props = defineProps({
required: true, required: true,
}, },
}); });
const connType = ref<number>(0); const connType = ref<string | undefined>();
const connectOptions = ref<{ label: string; value: number }[]>([]); const connectOptions = ref<{ label: string; value: string }[]>([]);
const showLoadTransData = ref(true); const showLoadTransData = ref(true);
const connectMap = new Map<string, number>();
onMounted(() => { onMounted(() => {
connectOptions.value = []; connectOptions.value = [];
getCanLinkPlatForm(props.simulationId) getCanLinkPlatForm(props.simulationId)
.then((resp) => { .then((resp) => {
const list: { label: string; value: number }[] = []; const list: { label: string; value: string }[] = [];
resp.data.forEach((element: { connType: number }) => { resp.data.forEach((element: { typeName: string; connType: number }) => {
if (element.connType === 1) { list.push({
list.push({ label: '半实物', value: 1 }); label: element.typeName,
} else if (element.connType === 2) { value: element.typeName,
list.push({ label: 'PC仿真', value: 2 }); });
} connectMap.set(element.typeName, element.connType);
}); });
connectOptions.value = list; connectOptions.value = list;
}) })
@ -82,7 +84,8 @@ function onCreate() {
updateTrainConn({ updateTrainConn({
id: props.trainId + '', id: props.trainId + '',
simulationId: props.simulationId, simulationId: props.simulationId,
connType: connType.value, connType: connectMap.get(connType.value as string) || 0,
typeName: connType.value as string,
}) })
.then(() => { .then(() => {
successNotify('列车连接成功!'); successNotify('列车连接成功!');
@ -93,5 +96,8 @@ function onCreate() {
}); });
}); });
} }
onUnmounted(() => {
useLineStore().deviceOpreratDialogInstance = null;
});
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -8,7 +8,7 @@
:height="722" :height="722"
> >
<q-card style="width: 1000px; height: auto"> <q-card style="width: 1000px; height: auto">
<q-form ref="myForm" @submit="onCreate" class="q-gutter-md"> <q-form ref="myForm" class="q-gutter-md">
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="float-text">1</div> <div class="float-text">1</div>
@ -23,7 +23,7 @@
v-model.number="model.trainEndsA.radarCheckSpeedDiff" v-model.number="model.trainEndsA.radarCheckSpeedDiff"
clearable clearable
@clear="() => (model.trainEndsA.radarCheckSpeedDiff = 0)" @clear="() => (model.trainEndsA.radarCheckSpeedDiff = 0)"
label="雷达测速差值(m/s)" label="雷达测速差值(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -45,7 +45,7 @@
v-model.number="model.trainEndsA.radarOutSpeed" v-model.number="model.trainEndsA.radarOutSpeed"
clearable clearable
@clear="() => (model.trainEndsA.radarOutSpeed = 0)" @clear="() => (model.trainEndsA.radarOutSpeed = 0)"
label="雷达速度输出(m/s)" label="雷达速度输出(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -82,7 +82,7 @@
v-model.number="model.trainEndsA.accOutSpeed" v-model.number="model.trainEndsA.accOutSpeed"
clearable clearable
@clear="() => (model.trainEndsA.accOutSpeed = 0)" @clear="() => (model.trainEndsA.accOutSpeed = 0)"
label="速传速度输出(m/s)" label="速传速度输出(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -137,7 +137,7 @@
v-model.number="model.trainEndsB.radarCheckSpeedDiff" v-model.number="model.trainEndsB.radarCheckSpeedDiff"
clearable clearable
@clear="() => (model.trainEndsB.radarCheckSpeedDiff = 0)" @clear="() => (model.trainEndsB.radarCheckSpeedDiff = 0)"
label="雷达测速差值(m/s)" label="雷达测速差值(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -159,7 +159,7 @@
v-model.number="model.trainEndsB.radarOutSpeed" v-model.number="model.trainEndsB.radarOutSpeed"
clearable clearable
@clear="() => (model.trainEndsB.radarOutSpeed = 0)" @clear="() => (model.trainEndsB.radarOutSpeed = 0)"
label="雷达速度输出(m/s)" label="雷达速度输出(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -196,7 +196,7 @@
v-model.number="model.trainEndsB.accOutSpeed" v-model.number="model.trainEndsB.accOutSpeed"
clearable clearable
@clear="() => (model.trainEndsB.accOutSpeed = 0)" @clear="() => (model.trainEndsB.accOutSpeed = 0)"
label="速传速度输出(m/s)" label="速传速度输出(km/h)"
hint="" hint=""
/> />
</div> </div>
@ -427,17 +427,29 @@
</div> </div>
</div> </div>
</div> </div>
<q-card-actions align="right" class="text-primary"> <!-- <q-card-actions align="right" class="text-primary">
</q-card-actions> -->
</q-form>
</q-card>
<template v-slot:sticky-footer>
<div
style="
height: 45px;
line-height: 45px;
text-align: right;
background: #fff;
"
>
<q-btn <q-btn
flat flat
label="取消" label="取消"
@click="showTrainParamOperation = false" @click="showTrainParamOperation = false"
v-close-popup v-close-popup
/> />
<q-btn flat label="确认" type="submit" /> <q-btn flat label="确认" @click="onCreate" />
</q-card-actions> </div>
</q-form> </template>
</q-card>
</draggable-dialog> </draggable-dialog>
</template> </template>

View File

@ -0,0 +1,115 @@
<!-- eslint-disable vue/no-mutating-props -->
<template>
<draggable-dialog
v-model="showXcjOperation"
seamless
title="洗车机设置参数"
:width="380"
:height="0"
>
<template v-slot:footer>
<q-card>
<q-card-section>
<q-form ref="myForm" @submit="onCreate" class="q-gutter-md">
<q-input
dense
outlined
readonly
label="名称"
v-model="props.code"
/>
<div
class="q-gutter-sm"
style="border: 1px solid #ccc; border-radius: 3px"
>
<div>设置故障</div>
<q-radio
v-for="option in xcjFaultOption"
:key="option.value"
v-model="xcjFault"
:val="option.value"
:label="option.label"
/>
</div>
<q-card-actions align="right" class="text-primary">
<q-btn
flat
label="取消"
@click="showXcjOperation = false"
v-close-popup
/>
<q-btn flat label="确认" type="submit" />
</q-card-actions>
</q-form>
</q-card-section>
</q-card>
</template>
</draggable-dialog>
</template>
<script setup lang="ts">
import { QForm } from 'quasar';
import { xcjUpdateParams } from 'src/api/Simulation';
import DraggableDialog from 'src/components/common/DraggableDialog.vue';
import { request } from 'src/protos/request';
import { useLineStore } from 'src/stores/line-store';
import { errorNotify } from 'src/utils/CommonNotify';
import { onMounted, onUnmounted, ref } from 'vue';
const props = defineProps({
id: {
type: Number,
required: true,
},
code: {
type: String,
required: true,
},
xcjFaultProp: {
type: Number,
required: true,
},
});
const lineStore = useLineStore();
const showXcjOperation = ref(true);
const xcjFault = ref<request.Xcj.Fault>(0);
const xcjFaultOption = [
{
label: '无故障',
value: request.Xcj.Fault.FA_NONE,
},
{
label: '故障',
value: request.Xcj.Fault.FA_Fault,
},
];
onMounted(() => {
xcjFault.value = props.xcjFaultProp;
});
const myForm = ref<QForm | null>(null);
function onCreate() {
myForm.value?.validate().then(async (res) => {
if (res) {
const obj = {
simulationId: lineStore?.simulationId || '',
mapId: lineStore.mapId as number,
deviceId: props.id,
operation: request.Xcj.Operation.SetParams,
param: {
fault: xcjFault.value,
},
};
xcjUpdateParams(obj).catch((e) => errorNotify('操作失败:' + e.title, e));
showXcjOperation.value = false;
}
});
}
onUnmounted(() => {
lineStore.deviceOpreratDialogInstance = null;
});
</script>
<style scoped></style>

View File

@ -14,6 +14,22 @@
@blur="onUpdate" @blur="onUpdate"
label="名称" label="名称"
/> />
<q-input
outlined
class="q-mt-sm"
mask="#"
v-model.number="carWashingModel.duanNum"
@blur="onUpdate"
label="段数"
/>
<q-input
outlined
class="q-mt-sm"
:decimals="0"
v-model.number="carWashingModel.width"
@blur="onUpdate"
label="宽度"
/>
<q-select <q-select
outlined outlined
style="margin-top: 10px" style="margin-top: 10px"

View File

@ -60,6 +60,11 @@
<q-btn label="提交" type="submit" color="primary" class="q-mr-md" /> <q-btn label="提交" type="submit" color="primary" class="q-mr-md" />
<q-btn label="返回" color="primary" @click="goBack" /> <q-btn label="返回" color="primary" @click="goBack" />
</div> </div>
<q-separator inset></q-separator>
<div class="q-gutter-sm q-pa-md row justify-center">
<q-btn label="添加位置" color="red" @click="addPosition" />
<q-btn label="删除位置" color="red" @click="deletePosition" />
</div>
</q-form> </q-form>
</q-card> </q-card>
</div> </div>
@ -71,10 +76,15 @@ import { QForm, useQuasar } from 'quasar';
import { JlGraphic } from 'jl-graphic'; import { JlGraphic } from 'jl-graphic';
import { import {
CiCjConfigCeil, CiCjConfigCeil,
PressKeyForCiCjQd,
useRelayCabinetStore, useRelayCabinetStore,
} from 'src/stores/relayCabinet-store'; } from 'src/stores/relayCabinet-store';
import { Relay } from 'src/graphics/relay/Relay'; import { Relay } from 'src/graphics/relay/Relay';
import { loadCiCjList } from 'src/drawApp/relayCabinetLayoutApp'; import {
deleteCjDataPositionByIndex,
addCjDataPositionByIndex,
loadCiCjList,
} from 'src/drawApp/relayCabinetLayoutApp';
import { PhaseFailureProtector } from 'src/graphics/phaseFailureProtector/PhaseFailureProtector'; import { PhaseFailureProtector } from 'src/graphics/phaseFailureProtector/PhaseFailureProtector';
import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics'; import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics';
@ -107,17 +117,28 @@ watch(
selectGraphic.push(...selectFilter); selectGraphic.push(...selectFilter);
selectGraphic = Array.from(new Set(selectGraphic)); selectGraphic = Array.from(new Set(selectGraphic));
relayCabinetStore.getDrawApp().updateSelected(...selectGraphic); relayCabinetStore.getDrawApp().updateSelected(...selectGraphic);
collectionConfig.value.refRelaysCode = selectGraphic.map((g) => {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil; const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
collectionConfig.value.refRelaysCode = selectGraphic.map((g) => {
const hasChoose = map const hasChoose = map
.get(`${click.row}-${click.col}`) .get(`${click.row}-${click.col}`)
?.find((cjDataItem) => cjDataItem.relayId == g.id); ?.find((cjDataItem) => cjDataItem.relayId == g.id);
const pos = hasChoose?.position || 0; let isPressKeyPos = 0;
if (relayCabinetStore.currentPressKey == PressKeyForCiCjQd.alt) {
isPressKeyPos = 1;
}
const pos = hasChoose?.position || isPressKeyPos;
return { code: (g as Relay).datas.code, pos }; return { code: (g as Relay).datas.code, pos };
}); });
collectionConfig.value.refRelays = selectGraphic.map( collectionConfig.value.refRelays = selectGraphic.map(
(g) => g.id (g) => g.id
) as number[]; ) as number[];
if (
relayCabinetStore.currentPressKey == PressKeyForCiCjQd.ctrl ||
relayCabinetStore.currentPressKey == PressKeyForCiCjQd.alt
) {
onSubmit();
handleNextPosition();
}
} }
} }
); );
@ -133,9 +154,24 @@ watch(
} }
); );
//
watch(
() => relayCabinetStore.currentPressKey,
(val) => {
if (val == PressKeyForCiCjQd.space1 || val == PressKeyForCiCjQd.space2) {
handleNextPosition();
}
}
);
let CiCjListRows = 0;
let CiCjListCols = 0;
onMounted(() => { onMounted(() => {
onReset(); onReset();
getEditData(); getEditData();
const ciCjList = loadCiCjList();
CiCjListRows = ciCjList.dsCount;
CiCjListCols = ciCjList.cjList.length;
}); });
function getEditData() { function getEditData() {
@ -172,9 +208,7 @@ function updateMap(ciCjList: relayCabinetGraphicData.CiCj) {
} }
const myForm = ref<QForm | null>(null); const myForm = ref<QForm | null>(null);
async function onSubmit() { function onSubmit() {
myForm.value?.validate().then(async (res) => {
if (res) {
try { try {
const ciCjList = loadCiCjList(); const ciCjList = loadCiCjList();
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil; const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
@ -203,8 +237,6 @@ async function onSubmit() {
showCollectionConfig.value = true; showCollectionConfig.value = true;
}, 0); }, 0);
} }
}
});
} }
function removeSelect(removeIndex: number) { function removeSelect(removeIndex: number) {
@ -239,6 +271,36 @@ function goBack() {
relayCabinetStore.showCiCjConfig = false; relayCabinetStore.showCiCjConfig = false;
} }
function addPosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
addCjDataPositionByIndex(click.row - 1, click.col - 1);
relayCabinetStore.updateCiCjList = true;
}
function deletePosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
deleteCjDataPositionByIndex(click.row - 1, click.col - 1);
relayCabinetStore.updateCiCjList = true;
}
function handleNextPosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
let nestPos = {
row: click.row + 1,
col: click.col,
};
if (click.row + 1 <= CiCjListRows) {
relayCabinetStore.editCiCjConfigIndex = nestPos;
}
if (click.row + 1 > CiCjListRows && click.col < CiCjListCols) {
nestPos = {
row: 1,
col: click.col + 1,
};
relayCabinetStore.editCiCjConfigIndex = nestPos;
}
}
onUnmounted(() => { onUnmounted(() => {
relayCabinetStore.showCiCjConfig = false; relayCabinetStore.showCiCjConfig = false;
}); });

View File

@ -51,6 +51,11 @@
<q-btn label="提交" type="submit" color="primary" class="q-mr-md" /> <q-btn label="提交" type="submit" color="primary" class="q-mr-md" />
<q-btn label="返回" color="primary" @click="goBack" /> <q-btn label="返回" color="primary" @click="goBack" />
</div> </div>
<q-separator inset></q-separator>
<div class="q-gutter-sm q-pa-md row justify-center">
<q-btn label="添加位置" color="red" @click="addPosition" />
<q-btn label="删除位置" color="red" @click="deletePosition" />
</div>
</q-form> </q-form>
</q-card> </q-card>
</div> </div>
@ -62,10 +67,15 @@ import { QForm, useQuasar } from 'quasar';
import { JlGraphic } from 'jl-graphic'; import { JlGraphic } from 'jl-graphic';
import { import {
CiCjConfigCeil, CiCjConfigCeil,
PressKeyForCiCjQd,
useRelayCabinetStore, useRelayCabinetStore,
} from 'src/stores/relayCabinet-store'; } from 'src/stores/relayCabinet-store';
import { Relay } from 'src/graphics/relay/Relay'; import { Relay } from 'src/graphics/relay/Relay';
import { loadCiQdList } from 'src/drawApp/relayCabinetLayoutApp'; import {
addQdDataPositionByIndex,
deleteQdDataPositionByIndex,
loadCiQdList,
} from 'src/drawApp/relayCabinetLayoutApp';
import { PhaseFailureProtector } from 'src/graphics/phaseFailureProtector/PhaseFailureProtector'; import { PhaseFailureProtector } from 'src/graphics/phaseFailureProtector/PhaseFailureProtector';
const relayCabinetStore = useRelayCabinetStore(); const relayCabinetStore = useRelayCabinetStore();
@ -99,6 +109,13 @@ watch(
collectionConfig.value.refRelays = selectGraphic.map( collectionConfig.value.refRelays = selectGraphic.map(
(g) => g.id (g) => g.id
) as number[]; ) as number[];
if (
relayCabinetStore.currentPressKey == PressKeyForCiCjQd.ctrl ||
relayCabinetStore.currentPressKey == PressKeyForCiCjQd.alt
) {
onSubmit();
handleNextPosition();
}
} }
} }
); );
@ -113,9 +130,24 @@ watch(
} }
); );
//
watch(
() => relayCabinetStore.currentPressKey,
(val) => {
if (val == PressKeyForCiCjQd.space1 || val == PressKeyForCiCjQd.space2) {
handleNextPosition();
}
}
);
let CiQdListRows = 0;
let CiQdListCols = 0;
onMounted(() => { onMounted(() => {
onReset(); onReset();
getEditData(); getEditData();
const ciQdList = loadCiQdList();
CiQdListRows = ciQdList.dsCount;
CiQdListCols = ciQdList.qdList.length;
}); });
function getEditData() { function getEditData() {
@ -138,9 +170,7 @@ function getEditData() {
} }
const myForm = ref<QForm | null>(null); const myForm = ref<QForm | null>(null);
async function onSubmit() { function onSubmit() {
myForm.value?.validate().then(async (res) => {
if (res) {
try { try {
const ciQdList = loadCiQdList(); const ciQdList = loadCiQdList();
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil; const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
@ -162,8 +192,6 @@ async function onSubmit() {
showCollectionConfig.value = true; showCollectionConfig.value = true;
}, 0); }, 0);
} }
}
});
} }
function removeSelect(removeIndex: number) { function removeSelect(removeIndex: number) {
@ -198,6 +226,36 @@ function goBack() {
relayCabinetStore.showCiCjConfig = false; relayCabinetStore.showCiCjConfig = false;
} }
function addPosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
addQdDataPositionByIndex(click.row - 1, click.col - 1);
relayCabinetStore.updateCiCjList = true;
}
function deletePosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
deleteQdDataPositionByIndex(click.row - 1, click.col - 1);
relayCabinetStore.updateCiCjList = true;
}
function handleNextPosition() {
const click = relayCabinetStore.editCiCjConfigIndex as CiCjConfigCeil;
let nestPos = {
row: click.row + 1,
col: click.col,
};
if (click.row + 1 <= CiQdListRows) {
relayCabinetStore.editCiCjConfigIndex = nestPos;
}
if (click.row + 1 > CiQdListRows && click.col < CiQdListCols) {
nestPos = {
row: 1,
col: click.col + 1,
};
relayCabinetStore.editCiCjConfigIndex = nestPos;
}
}
onUnmounted(() => { onUnmounted(() => {
relayCabinetStore.showCiCjConfig = false; relayCabinetStore.showCiCjConfig = false;
}); });

View File

@ -26,14 +26,6 @@
@update:model-value="onUpdate" @update:model-value="onUpdate"
label="右边关联的集中站" label="右边关联的集中站"
/> />
<q-toggle
v-model="
concentrationDividingLineModel.isOtherLineConcentrationDividingLine
"
label="是否与其它线的边界处"
emit-value
@update:model-value="onUpdate"
/>
<q-list bordered separator class="rounded-borders"> <q-list bordered separator class="rounded-borders">
<q-item <q-item
v-for="sectionRelation in sectionRelations" v-for="sectionRelation in sectionRelations"

View File

@ -18,6 +18,14 @@
@update:model-value="onUpdate" @update:model-value="onUpdate"
label="关联区段" label="关联区段"
></q-select> ></q-select>
<q-select
outlined
class="q-mt-sm"
@blur="onUpdate"
v-model="floodGateModel.refPslMapCode"
:options="pslNameList"
label="关联PSL地图"
/>
<q-field class="q-mt-lg" outlined label="所属集中站" stack-label> <q-field class="q-mt-lg" outlined label="所属集中站" stack-label>
<template #control> <template #control>
<q-chip <q-chip
@ -39,12 +47,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { useFormData } from 'src/components/DrawAppFormUtils'; import { useFormData } from 'src/components/DrawAppFormUtils';
import { useDrawStore } from 'src/stores/draw-store'; import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive } from 'vue'; import { onMounted, reactive, ref } from 'vue';
import { Section } from 'src/graphics/section/Section';
import { FloodGateData } from 'src/drawApp/graphics/FloodGateInteraction'; import { FloodGateData } from 'src/drawApp/graphics/FloodGateInteraction';
import { Section } from 'src/graphics/section/Section';
import AddCentralizedStationDialog from '../dialogs/AddCentralizedStationDialog.vue'; import AddCentralizedStationDialog from '../dialogs/AddCentralizedStationDialog.vue';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { Station } from 'src/graphics/station/Station'; import { Station } from 'src/graphics/station/Station';
import { getPublishList } from 'src/api/PublishApi';
import { PictureType } from 'src/protos/picture';
const drawStore = useDrawStore(); const drawStore = useDrawStore();
const sectionList: { label: string; value: number }[] = reactive([]); const sectionList: { label: string; value: number }[] = reactive([]);
@ -53,8 +63,20 @@ const { data: floodGateModel, onUpdate } = useFormData(
new FloodGateData(), new FloodGateData(),
drawStore.getDrawApp() drawStore.getDrawApp()
); );
const pslNameList = ref<string[]>([]);
onMounted(() => { onMounted(() => {
const list2: string[] = [];
getPublishList({
type: PictureType.Psl,
category: useDrawStore().categoryType,
}).then((pslMapList) => {
if (pslMapList && pslMapList.length) {
pslMapList.forEach((item) => {
list2.push(item.name);
});
}
pslNameList.value = list2;
});
const sections = drawStore const sections = drawStore
.getDrawApp() .getDrawApp()
.queryStore.queryByType<Section>(Section.Type); .queryStore.queryByType<Section>(Section.Type);
@ -65,12 +87,12 @@ onMounted(() => {
}); });
}); });
}); });
const $q = useQuasar();
function removeStation(index: number) { function removeStation(index: number) {
floodGateModel.centralizedStations.splice(index, 1); floodGateModel.centralizedStations.splice(index, 1);
onUpdate(); onUpdate();
} }
const $q = useQuasar();
function addStation() { function addStation() {
$q.dialog({ $q.dialog({
title: '', title: '',

View File

@ -1,78 +0,0 @@
<template>
<q-form>
<q-input
outlined
readonly
v-model="garageDoorBoxModel.id"
label="id"
hint=""
/>
<q-input
outlined
class="q-mt-sm"
v-model="garageDoorBoxModel.code"
@blur="onUpdate"
label="编号"
/>
<q-select
outlined
class="q-mt-sm"
style="margin-top: 10px"
v-model="garageDoorBoxModel.refGarageDoorId"
:options="garageDoorList"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="关联屏蔽门"
></q-select>
<q-select
outlined
class="q-mt-sm"
@blur="onUpdate"
v-model="garageDoorBoxModel.refPslMapCode"
:options="pslNameList"
label="关联PSL地图"
/>
</q-form>
</template>
<script setup lang="ts">
import { GarageDoorBoxData } from 'src/drawApp/graphics/GarageDoorBoxInteraction';
import { useFormData } from 'src/components/DrawAppFormUtils';
import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive, ref } from 'vue';
import { getPublishList } from 'src/api/PublishApi';
import { PictureType } from 'src/protos/picture';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
const { data: garageDoorBoxModel, onUpdate } = useFormData(
new GarageDoorBoxData(),
useDrawStore().getDrawApp()
);
const garageDoorList: { label: string; value: number }[] = reactive([]);
const pslNameList = ref<string[]>([]);
onMounted(() => {
const list2: string[] = [];
getPublishList({
type: PictureType.Psl,
category: useDrawStore().categoryType,
}).then((pslMapList) => {
if (pslMapList && pslMapList.length) {
pslMapList.forEach((item) => {
list2.push(item.name);
});
}
pslNameList.value = list2;
});
const garageDoors = useDrawStore()
.getDrawApp()
.queryStore.queryByType<GarageDoor>(GarageDoor.Type);
garageDoors.forEach((p) => {
garageDoorList.push({
value: p.id,
label: `${p.datas.code}[${p.datas.id}]`,
});
});
});
</script>

View File

@ -24,6 +24,14 @@
@update:model-value="onUpdate" @update:model-value="onUpdate"
label="关联区段" label="关联区段"
></q-select> ></q-select>
<q-select
outlined
class="q-mt-sm"
@blur="onUpdate"
v-model="garageDoorModel.refPslMapCode"
:options="pslNameList"
label="关联PSL地图"
/>
<q-field class="q-mt-lg" outlined label="所属集中站" stack-label> <q-field class="q-mt-lg" outlined label="所属集中站" stack-label>
<template #control> <template #control>
<q-chip <q-chip
@ -45,12 +53,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { useFormData } from 'src/components/DrawAppFormUtils'; import { useFormData } from 'src/components/DrawAppFormUtils';
import { useDrawStore } from 'src/stores/draw-store'; import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive } from 'vue'; import { onMounted, reactive, ref } from 'vue';
import { GarageDoorData } from 'src/drawApp/graphics/GarageDoorInteraction'; import { GarageDoorData } from 'src/drawApp/graphics/GarageDoorInteraction';
import { Section } from 'src/graphics/section/Section'; import { Section } from 'src/graphics/section/Section';
import AddCentralizedStationDialog from '../dialogs/AddCentralizedStationDialog.vue'; import AddCentralizedStationDialog from '../dialogs/AddCentralizedStationDialog.vue';
import { useQuasar } from 'quasar'; import { useQuasar } from 'quasar';
import { Station } from 'src/graphics/station/Station'; import { Station } from 'src/graphics/station/Station';
import { getPublishList } from 'src/api/PublishApi';
import { PictureType } from 'src/protos/picture';
const drawStore = useDrawStore(); const drawStore = useDrawStore();
const sectionList: { label: string; value: number }[] = reactive([]); const sectionList: { label: string; value: number }[] = reactive([]);
@ -59,8 +69,20 @@ const { data: garageDoorModel, onUpdate } = useFormData(
new GarageDoorData(), new GarageDoorData(),
drawStore.getDrawApp() drawStore.getDrawApp()
); );
const pslNameList = ref<string[]>([]);
onMounted(() => { onMounted(() => {
const list2: string[] = [];
getPublishList({
type: PictureType.Psl,
category: useDrawStore().categoryType,
}).then((pslMapList) => {
if (pslMapList && pslMapList.length) {
pslMapList.forEach((item) => {
list2.push(item.name);
});
}
pslNameList.value = list2;
});
const sections = drawStore const sections = drawStore
.getDrawApp() .getDrawApp()
.queryStore.queryByType<Section>(Section.Type); .queryStore.queryByType<Section>(Section.Type);

View File

@ -0,0 +1,55 @@
<template>
<q-form>
<q-input
outlined
readonly
v-model="holdButtonModel.id"
label="id"
hint=""
/>
<q-input
outlined
style="margin-top: 10px"
v-model="holdButtonModel.code"
@blur="onUpdate"
label="编号"
/>
<q-select
outlined
style="margin-top: 10px"
v-model="holdButtonModel.refStand"
:options="platformList"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="关联站台"
></q-select>
</q-form>
</template>
<script setup lang="ts">
import { useFormData } from 'src/components/DrawAppFormUtils';
import { HoldButtonData } from 'src/drawApp/graphics/HoldButtonInteraction';
import { Platform } from 'src/graphics/platform/Platform';
import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive } from 'vue';
const drawStore = useDrawStore();
const { data: holdButtonModel, onUpdate } = useFormData(
new HoldButtonData(),
drawStore.getDrawApp()
);
const platformList: { label: string; value: number }[] = reactive([]);
onMounted(() => {
const platforms = drawStore
.getDrawApp()
.queryStore.queryByType<Platform>(Platform.Type);
platforms.forEach((p) => {
platformList.push({
value: p.id,
label: `${p.datas.code}`,
});
});
});
</script>

View File

@ -0,0 +1,194 @@
<template>
<div v-if="showRangeConfig">
<q-card class="q-pa-sm" flat>
<q-card-section>
<div class="text-h6">{{ handleState }}公里标设计-实测数据</div>
</q-card-section>
<q-form
ref="myForm"
@submit="onSubmit"
@reset="onReset"
class="q-gutter-md"
>
<q-card class="q-pa-sm">
<q-card-section>
<div class="text-subtitle1">设计公里标</div>
</q-card-section>
<q-item-section no-wrap class="q-gutter-y-sm column">
<q-input
style="margin-top: 10px"
v-model="data.designKm.coordinateSystem"
label="坐标系"
></q-input>
<q-select
outlined
v-model="data.designKm.direction"
:options="directionOptions"
:map-options="true"
:emit-value="true"
label="方向"
></q-select>
<q-input
style="margin-top: 10px"
v-model.number="data.designKm.kilometer"
type="number"
label="公里标(mm):"
/>
</q-item-section>
</q-card>
<q-card class="q-pa-sm">
<q-card-section>
<div class="text-subtitle1">实测公里标</div>
</q-card-section>
<q-item-section no-wrap class="q-gutter-y-sm column">
<q-input
style="margin-top: 10px"
v-model="data.actualKm.coordinateSystem"
label="坐标系"
></q-input>
<q-select
outlined
v-model="data.actualKm.direction"
:options="directionOptions"
:map-options="true"
:emit-value="true"
label="方向"
></q-select>
<q-input
style="margin-top: 10px"
v-model.number="data.actualKm.kilometer"
type="number"
label="公里标(mm):"
/>
</q-item-section>
</q-card>
<div class="q-gutter-sm q-pa-md row justify-center">
<q-btn label="提交" type="submit" color="primary" class="q-mr-md" />
<q-btn label="重置" type="reset" color="primary" class="q-mr-md" />
<q-btn label="返回" color="primary" @click="goBack" />
</div>
</q-form>
</q-card>
</div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, watch } from 'vue';
import { QForm, useQuasar } from 'quasar';
import { KilometerSystem } from 'src/graphics/signal/Signal';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import {
loadKmChainDataList,
createKmChainData,
editKmChainData,
} from 'src/drawApp/commonApp';
import { useDrawStore } from 'src/stores/draw-store';
const $q = useQuasar();
const showRangeConfig = ref(true);
const handleState = ref('新建');
const drawStore = useDrawStore();
interface IKmChainData {
designKm: KilometerSystem;
actualKm: KilometerSystem;
}
const data = reactive<IKmChainData>({
designKm: {
coordinateSystem: 'MAIN_LINE',
kilometer: 0,
direction: 0,
},
actualKm: {
coordinateSystem: 'MAIN_LINE',
kilometer: 0,
direction: 0,
},
});
const directionOptions = [
{ label: '左行', value: 0 },
{ label: '右行', value: 1 },
];
onMounted(() => {
getData();
});
watch(
() => drawStore.editKmChainDataIndex,
(val) => {
if (val > -1) {
getData();
}
}
);
const myForm = ref<QForm | null>(null);
async function onSubmit() {
myForm.value?.validate().then(async (res) => {
if (res) {
try {
const designKm = new graphicData.KilometerSystem(data.designKm);
const actualKm = new graphicData.KilometerSystem(data.actualKm);
const obj = {
designKm,
actualKm,
};
const convert = new graphicData.KilometerMarkCalibration(
obj as graphicData.KilometerMarkCalibration
);
if (handleState.value == '新建') {
createKmChainData(convert);
} else {
editKmChainData(convert);
}
onReset();
showRangeConfig.value = false;
drawStore.setEditKmChainDataIndex(-1);
} catch (err) {
console.log(err);
$q.notify({
type: 'negative',
message: `${handleState.value}公里标设计-实测编辑失败!`,
});
}
}
});
}
function onReset() {
data.designKm.coordinateSystem = 'MAIN_LINE';
data.designKm.kilometer = 0;
data.designKm.direction = 0;
data.actualKm.coordinateSystem = 'MAIN_LINE';
data.actualKm.kilometer = 0;
data.actualKm.direction = 0;
}
function goBack() {
onReset();
drawStore.setEditKmChainDataIndex(-1);
}
function getData() {
const index = drawStore.editKmChainDataIndex;
const kmChainData = loadKmChainDataList()[index];
console.log(index, kmChainData, '=========');
if (kmChainData?.designKm || kmChainData?.actualKm) {
handleState.value = '编辑';
} else {
handleState.value = '新建';
}
data.designKm.coordinateSystem =
kmChainData?.designKm?.coordinateSystem || 'MAIN_LINE';
data.designKm.kilometer = kmChainData?.designKm?.kilometer || 0;
data.designKm.direction = kmChainData?.designKm?.direction || 0;
data.actualKm.coordinateSystem =
kmChainData?.actualKm?.coordinateSystem || 'MAIN_LINE';
data.actualKm.kilometer = kmChainData?.actualKm?.kilometer || 0;
data.actualKm.direction = kmChainData?.actualKm?.direction || 0;
}
</script>

View File

@ -88,12 +88,17 @@ const optionsType = [
{ label: '电源屏', value: graphicData.RelatedRef.DeviceType.PowerScreen }, { label: '电源屏', value: graphicData.RelatedRef.DeviceType.PowerScreen },
{ label: '车库门', value: graphicData.RelatedRef.DeviceType.GarageDoor }, { label: '车库门', value: graphicData.RelatedRef.DeviceType.GarageDoor },
{ label: '洗车机', value: graphicData.RelatedRef.DeviceType.CarWashing }, { label: '洗车机', value: graphicData.RelatedRef.DeviceType.CarWashing },
{ label: '防淹门', value: graphicData.RelatedRef.DeviceType.FloodGate },
{ label: '区段', value: graphicData.RelatedRef.DeviceType.Section },
{ label: '站台', value: graphicData.RelatedRef.DeviceType.Platform },
{ label: '零散', value: graphicData.RelatedRef.DeviceType.LS },
]; ];
const noShowType = [ const noShowType = [
graphicData.RelatedRef.DeviceType.SignalFaultAlarm, graphicData.RelatedRef.DeviceType.SignalFaultAlarm,
graphicData.RelatedRef.DeviceType.Breakers, graphicData.RelatedRef.DeviceType.Breakers,
graphicData.RelatedRef.DeviceType.PowerScreen, graphicData.RelatedRef.DeviceType.PowerScreen,
graphicData.RelatedRef.DeviceType.LS,
]; ];
onMounted(() => { onMounted(() => {

View File

@ -0,0 +1,54 @@
<template>
<div class="q-gutter-sm" style="padding: 16px">
<q-select
outlined
v-model="defaultInitialPosition"
:options="defaultInitialPositionModel"
emitValue
mapOptions
label="继电器默认初始位置"
>
<template v-slot:after>
<q-btn label="设置" color="primary" @click="changeRelayPos" />
</template>
</q-select>
</div>
</template>
<script setup lang="ts">
import { Relay } from 'src/graphics/relay/Relay';
import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics';
import { useRelayCabinetStore } from 'src/stores/relayCabinet-store';
import { ref } from 'vue';
const relayCabinetStore = useRelayCabinetStore();
const defaultInitialPosition =
ref<relayCabinetGraphicData.CjDataItem.PostionType>(
relayCabinetGraphicData.CjDataItem.PostionType.NONE
);
const defaultInitialPositionModel = [
{
label: 'Q',
value: relayCabinetGraphicData.CjDataItem.PostionType.Q,
},
{
label: 'H',
value: relayCabinetGraphicData.CjDataItem.PostionType.H,
},
{
label: 'NONE',
value: relayCabinetGraphicData.CjDataItem.PostionType.NONE,
},
];
function changeRelayPos() {
const selectedRelays = relayCabinetStore.selectedGraphics?.filter(
(g) => g instanceof Relay
);
selectedRelays?.forEach(
(relay) =>
((relay as Relay).datas.defaultInitialPosition =
defaultInitialPosition.value)
);
}
</script>

View File

@ -10,6 +10,15 @@
label="编号" label="编号"
lazy-rules lazy-rules
/> />
<q-input
outlined
v-model="relayModel.showCode"
@blur="onUpdate"
:emit-value="true"
@update:model-value="onUpdate"
label="展示的编号"
lazy-rules
/>
<q-select <q-select
outlined outlined
v-model="relayModel.newModel" v-model="relayModel.newModel"
@ -19,6 +28,15 @@
@update:model-value="onUpdate" @update:model-value="onUpdate"
label="型号" label="型号"
/> />
<q-select
outlined
v-model="relayModel.defaultInitialPosition"
:options="defaultInitialPositionModel"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="默认初始位置"
/>
</q-form> </q-form>
</template> </template>
@ -71,4 +89,19 @@ const newOptionsModel = [
value: relayCabinetGraphicData.Relay.ModelType.JZXC_H18, value: relayCabinetGraphicData.Relay.ModelType.JZXC_H18,
}, },
]; ];
const defaultInitialPositionModel = [
{
label: 'Q',
value: relayCabinetGraphicData.CjDataItem.PostionType.Q,
},
{
label: 'H',
value: relayCabinetGraphicData.CjDataItem.PostionType.H,
},
{
label: 'NONE',
value: relayCabinetGraphicData.CjDataItem.PostionType.NONE,
},
];
</script> </script>

View File

@ -24,17 +24,6 @@
@update:model-value="onUpdate" @update:model-value="onUpdate"
label="关联站台" label="关联站台"
></q-select> ></q-select>
<q-select
outlined
style="margin-top: 10px"
v-model="spksSwitchModel.refSections"
:options="sectionList"
:multiple="true"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="关联物理区段"
></q-select>
</q-form> </q-form>
</template> </template>

View File

@ -5,7 +5,7 @@
outlined outlined
v-model="tccButtonModel.code" v-model="tccButtonModel.code"
@blur="onUpdate" @blur="onUpdate"
label="紧急制动按钮" label="Tcc按钮"
lazy-rules lazy-rules
/> />
<q-checkbox <q-checkbox

View File

@ -40,5 +40,9 @@ const optionsKeyType = [
label: '前后方向控制', label: '前后方向控制',
value: tccGraphicData.TccKey.TccKeyType.frontAndRearDirectionalControl, value: tccGraphicData.TccKey.TccKeyType.frontAndRearDirectionalControl,
}, },
{
label: '列车门模式',
value: tccGraphicData.TccKey.TccKeyType.trainDoorMode,
},
]; ];
</script> </script>

View File

@ -0,0 +1,49 @@
<template>
<q-form class="q-gutter-sm">
<q-input outlined readonly v-model="tccLightModel.id" label="id" />
<q-input
outlined
v-model="tccLightModel.code"
@blur="onUpdate"
label="Tcc灯"
lazy-rules
/>
<q-select
outlined
class="q-mt-sm"
v-model="tccLightModel.lightColor"
:options="optionsLightColor"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="灯颜色"
/>
<q-checkbox
v-model="tccLightModel.activeLevel"
label="有效电平"
@update:model-value="onUpdate"
/>
<q-checkbox
v-model="tccLightModel.initialState"
label="初始状态"
@update:model-value="onUpdate"
/>
</q-form>
</template>
<script setup lang="ts">
import { useFormData } from 'src/components/DrawAppFormUtils';
import { tccGraphicData } from 'src/protos/tccGraphics';
import { TccLightData } from 'src/drawApp/graphics/TccLightInteraction';
import { useTccDrawStore } from 'src/stores/tcc-draw-store';
const tccDrawStore = useTccDrawStore();
const { data: tccLightModel, onUpdate } = useFormData(
new TccLightData(),
tccDrawStore.getDrawApp()
);
const optionsLightColor = [
{ label: '绿色', value: tccGraphicData.TccElementColor.green },
];
</script>

View File

@ -40,6 +40,27 @@
</template> </template>
</q-item> </q-item>
</q-list> </q-list>
<q-input
outlined
class="q-mt-md"
v-model="transponderModel.originalCode"
@blur="onUpdate"
label="原编号"
/>
<q-input
outlined
class="q-mt-md"
v-model="transponderModel.leuIndex"
@blur="onUpdate"
label="LEU索引"
/>
<q-input
outlined
class="q-mt-md"
v-model="transponderModel.leuInsideIndex"
@blur="onUpdate"
label="LEU内部索引"
/>
<q-select <q-select
outlined outlined
class="q-mt-md" class="q-mt-md"
@ -53,17 +74,17 @@
<q-input <q-input
outlined outlined
class="q-mt-md" class="q-mt-md"
readonly
autogrow autogrow
v-model="transponderModel.fixedUserTelegram" v-model="transponderModel.fixedUserTelegram"
@blur="onUpdate"
label="固定用户报文" label="固定用户报文"
/> />
<q-input <q-input
outlined outlined
class="q-mt-md" class="q-mt-md"
readonly
autogrow autogrow
v-model="transponderModel.fixedTelegram" v-model="transponderModel.fixedTelegram"
@blur="onUpdate"
label="固定报文" label="固定报文"
/> />
<q-field class="q-mt-md" outlined label="关联区段" readonly stack-label> <q-field class="q-mt-md" outlined label="关联区段" readonly stack-label>

View File

@ -0,0 +1,55 @@
<template>
<q-form>
<q-input
outlined
readonly
v-model="unattengedButtonModel.id"
label="id"
hint=""
/>
<q-input
outlined
style="margin-top: 10px"
v-model="unattengedButtonModel.code"
@blur="onUpdate"
label="编号"
/>
<q-select
outlined
style="margin-top: 10px"
v-model="unattengedButtonModel.refStand"
:options="platformList"
:map-options="true"
:emit-value="true"
@update:model-value="onUpdate"
label="关联站台"
></q-select>
</q-form>
</template>
<script setup lang="ts">
import { useFormData } from 'src/components/DrawAppFormUtils';
import { UnattengedButtonData } from 'src/drawApp/graphics/UnattengedButtonInteraction';
import { Platform } from 'src/graphics/platform/Platform';
import { useDrawStore } from 'src/stores/draw-store';
import { onMounted, reactive } from 'vue';
const drawStore = useDrawStore();
const { data: unattengedButtonModel, onUpdate } = useFormData(
new UnattengedButtonData(),
drawStore.getDrawApp()
);
const platformList: { label: string; value: number }[] = reactive([]);
onMounted(() => {
const platforms = drawStore
.getDrawApp()
.queryStore.queryByType<Platform>(Platform.Type);
platforms.forEach((p) => {
platformList.push({
value: p.id,
label: `${p.datas.code}`,
});
});
});
</script>

View File

@ -28,6 +28,18 @@
<transponder-state <transponder-state
v-else-if="lineStore.selectedGraphicType === Transponder.Type" v-else-if="lineStore.selectedGraphicType === Transponder.Type"
></transponder-state> ></transponder-state>
<garage-door-state
v-else-if="lineStore.selectedGraphicType === GarageDoor.Type"
></garage-door-state>
<flood-gate-state
v-else-if="lineStore.selectedGraphicType === FloodGate.Type"
></flood-gate-state>
<car-washing-state
v-else-if="lineStore.selectedGraphicType === CarWashing.Type"
></car-washing-state>
<axleCountingSection-state
v-else-if="lineStore.selectedGraphicType === AxleCountingSection.Type"
></axleCountingSection-state>
</div> </div>
</q-scroll-area> </q-scroll-area>
</template> </template>
@ -56,6 +68,14 @@ import SpksSwitchState from './states/SpksSwitchState.vue';
import { SpksSwitch } from 'src/graphics/spksSwitch/SpksSwitch'; import { SpksSwitch } from 'src/graphics/spksSwitch/SpksSwitch';
import TransponderState from './states/TransponderState.vue'; import TransponderState from './states/TransponderState.vue';
import { Transponder } from 'src/graphics/transponder/Transponder'; import { Transponder } from 'src/graphics/transponder/Transponder';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
import GarageDoorState from './states/GarageDoorState.vue';
import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import FloodGateState from './states/FloodGateState.vue';
import CarWashingState from './states/CarWashingState.vue';
import { CarWashing } from 'src/graphics/carWashing/CarWashing';
import AxleCountingSectionState from './states/AxleCountingSectionState.vue';
import { AxleCountingSection } from 'src/graphics/axleCountingSection/AxleCountingSection';
const lineStore = useLineStore(); const lineStore = useLineStore();
</script> </script>

View File

@ -42,6 +42,9 @@ enum Type {
'未定义', '未定义',
'动力学', '动力学',
'半实物列车', '半实物列车',
'列车PC仿真',
'联锁通信服务',
'计轴区段通信服务',
} }
const columns: QTable['columns'] = [ const columns: QTable['columns'] = [
{ {
@ -56,6 +59,12 @@ const columns: QTable['columns'] = [
field: (row) => (row.state == 0 ? '正常' : '异常'), field: (row) => (row.state == 0 ? '正常' : '异常'),
align: 'center', align: 'center',
}, },
{
name: 'serviceName',
label: '服务描述',
field: 'serviceName',
align: 'center',
},
]; ];
const rows = ref<state.SimulationThirdPartyApiServiceState[]>([]); const rows = ref<state.SimulationThirdPartyApiServiceState[]>([]);

View File

@ -191,6 +191,8 @@ import { Dialog } from 'quasar';
import { state } from 'src/protos/device_state'; import { state } from 'src/protos/device_state';
import SetTrainLink from 'src/components/draw-app/dialogs/SetTrainLink.vue'; import SetTrainLink from 'src/components/draw-app/dialogs/SetTrainLink.vue';
import { useTccStore } from 'src/stores/tcc-store'; import { useTccStore } from 'src/stores/tcc-store';
import { removeTrain, cancelTrainConn } from 'src/api/Simulation';
import { errorNotify, successNotify } from 'src/utils/CommonNotify';
interface KeyType { interface KeyType {
label: string; label: string;
@ -203,7 +205,7 @@ const trainInfo = ref<ITrainState | null>();
const list: KeyType[] = [ const list: KeyType[] = [
{ label: '列车索引', key: 'id' }, { label: '列车索引', key: 'id' },
{ label: '连接状态', key: 'conn', formatFn: connStateFormat }, { label: '连接状态', key: 'conn', formatFn: connStateFormat },
{ label: '连接平台', key: 'connType', formatFn: connTypeFormat }, { label: '连接平台', key: 'typeName', formatFn: typeNameFormat },
{ label: '列车长度', key: 'trainLength', formatFn: trainLengthFormat }, { label: '列车长度', key: 'trainLength', formatFn: trainLengthFormat },
{ label: '车头所在设备', key: 'headDeviceId', formatFn: getDeviveName }, { label: '车头所在设备', key: 'headDeviceId', formatFn: getDeviveName },
{ label: '车头所在设备的偏移量', key: 'headOffset', formatFn: offsetFormat }, { label: '车头所在设备的偏移量', key: 'headOffset', formatFn: offsetFormat },
@ -336,44 +338,52 @@ const list4: KeyType[] = [
// { label: '2', key: 'tailSensorSpeed2', formatFn: speedFormat }, // { label: '2', key: 'tailSensorSpeed2', formatFn: speedFormat },
{ label: '1端速传1是否有效', key: 'aSpeedSensorEnableA', formatFn: upFormat }, { label: '1端速传1是否有效', key: 'aSpeedSensorEnableA', formatFn: upFormat },
{ label: '1端速传2是否有效', key: 'aSpeedSensorEnableB', formatFn: upFormat }, { label: '1端速传2是否有效', key: 'aSpeedSensorEnableB', formatFn: upFormat },
{ label: '1端速度输出', key: 'aAccOutSpeed', formatFn: msFormat }, { label: '1端速度输出', key: 'aAccOutSpeed', formatFn: kmhFormat },
{ label: '2端速传1是否有效', key: 'bSpeedSensorEnableA', formatFn: upFormat }, { label: '2端速传1是否有效', key: 'bSpeedSensorEnableA', formatFn: upFormat },
{ label: '2端速传2是否有效', key: 'bSpeedSensorEnableB', formatFn: upFormat }, { label: '2端速传2是否有效', key: 'bSpeedSensorEnableB', formatFn: upFormat },
{ label: '2端速度输出', key: 'bAccOutSpeed', formatFn: msFormat }, { label: '2端速度输出', key: 'bAccOutSpeed', formatFn: kmhFormat },
]; ];
const list5: KeyType[] = [ const list5: KeyType[] = [
// { label: '', key: 'headRadarSpeed', formatFn: speedFormat }, // { label: '', key: 'headRadarSpeed', formatFn: speedFormat },
// { label: '', key: 'tailRadarSpeed', formatFn: speedFormat }, // { label: '', key: 'tailRadarSpeed', formatFn: speedFormat },
{ label: '1端雷达是否有效', key: 'aRadarEnable', formatFn: upFormat }, { label: '1端雷达是否有效', key: 'aRadarEnable', formatFn: upFormat },
{ label: '1端雷达测速差值', key: 'aRadarCheckSpeedDiff', formatFn: msFormat },
{ {
label: '1端雷达检测时间(秒)', label: '1端雷达测速差值',
key: 'aRadarCheckSpeedDiff',
formatFn: kmhFormat,
},
{
label: '1端雷达检测设置剩余时间(秒)',
key: 'aRadarCheckTime', key: 'aRadarCheckTime',
formatFn: timeFormat, formatFn: timeFormat,
}, },
{ label: '1端雷达速度输出', key: 'aRadarOutSpeed', formatFn: msFormat }, { label: '1端雷达速度输出', key: 'aRadarOutSpeed', formatFn: kmhFormat },
{ label: '2端雷达是否有效', key: 'bRadarEnable', formatFn: upFormat }, { label: '2端雷达是否有效', key: 'bRadarEnable', formatFn: upFormat },
{ label: '2端雷达测速差值', key: 'bRadarCheckSpeedDiff', formatFn: msFormat },
{ {
label: '2端雷达检测时间', label: '2端雷达测速差值',
key: 'bRadarCheckSpeedDiff',
formatFn: kmhFormat,
},
{
label: '2端雷达检测设置剩余时间',
key: 'bRadarCheckTime', key: 'bRadarCheckTime',
formatFn: timeFormat, formatFn: timeFormat,
}, },
{ label: '2端雷达速度输出', key: 'bRadarOutSpeed', formatFn: msFormat }, { label: '2端雷达速度输出', key: 'bRadarOutSpeed', formatFn: kmhFormat },
]; ];
const list6: KeyType[] = [ const list6: KeyType[] = [
{ label: '加速度', key: 'acceleration', formatFn: accelerationFormat }, { label: '加速度', key: 'acceleration', formatFn: accelerationFormat },
{ label: '1端加速度计是否有效', key: 'aAccEnable', formatFn: upFormat }, { label: '1端加速度计是否有效', key: 'aAccEnable', formatFn: upFormat },
{ label: '1端加速度测速差值', key: 'aAccCheckSpeedDiff', formatFn: msFormat }, { label: '1端加速度测速差值', key: 'aAccCheckSpeedDiff', formatFn: msFormat },
{ {
label: '1端加速度持续时间', label: '1端加速度持续设置剩余时间',
key: 'aAccCheckTime', key: 'aAccCheckTime',
formatFn: timeFormat, formatFn: timeFormat,
}, },
{ label: '2端加速度计是否有效', key: 'bAccEnable', formatFn: upFormat }, { label: '2端加速度计是否有效', key: 'bAccEnable', formatFn: upFormat },
{ label: '2端加速度测速差值', key: 'bAccCheckSpeedDiff', formatFn: msFormat }, { label: '2端加速度测速差值', key: 'bAccCheckSpeedDiff', formatFn: msFormat },
{ {
label: '2端加速度持续时间', label: '2端加速度持续设置剩余时间',
key: 'bAccCheckTime', key: 'bAccCheckTime',
formatFn: timeFormat, formatFn: timeFormat,
}, },
@ -393,6 +403,9 @@ function percentFormat(v: number) {
function msFormat(v: number) { function msFormat(v: number) {
return v + 'm/s'; return v + 'm/s';
} }
function kmhFormat(v: number) {
return v + 'km/h';
}
function timeFormat(v: number) { function timeFormat(v: number) {
return v + 's'; return v + 's';
} }
@ -442,16 +455,21 @@ function trainLengthFormat(v: number) {
function connStateFormat(v: boolean) { function connStateFormat(v: boolean) {
return v ? '已连接' : '未连接'; return v ? '已连接' : '未连接';
} }
function connTypeFormat(v: state.TrainConnState.TrainConnType) { // PC_SIM_A = 3; //PC仿
if (v === state.TrainConnState.TrainConnType.NONE) { // PC_SIM_B = 4; //PC仿
return '无'; function typeNameFormat(v: string) {
} else if (v === state.TrainConnState.TrainConnType.PC_SIM) { return v;
return 'PC仿真'; // if (v === state.TrainConnState.TrainConnType.NONE) {
} else if (v === state.TrainConnState.TrainConnType.VOBC) { // return '';
return '半实物'; // } else if (v === state.TrainConnState.TrainConnType.PC_SIM_A) {
} else { // return 'PC仿A';
return '无'; // } else if (v === state.TrainConnState.TrainConnType.VOBC) {
} // return '';
// } else if (v === state.TrainConnState.TrainConnType.PC_SIM_B) {
// return 'PC仿B';
// } else {
// return '';
// }
} }
function floatDecimal(v: number, x = 2) { function floatDecimal(v: number, x = 2) {
// //
@ -609,9 +627,17 @@ const options = [
value: 2, value: 2,
}, },
{ {
label: '列车驾驶台', label: '取消连接',
value: 3, value: 3,
}, },
{
label: '列车驾驶台',
value: 4,
},
{
label: '清除列车',
value: 5,
},
]; ];
function doTrainOperation(option: { label: string; value: number }) { function doTrainOperation(option: { label: string; value: number }) {
@ -619,11 +645,35 @@ function doTrainOperation(option: { label: string; value: number }) {
setTrain(); setTrain();
} else if (option.value == 2) { } else if (option.value == 2) {
linkTrain(); linkTrain();
} else if (option.value == 3) { } else if (option.value == 4) {
openTccDialog(); openTccDialog();
} else if (option.value == 3) {
cancelTrainLink();
} else if (option.value == 5) {
clearTrain();
} }
} }
function cancelTrainLink() {
if (!lineStore.selectedGraphics) return;
const train = lineStore.selectedGraphics[0] as Train;
Dialog.create({
title: '确认',
message: `确认取消【${train.states.id}】列车的连接吗?`,
cancel: true,
}).onOk(async () => {
cancelTrainConn({
id: lineStore.simulationId || '',
trainId: train.code,
})
.then(() => {
successNotify('列车取消连接成功!');
})
.catch((err) => {
errorNotify('列车取消连接失败!', err);
});
});
}
function linkTrain() { function linkTrain() {
if (!lineStore.selectedGraphics) return; if (!lineStore.selectedGraphics) return;
if (lineStore.deviceOpreratDialogInstance) return; if (lineStore.deviceOpreratDialogInstance) return;
@ -664,6 +714,28 @@ function openTccDialog() {
trainInfo.value?.trainControlMapId as number trainInfo.value?.trainControlMapId as number
); );
} }
function clearTrain() {
if (!lineStore.selectedGraphics) return;
const train = lineStore.selectedGraphics[0] as Train;
Dialog.create({
title: '确认',
message: `确认清除【${trainInfo.value?.id}】列车吗?`,
cancel: true,
}).onOk(async () => {
removeTrain({
simulationId: lineStore.simulationId as string,
mapId: lineStore.mapId as number,
trainId: train.code,
})
.then(() => {
successNotify('移除列车成功!');
})
.catch((err) => {
errorNotify('移除列车失败!', err);
});
});
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.q-item { .q-item {

View File

@ -0,0 +1,115 @@
<template>
<q-card flat bordered>
<q-card-section class="flex justify-between">
<div class="text-h6">计轴区段状态</div>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(sectionState[item.key])
: sectionState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
</q-card>
</template>
<script setup lang="ts">
import { useLineStore } from 'src/stores/line-store';
import { ref, watch, onMounted, onUnmounted, toRaw } from 'vue';
import { AxleCountingSectionStates } from 'src/drawApp/graphics/AxleCountingSectionInteraction';
import { AxleCountingSection } from 'src/graphics/axleCountingSection/AxleCountingSection';
const lineStore = useLineStore();
const sectionState = ref({
id: 0,
code: '',
occupied: false,
});
let copySelectGraphic: AxleCountingSection | null = null;
interface KeyType {
label: string;
key: keyof AxleCountingSectionStates;
formatFn?(
v: AxleCountingSectionStates[keyof AxleCountingSectionStates]
): string;
}
const list: KeyType[] = [
{ label: '计轴区段索引', key: 'id' },
{ label: '计轴区段名称', key: 'code' },
{ label: '是否占用', key: 'occupied', formatFn: getName },
];
watch(
() => lineStore.selectedGraphics,
(val, oldVal) => {
if (oldVal?.length == 1 && oldVal[0] instanceof AxleCountingSection) {
unSubscribeState(oldVal[0]);
}
if (val?.length == 1 && val[0] instanceof AxleCountingSection) {
copySelectGraphic = toRaw(val[0]);
initSectionState(val[0] as AxleCountingSection);
} else {
copySelectGraphic = null;
sectionState.value = {
id: 0,
code: '',
occupied: false,
};
}
}
);
onMounted(() => {
if (lineStore.selectedGraphics) {
initSectionState(lineStore.selectedGraphics[0] as AxleCountingSection);
}
});
function getName(v: boolean) {
if (v) return '是';
return '否';
}
function initSectionState(section: AxleCountingSection) {
copySelectGraphic = toRaw(section);
sectionState.value = {
id: section.datas.id,
code: section.datas.code,
occupied: section.states.occupied ?? false,
};
subscribeState(section);
}
function updateState(newVal: AxleCountingSection) {
sectionState.value = {
id: newVal.id,
code: sectionState.value.code,
occupied: newVal.states.occupied ?? false,
};
}
function subscribeState(g: AxleCountingSection) {
g.on('stateupdate', updateState);
}
function unSubscribeState(g: AxleCountingSection) {
g.off('stateupdate', updateState);
}
onUnmounted(() => {
if (copySelectGraphic) {
unSubscribeState(copySelectGraphic);
}
});
</script>

View File

@ -0,0 +1,332 @@
<template>
<q-card flat bordered>
<q-card-section class="flex justify-between">
<div class="text-h6">洗车机状态</div>
<q-btn-dropdown color="primary" label="操作">
<q-list>
<q-item
v-for="(item, index) in operationOptions"
:key="index"
clickable
v-close-popup
@click="doCarWashingOperation(item)"
>
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list1" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(carWashingState[item.key])
: carWashingState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list2" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(carWashingState[item.key])
: carWashingState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
<q-item v-for="(item, index) in list3" :key="index + list2.length">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption
><span>[</span>
<span
v-if="carWashingState.twjList.length >= 1"
:style="{
color: carWashingState.twjList[0] ? 'green' : 'red',
}"
>{{
`1:${carWashingState.twjList[0] ? '结束' : '未结束'}`
}}</span
>
<span
v-if="carWashingState.twjList.length >= 2"
:style="{
color: carWashingState.twjList[1] ? 'green' : 'red',
}"
>{{
`2:${carWashingState.twjList[1] ? '结束' : '未结束'}`
}}</span
>
<span
v-if="carWashingState.twjList.length >= 3"
:style="{
color: carWashingState.twjList[2] ? 'green' : 'red',
}"
>{{
`3:${carWashingState.twjList[2] ? '结束' : '未结束'}`
}}</span
>
<span>]</span></q-item-label
>
</q-item-section>
</q-item>
<q-item
v-for="(item, index) in list4"
:key="index + list2.length + list3.length"
>
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(carWashingState[item.key])
: carWashingState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list5" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(carWashingState[item.key])
: carWashingState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
<q-item v-for="(item, index) in list6" :key="index + list5.length">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>
<span>[</span>
<span
v-if="carWashingState.cfjList.length >= 1"
:style="{
color: carWashingState.cfjList[0] ? 'green' : 'red',
}"
>{{
`1:${carWashingState.cfjList[0] ? '结束' : '未结束'}`
}}</span
>
<span
v-if="carWashingState.cfjList.length >= 2"
:style="{
color: carWashingState.cfjList[1] ? 'green' : 'red',
}"
>{{
`2:${carWashingState.cfjList[1] ? '结束' : '未结束'}`
}}</span
>
<span
v-if="carWashingState.cfjList.length >= 3"
:style="{
color: carWashingState.cfjList[2] ? 'green' : 'red',
}"
>{{
`3:${carWashingState.cfjList[2] ? '结束' : '未结束'}`
}}</span
>
<span>]</span>
</q-item-label>
</q-item-section>
</q-item>
<q-item
v-for="(item, index) in list7"
:key="index + list5.length + list6.length"
>
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(carWashingState[item.key])
: carWashingState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
</q-card>
</template>
<script setup lang="ts">
import { useLineStore } from 'src/stores/line-store';
import { ref, watch, onMounted, onUnmounted, toRaw } from 'vue';
import { request } from 'src/protos/request';
import { CarWashing } from 'src/graphics/carWashing/CarWashing';
import XcjOperation from 'src/components/draw-app/dialogs/XcjOperation.vue';
import { CarWashingState } from 'src/drawApp/graphics/CarWashingInteraction';
import { Dialog } from 'quasar';
const lineStore = useLineStore();
const carWashingState = ref<CarWashingState>(new CarWashingState());
const code = ref('');
const operationOptions = [
{
label: '设置参数',
value: request.Xcj.Operation.SetParams,
},
];
const carWashingFault = ref<request.Xcj.Fault>(0);
let copySelectGraphic: CarWashing | null = null;
interface KeyType {
label: string;
key: keyof CarWashingState;
formatFn?(v: CarWashingState[keyof CarWashingState]): string;
}
const list1: KeyType[] = [
{ label: '洗车机索引', key: 'id' },
{ label: '洗车机名称', key: 'code', formatFn: getNameFormat },
];
const list2: KeyType[] = [
{ label: '洗车请求', key: 'xqj', formatFn: getBoolFormat },
];
const list3: KeyType[] = [
{ label: '端洗停稳 ', key: 'twjList', formatFn: getTwFormat },
];
const list4: KeyType[] = [
{ label: '通过请求', key: 'tgqj', formatFn: getBoolFormat },
];
const list5: KeyType[] = [
{ label: '洗车就绪', key: 'xcjxj', formatFn: getBoolFormat },
{ label: '洗车允许', key: 'xcyxj', formatFn: getBoolFormat },
];
const list6: KeyType[] = [
{ label: '端洗结束', key: 'cfjList', formatFn: getYXFormat },
];
const list7: KeyType[] = [
{ label: '紧急停车', key: 'jtj', formatFn: getBoolFormat },
{ label: '通过允许', key: 'tgyxj', formatFn: getBoolFormat },
];
watch(
() => lineStore.selectedGraphics,
(val, oldVal) => {
if (oldVal?.length == 1 && oldVal[0] instanceof CarWashing) {
unSubscribeState(oldVal[0]);
}
if (val?.length == 1 && val[0] instanceof CarWashing) {
copySelectGraphic = toRaw(val[0]);
initCarWashingState(val[0]);
} else {
copySelectGraphic = null;
carWashingState.value = new CarWashingState();
}
}
);
onMounted(() => {
if (lineStore.selectedGraphics) {
initCarWashingState(lineStore.selectedGraphics[0] as CarWashing);
}
});
function getNameFormat() {
return code.value;
}
function getBoolFormat(v: boolean) {
return v ? '是' : '否';
}
function getTwFormat(v: boolean[]) {
if (v.length === 2) {
return `[1:${v[0] ? '停稳' : '未停稳'};2:${v[1] ? '停稳' : '未停稳'};]`;
} else if (v.length === 3) {
return `[1:${v[0] ? '停稳' : '未停稳'};2:${v[1] ? '停稳' : '未停稳'};3:${
v[2] ? '停稳' : '未停稳'
};]`;
} else {
return '状态显示错误';
}
}
function getYXFormat(v: boolean[]) {
if (v.length === 2) {
return `头部${v[0] ? '允许' : '不允许'};尾部${v[1] ? '允许' : '不允许'};`;
} else if (v.length === 3) {
return `头部${v[0] ? '允许' : '不允许'};中部${
v[1] ? '允许' : '不允许'
};尾部${v[2] ? '允许' : '不允许'};`;
} else {
return '状态显示错误';
}
}
function initCarWashingState(carWashing: CarWashing) {
copySelectGraphic = toRaw(carWashing);
code.value = carWashing.datas.code;
updateState(carWashing);
subscribeState(carWashing);
}
function updateState(carWashing: CarWashing) {
carWashingState.value = carWashing.states.clone() as CarWashingState;
carWashingFault.value = carWashingState.value.param.fault;
}
function doCarWashingOperation(item: {
label: string;
value: request.Xcj.Operation;
}) {
if (!lineStore.simulationId) return;
if (item.label == '设置参数') {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: XcjOperation,
componentProps: {
id: +carWashingState.value.id,
code: code.value,
xcjFaultProp: carWashingState.value.param.fault,
},
cancel: true,
persistent: true,
}).onCancel(() => {
lineStore.deviceOpreratDialogInstance = null;
});
}
}
function subscribeState(g: CarWashing) {
g.on('stateupdate', updateState);
}
function unSubscribeState(g: CarWashing) {
g.off('stateupdate', updateState);
}
onUnmounted(() => {
if (copySelectGraphic) {
unSubscribeState(copySelectGraphic);
}
});
</script>

View File

@ -0,0 +1,190 @@
<template>
<q-card flat bordered>
<q-card-section class="flex justify-between">
<div class="text-h6">防淹门状态</div>
<q-btn-dropdown color="primary" label="操作">
<q-list>
<q-item
v-for="(item, index) in operationOptions"
:key="index"
clickable
v-close-popup
@click="doFloodGateOperation(item)"
>
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(floodGateState[item.key])
: floodGateState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
</q-card>
</template>
<script setup lang="ts">
import { useLineStore } from 'src/stores/line-store';
import { ref, watch, onMounted, onUnmounted, toRaw } from 'vue';
import { request } from 'src/protos/request';
import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import CkmOperation from 'src/components/draw-app/dialogs/CkmOperation.vue';
import { FloodGateState } from 'src/drawApp/graphics/FloodGateInteraction';
import { Dialog } from 'quasar';
const lineStore = useLineStore();
const floodGateState = ref<FloodGateState>(new FloodGateState());
const code = ref('');
const operationOptions = [
{
label: '设置参数',
value: request.Ckm.Operation.SetParams,
},
];
const floodGateForce = ref<request.Ckm.Force>(0);
const floodGateForceOption = [
{
label: '无强制',
value: request.Ckm.Force.F_NONE,
},
{
label: '强制开门',
value: request.Ckm.Force.F_KM,
},
{
label: '强制关门',
value: request.Ckm.Force.F_GM,
},
];
const floodGateFault = ref<request.Ckm.Fault>(0);
let copySelectGraphic: FloodGate | null = null;
interface KeyType {
label: string;
key: keyof FloodGateState;
formatFn?(v: FloodGateState[keyof FloodGateState]): string;
}
const list: KeyType[] = [
{ label: '防淹门索引', key: 'id' },
{ label: '防淹门名称', key: 'code', formatFn: getNameFormat },
{ label: '防淹门关闭', key: 'mgj', formatFn: getName },
{ label: '控制端', key: 'local', formatFn: getLocal },
{ label: '门旁路', key: 'mplj', formatFn: getName },
{ label: '防淹门强制', key: 'param', formatFn: getForceName },
{ label: '设置故障', key: 'param', formatFn: getFaultName },
];
watch(
() => lineStore.selectedGraphics,
(val, oldVal) => {
if (oldVal?.length == 1 && oldVal[0] instanceof FloodGate) {
unSubscribeState(oldVal[0]);
}
if (val?.length == 1 && val[0] instanceof FloodGate) {
copySelectGraphic = toRaw(val[0]);
initFloodGateState(val[0]);
} else {
copySelectGraphic = null;
floodGateState.value = new FloodGateState();
}
}
);
onMounted(() => {
if (lineStore.selectedGraphics) {
initFloodGateState(lineStore.selectedGraphics[0] as FloodGate);
}
});
function getNameFormat() {
return code.value;
}
function getName(v: boolean) {
if (v) return '是';
return '否';
}
function getLocal(v: boolean) {
return v ? '本地' : '远程';
}
function getForceName() {
return (
floodGateForceOption.find((item) => item.value == floodGateForce.value)
?.label || ''
);
}
function getFaultName() {
if (floodGateFault.value == request.Ckm.Fault.FA_State_Loss)
return '状态丢失';
return '无';
}
function initFloodGateState(floodGate: FloodGate) {
copySelectGraphic = toRaw(floodGate);
code.value = floodGate.datas.code;
updateState(floodGate);
subscribeState(floodGate);
}
function updateState(floodGate: FloodGate) {
floodGateState.value = floodGate.states.clone() as FloodGateState;
floodGateForce.value = floodGateState.value.param.force;
floodGateFault.value = floodGateState.value.param.fault;
}
function doFloodGateOperation(item: {
label: string;
value: request.Ckm.Operation;
}) {
if (!lineStore.simulationId) return;
if (item.label == '设置参数') {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: CkmOperation,
componentProps: {
id: +floodGateState.value.id,
code: code.value,
ckmForceProp: floodGateState.value.param.force,
ckmFaultProp: floodGateState.value.param.fault,
title: '防淹门设置参数',
},
cancel: true,
persistent: true,
}).onCancel(() => {
lineStore.deviceOpreratDialogInstance = null;
});
}
}
function subscribeState(g: FloodGate) {
g.on('stateupdate', updateState);
}
function unSubscribeState(g: FloodGate) {
g.off('stateupdate', updateState);
}
onUnmounted(() => {
if (copySelectGraphic) {
unSubscribeState(copySelectGraphic);
}
});
</script>

View File

@ -0,0 +1,191 @@
<template>
<q-card flat bordered>
<q-card-section class="flex justify-between">
<div class="text-h6">车库门状态</div>
<q-btn-dropdown color="primary" label="操作">
<q-list>
<q-item
v-for="(item, index) in operationOptions"
:key="index"
clickable
v-close-popup
@click="doGarageDoorOperation(item)"
>
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
</q-card-section>
<q-separator inset />
<q-card-section>
<q-list dense>
<q-item v-for="(item, index) in list" :key="index">
<q-item-section>
<q-item-label>{{ item.label }}</q-item-label>
</q-item-section>
<q-item-section side>
<q-item-label caption>{{
item.formatFn
? item.formatFn(garageDoorState[item.key])
: garageDoorState[item.key]
}}</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-card-section>
</q-card>
</template>
<script setup lang="ts">
import { useLineStore } from 'src/stores/line-store';
import { ref, watch, onMounted, onUnmounted, toRaw } from 'vue';
import { request } from 'src/protos/request';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
import CkmOperation from 'src/components/draw-app/dialogs/CkmOperation.vue';
import { GarageDoorState } from 'src/drawApp/graphics/GarageDoorInteraction';
import { Dialog } from 'quasar';
const lineStore = useLineStore();
const garageDoorState = ref<GarageDoorState>(new GarageDoorState());
const code = ref('');
const operationOptions = [
{
label: '设置参数',
value: request.Ckm.Operation.SetParams,
},
];
const garageDoorForce = ref<request.Ckm.Force>(0);
const garageDoorForceOption = [
{
label: '无强制',
value: request.Ckm.Force.F_NONE,
},
{
label: '强制开门',
value: request.Ckm.Force.F_KM,
},
{
label: '强制关门',
value: request.Ckm.Force.F_GM,
},
];
const garageDoorFault = ref<request.Ckm.Fault>(0);
let copySelectGraphic: GarageDoor | null = null;
interface KeyType {
label: string;
key: keyof GarageDoorState;
formatFn?(v: GarageDoorState[keyof GarageDoorState]): string;
}
const list: KeyType[] = [
{ label: '车库门索引', key: 'id' },
{ label: '车库门名称', key: 'code', formatFn: getNameFormat },
{ label: '车库门关闭', key: 'mgj', formatFn: getName },
{ label: '控制端', key: 'local', formatFn: getLocal },
{ label: '门旁路', key: 'mplj', formatFn: getName },
// { label: '', key: 'stateLoss', formatFn: getName },
{ label: '车库门强制', key: 'param', formatFn: getForceName },
{ label: '设置故障', key: 'param', formatFn: getFaultName },
];
watch(
() => lineStore.selectedGraphics,
(val, oldVal) => {
if (oldVal?.length == 1 && oldVal[0] instanceof GarageDoor) {
unSubscribeState(oldVal[0]);
}
if (val?.length == 1 && val[0] instanceof GarageDoor) {
copySelectGraphic = toRaw(val[0]);
initGarageDoorState(val[0]);
} else {
copySelectGraphic = null;
garageDoorState.value = new GarageDoorState();
}
}
);
onMounted(() => {
if (lineStore.selectedGraphics) {
initGarageDoorState(lineStore.selectedGraphics[0] as GarageDoor);
}
});
function getNameFormat() {
return code.value;
}
function getName(v: boolean) {
if (v) return '是';
return '否';
}
function getLocal(v: boolean) {
return v ? '本地' : '远程';
}
function getForceName() {
return (
garageDoorForceOption.find((item) => item.value == garageDoorForce.value)
?.label || ''
);
}
function getFaultName() {
if (garageDoorFault.value == request.Ckm.Fault.FA_State_Loss)
return '状态丢失';
return '无';
}
function initGarageDoorState(garageDoor: GarageDoor) {
copySelectGraphic = toRaw(garageDoor);
code.value = garageDoor.datas.code;
updateState(garageDoor);
subscribeState(garageDoor);
}
function updateState(garageDoor: GarageDoor) {
garageDoorState.value = garageDoor.states.clone() as GarageDoorState;
garageDoorForce.value = garageDoorState.value.param.force;
garageDoorFault.value = garageDoorState.value.param.fault;
}
function doGarageDoorOperation(item: {
label: string;
value: request.Ckm.Operation;
}) {
if (!lineStore.simulationId) return;
if (item.label == '设置参数') {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: CkmOperation,
componentProps: {
id: +garageDoorState.value.id,
code: code.value,
ckmForceProp: garageDoorState.value.param.force,
ckmFaultProp: garageDoorState.value.param.fault,
title: '车库门设置参数',
},
cancel: true,
persistent: true,
}).onCancel(() => {
lineStore.deviceOpreratDialogInstance = null;
});
}
}
function subscribeState(g: GarageDoor) {
g.on('stateupdate', updateState);
}
function unSubscribeState(g: GarageDoor) {
g.off('stateupdate', updateState);
}
onUnmounted(() => {
if (copySelectGraphic) {
unSubscribeState(copySelectGraphic);
}
});
</script>

View File

@ -68,8 +68,8 @@ interface KeyType {
const list: KeyType[] = [ const list: KeyType[] = [
{ label: '轨道索引', key: 'id' }, { label: '轨道索引', key: 'id' },
{ label: '轨道名称', key: 'code' }, { label: '轨道名称', key: 'code' },
{ label: '是否占用', key: 'axleFault', formatFn: getName }, { label: '是否占用', key: 'occupied', formatFn: getName },
{ label: '是否计轴故障', key: 'occupied', formatFn: getName }, { label: '是否计轴故障', key: 'axleFault', formatFn: getName },
{ label: '是否计轴复位', key: 'axleDrst', formatFn: getName }, { label: '是否计轴复位', key: 'axleDrst', formatFn: getName },
{ label: '是否计轴预复位', key: 'axlePdrst', formatFn: getName }, { label: '是否计轴预复位', key: 'axlePdrst', formatFn: getName },
]; ];

View File

@ -91,6 +91,7 @@ import { graphicData } from 'src/protos/stationLayoutGraphics';
const lineStore = useLineStore(); const lineStore = useLineStore();
const transponderState = ref<TransponderState>(new TransponderState()); const transponderState = ref<TransponderState>(new TransponderState());
const code = ref(''); const code = ref('');
const originalCode = ref('');
const type = ref(0); const type = ref(0);
const kilometer = ref(0); const kilometer = ref(0);
enum TransponderOperation { enum TransponderOperation {
@ -144,6 +145,7 @@ interface KeyType {
const list: KeyType[] = [ const list: KeyType[] = [
{ label: '应答器索引', key: 'code' }, { label: '应答器索引', key: 'code' },
{ label: '应答器名称', key: 'code', formatFn: getNameFormat }, { label: '应答器名称', key: 'code', formatFn: getNameFormat },
{ label: '应答器原编号', key: 'code', formatFn: getOriginalCodeFormat },
{ label: '坐标系', key: 'km', formatFn: getCoordinateSystemFormat }, { label: '坐标系', key: 'km', formatFn: getCoordinateSystemFormat },
{ label: '公里标', key: 'km', formatFn: getKilometerFormat }, { label: '公里标', key: 'km', formatFn: getKilometerFormat },
{ label: '方向', key: 'km', formatFn: getDirectionFormat }, { label: '方向', key: 'km', formatFn: getDirectionFormat },
@ -162,6 +164,9 @@ const list1: KeyType[] = [
function getNameFormat(v: string) { function getNameFormat(v: string) {
return code.value || v; return code.value || v;
} }
function getOriginalCodeFormat(v: string) {
return originalCode.value || v;
}
function getCoordinateSystemFormat(v: graphicData.KilometerSystem) { function getCoordinateSystemFormat(v: graphicData.KilometerSystem) {
return v.coordinateSystem; return v.coordinateSystem;
} }
@ -198,6 +203,7 @@ function initTransponderState(transponder: Transponder) {
copySelectGraphic = toRaw(transponder); copySelectGraphic = toRaw(transponder);
code.value = transponder.datas.code; code.value = transponder.datas.code;
type.value = transponder.datas.type; type.value = transponder.datas.type;
originalCode.value = transponder.datas.originalCode;
kilometer.value = transponder.states.km?.kilometer || 0; kilometer.value = transponder.states.km?.kilometer || 0;
transponderState.value = transponder.states.clone() as TransponderState; transponderState.value = transponder.states.clone() as TransponderState;
subscribeState(transponder); subscribeState(transponder);

View File

@ -1,13 +1,20 @@
function getHost(): string { function getHost(): string {
if (process.env.ENV_MODE == 'test') { if (process.env.URL_ENV == 'test') {
return 'test.joylink.club/bjrtsts-server'; return 'test.joylink.club/bjrtsts-server';
} else if (process.env.ENV_MODE == 'publish') { } else if (process.env.URL_ENV == 'publish') {
return 'joylink.club/bjrtsts-server'; return 'joylink.club/bjrtsts-server';
} else if (process.env.URL_ENV == 'local_test') {
return '192.168.33.233:9091';
} else if (process.env.URL_ENV == 'local_pxf') {
//北京现场
return '172.29.5.168/bjrtss-server';
} }
// return '192.168.3.7:9091'; // return '192.168.3.7:9091';
// return '192.168.3.47:9091'; // return '192.168.3.47:9091';
// return '192.168.3.37:9091'; // return '192.168.3.37:9091';
// return '192.168.33.207:9091'; // 张骞 //return '192.168.33.207:9091'; // 张骞
// return '192.168.33.93:9091'; // return '192.168.33.93:9091';
// return '192.168.3.37:9091'; //卫志宏 // return '192.168.3.37:9091'; //卫志宏
// return 'test.joylink.club/bjrtsts-service'; // 测试 // return 'test.joylink.club/bjrtsts-service'; // 测试
@ -16,7 +23,7 @@ function getHost(): string {
export function getHttpBase() { export function getHttpBase() {
let protocol = 'http'; let protocol = 'http';
if (['publish'].includes(process.env.ENV_MODE as string)) { if (['publish'].includes(process.env.URL_ENV as string)) {
protocol = 'https'; protocol = 'https';
} }
return `${protocol}://${getHost()}`; return `${protocol}://${getHost()}`;
@ -28,16 +35,21 @@ export function getWebsocketUrl() {
// let host = 'test.joylink.club'; // let host = 'test.joylink.club';
let port = '8083'; let port = '8083';
let url = `${protocol}://${host}:${port}`; let url = `${protocol}://${host}:${port}`;
if (process.env.ENV_MODE == 'test') { if (process.env.URL_ENV == 'test') {
// protocol = 'wss'; // protocol = 'wss';
host = 'test.joylink.club/bjrtsts-server'; host = 'test.joylink.club/bjrtsts-server';
port = ''; port = '';
url = `${protocol}://${host}`; url = `${protocol}://${host}`;
} else if (process.env.ENV_MODE == 'publish') { } else if (process.env.URL_ENV == 'publish') {
protocol = 'wss'; protocol = 'wss';
host = 'joylink.club/bjrtsts-server'; host = 'joylink.club/bjrtsts-server';
port = ''; port = '';
url = `${protocol}://${host}`; url = `${protocol}://${host}`;
} else if (process.env.URL_ENV == 'local_test') {
host = '192.168.33.233';
} else if (process.env.URL_ENV == 'local_pxf') {
host = '172.29.5.168';
} }
return `${url}/mqtt`; return `${url}/mqtt`;
} }

View File

@ -24,7 +24,8 @@ import { PslBox } from 'src/graphics/pslBox/PslBox';
import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor'; import { GarageDoor } from 'src/graphics/garageDoor/GarageDoor';
import { CarWashing } from 'src/graphics/carWashing/CarWashing'; import { CarWashing } from 'src/graphics/carWashing/CarWashing';
import { FloodGate } from 'src/graphics/floodGate/FloodGate'; import { FloodGate } from 'src/graphics/floodGate/FloodGate';
import { GarageDoorBox } from 'src/graphics/garageDoorBox/GarageDoorBox'; import { HoldButton } from 'src/graphics/holdButton/HoldButton';
import { UnattengedButton } from 'src/graphics/unattengedButton/UnattengedButton';
export const drawCommonLayerList = [ export const drawCommonLayerList = [
// 图层列表 默认显示的图层defaultShow: true // 图层列表 默认显示的图层defaultShow: true
@ -60,7 +61,8 @@ export const drawCommonLayerList = [
defaultShow: true, defaultShow: true,
}, },
{ label: '车库门', value: GarageDoor.Type, defaultShow: true }, { label: '车库门', value: GarageDoor.Type, defaultShow: true },
{ label: '防淹门', value: FloodGate.Type, defaultShow: true },
{ label: '洗车机', value: CarWashing.Type, defaultShow: true }, { label: '洗车机', value: CarWashing.Type, defaultShow: true },
{ label: '车库门设置', value: GarageDoorBox.Type, defaultShow: true }, { label: '防淹门', value: FloodGate.Type, defaultShow: true },
{ label: '扣车按钮', value: HoldButton.Type, defaultShow: true },
{ label: '无人折返按钮', value: UnattengedButton.Type, defaultShow: true },
]; ];

View File

@ -91,20 +91,27 @@ import {
SpksSwitchData, SpksSwitchData,
DrawSpksSwitchInteraction, DrawSpksSwitchInteraction,
} from './graphics/SpksSwitchInteraction'; } from './graphics/SpksSwitchInteraction';
import {
HoldButton,
HoldButtonTemplate,
} from 'src/graphics/holdButton/HoldButton';
import {
DrawHoldButtonInteraction,
HoldButtonData,
} from './graphics/HoldButtonInteraction';
import {
UnattengedButton,
UnattengedButtonTemplate,
} from 'src/graphics/unattengedButton/UnattengedButton';
import {
UnattengedButtonData,
DrawUnattengedButtonInteraction,
} from './graphics/UnattengedButtonInteraction';
import { GatedBox, GatedBoxTemplate } from 'src/graphics/gatedBox/GatedBox'; import { GatedBox, GatedBoxTemplate } from 'src/graphics/gatedBox/GatedBox';
import { import {
GatedBoxData, GatedBoxData,
DrawGatedBoxInteraction, DrawGatedBoxInteraction,
} from './graphics/GatedBoxInteraction'; } from './graphics/GatedBoxInteraction';
import {
GarageDoorBox,
GarageDoorBoxTemplate,
} from 'src/graphics/garageDoorBox/GarageDoorBox';
import {
GarageDoorBoxData,
DrawGarageDoorBoxInteraction,
} from './graphics/GarageDoorBoxInteraction';
import { GarageDoorBoxDraw } from 'src/graphics/garageDoorBox/GarageDoorBoxAssistant';
// import { EsbButton, EsbButtonTemplate } from 'src/graphics/esbButton/EsbButton'; // import { EsbButton, EsbButtonTemplate } from 'src/graphics/esbButton/EsbButton';
// import { // import {
// EsbButtonData, // EsbButtonData,
@ -112,6 +119,8 @@ import { GarageDoorBoxDraw } from 'src/graphics/garageDoorBox/GarageDoorBoxAssis
// EsbButtonState, // EsbButtonState,
// } from './graphics/EsbButtonInteraction'; // } from './graphics/EsbButtonInteraction';
import { SpksSwitchDraw } from 'src/graphics/spksSwitch/SpksSwitchDrawAssistant'; import { SpksSwitchDraw } from 'src/graphics/spksSwitch/SpksSwitchDrawAssistant';
import { HoldButtonDraw } from 'src/graphics/holdButton/HoldButtonDrawAssistant';
import { UnattengedButtonDraw } from 'src/graphics/unattengedButton/UnattengedButtonDrawAssistant';
import { GatedBoxDraw } from 'src/graphics/gatedBox/GatedBoxDrawAssistant'; import { GatedBoxDraw } from 'src/graphics/gatedBox/GatedBoxDrawAssistant';
// import { EsbButtonDraw } from 'src/graphics/esbButton/EsbButtonDrawAssistant'; // import { EsbButtonDraw } from 'src/graphics/esbButton/EsbButtonDrawAssistant';
import { TransponderDraw } from 'src/graphics/transponder/TransponderDrawAssistant'; import { TransponderDraw } from 'src/graphics/transponder/TransponderDrawAssistant';
@ -151,21 +160,27 @@ import { Dialog } from 'quasar';
import { useDrawStore } from 'src/stores/draw-store'; import { useDrawStore } from 'src/stores/draw-store';
import { saveDraft } from 'src/api/DraftApi'; import { saveDraft } from 'src/api/DraftApi';
import { SignalDraw } from 'src/graphics/signal/SignalDrawAssistant'; import { SignalDraw } from 'src/graphics/signal/SignalDrawAssistant';
import { CarWashingData } from './graphics/CarWashingInteraction'; import {
CarWashingData,
CarWashingState,
} from './graphics/CarWashingInteraction';
import { import {
CarWashing, CarWashing,
CarWashingTemplate, CarWashingTemplate,
} from 'src/graphics/carWashing/CarWashing'; } from 'src/graphics/carWashing/CarWashing';
import { CarWashingDraw } from 'src/graphics/carWashing/CarWashingDrawAssistant'; import { CarWashingDraw } from 'src/graphics/carWashing/CarWashingDrawAssistant';
import { FloodGateData } from './graphics/FloodGateInteraction'; import {
import { FloodGate, FloodGateTemplate } from 'src/graphics/floodGate/FloodGate'; GarageDoorData,
import { FloodGateDraw } from 'src/graphics/floodGate/FloodGateDrawAssistant'; GarageDoorState,
import { GarageDoorData } from './graphics/GarageDoorInteraction'; } from './graphics/GarageDoorInteraction';
import { import {
GarageDoor, GarageDoor,
GarageDoorTemplate, GarageDoorTemplate,
} from 'src/graphics/garageDoor/GarageDoor'; } from 'src/graphics/garageDoor/GarageDoor';
import { GarageDoorDraw } from 'src/graphics/garageDoor/GarageDoorDrawAssistant'; import { GarageDoorDraw } from 'src/graphics/garageDoor/GarageDoorDrawAssistant';
import { FloodGateDraw } from 'src/graphics/floodGate/FloodGateDrawAssistant';
import { FloodGate, FloodGateTemplate } from 'src/graphics/floodGate/FloodGate';
import { FloodGateData, FloodGateState } from './graphics/FloodGateInteraction';
const UndoOptions: MenuItemOptions = { const UndoOptions: MenuItemOptions = {
name: '撤销', name: '撤销',
@ -231,11 +246,12 @@ export function initCommonDrawApp(app: IDrawApp) {
); );
new StopPositionDraw(app, new StopPositionTemplate(new StopPositionData())); new StopPositionDraw(app, new StopPositionTemplate(new StopPositionData()));
new SpksSwitchDraw(app, new SpksSwitchTemplate(new SpksSwitchData())); new SpksSwitchDraw(app, new SpksSwitchTemplate(new SpksSwitchData()));
new GatedBoxDraw(app, new GatedBoxTemplate(new GatedBoxData())); new HoldButtonDraw(app, new HoldButtonTemplate(new HoldButtonData()));
new GarageDoorBoxDraw( new UnattengedButtonDraw(
app, app,
new GarageDoorBoxTemplate(new GarageDoorBoxData()) new UnattengedButtonTemplate(new UnattengedButtonData())
); );
new GatedBoxDraw(app, new GatedBoxTemplate(new GatedBoxData()));
// new EsbButtonDraw( // new EsbButtonDraw(
// app, // app,
// new EsbButtonTemplate(new EsbButtonData(), new EsbButtonState()) // new EsbButtonTemplate(new EsbButtonData(), new EsbButtonState())
@ -256,14 +272,24 @@ export function initCommonDrawApp(app: IDrawApp) {
app, app,
new ConcentrationDividingLineTemplate(new ConcentrationDividingLineData()) new ConcentrationDividingLineTemplate(new ConcentrationDividingLineData())
); );
new CarWashingDraw(app, new CarWashingTemplate(new CarWashingData())); new CarWashingDraw(
new FloodGateDraw(app, new FloodGateTemplate(new FloodGateData())); app,
new GarageDoorDraw(app, new GarageDoorTemplate(new GarageDoorData())); new CarWashingTemplate(new CarWashingData(), new CarWashingState())
);
new GarageDoorDraw(
app,
new GarageDoorTemplate(new GarageDoorData(), new GarageDoorState())
);
new FloodGateDraw(
app,
new FloodGateTemplate(new FloodGateData(), new FloodGateState())
);
DrawSignalInteraction.init(app); DrawSignalInteraction.init(app);
DrawStopPositionInteraction.init(app); DrawStopPositionInteraction.init(app);
DrawSpksSwitchInteraction.init(app); DrawSpksSwitchInteraction.init(app);
DrawHoldButtonInteraction.init(app);
DrawUnattengedButtonInteraction.init(app);
DrawGatedBoxInteraction.init(app); DrawGatedBoxInteraction.init(app);
DrawGarageDoorBoxInteraction.init(app);
// DrawEsbButtonInteraction.init(app); // DrawEsbButtonInteraction.init(app);
// 画布右键菜单 // 画布右键菜单
@ -292,9 +318,11 @@ export function initCommonDrawApp(app: IDrawApp) {
UniqueIdPrefix = new graphicData.UniqueIdOfStationLayout(); UniqueIdPrefix = new graphicData.UniqueIdOfStationLayout();
screenDoorConfig = new graphicData.ScreenDoorConfig(); screenDoorConfig = new graphicData.ScreenDoorConfig();
generateAxleCountingConfig = new graphicData.GenerateAxleCountingConfig(); generateAxleCountingConfig = new graphicData.GenerateAxleCountingConfig();
lianSuoData = new graphicData.LianSuoData();
kilometerConvertList = []; kilometerConvertList = [];
sectionCodePointList = []; sectionCodePointList = [];
otherLineList = []; otherLineList = [];
kmChainDataList = [];
}); });
// KeyA 用于区段复制--控制生成的区段位置 // KeyA 用于区段复制--控制生成的区段位置
const graphicCopyPlugin = app.app.graphicCopyPlugin; const graphicCopyPlugin = app.app.graphicCopyPlugin;
@ -399,7 +427,11 @@ export function loadCommonDrawDatas(
UniqueIdPrefix = storage.UniqueIdPrefix; UniqueIdPrefix = storage.UniqueIdPrefix;
screenDoorConfig = storage.screenDoorConfig; screenDoorConfig = storage.screenDoorConfig;
generateAxleCountingConfig = storage.generateAxleCountingConfig; generateAxleCountingConfig = storage.generateAxleCountingConfig;
if (storage.lianSuoData) {
lianSuoData = storage.lianSuoData;
}
kilometerConvertList = storage.kilometerConvertList; kilometerConvertList = storage.kilometerConvertList;
kmChainDataList = storage.kilometerMarkCalibrations;
sectionCodePointList = storage.sectionCodePointList; sectionCodePointList = storage.sectionCodePointList;
otherLineList = storage.otherLineList; otherLineList = storage.otherLineList;
refDevicesList = storage.stationRelateDeviceList; refDevicesList = storage.stationRelateDeviceList;
@ -442,12 +474,15 @@ export function loadCommonDrawDatas(
storage.spksSwitchs.forEach((spksSwitch) => { storage.spksSwitchs.forEach((spksSwitch) => {
datas.push(new SpksSwitchData(spksSwitch)); datas.push(new SpksSwitchData(spksSwitch));
}); });
storage.holdButtons.forEach((holdButton) => {
datas.push(new HoldButtonData(holdButton));
});
storage.unattengedButtons.forEach((unattengedButton) => {
datas.push(new UnattengedButtonData(unattengedButton));
});
storage.gateBoxs.forEach((gatedBox) => { storage.gateBoxs.forEach((gatedBox) => {
datas.push(new GatedBoxData(gatedBox)); datas.push(new GatedBoxData(gatedBox));
}); });
storage.garageDoorBoxes.forEach((garageDoorBox) => {
datas.push(new GarageDoorBoxData(garageDoorBox));
});
// storage.esbButtons.forEach((esbButton) => { // storage.esbButtons.forEach((esbButton) => {
// datas.push(new EsbButtonData(esbButton)); // datas.push(new EsbButtonData(esbButton));
// }); // });
@ -472,15 +507,15 @@ export function loadCommonDrawDatas(
storage.concentrationDividingLines.forEach((concentrationDividingLine) => { storage.concentrationDividingLines.forEach((concentrationDividingLine) => {
datas.push(new ConcentrationDividingLineData(concentrationDividingLine)); datas.push(new ConcentrationDividingLineData(concentrationDividingLine));
}); });
storage.floodGates.forEach((flood) => {
datas.push(new FloodGateData(flood));
});
storage.carWashings.forEach((carWashing) => { storage.carWashings.forEach((carWashing) => {
datas.push(new CarWashingData(carWashing)); datas.push(new CarWashingData(carWashing));
}); });
storage.garageDoors.forEach((garageDoor) => { storage.garageDoors.forEach((garageDoor) => {
datas.push(new GarageDoorData(garageDoor)); datas.push(new GarageDoorData(garageDoor));
}); });
storage.floodGates.forEach((floodGate) => {
datas.push(new FloodGateData(floodGate));
});
return datas; return datas;
} }
@ -534,17 +569,20 @@ export function saveCommonDrawDatas(app: IDrawApp) {
} else if (SpksSwitch.Type === g.type) { } else if (SpksSwitch.Type === g.type) {
const spksSwitchData = (g as SpksSwitch).saveData(); const spksSwitchData = (g as SpksSwitch).saveData();
storage.spksSwitchs.push((spksSwitchData as SpksSwitchData).data); storage.spksSwitchs.push((spksSwitchData as SpksSwitchData).data);
} else if (HoldButton.Type === g.type) {
const holdButtonData = (g as HoldButton).saveData();
storage.holdButtons.push((holdButtonData as HoldButtonData).data);
} else if (UnattengedButton.Type === g.type) {
const unattengedButtonData = (g as UnattengedButton).saveData();
storage.unattengedButtons.push(
(unattengedButtonData as UnattengedButtonData).data
);
} else if (GatedBox.Type === g.type) { } else if (GatedBox.Type === g.type) {
const gatedBoxData = (g as GatedBox).saveData(); const gatedBoxData = (g as GatedBox).saveData();
storage.gateBoxs.push((gatedBoxData as GatedBoxData).data); storage.gateBoxs.push((gatedBoxData as GatedBoxData).data);
// } else if (EsbButton.Type === g.type) { // } else if (EsbButton.Type === g.type) {
// const esbButtonData = (g as EsbButton).saveData(); // const esbButtonData = (g as EsbButton).saveData();
// storage.esbButtons.push((esbButtonData as EsbButtonData).data); // storage.esbButtons.push((esbButtonData as EsbButtonData).data);
} else if (GarageDoorBox.Type === g.type) {
const garageDoorBoxData = (g as GarageDoorBox).saveData();
storage.garageDoorBoxes.push(
(garageDoorBoxData as GarageDoorBoxData).data
);
} else if (Transponder.Type === g.type) { } else if (Transponder.Type === g.type) {
const transponderData = (g as Transponder).saveData(); const transponderData = (g as Transponder).saveData();
storage.transponders.push((transponderData as TransponderData).data); storage.transponders.push((transponderData as TransponderData).data);
@ -575,12 +613,12 @@ export function saveCommonDrawDatas(app: IDrawApp) {
} else if (g instanceof CarWashing) { } else if (g instanceof CarWashing) {
const carWashingData = g.saveData(); const carWashingData = g.saveData();
storage.carWashings.push((carWashingData as CarWashingData).data); storage.carWashings.push((carWashingData as CarWashingData).data);
} else if (g instanceof FloodGate) {
const floodGateData = g.saveData();
storage.floodGates.push((floodGateData as FloodGateData).data);
} else if (g instanceof GarageDoor) { } else if (g instanceof GarageDoor) {
const garageDoorData = g.saveData(); const garageDoorData = g.saveData();
storage.garageDoors.push((garageDoorData as GarageDoorData).data); storage.garageDoors.push((garageDoorData as GarageDoorData).data);
} else if (g instanceof FloodGate) {
const floodGateData = g.saveData();
storage.floodGates.push((floodGateData as FloodGateData).data);
} }
}); });
// storage.Platforms.forEach((item) => { // storage.Platforms.forEach((item) => {
@ -699,6 +737,8 @@ export function saveCommonDrawDatas(app: IDrawApp) {
storage.sectionCodePointList = sectionCodePointList; storage.sectionCodePointList = sectionCodePointList;
storage.otherLineList = otherLineList; storage.otherLineList = otherLineList;
storage.stationRelateDeviceList = refDevicesList; storage.stationRelateDeviceList = refDevicesList;
storage.lianSuoData = lianSuoData;
storage.kilometerMarkCalibrations = kmChainDataList;
// if (storage.generateAxleCountingConfig?.bbConnect) { // if (storage.generateAxleCountingConfig?.bbConnect) {
// storage.generateAxleCountingConfig.newbbConnect = // storage.generateAxleCountingConfig.newbbConnect =
// storage.generateAxleCountingConfig.bbConnect.map((item) => +item); // storage.generateAxleCountingConfig.bbConnect.map((item) => +item);
@ -793,6 +833,24 @@ export function editKilometerConvert(row: graphicData.KilometerConvert) {
export function deleteKilometerConvert(index: number) { export function deleteKilometerConvert(index: number) {
kilometerConvertList.splice(index, 1); kilometerConvertList.splice(index, 1);
} }
//公里标设计-实测数据增删改查
let kmChainDataList: graphicData.KilometerMarkCalibration[] = [];
export function loadKmChainDataList() {
return kmChainDataList;
}
export function createKmChainData(row: graphicData.KilometerMarkCalibration) {
kmChainDataList.push(row);
}
export function editKmChainData(row: graphicData.KilometerMarkCalibration) {
const drawStore = useDrawStore();
const findIndex = drawStore.editKmChainDataIndex;
if (findIndex >= 0) {
kmChainDataList.splice(findIndex, 1, row);
}
}
export function deleteKmChainData(index: number) {
kmChainDataList.splice(index, 1);
}
// 公里标转换趋势 // 公里标转换趋势
export const sameTrendOptions = [ export const sameTrendOptions = [
{ label: '相反', value: false }, { label: '相反', value: false },
@ -852,6 +910,15 @@ export function setGenerateAxleCountingConfig(
generateAxleCountingConfig = newScreenDoorConfig; generateAxleCountingConfig = newScreenDoorConfig;
} }
let lianSuoData = new graphicData.LianSuoData();
export function loadLianSuoData() {
return lianSuoData;
}
export function setLianSuoData(newLianSuoData: graphicData.LianSuoData) {
lianSuoData = newLianSuoData;
}
// 其他线路数据 // 其他线路数据
let otherLineList: graphicData.OtherLine[] = []; let otherLineList: graphicData.OtherLine[] = [];
export function loadOtherLineList() { export function loadOtherLineList() {

View File

@ -1,12 +1,17 @@
import * as pb_1 from 'google-protobuf'; import * as pb_1 from 'google-protobuf';
import { GraphicDataBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { import {
IAxleCountingSectionData, IAxleCountingSectionData,
AxleCountingSection, AxleCountingSection,
ITurnoutPosRefData, ITurnoutPosRefData,
IAxleCountingSectionState,
} from 'src/graphics/axleCountingSection/AxleCountingSection'; } from 'src/graphics/axleCountingSection/AxleCountingSection';
import { graphicData } from 'src/protos/stationLayoutGraphics'; import { graphicData } from 'src/protos/stationLayoutGraphics';
import { IPointData } from 'pixi.js'; import { IPointData } from 'pixi.js';
import { state } from 'src/protos/device_state';
import { useLineStore } from 'src/stores/line-store';
import { GraphicInteractionPlugin, IGraphicScene, JlGraphic } from 'jl-graphic';
import { AxleCountingSectionGraphicHitArea } from 'src/graphics/axleCountingSection/AxleCountingSectionAssistant';
export class AxleCountingSectionData export class AxleCountingSectionData
extends GraphicDataBase extends GraphicDataBase
@ -68,3 +73,84 @@ export class AxleCountingSectionData
return pb_1.Message.equals(this.data, other.data); return pb_1.Message.equals(this.data, other.data);
} }
} }
export class AxleCountingSectionStates
extends GraphicStateBase
implements IAxleCountingSectionState
{
constructor(proto?: state.AxleCountingSectionState) {
let states;
if (proto) {
states = proto;
} else {
states = new state.AxleCountingSectionState();
}
super(states, AxleCountingSection.Type);
}
get code(): string {
return this.states.id + '';
}
get id(): number {
return this.states.id;
}
set id(id: number) {
this.states.id = id;
}
get occupied(): boolean {
return this.states.occupied;
}
set occupied(occupied: boolean) {
this.states.occupied = occupied;
}
get states(): state.AxleCountingSectionState {
return this.getState<state.AxleCountingSectionState>();
}
clone(): AxleCountingSectionStates {
return new AxleCountingSectionStates(this.states.cloneMessage());
}
copyFrom(data: GraphicStateBase): void {
pb_1.Message.copyInto(data._state, this._state);
}
eq(data: GraphicStateBase): boolean {
return pb_1.Message.equals(this._state, data._state);
}
}
export class AxleCountingSectionOperateInteraction extends GraphicInteractionPlugin<AxleCountingSection> {
static Name = 'AxleCountingSection_operate_menu';
constructor(app: IGraphicScene) {
super(AxleCountingSectionOperateInteraction.Name, app);
}
static init(app: IGraphicScene) {
return new AxleCountingSectionOperateInteraction(app);
}
filter(...grahpics: JlGraphic[]): AxleCountingSection[] | undefined {
return grahpics
.filter((g) => g.type === AxleCountingSection.Type)
.map((g) => g as AxleCountingSection);
}
bind(g: AxleCountingSection): void {
g.lineGraphic.eventMode = 'static';
g.lineGraphic.cursor = 'pointer';
g.lineGraphic.hitArea = new AxleCountingSectionGraphicHitArea(g);
g.lineGraphic.selectable = true;
g.selectable = true;
g.labelGraphic.eventMode = 'static';
g.labelGraphic.cursor = 'pointer';
g.labelGraphic.selectable = true;
g.on('_leftclick', this.onLeftClick, this);
}
unbind(g: AxleCountingSection): void {
g.lineGraphic.eventMode = 'none';
g.lineGraphic.scalable = false;
g.lineGraphic.selectable = false;
g.selectable = false;
g.labelGraphic.eventMode = 'none';
g.labelGraphic.selectable = false;
g.off('_leftclick', this.onLeftClick, this);
}
onLeftClick() {
useLineStore().stateProCountIncrease();
}
}

View File

@ -1,13 +1,26 @@
import * as pb_1 from 'google-protobuf'; import * as pb_1 from 'google-protobuf';
import { FederatedMouseEvent } from 'pixi.js'; import { FederatedMouseEvent, DisplayObject } from 'pixi.js';
import { import {
CarWashing, CarWashing,
ICarWashingData, ICarWashingData,
ICarWashingState,
} from 'src/graphics/carWashing/CarWashing'; } from 'src/graphics/carWashing/CarWashing';
import { GraphicInteractionPlugin, JlGraphic, IGraphicScene } from 'jl-graphic'; import {
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics'; import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { state } from 'src/protos/device_state';
import { request } from 'src/protos/request';
import { useLineStore } from 'src/stores/line-store';
import { Dialog } from 'quasar';
import XcjOperation from 'src/components/draw-app/dialogs/XcjOperation.vue';
import { CarWashingGraphicHitArea } from 'src/graphics/carWashing/CarWashingDrawAssistant';
export class CarWashingData extends GraphicDataBase implements ICarWashingData { export class CarWashingData extends GraphicDataBase implements ICarWashingData {
constructor(data?: graphicData.CarWashing) { constructor(data?: graphicData.CarWashing) {
@ -43,6 +56,18 @@ export class CarWashingData extends GraphicDataBase implements ICarWashingData {
set centralizedStations(v: number[]) { set centralizedStations(v: number[]) {
this.data.centralizedStations = v; this.data.centralizedStations = v;
} }
get duanNum(): number {
return this.data.duanNum;
}
set duanNum(v: number) {
this.data.duanNum = v;
}
get width(): number {
return this.data.width;
}
set width(v: number) {
this.data.width = v;
}
clone(): CarWashingData { clone(): CarWashingData {
return new CarWashingData(this.data.cloneMessage()); return new CarWashingData(this.data.cloneMessage());
} }
@ -54,10 +79,110 @@ export class CarWashingData extends GraphicDataBase implements ICarWashingData {
} }
} }
export class CarWashingState
extends GraphicStateBase
implements ICarWashingState
{
constructor(proto?: state.XcjState) {
let states;
if (proto) {
states = proto;
} else {
states = new state.XcjState();
}
super(states, CarWashing.Type);
}
get code(): string {
return this.states.id + '';
}
get id(): number {
return this.states.id;
}
set id(id: number) {
this.states.id = id;
}
get param(): request.XcjParam {
return this.states.param;
}
set param(param: request.XcjParam) {
this.states.param = param;
}
get xqj(): boolean {
return this.states.xqj;
}
set xqj(v: boolean) {
this.states.xqj = v;
}
get twjList(): boolean[] {
return this.states.twjList;
}
set twjList(v: boolean[]) {
this.states.twjList = v;
}
get tgqj(): boolean {
return this.states.tgqj;
}
set tgqj(v: boolean) {
this.states.tgqj = v;
}
get xcjxj(): boolean {
return this.states.xcjxj;
}
set xcjxj(v: boolean) {
this.states.xcjxj = v;
}
get xcyxj(): boolean {
return this.states.xcyxj;
}
set xcyxj(v: boolean) {
this.states.xcyxj = v;
}
get cfjList(): boolean[] {
return this.states.cfjList;
}
set cfjList(v: boolean[]) {
this.states.cfjList = v;
}
get jtj(): boolean {
return this.states.jtj;
}
set jtj(v: boolean) {
this.states.jtj = v;
}
get tgyxj(): boolean {
return this.states.tgyxj;
}
set tgyxj(v: boolean) {
this.states.tgyxj = v;
}
get states(): state.XcjState {
return this.getState<state.XcjState>();
}
clone(): CarWashingState {
return new CarWashingState(this.states.cloneMessage());
}
copyFrom(data: GraphicStateBase): void {
pb_1.Message.copyInto(data._state, this._state);
}
eq(data: GraphicStateBase): boolean {
return pb_1.Message.equals(this._state, data._state);
}
}
const setXcjParam: MenuItemOptions = { name: '设置参数' };
const xcjOperateMenu: ContextMenu = ContextMenu.init({
name: '洗车机操作菜单',
groups: [
{
items: [setXcjParam],
},
],
});
export class CarWashingOperationInteraction extends GraphicInteractionPlugin<CarWashing> { export class CarWashingOperationInteraction extends GraphicInteractionPlugin<CarWashing> {
static Name = 'car_washing_operation'; static Name = 'car_washing_operation';
constructor(scene: IGraphicScene) { constructor(scene: IGraphicScene) {
super(CarWashingOperationInteraction.Name, scene); super(CarWashingOperationInteraction.Name, scene);
scene.registerMenu(xcjOperateMenu);
} }
static init(scene: IGraphicScene) { static init(scene: IGraphicScene) {
return new CarWashingOperationInteraction(scene); return new CarWashingOperationInteraction(scene);
@ -68,12 +193,17 @@ export class CarWashingOperationInteraction extends GraphicInteractionPlugin<Car
bind(g: CarWashing): void { bind(g: CarWashing): void {
g.eventMode = 'static'; g.eventMode = 'static';
g.cursor = 'pointer'; g.cursor = 'pointer';
g.rectBody.hitArea = new CarWashingGraphicHitArea(g);
g.selectable = true;
g.on('mousedown', this.onPress, this); g.on('mousedown', this.onPress, this);
g.on('_rightclick', this.onContextMenu);
} }
unbind(g: CarWashing): void { unbind(g: CarWashing): void {
g.eventMode = 'none'; g.eventMode = 'none';
g.cursor = 'default'; g.cursor = 'default';
g.selectable = false;
g.off('mousedown', this.onPress, this); g.off('mousedown', this.onPress, this);
g.off('_rightclick', this.onContextMenu);
} }
onPress(e: FederatedMouseEvent) { onPress(e: FederatedMouseEvent) {
const g = e.target as CarWashing; const g = e.target as CarWashing;
@ -85,4 +215,25 @@ export class CarWashingOperationInteraction extends GraphicInteractionPlugin<Car
g.off('mouseleave', this.onRelease, this); g.off('mouseleave', this.onRelease, this);
g.off('mouseup', this.onRelease, this); g.off('mouseup', this.onRelease, this);
} }
onContextMenu(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const carWashing = target.getGraphic<CarWashing>();
if (!carWashing) return;
const lineStore = useLineStore();
setXcjParam.handler = async () => {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: XcjOperation,
componentProps: {
id: carWashing.id,
code: carWashing.datas.code,
xcjFaultProp: carWashing.states.param.fault,
},
cancel: true,
persistent: true,
});
};
xcjOperateMenu.open(e.global);
}
} }

View File

@ -1,16 +1,33 @@
import * as pb_1 from 'google-protobuf'; import * as pb_1 from 'google-protobuf';
import { FederatedMouseEvent } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { FloodGate, IFloodGateData } from 'src/graphics/floodGate/FloodGate'; import {
import { GraphicInteractionPlugin, JlGraphic, IGraphicScene } from 'jl-graphic'; FloodGate,
IFloodGateData,
IFloodGateState,
} from 'src/graphics/floodGate/FloodGate';
import {
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics'; import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { useLineStore } from 'src/stores/line-store';
import { Dialog } from 'quasar';
import CkmOperation from 'src/components/draw-app/dialogs/CkmOperation.vue';
import { state } from 'src/protos/device_state';
import { request } from 'src/protos/request';
import { FloodGateGraphicHitArea } from 'src/graphics/floodGate/FloodGateDrawAssistant';
import { usePslStore } from 'src/stores/psl-store';
export class FloodGateData extends GraphicDataBase implements IFloodGateData { export class FloodGateData extends GraphicDataBase implements IFloodGateData {
constructor(data?: graphicData.FloodGate) { constructor(data?: graphicData.GarageDoor) {
let floodGate; let floodGate;
if (!data) { if (!data) {
floodGate = new graphicData.FloodGate({ floodGate = new graphicData.GarageDoor({
common: GraphicDataBase.defaultCommonInfo(FloodGate.Type), common: GraphicDataBase.defaultCommonInfo(FloodGate.Type),
}); });
} else { } else {
@ -19,8 +36,8 @@ export class FloodGateData extends GraphicDataBase implements IFloodGateData {
super(floodGate); super(floodGate);
} }
public get data(): graphicData.FloodGate { public get data(): graphicData.GarageDoor {
return this.getData<graphicData.FloodGate>(); return this.getData<graphicData.GarageDoor>();
} }
get code(): string { get code(): string {
return this.data.code; return this.data.code;
@ -40,6 +57,12 @@ export class FloodGateData extends GraphicDataBase implements IFloodGateData {
set centralizedStations(v: number[]) { set centralizedStations(v: number[]) {
this.data.centralizedStations = v; this.data.centralizedStations = v;
} }
get refPslMapCode(): string {
return this.data.refPslMapCode;
}
set refPslMapCode(v: string) {
this.data.refPslMapCode = v;
}
clone(): FloodGateData { clone(): FloodGateData {
return new FloodGateData(this.data.cloneMessage()); return new FloodGateData(this.data.cloneMessage());
} }
@ -51,35 +74,138 @@ export class FloodGateData extends GraphicDataBase implements IFloodGateData {
} }
} }
export class FloodGateState
extends GraphicStateBase
implements IFloodGateState
{
constructor(proto?: state.CkmState) {
let states;
if (proto) {
states = proto;
} else {
states = new state.CkmState();
}
super(states, FloodGate.Type);
}
get code(): string {
return this.states.id + '';
}
get id(): number {
return this.states.id;
}
set id(id: number) {
this.states.id = id;
}
get mgj() {
return this.states.mgj;
}
set mgj(v: boolean) {
this.states.mgj = v;
}
get param(): request.CkmParam {
return this.states.param;
}
set param(param: request.CkmParam) {
this.states.param = param;
}
get local(): boolean {
return this.states.local;
}
set local(v: boolean) {
this.states.local = v;
}
get mplj() {
return this.states.mplj;
}
set mplj(v: boolean) {
this.states.mplj = v;
}
get states(): state.CkmState {
return this.getState<state.CkmState>();
}
clone(): FloodGateState {
return new FloodGateState(this.states.cloneMessage());
}
copyFrom(data: GraphicStateBase): void {
pb_1.Message.copyInto(data._state, this._state);
}
eq(data: GraphicStateBase): boolean {
return pb_1.Message.equals(this._state, data._state);
}
}
const setCkmrParam: MenuItemOptions = { name: '设置参数' };
const ckmOperateMenu: ContextMenu = ContextMenu.init({
name: '防淹门操作菜单',
groups: [
{
items: [setCkmrParam],
},
],
});
export class FloodGateOperationInteraction extends GraphicInteractionPlugin<FloodGate> { export class FloodGateOperationInteraction extends GraphicInteractionPlugin<FloodGate> {
static Name = 'flood_gate_operation'; static Name = 'flood_gate_operation';
constructor(scene: IGraphicScene) { constructor(app: IGraphicScene) {
super(FloodGateOperationInteraction.Name, scene); super(FloodGateOperationInteraction.Name, app);
app.registerMenu(ckmOperateMenu);
} }
static init(scene: IGraphicScene) { static init(app: IGraphicScene) {
return new FloodGateOperationInteraction(scene); return new FloodGateOperationInteraction(app);
} }
filter(...grahpics: JlGraphic[]): FloodGate[] | undefined { filter(...grahpics: JlGraphic[]): FloodGate[] | undefined {
return grahpics.filter((g): g is FloodGate => g.type === FloodGate.Type); return grahpics.filter((g): g is FloodGate => g.type === FloodGate.Type);
} }
bind(g: FloodGate): void { bind(g: FloodGate): void {
g.eventMode = 'static'; g.eventMode = 'static';
g.hitArea = new FloodGateGraphicHitArea(g);
g.cursor = 'pointer'; g.cursor = 'pointer';
g.on('mousedown', this.onPress, this); g.selectable = true;
g.rectBody.eventMode = 'static';
g.rectBody.cursor = 'pointer';
g.rectBody.selectable = true;
g.on('_rightclick', this.onContextMenu);
g.rectBody.on('_leftclick', this.onLeftClick, this);
} }
unbind(g: FloodGate): void { unbind(g: FloodGate): void {
g.eventMode = 'none'; g.eventMode = 'none';
g.cursor = 'default'; g.cursor = 'default';
g.off('mousedown', this.onPress, this); g.selectable = false;
g.rectBody.eventMode = 'none';
g.rectBody.cursor = 'default';
g.rectBody.selectable = false;
g.off('_rightclick', this.onContextMenu);
g.rectBody.off('_leftclick', this.onLeftClick, this);
} }
onPress(e: FederatedMouseEvent) {
const g = e.target as FloodGate; onContextMenu(e: FederatedMouseEvent) {
g.on('mouseleave', this.onRelease, this); const target = e.target as DisplayObject;
g.on('mouseup', this.onRelease, this); const floodGate = target.getGraphic<FloodGate>();
if (!floodGate) return;
const lineStore = useLineStore();
setCkmrParam.handler = async () => {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: CkmOperation,
componentProps: {
id: floodGate.id,
code: floodGate.datas.code,
ckmForceProp: floodGate.states.param.force,
ckmFaultProp: floodGate.states.param.fault,
title: '防淹门设置参数',
},
cancel: true,
persistent: true,
});
};
ckmOperateMenu.open(e.global);
} }
onRelease(e: FederatedMouseEvent) { onLeftClick(e: FederatedMouseEvent) {
const g = e.target as FloodGate; const target = e.target as DisplayObject;
g.off('mouseleave', this.onRelease, this); const floodGate = target.getGraphic() as FloodGate;
g.off('mouseup', this.onRelease, this); usePslStore().setPslParam(
floodGate.datas.id,
floodGate.datas.refPslMapCode
);
} }
} }

View File

@ -1,150 +0,0 @@
import * as pb_1 from 'google-protobuf';
import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import {
GarageDoorBox,
IGarageDoorBox,
} from 'src/graphics/garageDoorBox/GarageDoorBox';
import {
IGraphicApp,
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase';
import { usePslStore } from 'src/stores/psl-store';
export class GarageDoorBoxData
extends GraphicDataBase
implements IGarageDoorBox
{
constructor(data?: graphicData.GarageDoorBox) {
let garageDoorBox;
if (!data) {
garageDoorBox = new graphicData.GarageDoorBox({
common: GraphicDataBase.defaultCommonInfo(GarageDoorBox.Type),
});
} else {
garageDoorBox = data;
}
super(garageDoorBox);
}
public get data(): graphicData.GarageDoorBox {
return this.getData<graphicData.GarageDoorBox>();
}
get code(): string {
return this.data.code;
}
set code(v: string) {
this.data.code = v;
}
get flip(): boolean {
return this.data.flip;
}
set flip(v: boolean) {
this.data.flip = v;
}
get refGarageDoorId(): number {
return this.data.refGarageDoorId;
}
set refGarageDoorId(v: number) {
this.data.refGarageDoorId = v;
}
get refPslMapCode(): string {
return this.data.refPslMapCode;
}
set refPslMapCode(v: string) {
this.data.refPslMapCode = v;
}
clone(): GarageDoorBoxData {
return new GarageDoorBoxData(this.data.cloneMessage());
}
copyFrom(data: GarageDoorBoxData): void {
pb_1.Message.copyInto(data.data, this.data);
}
eq(other: GarageDoorBoxData): boolean {
return pb_1.Message.equals(this.data, other.data);
}
}
const flipConfig: MenuItemOptions = {
name: '上下翻转',
};
const GarageDoorBoxEditMenu: ContextMenu = ContextMenu.init({
name: '设置车库门编辑菜单',
groups: [
{
items: [flipConfig],
},
],
});
export class DrawGarageDoorBoxInteraction extends GraphicInteractionPlugin<GarageDoorBox> {
static Name = 'garage_door_box_draw_right_menu';
constructor(app: IGraphicApp) {
super(DrawGarageDoorBoxInteraction.Name, app);
app.registerMenu(GarageDoorBoxEditMenu);
}
static init(app: IGraphicApp) {
return new DrawGarageDoorBoxInteraction(app);
}
filter(...grahpics: JlGraphic[]): GarageDoorBox[] | undefined {
return grahpics
.filter((g) => g.type === GarageDoorBox.Type)
.map((g) => g as GarageDoorBox);
}
bind(g: GarageDoorBox): void {
g.on('_rightclick', this.onContextMenu, this);
}
unbind(g: GarageDoorBox): void {
g.off('_rightclick', this.onContextMenu, this);
}
onContextMenu(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const garageDoorBox = target.getGraphic() as GarageDoorBox;
this.app.updateSelected(garageDoorBox);
flipConfig.handler = () => {
garageDoorBox.datas.flip = !garageDoorBox.datas.flip;
garageDoorBox.repaint();
};
GarageDoorBoxEditMenu.open(e.global);
}
}
export class GarageDoorBoxOperateInteraction extends GraphicInteractionPlugin<GarageDoorBox> {
static Name = 'garage_door_box_operate_menu';
constructor(app: IGraphicScene) {
super(GarageDoorBoxOperateInteraction.Name, app);
}
static init(app: IGraphicScene) {
return new GarageDoorBoxOperateInteraction(app);
}
filter(...grahpics: JlGraphic[]): GarageDoorBox[] | undefined {
return grahpics
.filter((g) => g.type === GarageDoorBox.Type)
.map((g) => g as GarageDoorBox);
}
bind(g: GarageDoorBox): void {
g.eventMode = 'static';
g.cursor = 'pointer';
g.on('_leftclick', this.onLeftClick, this);
}
unbind(g: GarageDoorBox): void {
g.eventMode = 'none';
g.off('_leftclick', this.onLeftClick, this);
}
onLeftClick(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const garageDoorBox = target.getGraphic() as GarageDoorBox;
usePslStore().setPslParam(
garageDoorBox.datas.id,
garageDoorBox.datas.refPslMapCode
);
}
}

View File

@ -1,13 +1,27 @@
import * as pb_1 from 'google-protobuf'; import * as pb_1 from 'google-protobuf';
import { FederatedMouseEvent } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { import {
GarageDoor, GarageDoor,
IGarageDoorData, IGarageDoorData,
IGarageDoorState,
} from 'src/graphics/garageDoor/GarageDoor'; } from 'src/graphics/garageDoor/GarageDoor';
import { GraphicInteractionPlugin, JlGraphic, IGraphicScene } from 'jl-graphic'; import {
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics'; import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { useLineStore } from 'src/stores/line-store';
import { Dialog } from 'quasar';
import CkmOperation from 'src/components/draw-app/dialogs/CkmOperation.vue';
import { state } from 'src/protos/device_state';
import { request } from 'src/protos/request';
import { GarageDoorGraphicHitArea } from 'src/graphics/garageDoor/GarageDoorDrawAssistant';
import { usePslStore } from 'src/stores/psl-store';
export class GarageDoorData extends GraphicDataBase implements IGarageDoorData { export class GarageDoorData extends GraphicDataBase implements IGarageDoorData {
constructor(data?: graphicData.GarageDoor) { constructor(data?: graphicData.GarageDoor) {
@ -43,6 +57,12 @@ export class GarageDoorData extends GraphicDataBase implements IGarageDoorData {
set centralizedStations(v: number[]) { set centralizedStations(v: number[]) {
this.data.centralizedStations = v; this.data.centralizedStations = v;
} }
get refPslMapCode(): string {
return this.data.refPslMapCode;
}
set refPslMapCode(v: string) {
this.data.refPslMapCode = v;
}
clone(): GarageDoorData { clone(): GarageDoorData {
return new GarageDoorData(this.data.cloneMessage()); return new GarageDoorData(this.data.cloneMessage());
} }
@ -54,35 +74,138 @@ export class GarageDoorData extends GraphicDataBase implements IGarageDoorData {
} }
} }
export class GarageDoorState
extends GraphicStateBase
implements IGarageDoorState
{
constructor(proto?: state.CkmState) {
let states;
if (proto) {
states = proto;
} else {
states = new state.CkmState();
}
super(states, GarageDoor.Type);
}
get code(): string {
return this.states.id + '';
}
get id(): number {
return this.states.id;
}
set id(id: number) {
this.states.id = id;
}
get mgj() {
return this.states.mgj;
}
set mgj(v: boolean) {
this.states.mgj = v;
}
get param(): request.CkmParam {
return this.states.param;
}
set param(param: request.CkmParam) {
this.states.param = param;
}
get local(): boolean {
return this.states.local;
}
set local(v: boolean) {
this.states.local = v;
}
get mplj() {
return this.states.mplj;
}
set mplj(v: boolean) {
this.states.mplj = v;
}
get states(): state.CkmState {
return this.getState<state.CkmState>();
}
clone(): GarageDoorState {
return new GarageDoorState(this.states.cloneMessage());
}
copyFrom(data: GraphicStateBase): void {
pb_1.Message.copyInto(data._state, this._state);
}
eq(data: GraphicStateBase): boolean {
return pb_1.Message.equals(this._state, data._state);
}
}
const setCkmrParam: MenuItemOptions = { name: '设置参数' };
const ckmOperateMenu: ContextMenu = ContextMenu.init({
name: '车库门操作菜单',
groups: [
{
items: [setCkmrParam],
},
],
});
export class GarageDoorOperationInteraction extends GraphicInteractionPlugin<GarageDoor> { export class GarageDoorOperationInteraction extends GraphicInteractionPlugin<GarageDoor> {
static Name = 'garage_door_operation'; static Name = 'garage_door_operation';
constructor(scene: IGraphicScene) { constructor(app: IGraphicScene) {
super(GarageDoorOperationInteraction.Name, scene); super(GarageDoorOperationInteraction.Name, app);
app.registerMenu(ckmOperateMenu);
} }
static init(scene: IGraphicScene) { static init(app: IGraphicScene) {
return new GarageDoorOperationInteraction(scene); return new GarageDoorOperationInteraction(app);
} }
filter(...grahpics: JlGraphic[]): GarageDoor[] | undefined { filter(...grahpics: JlGraphic[]): GarageDoor[] | undefined {
return grahpics.filter((g): g is GarageDoor => g.type === GarageDoor.Type); return grahpics.filter((g): g is GarageDoor => g.type === GarageDoor.Type);
} }
bind(g: GarageDoor): void { bind(g: GarageDoor): void {
g.eventMode = 'static'; g.eventMode = 'static';
g.hitArea = new GarageDoorGraphicHitArea(g);
g.cursor = 'pointer'; g.cursor = 'pointer';
g.on('mousedown', this.onPress, this); g.selectable = true;
g.rectBody.eventMode = 'static';
g.rectBody.cursor = 'pointer';
g.rectBody.selectable = true;
g.on('_rightclick', this.onContextMenu);
g.rectBody.on('_leftclick', this.onLeftClick, this);
} }
unbind(g: GarageDoor): void { unbind(g: GarageDoor): void {
g.eventMode = 'none'; g.eventMode = 'none';
g.cursor = 'default'; g.cursor = 'default';
g.off('mousedown', this.onPress, this); g.selectable = false;
g.rectBody.eventMode = 'none';
g.rectBody.cursor = 'default';
g.rectBody.selectable = false;
g.off('_rightclick', this.onContextMenu);
g.rectBody.off('_leftclick', this.onLeftClick, this);
} }
onPress(e: FederatedMouseEvent) {
const g = e.target as GarageDoor; onContextMenu(e: FederatedMouseEvent) {
g.on('mouseleave', this.onRelease, this); const target = e.target as DisplayObject;
g.on('mouseup', this.onRelease, this); const garageDoor = target.getGraphic<GarageDoor>();
if (!garageDoor) return;
const lineStore = useLineStore();
setCkmrParam.handler = async () => {
if (lineStore.deviceOpreratDialogInstance) return;
lineStore.deviceOpreratDialogInstance = Dialog.create({
component: CkmOperation,
componentProps: {
id: garageDoor.id,
code: garageDoor.datas.code,
ckmForceProp: garageDoor.states.param.force,
ckmFaultProp: garageDoor.states.param.fault,
title: '车库门设置参数',
},
cancel: true,
persistent: true,
});
};
ckmOperateMenu.open(e.global);
} }
onRelease(e: FederatedMouseEvent) { onLeftClick(e: FederatedMouseEvent) {
const g = e.target as GarageDoor; const target = e.target as DisplayObject;
g.off('mouseleave', this.onRelease, this); const garageDoor = target.getGraphic() as GarageDoor;
g.off('mouseup', this.onRelease, this); usePslStore().setPslParam(
garageDoor.datas.id,
garageDoor.datas.refPslMapCode
);
} }
} }

View File

@ -0,0 +1,107 @@
import * as pb_1 from 'google-protobuf';
import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { IHoldButtonData, HoldButton } from 'src/graphics/holdButton/HoldButton';
import {
IGraphicApp,
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase';
import { useIbpStore } from 'src/stores/ibp-store';
import { Station } from 'src/graphics/station/Station';
import { Platform } from 'src/graphics/platform/Platform';
export class HoldButtonData extends GraphicDataBase implements IHoldButtonData {
constructor(data?: graphicData.HoldButton) {
let holdButton;
if (!data) {
holdButton = new graphicData.HoldButton({
common: GraphicDataBase.defaultCommonInfo(HoldButton.Type),
});
} else {
holdButton = data;
}
super(holdButton);
}
public get data(): graphicData.HoldButton {
return this.getData<graphicData.HoldButton>();
}
get code(): string {
return this.data.code;
}
set code(v: string) {
this.data.code = v;
}
get flip(): boolean {
return this.data.flip;
}
set flip(v: boolean) {
this.data.flip = v;
}
get refStand(): number {
return this.data.refStand;
}
set refStand(v: number) {
this.data.refStand = v;
}
clone(): HoldButtonData {
return new HoldButtonData(this.data.cloneMessage());
}
copyFrom(data: HoldButtonData): void {
pb_1.Message.copyInto(data.data, this.data);
}
eq(other: HoldButtonData): boolean {
return pb_1.Message.equals(this.data, other.data);
}
}
const flipConfig: MenuItemOptions = {
name: '上下翻转',
};
const HoldButtonEditMenu: ContextMenu = ContextMenu.init({
name: '扣车按钮编辑菜单',
groups: [
{
items: [flipConfig],
},
],
});
export class DrawHoldButtonInteraction extends GraphicInteractionPlugin<HoldButton> {
static Name = 'hold_button_draw_right_menu';
constructor(app: IGraphicApp) {
super(DrawHoldButtonInteraction.Name, app);
app.registerMenu(HoldButtonEditMenu);
}
static init(app: IGraphicApp) {
return new DrawHoldButtonInteraction(app);
}
filter(...grahpics: JlGraphic[]): HoldButton[] | undefined {
return grahpics
.filter((g) => g.type === HoldButton.Type)
.map((g) => g as HoldButton);
}
bind(g: HoldButton): void {
g.on('_rightclick', this.onContextMenu, this);
}
unbind(g: HoldButton): void {
g.off('_rightclick', this.onContextMenu, this);
}
onContextMenu(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const holdButton = target.getGraphic() as HoldButton;
this.app.updateSelected(holdButton);
flipConfig.handler = () => {
holdButton.datas.flip = !holdButton.datas.flip;
holdButton.repaint();
};
HoldButtonEditMenu.open(e.global);
}
}

View File

@ -81,6 +81,12 @@ export class PslButtonState
set down(v: boolean) { set down(v: boolean) {
this.states.down = v; this.states.down = v;
} }
get active(): boolean {
return this.states.active;
}
set active(v: boolean) {
this.states.active = v;
}
get states(): state.ButtonState { get states(): state.ButtonState {
return this.getState<state.ButtonState>(); return this.getState<state.ButtonState>();
} }

View File

@ -53,12 +53,12 @@ export class SpksSwitchData extends GraphicDataBase implements ISpksSwitchData {
set refStand(v: number) { set refStand(v: number) {
this.data.refStand = v; this.data.refStand = v;
} }
get refSections(): number[] { // get refSections(): number[] {
return this.data.refSections; // return this.data.refSections;
} // }
set refSections(v: number[]) { // set refSections(v: number[]) {
this.data.refSections = v; // this.data.refSections = v;
} // }
clone(): SpksSwitchData { clone(): SpksSwitchData {
return new SpksSwitchData(this.data.cloneMessage()); return new SpksSwitchData(this.data.cloneMessage());
} }
@ -114,36 +114,3 @@ export class DrawSpksSwitchInteraction extends GraphicInteractionPlugin<SpksSwit
SpksSwitchEditMenu.open(e.global); SpksSwitchEditMenu.open(e.global);
} }
} }
export class SpksSwitchOperationInteraction extends GraphicInteractionPlugin<SpksSwitch> {
static Name = 'spks_switch_operation';
constructor(app: IGraphicScene) {
super(SpksSwitchOperationInteraction.Name, app);
}
static init(app: IGraphicScene) {
return new SpksSwitchOperationInteraction(app);
}
filter(...grahpics: JlGraphic[]): SpksSwitch[] | undefined {
return grahpics.filter((g): g is SpksSwitch => g instanceof SpksSwitch);
}
bind(g: SpksSwitch): void {
g.eventMode = 'static';
g.cursor = 'pointer';
g.on('_leftclick', this.onLeftClick, this);
}
unbind(g: SpksSwitch): void {
g.off('_leftclick', this.onLeftClick, this);
}
onLeftClick(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const spksSwitch = target.getGraphic() as SpksSwitch;
const stand = this.app.queryStore.queryById<Platform>(
spksSwitch.datas.refStand
);
const station = this.app.queryStore.queryById<Station>(
stand.datas.refStation
);
useIbpStore().openIbpScene(station);
}
}

View File

@ -11,6 +11,9 @@ import {
ITccButtonState, ITccButtonState,
TccButton, TccButton,
} from 'src/graphics/tccButton/TccButton'; } from 'src/graphics/tccButton/TccButton';
import { tccOperation } from 'src/api/Simulation';
import { errorNotify } from 'src/utils/CommonNotify';
import { request } from 'src/protos/request';
export class TccButtonData extends GraphicDataBase implements ITccButtonData { export class TccButtonData extends GraphicDataBase implements ITccButtonData {
constructor(data?: tccGraphicData.TccButton) { constructor(data?: tccGraphicData.TccButton) {
@ -55,12 +58,12 @@ export class TccButtonState
extends GraphicStateBase extends GraphicStateBase
implements ITccButtonState implements ITccButtonState
{ {
constructor(proto?: state.TrainControlState.EmergentButton) { constructor(proto?: state.TrainControlState.ControlButton) {
let states; let states;
if (proto) { if (proto) {
states = proto; states = proto;
} else { } else {
states = new state.TrainControlState.EmergentButton(); states = new state.TrainControlState.ControlButton();
} }
super(states, TccButton.Type); super(states, TccButton.Type);
} }
@ -73,8 +76,8 @@ export class TccButtonState
set down(v: boolean) { set down(v: boolean) {
this.states.passed = v; this.states.passed = v;
} }
get states(): state.TrainControlState.EmergentButton { get states(): state.TrainControlState.ControlButton {
return this.getState<state.TrainControlState.EmergentButton>(); return this.getState<state.TrainControlState.ControlButton>();
} }
clone(): TccButtonState { clone(): TccButtonState {
return new TccButtonState(this.states.cloneMessage()); return new TccButtonState(this.states.cloneMessage());
@ -112,11 +115,21 @@ export class TccButtonOperateInteraction extends GraphicInteractionPlugin<TccBut
} }
onClick(e: FederatedMouseEvent): void { onClick(e: FederatedMouseEvent): void {
const simulationId = useLineStore().simulationId;
const tccId = useTccStore().tccId;
const target = e.target as DisplayObject; const target = e.target as DisplayObject;
const tccButton = target.getGraphic<TccButton>(); const tccButton = target.getGraphic<TccButton>();
if (!tccButton) return; if (!tccButton || !simulationId) return;
tccButton.states.down = !tccButton.states.down; tccOperation({
tccButton.doRepaint(); simulationId,
console.log(tccButton.states.down); trainId: tccId + '',
deviceId: tccButton.id,
controlType: request.TrainControl.TrainControlType.EMERGENT_BUTTON,
controlButton: {
active: !tccButton.states.down,
},
}).catch((err) => {
errorNotify('操作失败', { message: err.origin.response.data.title });
});
} }
} }

View File

@ -3,6 +3,8 @@ import {
ITccHandleData, ITccHandleData,
ITccHandleState, ITccHandleState,
TccHandle, TccHandle,
tccHandleHeight,
zeroOffset,
} from 'src/graphics/tccHandle/TccHandle'; } from 'src/graphics/tccHandle/TccHandle';
import { tccGraphicData } from 'src/protos/tccGraphics'; import { tccGraphicData } from 'src/protos/tccGraphics';
import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
@ -86,6 +88,7 @@ export class TccHandleInteraction extends GraphicInteractionPlugin<TccHandle> {
isMouseDown = false; isMouseDown = false;
mouseDownBeginPos = 0; mouseDownBeginPos = 0;
mouseDownTccHandleBeginPos = 0; mouseDownTccHandleBeginPos = 0;
timeout: string | number | NodeJS.Timeout | undefined;
constructor(app: IGraphicScene) { constructor(app: IGraphicScene) {
super(TccHandleInteraction.Name, app); super(TccHandleInteraction.Name, app);
} }
@ -99,29 +102,32 @@ export class TccHandleInteraction extends GraphicInteractionPlugin<TccHandle> {
g._tccHandle.eventMode = 'static'; g._tccHandle.eventMode = 'static';
g._tccHandle.cursor = 'Move'; g._tccHandle.cursor = 'Move';
g._tccHandle.onmousedown = (e) => { g._tccHandle.onmousedown = (e) => {
e.stopPropagation();
this.onMouseDown(e); this.onMouseDown(e);
}; };
g._tccHandle.onmouseup = () => { g._tccHandle.onmouseup = (e) => {
this.isMouseDown = false; e.stopPropagation();
this.onMouseUp(e);
}; };
g.onmousemove = (e) => { g.onmousemove = (e) => {
e.stopPropagation();
this.onMouseMove(e); this.onMouseMove(e);
}; };
g.onmouseleave = () => {
this.isMouseDown = false;
};
} }
unbind(g: TccHandle): void { unbind(g: TccHandle): void {
g._tccHandle.eventMode = 'none'; g._tccHandle.eventMode = 'none';
g._tccHandle.onmousedown = null; g._tccHandle.onmousedown = null;
g._tccHandle.onmouseup = null; g._tccHandle.onmouseup = null;
g.onmousemove = null; g.onmousemove = null;
g.onmouseleave = null; clearTimeout(this.timeout);
} }
onMouseDown(e: FederatedMouseEvent) { onMouseDown(e: FederatedMouseEvent) {
const target = e.target as DisplayObject; const target = e.target as DisplayObject;
const tccHandle = target.getGraphic<TccHandle>(); const tccHandle = target.getGraphic<TccHandle>();
if (!tccHandle) return; if (!tccHandle) return;
tccHandle.canDoRepaint = false;
useTccStore().tccHandleId = tccHandle.id;
useTccStore().mouseDownOnTccHandle = true;
this.isMouseDown = true; this.isMouseDown = true;
this.mouseDownBeginPos = e.clientY; this.mouseDownBeginPos = e.clientY;
this.mouseDownTccHandleBeginPos = tccHandle._tccHandle.y; this.mouseDownTccHandleBeginPos = tccHandle._tccHandle.y;
@ -132,16 +138,47 @@ export class TccHandleInteraction extends GraphicInteractionPlugin<TccHandle> {
if (!tccHandle) return; if (!tccHandle) return;
if ( if (
this.isMouseDown && this.isMouseDown &&
tccHandle._tccHandle.y > -145 && useTccStore().canvasMouseDown &&
tccHandle._tccHandle.y < 145 tccHandle._tccHandle.y > -tccHandleHeight - 1 &&
tccHandle._tccHandle.y < tccHandleHeight + 1
) { ) {
tccHandle._tccHandle.y = tccHandle._tccHandle.y =
this.mouseDownTccHandleBeginPos + e.clientY - this.mouseDownBeginPos; this.mouseDownTccHandleBeginPos + e.clientY - this.mouseDownBeginPos;
if (tccHandle._tccHandle.y >= 145) { if (tccHandle._tccHandle.y >= tccHandleHeight + 1) {
tccHandle._tccHandle.y = 144; tccHandle._tccHandle.y = tccHandleHeight;
} else if (tccHandle._tccHandle.y <= -145) { } else if (tccHandle._tccHandle.y <= -tccHandleHeight - 1) {
tccHandle._tccHandle.y = -144; tccHandle._tccHandle.y = -tccHandleHeight;
}
let transFormHandleVal = 0;
if (
tccHandle._tccHandle.y >= -zeroOffset &&
tccHandle._tccHandle.y <= zeroOffset
) {
tccHandle._tccHandle.y = 0;
} else if (tccHandle._tccHandle.y < -zeroOffset) {
transFormHandleVal = tccHandle._tccHandle.y + zeroOffset;
} else {
transFormHandleVal = tccHandle._tccHandle.y - zeroOffset;
}
tccHandle._stateVal = Number(
(-(transFormHandleVal / (tccHandleHeight - zeroOffset)) * 100).toFixed()
);
tccHandle.labelGraphic.text = Math.abs(tccHandle._stateVal) + '%';
tccHandle.labelGraphic.y = tccHandle._tccHandle.y;
if (this.timeout == undefined) {
this.timeout = setTimeout(() => {
useTccStore().onMouseUpFromTccHandle();
this.timeout = undefined;
}, 100);
} }
} }
} }
onMouseUp(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const tccHandle = target.getGraphic<TccHandle>();
if (!tccHandle) return;
tccHandle.canDoRepaint = true;
this.isMouseDown = false;
useTccStore().mouseDownOnTccHandle = false;
}
} }

View File

@ -4,8 +4,17 @@ import { tccGraphicData } from 'src/protos/tccGraphics';
import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase'; import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { state } from 'src/protos/device_state'; import { state } from 'src/protos/device_state';
import { GraphicInteractionPlugin, IGraphicScene, JlGraphic } from 'jl-graphic'; import { GraphicInteractionPlugin, IGraphicScene, JlGraphic } from 'jl-graphic';
import { type FederatedMouseEvent, DisplayObject, Point } from 'pixi.js'; import {
type FederatedMouseEvent,
DisplayObject,
Point,
Sprite,
} from 'pixi.js';
import { useTccStore } from 'src/stores/tcc-store'; import { useTccStore } from 'src/stores/tcc-store';
import { useLineStore } from 'src/stores/line-store';
import { tccOperation } from 'src/api/Simulation';
import { errorNotify } from 'src/utils/CommonNotify';
import { request } from 'src/protos/request';
export class TccKeyData extends GraphicDataBase implements ITccKeyData { export class TccKeyData extends GraphicDataBase implements ITccKeyData {
constructor(data?: tccGraphicData.TccKey) { constructor(data?: tccGraphicData.TccKey) {
@ -48,20 +57,20 @@ export class TccKeyData extends GraphicDataBase implements ITccKeyData {
} }
export class TccKeyState extends GraphicStateBase implements ITccKeyState { export class TccKeyState extends GraphicStateBase implements ITccKeyState {
constructor(data?: state.TrainControlState.DirectionKeySwitch) { constructor(data?: state.TrainControlState.SwitchKeyChange) {
let tccKeyState; let tccKeyState;
if (data) { if (data) {
tccKeyState = data; tccKeyState = data;
} else { } else {
tccKeyState = new state.TrainControlState.DirectionKeySwitch(); tccKeyState = new state.TrainControlState.SwitchKeyChange();
} }
super(tccKeyState, TccKey.Type); super(tccKeyState, TccKey.Type);
} }
get code(): string { get code(): string {
return this.states.id + ''; return this.states.id + '';
} }
get states(): state.TrainControlState.DirectionKeySwitch { get states(): state.TrainControlState.SwitchKeyChange {
return this.getState<state.TrainControlState.DirectionKeySwitch>(); return this.getState<state.TrainControlState.SwitchKeyChange>();
} }
get position(): number { get position(): number {
return this.states.val; return this.states.val;
@ -80,13 +89,148 @@ export class TccKeyState extends GraphicStateBase implements ITccKeyState {
} }
} }
export class TccKeyInteraction extends GraphicInteractionPlugin<TccKey> { export enum KeyRotationMethod {
static Name = 'TccKeyInteraction'; jumpChange,
gradientChange,
}
export interface IKeyInteractionConfig {
gearPositionAmount?: number;
keyRotationMethod: KeyRotationMethod;
doAfterChangeRotation: () => void;
}
export abstract class KeyInteraction<
G extends JlGraphic
> extends GraphicInteractionPlugin<G> {
isMouseDown = false; isMouseDown = false;
changeOnce = false; ratatingSprite: Sprite = new Sprite();
mouseDownBeginPos = new Point(); mouseDownBeginPos = new Point();
mouseDownBeginRotation = 0;
changeRotation = 0;
keyInteractionConfig: IKeyInteractionConfig;
constructor(
name: string,
app: IGraphicScene,
keyInteractionConfig: IKeyInteractionConfig
) {
super(name, app);
this.keyInteractionConfig = keyInteractionConfig;
}
totalBind(g: G): void {
g.onmousemove = (e) => {
this.onMousemove(e);
};
g.onmouseup = (e) => {
e.stopPropagation();
this.isMouseDown = false;
this.keyInteractionConfig.doAfterChangeRotation();
};
g.onmousedown = () => {
useTccStore().tccKeyDirId = g.id;
useTccStore().mouseDownOnTccKeyDir = true;
};
}
totalUnbind(g: G): void {
g.onmousemove = null;
g.onmouseup = null;
g.onmousedown = null;
}
keyBind(g: Sprite): void {
this.ratatingSprite = g;
g.eventMode = 'static';
g.cursor = 'pointer';
g.onmousedown = (e) => {
this.onMouseDown(e);
};
}
keyUnbind(g: Sprite): void {
g.eventMode = 'none';
g.onmousedown = null;
}
onMouseDown(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const g = target.getGraphic<TccKey>();
if (!g) return;
this.isMouseDown = true;
this.ratatingSprite = g._tccKey;
this.mouseDownBeginPos = this.app.toCanvasCoordinates(e.global);
this.mouseDownBeginRotation = this.ratatingSprite.rotation;
this.changeRotation = this.mouseDownBeginRotation;
useTccStore().tccKeyLastRotation = this.ratatingSprite.rotation;
}
onMousemove(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const g = target.getGraphic<G>();
if (!g) return;
if (this.isMouseDown && useTccStore().canvasMouseDown) {
const mouseEndPos = this.app.toCanvasCoordinates(e.global);
const { angle, direction } = calculateAngleAndDirection(
this.mouseDownBeginPos,
g.position,
mouseEndPos
);
if (
this.keyInteractionConfig.keyRotationMethod ==
KeyRotationMethod.jumpChange
) {
if (direction == 'ssz') {
if (angle < 45) {
this.changeRotation = this.mouseDownBeginRotation;
} else if (
angle >= 45 &&
angle < 90 &&
this.mouseDownBeginRotation !== Math.PI / 4
) {
this.changeRotation = this.mouseDownBeginRotation + Math.PI / 4;
} else if (
angle >= 90 &&
this.mouseDownBeginRotation == -Math.PI / 4
) {
this.changeRotation = this.mouseDownBeginRotation + Math.PI / 2;
}
}
if (direction == 'nsz') {
if (angle < 45) {
this.changeRotation = this.mouseDownBeginRotation;
} else if (
angle >= 45 &&
angle < 90 &&
this.mouseDownBeginRotation !== -Math.PI / 4
) {
this.changeRotation = this.mouseDownBeginRotation - Math.PI / 4;
} else if (
angle >= 90 &&
this.mouseDownBeginRotation == Math.PI / 4
) {
this.changeRotation = this.mouseDownBeginRotation - Math.PI / 2;
}
}
if (this.ratatingSprite.rotation !== this.changeRotation) {
this.ratatingSprite.rotation = this.changeRotation;
useTccStore().onMouseUpFromTccKeyDir();
}
} else {
if (direction == 'ssz') {
this.ratatingSprite.rotation =
this.mouseDownBeginRotation + (angle / 180) * Math.PI;
} else {
this.ratatingSprite.rotation =
this.mouseDownBeginRotation - (angle / 180) * Math.PI;
}
}
}
}
}
export class TccKeyInteraction extends KeyInteraction<TccKey> {
static Name = 'TccKeyInteraction';
constructor(app: IGraphicScene) { constructor(app: IGraphicScene) {
super(TccKeyInteraction.Name, app); super(TccKeyInteraction.Name, app, {
gearPositionAmount: 3,
keyRotationMethod: KeyRotationMethod.jumpChange,
doAfterChangeRotation: () => {
this.changeState();
},
});
} }
static init(app: IGraphicScene) { static init(app: IGraphicScene) {
return new TccKeyInteraction(app); return new TccKeyInteraction(app);
@ -103,20 +247,8 @@ export class TccKeyInteraction extends GraphicInteractionPlugin<TccKey> {
) { ) {
g._tccKey.on('_leftclick', this.onClick); g._tccKey.on('_leftclick', this.onClick);
} else { } else {
g._tccKey.onmousedown = (e) => { super.totalBind(g);
this.onMouseDown(e); super.keyBind(g._tccKey);
};
g._tccKey.onmouseup = () => {
this.isMouseDown = false;
this.changeOnce = false;
};
g.onmousemove = (e) => {
this.onMousemove(e);
};
g.onmouseleave = () => {
this.isMouseDown = false;
this.changeOnce = false;
};
} }
} }
unbind(g: TccKey): void { unbind(g: TccKey): void {
@ -127,61 +259,32 @@ export class TccKeyInteraction extends GraphicInteractionPlugin<TccKey> {
) { ) {
g._tccKey.off('_leftclick', this.onClick); g._tccKey.off('_leftclick', this.onClick);
} else { } else {
g._tccKey.onmousedown = null; super.totalUnbind(g);
g._tccKey.onmouseup = null; super.keyUnbind(g._tccKey);
g.onmousemove = null;
g.onmouseleave = null;
} }
} }
onClick(e: FederatedMouseEvent): void { onClick(e: FederatedMouseEvent): void {
const simulationId = useLineStore().simulationId;
const mapId = useLineStore().mapId;
const tccId = useTccStore().tccId;
const target = e.target as DisplayObject; const target = e.target as DisplayObject;
const tccKey = target.getGraphic<TccKey>(); const tccKey = target.getGraphic<TccKey>();
if (!tccKey) return; if (!tccKey || !simulationId || !mapId) return;
tccKey.state.position = tccKey?.state.position == 0 ? 1 : 0; const state = tccKey?.state.position == 0 ? true : false;
tccKey.doRepaint(); tccOperation({
} simulationId,
onMouseDown(e: FederatedMouseEvent) { trainId: tccId + '',
const target = e.target as DisplayObject; deviceId: tccKey.id,
const tccKey = target.getGraphic<TccKey>(); controlType: request.TrainControl.TrainControlType.DRIVER_KEY_SWITCH,
if (!tccKey) return; driverKey: {
this.isMouseDown = true; val: state,
this.mouseDownBeginPos = tccKey },
.getGraphicApp() }).catch((err) => {
.getScene('tcc') errorNotify('操作失败', { message: err.origin.response.data.title });
.toCanvasCoordinates(e.global); });
}
onMousemove(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const tccKey = target.getGraphic<TccKey>();
if (!tccKey) return;
if (this.isMouseDown) {
const mouseEndPos = tccKey
.getGraphicApp()
.getScene('tcc')
.toCanvasCoordinates(e.global);
const { angle, direction } = calculateAngleAndDirection(
this.mouseDownBeginPos,
tccKey.position,
mouseEndPos
);
if (
direction == 'ssz' &&
((angle > 45 && !this.changeOnce) || (angle > 90 && this.changeOnce)) &&
(tccKey._tccKey.rotation == -Math.PI / 4 ||
tccKey._tccKey.rotation == 0)
) {
this.changeOnce = true;
tccKey._tccKey.rotation += Math.PI / 4;
}
if (
direction == 'nsz' &&
((angle > 45 && !this.changeOnce) || (angle > 90 && this.changeOnce)) &&
(tccKey._tccKey.rotation == Math.PI / 4 || tccKey._tccKey.rotation == 0)
) {
this.changeOnce = true;
tccKey._tccKey.rotation -= Math.PI / 4;
}
} }
changeState() {
useTccStore().mouseDownOnTccKeyDir = false;
} }
} }

View File

@ -0,0 +1,94 @@
import * as pb_1 from 'google-protobuf';
import {
ItccLightData,
ItccLightState,
TccLight,
} from 'src/graphics/tccLight/TccLight';
import { tccGraphicData } from 'src/protos/tccGraphics';
import { GraphicDataBase, GraphicStateBase } from './GraphicDataBase';
import { state } from 'src/protos/device_state';
export class TccLightData extends GraphicDataBase implements ItccLightData {
constructor(data?: tccGraphicData.TccLight) {
let tccLight;
if (data) {
tccLight = data;
} else {
tccLight = new tccGraphicData.TccLight({
common: GraphicDataBase.defaultCommonInfo(TccLight.Type),
});
}
super(tccLight);
}
public get data(): tccGraphicData.TccLight {
return this.getData<tccGraphicData.TccLight>();
}
get code(): string {
return this.data.code;
}
set code(v: string) {
this.data.code = v;
}
get lightColor(): tccGraphicData.TccElementColor {
return this.data.lightColor;
}
set lightColor(v: tccGraphicData.TccElementColor) {
this.data.lightColor = v;
}
get activeLevel(): boolean {
return this.data.activeLevel;
}
set activeLevel(v: boolean) {
this.data.activeLevel = v;
}
get initialState(): boolean {
return this.data.initialState;
}
set initialState(v: boolean) {
this.data.initialState = v;
}
clone(): TccLightData {
return new TccLightData(this.data.cloneMessage());
}
copyFrom(data: TccLightData): void {
pb_1.Message.copyInto(data.data, this.data);
}
eq(other: TccLightData): boolean {
return pb_1.Message.equals(this.data, other.data);
}
}
export class TccLightState extends GraphicStateBase implements ItccLightState {
constructor(proto?: state.TrainControlState.ControlLight) {
let states;
if (proto) {
states = proto;
} else {
states = new state.TrainControlState.ControlLight();
}
super(states, TccLight.Type);
}
get code(): string {
return this.states.id + '';
}
get active(): boolean {
return this.states.val;
}
set active(v: boolean) {
this.states.val = v;
}
get states(): state.TrainControlState.ControlLight {
return this.getState<state.TrainControlState.ControlLight>();
}
clone(): TccLightState {
return new TccLightState(this.states.cloneMessage());
}
copyFrom(data: GraphicStateBase): void {
pb_1.Message.copyInto(data._state, this._state);
}
eq(data: GraphicStateBase): boolean {
return pb_1.Message.equals(this._state, data._state);
}
}

View File

@ -10,12 +10,13 @@ import {
ContextMenu, ContextMenu,
} from 'jl-graphic'; } from 'jl-graphic';
import { DisplayObject, FederatedMouseEvent } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { removeTrain } from 'src/api/Simulation'; import { removeTrain, cancelTrainConn } from 'src/api/Simulation';
import { useLineStore } from 'src/stores/line-store'; import { useLineStore } from 'src/stores/line-store';
import { successNotify, errorNotify } from '../../utils/CommonNotify'; import { successNotify, errorNotify } from '../../utils/CommonNotify';
import { Dialog } from 'quasar'; import { Dialog } from 'quasar';
import SetTrainParam from 'src/components/draw-app/dialogs/SetTrainParam.vue'; import SetTrainParam from 'src/components/draw-app/dialogs/SetTrainParam.vue';
import SetTrainLink from 'src/components/draw-app/dialogs/SetTrainLink.vue'; import SetTrainLink from 'src/components/draw-app/dialogs/SetTrainLink.vue';
import { useTccStore } from 'src/stores/tcc-store';
export class TrainState extends GraphicStateBase implements ITrainState { export class TrainState extends GraphicStateBase implements ITrainState {
constructor(proto?: state.TrainMapState) { constructor(proto?: state.TrainMapState) {
let states; let states;
@ -77,23 +78,23 @@ export class TrainState extends GraphicStateBase implements ITrainState {
set devicePort(v: string) { set devicePort(v: string) {
this.states.devicePort = v; this.states.devicePort = v;
} }
get pointTo(): boolean { get driftTo(): boolean {
return this.states.pointTo; return this.states.driftTo;
} }
set pointTo(v: boolean) { set driftTo(v: boolean) {
this.states.pointTo = v; this.states.driftTo = v;
} }
get runDirection(): boolean { get trainRunUp(): boolean {
return this.states.runDirection; return this.states.trainRunUp;
} }
set runDirection(v: boolean) { set trainRunUp(v: boolean) {
this.states.runDirection = v; this.states.trainRunUp = v;
} }
get headDirection(): boolean { get trainActiveDirection(): number {
return this.states.headDirection; return this.states.trainActiveDirection;
} }
set headDirection(v: boolean) { set trainActiveDirection(v: number) {
this.states.headDirection = v; this.states.trainActiveDirection = v;
} }
get trainKilometer(): number { get trainKilometer(): number {
return this.states.trainKilometer; return this.states.trainKilometer;
@ -673,6 +674,12 @@ export class TrainState extends GraphicStateBase implements ITrainState {
set connType(v: state.TrainConnState.TrainConnType) { set connType(v: state.TrainConnState.TrainConnType) {
this.states.connState.connType = v; this.states.connState.connType = v;
} }
get typeName(): string {
return this.states.connState.typeName;
}
set typeName(v: string) {
this.states.connState.typeName = v;
}
get trainControlMapId(): number { get trainControlMapId(): number {
return this.states.connState.TrainControlMapId; return this.states.connState.TrainControlMapId;
} }
@ -696,14 +703,26 @@ const TrainParam: MenuItemOptions = {
const TrainLink: MenuItemOptions = { const TrainLink: MenuItemOptions = {
name: '列车连接', name: '列车连接',
}; };
const CancelLink: MenuItemOptions = {
name: '取消连接',
};
const removeTrainConfig: MenuItemOptions = { const removeTrainConfig: MenuItemOptions = {
name: '清除列车', name: '清除列车',
}; };
const DrivingCabConfig: MenuItemOptions = {
name: '列车驾驶台',
};
const TrainOperateMenu: ContextMenu = ContextMenu.init({ const TrainOperateMenu: ContextMenu = ContextMenu.init({
name: '列车操作菜单', name: '列车操作菜单',
groups: [ groups: [
{ {
items: [TrainParam, TrainLink, removeTrainConfig], items: [
TrainParam,
TrainLink,
CancelLink,
DrivingCabConfig,
removeTrainConfig,
],
}, },
], ],
}); });
@ -771,6 +790,24 @@ export class TrainOperateInteraction extends GraphicInteractionPlugin<Train> {
persistent: true, persistent: true,
}); });
}; };
CancelLink.handler = () => {
Dialog.create({
title: '确认',
message: `确认取消【${train.states.id}】列车的连接吗?`,
cancel: true,
}).onOk(async () => {
cancelTrainConn({
id: simulationId,
trainId: train.code,
})
.then(() => {
successNotify('列车取消连接成功!');
})
.catch((err) => {
errorNotify('列车取消连接失败!', err);
});
});
};
removeTrainConfig.handler = () => { removeTrainConfig.handler = () => {
Dialog.create({ Dialog.create({
title: '确认', title: '确认',
@ -790,6 +827,12 @@ export class TrainOperateInteraction extends GraphicInteractionPlugin<Train> {
}); });
}); });
}; };
DrivingCabConfig.handler = () => {
useTccStore().setTccParam(
parseInt(train.states.id),
train.states.trainControlMapId
);
};
TrainOperateMenu.open(e.global); TrainOperateMenu.open(e.global);
} }

View File

@ -24,14 +24,15 @@ import {
resetMessageTransponder, resetMessageTransponder,
resetPositionTransponder, resetPositionTransponder,
stopTransponderTelegram, stopTransponderTelegram,
sendTransponderTelegram sendTransponderTelegram,
} from 'src/api/Simulation'; } from 'src/api/Simulation';
import { errorNotify } from 'src/utils/CommonNotify'; import { errorNotify } from 'src/utils/CommonNotify';
import { state } from 'src/protos/device_state'; import { state } from 'src/protos/device_state';
export class TransponderData export class TransponderData
extends GraphicDataBase extends GraphicDataBase
implements ITransponderData { implements ITransponderData
{
constructor(data?: graphicData.Transponder) { constructor(data?: graphicData.Transponder) {
let transponder; let transponder;
if (!data) { if (!data) {
@ -92,6 +93,24 @@ export class TransponderData
set type(v: TransponderTypeEnum) { set type(v: TransponderTypeEnum) {
this.data.type = v; this.data.type = v;
} }
get originalCode(): string {
return this.data.originalCode;
}
set originalCode(v: string) {
this.data.originalCode = v;
}
get leuIndex(): number {
return this.data.leuIndex;
}
set leuIndex(v: number) {
this.data.leuIndex = v;
}
get leuInsideIndex(): number {
return this.data.leuInsideIndex;
}
set leuInsideIndex(v: number) {
this.data.leuInsideIndex = v;
}
clone(): TransponderData { clone(): TransponderData {
return new TransponderData(this.data.cloneMessage()); return new TransponderData(this.data.cloneMessage());
} }
@ -127,7 +146,8 @@ const TransponderOperationMenu: ContextMenu = ContextMenu.init({
export class TransponderState export class TransponderState
extends GraphicStateBase extends GraphicStateBase
implements ITransponderState { implements ITransponderState
{
constructor(proto?: state.BaliseState) { constructor(proto?: state.BaliseState) {
let states; let states;
if (proto) { if (proto) {

View File

@ -0,0 +1,107 @@
import * as pb_1 from 'google-protobuf';
import { DisplayObject, FederatedMouseEvent } from 'pixi.js';
import { IUnattengedButtonData, UnattengedButton } from 'src/graphics/unattengedButton/UnattengedButton';
import {
IGraphicApp,
GraphicInteractionPlugin,
JlGraphic,
IGraphicScene,
MenuItemOptions,
ContextMenu,
} from 'jl-graphic';
import { graphicData } from 'src/protos/stationLayoutGraphics';
import { GraphicDataBase } from './GraphicDataBase';
import { useIbpStore } from 'src/stores/ibp-store';
import { Station } from 'src/graphics/station/Station';
import { Platform } from 'src/graphics/platform/Platform';
export class UnattengedButtonData extends GraphicDataBase implements IUnattengedButtonData {
constructor(data?: graphicData.UnattengedButton) {
let unattengedButton;
if (!data) {
unattengedButton = new graphicData.UnattengedButton({
common: GraphicDataBase.defaultCommonInfo(UnattengedButton.Type),
});
} else {
unattengedButton = data;
}
super(unattengedButton);
}
public get data(): graphicData.UnattengedButton {
return this.getData<graphicData.UnattengedButton>();
}
get code(): string {
return this.data.code;
}
set code(v: string) {
this.data.code = v;
}
get flip(): boolean {
return this.data.flip;
}
set flip(v: boolean) {
this.data.flip = v;
}
get refStand(): number {
return this.data.refStand;
}
set refStand(v: number) {
this.data.refStand = v;
}
clone(): UnattengedButtonData {
return new UnattengedButtonData(this.data.cloneMessage());
}
copyFrom(data: UnattengedButtonData): void {
pb_1.Message.copyInto(data.data, this.data);
}
eq(other: UnattengedButtonData): boolean {
return pb_1.Message.equals(this.data, other.data);
}
}
const flipConfig: MenuItemOptions = {
name: '上下翻转',
};
const UnattengedButtonEditMenu: ContextMenu = ContextMenu.init({
name: '无人折返按钮编辑菜单',
groups: [
{
items: [flipConfig],
},
],
});
export class DrawUnattengedButtonInteraction extends GraphicInteractionPlugin<UnattengedButton> {
static Name = 'unattenged_button_draw_right_menu';
constructor(app: IGraphicApp) {
super(DrawUnattengedButtonInteraction.Name, app);
app.registerMenu(UnattengedButtonEditMenu);
}
static init(app: IGraphicApp) {
return new DrawUnattengedButtonInteraction(app);
}
filter(...grahpics: JlGraphic[]): UnattengedButton[] | undefined {
return grahpics
.filter((g) => g.type === UnattengedButton.Type)
.map((g) => g as UnattengedButton);
}
bind(g: UnattengedButton): void {
g.on('_rightclick', this.onContextMenu, this);
}
unbind(g: UnattengedButton): void {
g.off('_rightclick', this.onContextMenu, this);
}
onContextMenu(e: FederatedMouseEvent) {
const target = e.target as DisplayObject;
const unattengedButton = target.getGraphic() as UnattengedButton;
this.app.updateSelected(unattengedButton);
flipConfig.handler = () => {
unattengedButton.datas.flip = !unattengedButton.datas.flip;
unattengedButton.repaint();
};
UnattengedButtonEditMenu.open(e.global);
}
}

View File

@ -16,7 +16,7 @@ import {
AxleCountingSectionTemplate, AxleCountingSectionTemplate,
} from 'src/graphics/axleCountingSection/AxleCountingSection'; } from 'src/graphics/axleCountingSection/AxleCountingSection';
import { AxleCountingSectionDraw } from 'src/graphics/axleCountingSection/AxleCountingSectionAssistant'; import { AxleCountingSectionDraw } from 'src/graphics/axleCountingSection/AxleCountingSectionAssistant';
import { AxleCountingSectionData } from './graphics/AxleCountingSectionInteraction'; import { AxleCountingSectionData, AxleCountingSectionStates } from './graphics/AxleCountingSectionInteraction';
import { import {
SectionLink, SectionLink,
SectionLinkTemplate, SectionLinkTemplate,
@ -104,7 +104,7 @@ export function initJkDrawApp(): IDrawApp {
new SectionLinkDraw(app, new SectionLinkTemplate(new SectionLinkData())); new SectionLinkDraw(app, new SectionLinkTemplate(new SectionLinkData()));
new AxleCountingSectionDraw( new AxleCountingSectionDraw(
app, app,
new AxleCountingSectionTemplate(new AxleCountingSectionData()) new AxleCountingSectionTemplate(new AxleCountingSectionData(), new AxleCountingSectionStates())
); );
new EsbButtonDraw( new EsbButtonDraw(
app, app,

View File

@ -21,13 +21,9 @@ import {
Signal, Signal,
KilometerSystem, KilometerSystem,
} from 'src/graphics/signal/Signal'; } from 'src/graphics/signal/Signal';
import {
FloodGateData,
FloodGateOperationInteraction,
} from './graphics/FloodGateInteraction';
import { FloodGate, FloodGateTemplate } from 'src/graphics/floodGate/FloodGate';
import { import {
CarWashingData, CarWashingData,
CarWashingState,
CarWashingOperationInteraction, CarWashingOperationInteraction,
} from './graphics/CarWashingInteraction'; } from './graphics/CarWashingInteraction';
import { import {
@ -37,6 +33,7 @@ import {
import { import {
GarageDoorData, GarageDoorData,
GarageDoorOperationInteraction, GarageDoorOperationInteraction,
GarageDoorState,
} from './graphics/GarageDoorInteraction'; } from './graphics/GarageDoorInteraction';
import { import {
GarageDoor, GarageDoor,
@ -109,7 +106,11 @@ import {
SectionLinkData, SectionLinkData,
SectionLinkOperateInteraction, SectionLinkOperateInteraction,
} from './graphics/SectionLinkInteraction'; } from './graphics/SectionLinkInteraction';
import { AxleCountingSectionData } from './graphics/AxleCountingSectionInteraction'; import {
AxleCountingSectionData,
AxleCountingSectionOperateInteraction,
AxleCountingSectionStates,
} from './graphics/AxleCountingSectionInteraction';
import { LogicSectionData } from './graphics/LogicSectionInteraction'; import { LogicSectionData } from './graphics/LogicSectionInteraction';
import { Notify, QNotifyUpdateOptions, Dialog } from 'quasar'; import { Notify, QNotifyUpdateOptions, Dialog } from 'quasar';
import { import {
@ -123,16 +124,8 @@ import {
import { GatedBox, GatedBoxTemplate } from 'src/graphics/gatedBox/GatedBox'; import { GatedBox, GatedBoxTemplate } from 'src/graphics/gatedBox/GatedBox';
import { EsbButton, EsbButtonTemplate } from 'src/graphics/esbButton/EsbButton'; import { EsbButton, EsbButtonTemplate } from 'src/graphics/esbButton/EsbButton';
import { StopPositionData } from './graphics/StopPositionInteraction'; import { StopPositionData } from './graphics/StopPositionInteraction';
import { import { SpksSwitchData } from './graphics/SpksSwitchInteraction';
SpksSwitchData,
SpksSwitchOperationInteraction,
} from './graphics/SpksSwitchInteraction';
import { GatedBoxData } from './graphics/GatedBoxInteraction'; import { GatedBoxData } from './graphics/GatedBoxInteraction';
import { GarageDoorBoxData } from './graphics/GarageDoorBoxInteraction';
import {
GarageDoorBox,
GarageDoorBoxTemplate,
} from 'src/graphics/garageDoorBox/GarageDoorBox';
import { import {
EsbButtonData, EsbButtonData,
EsbButtonOperationInteraction, EsbButtonOperationInteraction,
@ -174,7 +167,6 @@ import {
} from 'src/graphics/trackLogicSection/TrackLogicSection'; } from 'src/graphics/trackLogicSection/TrackLogicSection';
import { TrackLogicSectionData } from './graphics/TrackLogicSectionInteraction'; import { TrackLogicSectionData } from './graphics/TrackLogicSectionInteraction';
import { GatedBoxOperateInteraction } from './graphics/GatedBoxInteraction'; import { GatedBoxOperateInteraction } from './graphics/GatedBoxInteraction';
import { GarageDoorBoxOperateInteraction } from './graphics/GarageDoorBoxInteraction';
import { CategoryType } from 'src/components/CategoryType'; import { CategoryType } from 'src/components/CategoryType';
import { import {
AutoReturnBox, AutoReturnBox,
@ -198,6 +190,14 @@ import {
IbpBoxData, IbpBoxData,
IbpBoxOperateInteraction, IbpBoxOperateInteraction,
} from './graphics/IbpBoxInteraction'; } from './graphics/IbpBoxInteraction';
import { FloodGate, FloodGateTemplate } from 'src/graphics/floodGate/FloodGate';
import {
FloodGateData,
FloodGateOperationInteraction,
FloodGateState,
} from './graphics/FloodGateInteraction';
import { HoldButton } from 'src/graphics/holdButton/HoldButton';
import { UnattengedButton } from 'src/graphics/unattengedButton/UnattengedButton';
const showOptions: MenuItemOptions = { const showOptions: MenuItemOptions = {
name: '显示控制', name: '显示控制',
@ -261,9 +261,10 @@ export const layerList = [
{ label: '轨道逻辑区段', value: TrackLogicSection.Type, defaultShow: false }, { label: '轨道逻辑区段', value: TrackLogicSection.Type, defaultShow: false },
{ label: '自动折返按钮箱', value: AutoReturnBox.Type, defaultShow: true }, { label: '自动折返按钮箱', value: AutoReturnBox.Type, defaultShow: true },
{ label: '车库门', value: GarageDoor.Type, defaultShow: true }, { label: '车库门', value: GarageDoor.Type, defaultShow: true },
{ label: '防淹门', value: FloodGate.Type, defaultShow: true },
{ label: '洗车机', value: CarWashing.Type, defaultShow: true }, { label: '洗车机', value: CarWashing.Type, defaultShow: true },
{ label: '车库门设置', value: GarageDoorBox.Type, defaultShow: true }, { label: '防淹门', value: FloodGate.Type, defaultShow: true },
{ label: '扣车按钮', value: HoldButton.Type, defaultShow: true },
{ label: '无人折返按钮', value: UnattengedButton.Type, defaultShow: true },
]; ];
let lineScene: IGraphicScene; let lineScene: IGraphicScene;
@ -311,7 +312,10 @@ export function initLineScene(lineApp: IGraphicApp, sceneName: string) {
new TrainWindowTemplate(new TrainWindowData()), new TrainWindowTemplate(new TrainWindowData()),
new SeparatorTemplate(new SeparatorData()), new SeparatorTemplate(new SeparatorData()),
new SectionLinkTemplate(new SectionLinkData()), new SectionLinkTemplate(new SectionLinkData()),
new AxleCountingSectionTemplate(new AxleCountingSectionData()), new AxleCountingSectionTemplate(
new AxleCountingSectionData(),
new AxleCountingSectionStates()
),
new LogicSectionTemplate(new LogicSectionData()), new LogicSectionTemplate(new LogicSectionData()),
new StopPositionTemplate(new StopPositionData()), new StopPositionTemplate(new StopPositionData()),
new SpksSwitchTemplate(new SpksSwitchData()), new SpksSwitchTemplate(new SpksSwitchData()),
@ -332,10 +336,9 @@ export function initLineScene(lineApp: IGraphicApp, sceneName: string) {
new AutoReturnBoxData(), new AutoReturnBoxData(),
new AutoReturnBoxState() new AutoReturnBoxState()
), ),
new CarWashingTemplate(new CarWashingData()), new CarWashingTemplate(new CarWashingData(), new CarWashingState()),
new GarageDoorTemplate(new GarageDoorData()), new GarageDoorTemplate(new GarageDoorData(), new GarageDoorState()),
new FloodGateTemplate(new FloodGateData()), new FloodGateTemplate(new FloodGateData(), new FloodGateState()),
new GarageDoorBoxTemplate(new GarageDoorBoxData()),
]; ];
lineScene.registerGraphicTemplates(...graphicTemplate); lineScene.registerGraphicTemplates(...graphicTemplate);
SignalOperateInteraction.init(lineScene); SignalOperateInteraction.init(lineScene);
@ -348,17 +351,18 @@ export function initLineScene(lineApp: IGraphicApp, sceneName: string) {
TurnoutOperationPlugin.init(lineScene); TurnoutOperationPlugin.init(lineScene);
TransponderOperationPlugin.init(lineScene); TransponderOperationPlugin.init(lineScene);
EsbButtonOperationInteraction.init(lineScene); EsbButtonOperationInteraction.init(lineScene);
SpksSwitchOperationInteraction.init(lineScene);
AutoReturnBoxOperationInteraction.init(lineScene); AutoReturnBoxOperationInteraction.init(lineScene);
PslBoxOperateInteraction.init(lineScene); PslBoxOperateInteraction.init(lineScene);
IbpBoxOperateInteraction.init(lineScene); IbpBoxOperateInteraction.init(lineScene);
CarWashingOperationInteraction.init(lineScene); CarWashingOperationInteraction.init(lineScene);
GarageDoorOperationInteraction.init(lineScene); GarageDoorOperationInteraction.init(lineScene);
FloodGateOperationInteraction.init(lineScene); FloodGateOperationInteraction.init(lineScene);
GarageDoorBoxOperateInteraction.init(lineScene);
if (categoryType === CategoryType.TH) { if (categoryType === CategoryType.TH) {
GatedBoxOperateInteraction.init(lineScene); GatedBoxOperateInteraction.init(lineScene);
} }
if (categoryType === CategoryType.JK) {
AxleCountingSectionOperateInteraction.init(lineScene);
}
// 画布右键菜单 // 画布右键菜单
lineScene.registerMenu(DefaultCanvasMenu); lineScene.registerMenu(DefaultCanvasMenu);
lineScene.canvas.on('_rightclick', (e) => { lineScene.canvas.on('_rightclick', (e) => {
@ -430,6 +434,11 @@ function handleSubscribe(lineScene: IGraphicScene) {
states.push(new SectionStates(item)); states.push(new SectionStates(item));
} }
}); });
storage.allStatus.axleCountingSection.forEach((item) => {
if (item.id) {
states.push(new AxleCountingSectionStates(item));
}
});
storage.allStatus.psdState.forEach((item) => { storage.allStatus.psdState.forEach((item) => {
if (item.id) { if (item.id) {
states.push(new ScreenDoorState(item)); states.push(new ScreenDoorState(item));
@ -461,6 +470,21 @@ function handleSubscribe(lineScene: IGraphicScene) {
states.push(new TransponderState(item)); states.push(new TransponderState(item));
} }
}); });
storage.allStatus.ckmStates.forEach((item) => {
if (item.id) {
states.push(new GarageDoorState(item));
}
});
storage.allStatus.fymStates.forEach((item) => {
if (item.id) {
states.push(new FloodGateState(item));
}
});
storage.allStatus.xcjStates.forEach((item) => {
if (item.id) {
states.push(new CarWashingState(item));
}
});
storage.allStatus.trainState.forEach((item) => { storage.allStatus.trainState.forEach((item) => {
// 列车 // 列车
if (!item.show) { if (!item.show) {
@ -519,7 +543,7 @@ function handleSubscribe(lineScene: IGraphicScene) {
msgNotify = Notify.create({ msgNotify = Notify.create({
type: 'negative', type: 'negative',
timeout: 0, timeout: 0,
position: 'top-right', position: 'top',
message: '通信链接已断开!', message: '通信链接已断开!',
}); });
} else if (msgNotify && connected) { } else if (msgNotify && connected) {
@ -660,9 +684,6 @@ export async function loadLineDatas(): Promise<IGraphicStorage> {
storage.floodGates.forEach((floodGate) => { storage.floodGates.forEach((floodGate) => {
datas.push(new FloodGateData(floodGate)); datas.push(new FloodGateData(floodGate));
}); });
storage.garageDoorBoxes.forEach((garageDoorBox) => {
datas.push(new GarageDoorBoxData(garageDoorBox));
});
// const linkIdGenerator = new IdGenerator(Link.Type); // const linkIdGenerator = new IdGenerator(Link.Type);
// storage.CalculateLink.forEach((link) => { // storage.CalculateLink.forEach((link) => {
// const g = new LinkData(link); // const g = new LinkData(link);

View File

@ -260,7 +260,6 @@ export function loadGatedRelateDeviceList() {
export function creatGatedRelateDevice(row: graphicData.DeviceCombinationtype) { export function creatGatedRelateDevice(row: graphicData.DeviceCombinationtype) {
refDevicesList.push(row); refDevicesList.push(row);
console.log(refDevicesList, '====');
drawApp?.emit('postdataloaded'); drawApp?.emit('postdataloaded');
} }

View File

@ -69,15 +69,17 @@ function handleSubscribe(pslScene: IGraphicScene) {
const states: GraphicState[] = []; const states: GraphicState[] = [];
const storage = state.PushedDevicesStatus.deserialize(message); const storage = state.PushedDevicesStatus.deserialize(message);
if (storage.all) { if (storage.all) {
// storage.allStatus.buttonState.forEach((item) => { storage.allStatus.buttonState.forEach((item) => {
// if (item.id) { if (item.id) {
// states.push(new PslButtonState(item)); states.push(new PslButtonState(item));
// } }
// }); });
} }
// console.log(states, 'states');
return states; return states;
}, },
graphicQueryer: (state, store) => {
return store.queryById(+state.code);
},
}); });
} }

View File

@ -46,6 +46,18 @@ export class RelayData extends GraphicDataBase implements IRelayData {
set newModel(v: relayCabinetGraphicData.Relay.ModelType) { set newModel(v: relayCabinetGraphicData.Relay.ModelType) {
this.data.newModel = v; this.data.newModel = v;
} }
get showCode(): string {
return this.data.showCode;
}
set showCode(v: string) {
this.data.showCode = v;
}
get defaultInitialPosition(): relayCabinetGraphicData.CjDataItem.PostionType {
return this.data.defaultInitialPosition;
}
set defaultInitialPosition(v: relayCabinetGraphicData.CjDataItem.PostionType) {
this.data.defaultInitialPosition = v;
}
clone(): RelayData { clone(): RelayData {
return new RelayData(this.data.cloneMessage()); return new RelayData(this.data.cloneMessage());
} }

View File

@ -125,6 +125,7 @@ export function initDrawApp(): IDrawApp {
}) })
); );
app.on('postdataloaded', () => { app.on('postdataloaded', () => {
refRelaysListMap.clear();
refRelaysList.forEach((device) => { refRelaysList.forEach((device) => {
device.combinationtypes.forEach((combinationtype) => { device.combinationtypes.forEach((combinationtype) => {
combinationtype.refRelays.forEach((relayId) => { combinationtype.refRelays.forEach((relayId) => {
@ -230,39 +231,10 @@ export function saveDrawDatas(app: IDrawApp) {
); );
} }
}); });
// storage.relayCabinets.forEach((item) => {
// item.common.newId = +item.common.id;
// });
// storage.relays.forEach((item) => {
// item.common.newId = +item.common.id;
// });
// storage.phaseFailureProtectors.forEach((item) => {
// item.common.newId = +item.common.id;
// });
// storage.signalFaultAlarms.forEach((item) => {
// item.common.newId = +item.common.id;
// });
storage.deviceRelateRelayList = refRelaysList; storage.deviceRelateRelayList = refRelaysList;
storage.UniqueIdPrefix = UniqueIdPrefix; storage.UniqueIdPrefix = UniqueIdPrefix;
storage.ciCjList = ciCjList; storage.ciCjList = ciCjList;
storage.ciQdList = ciQdList; storage.ciQdList = ciQdList;
// storage.deviceRelateRelayList.forEach((item) => {
// item.combinationtypes.forEach((itemB) => {
// itemB.newrefRelays = itemB.refRelays.map((item) => +item);
// });
// });
// storage.ciCjList?.cjList.forEach((item) => {
// item.bitList.forEach((item) => {
// item.refRelays.forEach((itemB) => {
// itemB.newrelayId = +itemB.relayId;
// });
// });
// });
// storage.ciQdList?.qdList.forEach((item) => {
// item.bitList.forEach((itemB) => {
// itemB.newrefRelays = itemB.refRelays.map((item) => +item);
// });
// });
const base64 = fromUint8Array(storage.serialize()); const base64 = fromUint8Array(storage.serialize());
console.log('保存数据', storage); console.log('保存数据', storage);
return base64; return base64;
@ -384,15 +356,7 @@ export function loadCiCjList() {
export function creatCiCjList(rows: number, cols: number) { export function creatCiCjList(rows: number, cols: number) {
if (ciCjList == undefined) { if (ciCjList == undefined) {
ciCjList = new relayCabinetGraphicData.CiCj(); clearCiCjList(rows, cols);
ciCjList.dsCount = rows;
for (let i = 0; i < cols; i++) {
ciCjList.cjList[i] = new relayCabinetGraphicData.CjDataSet();
ciCjList.cjList[i].name = 'D' + (i + 1);
for (let j = 0; j < rows; j++) {
ciCjList.cjList[i].bitList[j] = new relayCabinetGraphicData.CjData();
}
}
} else { } else {
const oldRows = ciCjList.dsCount; const oldRows = ciCjList.dsCount;
ciCjList.dsCount = rows; ciCjList.dsCount = rows;
@ -435,7 +399,11 @@ export function creatCiCjListByCombinationtype(
ciCjList.cjList[i] = new relayCabinetGraphicData.CjDataSet(); ciCjList.cjList[i] = new relayCabinetGraphicData.CjDataSet();
ciCjList.cjList[i].name = 'D' + (i + 1); ciCjList.cjList[i].name = 'D' + (i + 1);
for (let j = 0; j < rows; j++) { for (let j = 0; j < rows; j++) {
if (i < cols - 1 || (i == cols - 1 && j < allCjData.length % rows)) { if (
i < cols - 1 ||
(i == cols - 1 && j < allCjData.length % rows) ||
(i == cols - 1 && allCjData.length % rows == 0)
) {
ciCjList.cjList[i].bitList[j] = allCjData[i * rows + j]; ciCjList.cjList[i].bitList[j] = allCjData[i * rows + j];
} else { } else {
ciCjList.cjList[i].bitList[j] = new relayCabinetGraphicData.CjData(); ciCjList.cjList[i].bitList[j] = new relayCabinetGraphicData.CjData();
@ -444,6 +412,101 @@ export function creatCiCjListByCombinationtype(
} }
} }
export function checkCiCjListByCombinationtype(
needChangeCjDataMap: Map<
string,
{
posInCiCjListindex: number;
relayId: number;
}[]
>,
needDeleteCjDataMap: Map<string, number[]>
) {
ciCjList.cjList.forEach((CjDataSet, i) => {
CjDataSet.bitList.forEach((CjData, j) => {
const newIdInfo = needChangeCjDataMap.get(`${j}-${i}`);
if (newIdInfo) {
newIdInfo.forEach((info) => {
ciCjList.cjList[i].bitList[j].refRelays[
info.posInCiCjListindex
].relayId = info.relayId;
});
}
const deleteIdInfo = needDeleteCjDataMap.get(`${j}-${i}`);
if (deleteIdInfo) {
deleteIdInfo.forEach((index) => {
ciCjList.cjList[i].bitList[j].refRelays[index].relayId = 999999;
});
}
});
});
ciCjList.cjList.forEach((CjDataSet, i) => {
CjDataSet.bitList.forEach((CjData, j) => {
const newRefRelays = CjData.refRelays.filter(
(refRelay) => refRelay.relayId !== 999999
);
ciCjList.cjList[i].bitList[j].refRelays = newRefRelays;
});
});
}
export function clearCiCjList(rows: number, cols: number) {
ciCjList = new relayCabinetGraphicData.CiCj();
ciCjList.dsCount = rows;
for (let i = 0; i < cols; i++) {
ciCjList.cjList[i] = new relayCabinetGraphicData.CjDataSet();
ciCjList.cjList[i].name = 'D' + (i + 1);
for (let j = 0; j < rows; j++) {
ciCjList.cjList[i].bitList[j] = new relayCabinetGraphicData.CjData();
}
}
}
export function deleteCjDataPositionByIndex(row: number, col: number) {
const allCjData: relayCabinetGraphicData.CjData[] = [];
ciCjList.cjList.forEach((cj, i) => {
cj.bitList.forEach((bit, j) => {
if (i !== col || j !== row) {
allCjData.push(bit);
}
});
});
allCjData.push(new relayCabinetGraphicData.CjData());
const allCjData2D = convertTo2DArray(
allCjData,
ciCjList.cjList.length,
ciCjList.dsCount
) as relayCabinetGraphicData.CjData[][];
ciCjList.cjList.forEach((cj, i) => {
cj.bitList.forEach((bit, j) => {
cj.bitList[j] = allCjData2D[i][j];
});
});
}
export function addCjDataPositionByIndex(row: number, col: number) {
const allCjData: relayCabinetGraphicData.CjData[] = [];
ciCjList.cjList.forEach((cj, i) => {
cj.bitList.forEach((bit, j) => {
allCjData.push(bit);
if (i == col && j == row) {
allCjData.push(new relayCabinetGraphicData.CjData());
}
});
});
allCjData.pop();
const allCjData2D = convertTo2DArray(
allCjData,
ciCjList.cjList.length,
ciCjList.dsCount
) as relayCabinetGraphicData.CjData[][];
ciCjList.cjList.forEach((cj, i) => {
cj.bitList.forEach((bit, j) => {
cj.bitList[j] = allCjData2D[i][j];
});
});
}
//驱动列表的增删改查 //驱动列表的增删改查
let ciQdList: relayCabinetGraphicData.CiQd; let ciQdList: relayCabinetGraphicData.CiQd;
export function loadCiQdList() { export function loadCiQdList() {
@ -452,15 +515,7 @@ export function loadCiQdList() {
export function creatCiQdList(rows: number, cols: number) { export function creatCiQdList(rows: number, cols: number) {
if (ciQdList == undefined) { if (ciQdList == undefined) {
ciQdList = new relayCabinetGraphicData.CiQd(); clearCiQdList(rows, cols);
ciQdList.dsCount = rows;
for (let i = 0; i < cols; i++) {
ciQdList.qdList[i] = new relayCabinetGraphicData.QdDataSet();
ciQdList.qdList[i].name = 'D' + (i + 1);
for (let j = 0; j < rows; j++) {
ciQdList.qdList[i].bitList[j] = new relayCabinetGraphicData.QdData();
}
}
} else { } else {
const oldRows = ciQdList.dsCount; const oldRows = ciQdList.dsCount;
ciQdList.dsCount = rows; ciQdList.dsCount = rows;
@ -511,3 +566,115 @@ export function creatCiQdListByCombinationtype(
} }
} }
} }
export function checkCiQdListByCombinationtype(
needChangeCjDataMap: Map<
string,
{
posInCiQdListindex: number;
relayId: number;
}[]
>,
needDeleteCjDataMap: Map<string, number[]>
) {
ciQdList.qdList.forEach((qdDataSet, i) => {
qdDataSet.bitList.forEach((qdData, j) => {
const newIdInfo = needChangeCjDataMap.get(`${j}-${i}`);
if (newIdInfo) {
newIdInfo.forEach((info) => {
ciQdList.qdList[i].bitList[j].refRelays[info.posInCiQdListindex] =
info.relayId;
});
}
const deleteIdInfo = needDeleteCjDataMap.get(`${j}-${i}`);
if (deleteIdInfo) {
deleteIdInfo.forEach((index) => {
ciQdList.qdList[i].bitList[j].refRelays[index] = 999999;
});
}
});
});
ciQdList.qdList.forEach((qdDataSet, i) => {
qdDataSet.bitList.forEach((qdData, j) => {
const newRefRelays = qdData.refRelays.filter(
(refRelayId) => refRelayId !== 999999
);
ciQdList.qdList[i].bitList[j].refRelays = newRefRelays;
});
});
}
export function clearCiQdList(rows: number, cols: number) {
ciQdList = new relayCabinetGraphicData.CiQd();
ciQdList.dsCount = rows;
for (let i = 0; i < cols; i++) {
ciQdList.qdList[i] = new relayCabinetGraphicData.QdDataSet();
ciQdList.qdList[i].name = 'D' + (i + 1);
for (let j = 0; j < rows; j++) {
ciQdList.qdList[i].bitList[j] = new relayCabinetGraphicData.QdData();
}
}
}
export function deleteQdDataPositionByIndex(row: number, col: number) {
const allQdData: relayCabinetGraphicData.QdData[] = [];
ciQdList.qdList.forEach((qd, i) => {
qd.bitList.forEach((bit, j) => {
if (i !== col || j !== row) {
allQdData.push(bit);
}
});
});
allQdData.push(new relayCabinetGraphicData.QdData());
const allQdData2D = convertTo2DArray(
allQdData,
ciQdList.qdList.length,
ciQdList.dsCount
) as relayCabinetGraphicData.QdData[][];
ciQdList.qdList.forEach((qd, i) => {
qd.bitList.forEach((bit, j) => {
qd.bitList[j] = allQdData2D[i][j];
});
});
}
export function addQdDataPositionByIndex(row: number, col: number) {
const allQdData: relayCabinetGraphicData.QdData[] = [];
ciQdList.qdList.forEach((qd, i) => {
qd.bitList.forEach((bit, j) => {
allQdData.push(bit);
if (i == col && j == row) {
allQdData.push(new relayCabinetGraphicData.QdData());
}
});
});
allQdData.pop();
const allQdData2D = convertTo2DArray(
allQdData,
ciQdList.qdList.length,
ciQdList.dsCount
) as relayCabinetGraphicData.QdData[][];
ciQdList.qdList.forEach((qd, i) => {
qd.bitList.forEach((bit, j) => {
qd.bitList[j] = allQdData2D[i][j];
});
});
}
//一维数组变二维数组
export function convertTo2DArray<T>(
sourceArray: T[],
rowCount: number,
colCount: number
): T[][] {
const result: T[][] = [];
for (let i = 0; i < rowCount; i++) {
const row: T[] = [];
for (let j = 0; j < colCount; j++) {
const index = i * colCount + j;
row.push(sourceArray[index]);
}
result.push(row);
}
return result;
}

View File

@ -159,7 +159,7 @@ function handleSubscribe(relayScene: IGraphicScene) {
msgNotify = Notify.create({ msgNotify = Notify.create({
type: 'negative', type: 'negative',
timeout: 0, timeout: 0,
position: 'top-right', position: 'top',
message: '通信链接已断开!', message: '通信链接已断开!',
}); });
} else if (msgNotify && connected) { } else if (msgNotify && connected) {

View File

@ -32,6 +32,10 @@ import { TccKeyData, TccKeyState } from './graphics/TccKeyInteraction';
import { TccHandleDraw } from 'src/graphics/tccHandle/TccHandleDrawAssistant'; import { TccHandleDraw } from 'src/graphics/tccHandle/TccHandleDrawAssistant';
import { TccHandle, TccHandleTemplate } from 'src/graphics/tccHandle/TccHandle'; import { TccHandle, TccHandleTemplate } from 'src/graphics/tccHandle/TccHandle';
import { TccHandleData, TccHandleState } from './graphics/TccHandleInteraction'; import { TccHandleData, TccHandleState } from './graphics/TccHandleInteraction';
import { TccLightDraw } from 'src/graphics/tccLight/TccLightDrawAssistant';
import { TccLightData, TccLightState } from './graphics/TccLightInteraction';
import { TccLight, TccLightTemplate } from 'src/graphics/tccLight/TccLight';
const UndoOptions: MenuItemOptions = { const UndoOptions: MenuItemOptions = {
name: '撤销', name: '撤销',
@ -87,6 +91,10 @@ export function initTccDrawApp(): IDrawApp {
drawApp, drawApp,
new TccHandleTemplate(new TccHandleData(), new TccHandleState()) new TccHandleTemplate(new TccHandleData(), new TccHandleState())
); );
new TccLightDraw(
app,
new TccLightTemplate(new TccLightData(), new TccLightState())
);
// 画布右键菜单 // 画布右键菜单
app.registerMenu(DefaultCanvasMenu); app.registerMenu(DefaultCanvasMenu);
@ -181,6 +189,8 @@ export function saveTccDrawDatas(app: IDrawApp) {
storage.tccKeys.push(g.saveData<TccKeyData>().data); storage.tccKeys.push(g.saveData<TccKeyData>().data);
} else if (g instanceof TccHandle) { } else if (g instanceof TccHandle) {
storage.tccHandles.push(g.saveData<TccHandleData>().data); storage.tccHandles.push(g.saveData<TccHandleData>().data);
} else if (g instanceof TccLight) {
storage.tccLights.push(g.saveData<TccLightData>().data);
} }
}); });
const base64 = fromUint8Array(storage.serialize()); const base64 = fromUint8Array(storage.serialize());
@ -214,6 +224,9 @@ export async function loadTccDrawDatas(): Promise<IGraphicStorage> {
storage.tccTexts.forEach((tccText) => { storage.tccTexts.forEach((tccText) => {
datas.push(new TccTextData(tccText)); datas.push(new TccTextData(tccText));
}); });
storage.tccLights.forEach((tccLight) => {
datas.push(new TccLightData(tccLight));
});
return { return {
canvasProperty: storage.canvas, canvasProperty: storage.canvas,
datas: datas, datas: datas,

View File

@ -31,6 +31,8 @@ import {
TccHandleInteraction, TccHandleInteraction,
TccHandleState, TccHandleState,
} from './graphics/TccHandleInteraction'; } from './graphics/TccHandleInteraction';
import { TccLightTemplate } from 'src/graphics/tccLight/TccLight';
import { TccLightData, TccLightState } from './graphics/TccLightInteraction';
export function initTccScene(lineApp: IGraphicApp, sceneName: string) { export function initTccScene(lineApp: IGraphicApp, sceneName: string) {
const tccScene = lineApp.initScene(sceneName, { const tccScene = lineApp.initScene(sceneName, {
@ -45,6 +47,7 @@ export function initTccScene(lineApp: IGraphicApp, sceneName: string) {
new TextContentTemplate(new TccTextData()), new TextContentTemplate(new TccTextData()),
new TccKeyTemplate(new TccKeyData(), new TccKeyState()), new TccKeyTemplate(new TccKeyData(), new TccKeyState()),
new TccHandleTemplate(new TccHandleData(), new TccHandleState()), new TccHandleTemplate(new TccHandleData(), new TccHandleState()),
new TccLightTemplate(new TccLightData(), new TccLightState()),
]; ];
TccButtonOperateInteraction.init(tccScene); TccButtonOperateInteraction.init(tccScene);
TccKeyInteraction.init(tccScene); TccKeyInteraction.init(tccScene);
@ -53,6 +56,23 @@ export function initTccScene(lineApp: IGraphicApp, sceneName: string) {
tccScene.on('postdataloaded', () => { tccScene.on('postdataloaded', () => {
handleSubscribe(tccScene); handleSubscribe(tccScene);
}); });
const tccStore = useTccStore();
tccScene.canvas.onmousedown = () => {
tccStore.canvasMouseDown = true;
};
tccScene.canvas.onmouseup = () => {
tccStore.canvasMouseDown = false;
if (tccStore.mouseDownOnTccHandle) {
tccStore.mouseDownOnTccHandle = false;
}
if (tccStore.mouseDownOnTccKeyDir) {
tccStore.mouseDownOnTccKeyDir = false;
}
};
lineApp.on('destroy', () => {
tccScene.canvas.onmousedown = null;
tccScene.canvas.onmouseup = null;
});
return tccScene; return tccScene;
} }
@ -66,15 +86,15 @@ function handleSubscribe(tccScene: IGraphicScene) {
destination: `/rtsts/simulation/${simulationId}/train/control/${tccId}`, destination: `/rtsts/simulation/${simulationId}/train/control/${tccId}`,
messageConverter: (message: Uint8Array) => { messageConverter: (message: Uint8Array) => {
const states: GraphicState[] = []; const states: GraphicState[] = [];
const storage = state.TrainControlState.deserialize(message); const storage = state.TrainControlStateMsg.deserialize(message);
if (storage.ebutton) { storage?.buttons.forEach((button) => {
states.push(new TccButtonState(storage.ebutton)); states.push(new TccButtonState(button));
} });
if (storage.dirKey) { storage?.switchKeys.forEach((switchKey) => {
states.push(new TccKeyState(storage.dirKey)); states.push(new TccKeyState(switchKey));
} });
storage?.driverKey.forEach((driverKey) => { storage?.driverKey.forEach((driverKey) => {
const data = new state.TrainControlState.DirectionKeySwitch({ const data = new state.TrainControlState.SwitchKeyChange({
id: driverKey.id, id: driverKey.id,
val: driverKey.val ? 1 : 0, val: driverKey.val ? 1 : 0,
}); });
@ -83,6 +103,9 @@ function handleSubscribe(tccScene: IGraphicScene) {
if (storage.pushHandler) { if (storage.pushHandler) {
states.push(new TccHandleState(storage.pushHandler)); states.push(new TccHandleState(storage.pushHandler));
} }
storage?.lights.forEach((light) => {
states.push(new TccLightState(light));
});
return states; return states;
}, },
graphicQueryer: (state, store) => { graphicQueryer: (state, store) => {
@ -113,6 +136,9 @@ async function loadTccDatas(): Promise<IGraphicStorage> {
storage.tccTexts.forEach((tccText) => { storage.tccTexts.forEach((tccText) => {
datas.push(new TccTextData(tccText)); datas.push(new TccTextData(tccText));
}); });
storage.tccLights.forEach((tccLight) => {
datas.push(new TccLightData(tccLight));
});
return Promise.resolve({ return Promise.resolve({
canvasProperty: storage.canvas, canvasProperty: storage.canvas,
datas: datas, datas: datas,

View File

@ -166,16 +166,36 @@ export class AxleCountingDraw extends GraphicDrawAssistant<
} }
oneGenerates(height: Point) { oneGenerates(height: Point) {
const map = new Map(); const map = new Map();
const axleCountings = this.app.queryStore.queryByType<AxleCounting>( const needDelete: AxleCounting[] = [];
AxleCounting.Type const axleCountings = this.app.queryStore
.queryByType<AxleCounting>(AxleCounting.Type)
.filter((axleCounting) => {
if (axleCounting.datas.axleCountingRef.length == 1) {
const refInfo = axleCounting.datas.axleCountingRef[0];
if (refInfo.deviceType == graphicData.RelatedRef.DeviceType.Section) {
const refSection = this.app.queryStore.queryById<Section>(
refInfo.id
); );
if (
refSection.datas.paRef != undefined &&
refSection.datas.pbRef != undefined
) {
needDelete.push(axleCounting);
return false;
}
}
}
return true;
});
this.app.deleteGraphics(...needDelete);
const axleCountingRefs: IRelatedRefData[] = []; const axleCountingRefs: IRelatedRefData[] = [];
axleCountings.forEach((axleCounting) => { axleCountings.forEach((axleCounting) => {
axleCountingRefs.push(...axleCounting.datas.axleCountingRef); axleCountingRefs.push(...axleCounting.datas.axleCountingRef);
}); });
axleCountingRefs.forEach((axleCountingRef) => { axleCountingRefs.forEach((axleCountingRef) => {
map.set( map.set(
`${axleCountingRef.id}-${graphicData.RelatedRef.DevicePort[axleCountingRef.devicePort] `${axleCountingRef.id}-${
graphicData.RelatedRef.DevicePort[axleCountingRef.devicePort]
}`, }`,
1 1
); );

View File

@ -2,6 +2,7 @@ import { Graphics, IPointData } from 'pixi.js';
import { import {
GraphicData, GraphicData,
GraphicRelationParam, GraphicRelationParam,
GraphicState,
JlGraphic, JlGraphic,
JlGraphicTemplate, JlGraphicTemplate,
VectorText, VectorText,
@ -9,6 +10,7 @@ import {
} from 'jl-graphic'; } from 'jl-graphic';
import { IRelatedRefData, protoPort2Data } from '../CommonGraphics'; import { IRelatedRefData, protoPort2Data } from '../CommonGraphics';
import { DevicePort } from '../section/Section'; import { DevicePort } from '../section/Section';
import { state } from 'src/protos/device_state';
export interface ITurnoutPosRefData { export interface ITurnoutPosRefData {
get id(): number; //道岔的ID get id(): number; //道岔的ID
@ -34,10 +36,17 @@ export interface IAxleCountingSectionData extends GraphicData {
} }
export const AxleCountingSectionConsts = { export const AxleCountingSectionConsts = {
lineColor: '0xff0000', lineColor: '#5578b6',
lineWidth: 2, occupiedColor: '#f00',
lineWidth: 5,
}; };
export interface IAxleCountingSectionState extends GraphicState {
id: number;
type?: state.SectionType;
occupied?: boolean; //计轴区段占用
}
export class AxleCountingSection extends JlGraphic { export class AxleCountingSection extends JlGraphic {
static Type = 'AxleCountingSection'; static Type = 'AxleCountingSection';
lineGraphic: Graphics; lineGraphic: Graphics;
@ -48,7 +57,7 @@ export class AxleCountingSection extends JlGraphic {
this.labelGraphic = new VectorText(); this.labelGraphic = new VectorText();
this.labelGraphic.setVectorFontSize(14); this.labelGraphic.setVectorFontSize(14);
this.labelGraphic.anchor.set(0.5); this.labelGraphic.anchor.set(0.5);
this.labelGraphic.style.fill = '0xff0000'; this.labelGraphic.style.fill = '0xffffff';
this.labelGraphic.transformSave = true; this.labelGraphic.transformSave = true;
this.labelGraphic.name = 'label'; this.labelGraphic.name = 'label';
this.transformSave = true; this.transformSave = true;
@ -61,6 +70,9 @@ export class AxleCountingSection extends JlGraphic {
get datas(): IAxleCountingSectionData { get datas(): IAxleCountingSectionData {
return this.getDatas<IAxleCountingSectionData>(); return this.getDatas<IAxleCountingSectionData>();
} }
get states(): IAxleCountingSectionState {
return this.getStates<IAxleCountingSectionState>();
}
doRepaint(): void { doRepaint(): void {
if (this.datas.points.length < 2) { if (this.datas.points.length < 2) {
throw new Error('AxleCountingSection坐标数据异常'); throw new Error('AxleCountingSection坐标数据异常');
@ -68,7 +80,9 @@ export class AxleCountingSection extends JlGraphic {
this.lineGraphic.clear(); this.lineGraphic.clear();
this.lineGraphic.lineStyle( this.lineGraphic.lineStyle(
AxleCountingSectionConsts.lineWidth, AxleCountingSectionConsts.lineWidth,
AxleCountingSectionConsts.lineColor this.states.occupied
? AxleCountingSectionConsts.occupiedColor
: AxleCountingSectionConsts.lineColor
); );
this.datas.points.forEach((p, i) => { this.datas.points.forEach((p, i) => {
if (i !== 0) { if (i !== 0) {
@ -77,7 +91,7 @@ export class AxleCountingSection extends JlGraphic {
this.lineGraphic.moveTo(p.x, p.y); this.lineGraphic.moveTo(p.x, p.y);
} }
}); });
this.labelGraphic.text = this.datas.code; this.labelGraphic.text = this.datas.code + '(计)';
const labelPosition = this.datas.childTransforms?.find( const labelPosition = this.datas.childTransforms?.find(
(t) => t.name === this.labelGraphic.name (t) => t.name === this.labelGraphic.name
)?.transform.position; )?.transform.position;
@ -133,14 +147,19 @@ export class AxleCountingSection extends JlGraphic {
} }
export class AxleCountingSectionTemplate extends JlGraphicTemplate<AxleCountingSection> { export class AxleCountingSectionTemplate extends JlGraphicTemplate<AxleCountingSection> {
constructor(dataTemplate: IAxleCountingSectionData) { constructor(
dataTemplate: IAxleCountingSectionData,
stateTemplate?: IAxleCountingSectionState
) {
super(AxleCountingSection.Type, { super(AxleCountingSection.Type, {
dataTemplate, dataTemplate,
stateTemplate,
}); });
} }
new(): AxleCountingSection { new(): AxleCountingSection {
const axleCountingSection = new AxleCountingSection(); const axleCountingSection = new AxleCountingSection();
axleCountingSection.loadData(this.datas); axleCountingSection.loadData(this.datas);
axleCountingSection.loadState(this.states);
return axleCountingSection; return axleCountingSection;
} }
} }

View File

@ -246,7 +246,7 @@ export class AxleCountingSectionDraw extends GraphicDrawAssistant<
}); });
} }
} }
class AxleCountingSectionGraphicHitArea implements IHitArea { export class AxleCountingSectionGraphicHitArea implements IHitArea {
axleCountingSection: AxleCountingSection; axleCountingSection: AxleCountingSection;
constructor(axleCountingSection: AxleCountingSection) { constructor(axleCountingSection: AxleCountingSection) {
this.axleCountingSection = axleCountingSection; this.axleCountingSection = axleCountingSection;

View File

@ -1,10 +1,14 @@
import { Graphics } from 'pixi.js'; import { Graphics } from 'pixi.js';
import { import {
GraphicData, GraphicData,
GraphicState,
JlGraphic, JlGraphic,
JlGraphicTemplate, JlGraphicTemplate,
VectorText, VectorText,
linePoint,
} from 'jl-graphic'; } from 'jl-graphic';
import { Section, SectionType } from '../section/Section';
import { request } from 'src/protos/request';
export interface ICarWashingData extends GraphicData { export interface ICarWashingData extends GraphicData {
get code(): string; get code(): string;
@ -13,29 +17,59 @@ export interface ICarWashingData extends GraphicData {
set linkSection(v: number); set linkSection(v: number);
get centralizedStations(): number[]; get centralizedStations(): number[];
set centralizedStations(v: number[]); set centralizedStations(v: number[]);
get duanNum(): number;
set duanNum(v: number);
get width(): number;
set width(v: number);
clone(): ICarWashingData; clone(): ICarWashingData;
copyFrom(data: ICarWashingData): void; copyFrom(data: ICarWashingData): void;
eq(other: ICarWashingData): boolean; eq(other: ICarWashingData): boolean;
} }
export interface ICarWashingState extends GraphicState {
get id(): number;
set id(v: number);
get param(): request.XcjParam;
set param(v: request.XcjParam);
get xqj(): boolean; //洗车请求
set xqj(v: boolean);
get twjList(): boolean[]; //停稳
set twjList(v: boolean[]);
get tgqj(): boolean; //通过请求
set tgqj(v: boolean);
get xcjxj(): boolean; //洗车就绪
set xcjxj(v: boolean);
get xcyxj(): boolean; //洗车允许
set xcyxj(v: boolean);
get cfjList(): boolean[]; //移动允许
set cfjList(v: boolean[]);
get jtj(): boolean; //紧急停车
set jtj(v: boolean);
get tgyxj(): boolean; //通过允许
set tgyxj(v: boolean);
}
const carWashingConsts = { export const carWashingConsts = {
codeFontSize: 12, codeFontSize: 12,
codeColor: 0xffffff, codeColor: 0xffffff,
bodyRectLineColor: 0xffffff, bodyRectLineColor: 0xffffff,
bodyRectLineWidth: 2, bodyRectLineWidth: 6,
bodyRectWidth: 10, bodyRectWidth: 60,
bodyRectHeight: 20, bodyRectHeight: 40,
bodyColor: 0x000000, bodyColor: 0xffffff,
}; };
export class CarWashing extends JlGraphic { export class CarWashing extends JlGraphic {
static Type = 'carWashing'; static Type = 'carWashing';
codeGraph: VectorText = new VectorText(''); codeGraph: VectorText = new VectorText('');
rectBody: Graphics = new Graphics(); rectBody: Graphics = new Graphics();
stopText: VectorText = new VectorText('');
stateText: VectorText = new VectorText('');
constructor() { constructor() {
super(CarWashing.Type); super(CarWashing.Type);
this.addChild(this.codeGraph); this.addChild(this.codeGraph);
this.addChild(this.rectBody); this.addChild(this.rectBody);
this.addChild(this.stopText);
this.addChild(this.stateText);
this.codeGraph.name = 'carw_code'; this.codeGraph.name = 'carw_code';
} }
get code(): string { get code(): string {
@ -44,6 +78,9 @@ export class CarWashing extends JlGraphic {
get datas(): ICarWashingData { get datas(): ICarWashingData {
return this.getDatas<ICarWashingData>(); return this.getDatas<ICarWashingData>();
} }
get states(): ICarWashingState {
return this.getStates<ICarWashingState>();
}
doRepaint(): void { doRepaint(): void {
const codeGraph = this.codeGraph; const codeGraph = this.codeGraph;
codeGraph.text = this.datas.code; codeGraph.text = this.datas.code;
@ -62,28 +99,89 @@ export class CarWashing extends JlGraphic {
codeGraph.position.set(0, -30); codeGraph.position.set(0, -30);
} }
this.rectBody.clear(); this.rectBody.clear();
this.rectBody.beginFill(carWashingConsts.bodyColor, 0);
this.rectBody.lineStyle( this.rectBody.lineStyle(
carWashingConsts.bodyRectLineWidth, carWashingConsts.bodyRectLineWidth,
carWashingConsts.bodyRectLineColor carWashingConsts.bodyRectLineColor
); );
this.rectBody.beginFill(carWashingConsts.bodyColor, 0);
const width = this.datas.width || carWashingConsts.bodyRectWidth;
this.rectBody.drawRect( this.rectBody.drawRect(
-carWashingConsts.bodyRectWidth / 2, -width / 2,
-carWashingConsts.bodyRectHeight / 2, -carWashingConsts.bodyRectHeight / 2,
carWashingConsts.bodyRectWidth, width,
carWashingConsts.bodyRectHeight carWashingConsts.bodyRectHeight
); );
this.rectBody.endFill(); this.rectBody.endFill();
this.stopText.text = '';
if (this.states.jtj) {
this.stopText.text = '紧';
this.stopText.style.fill = carWashingConsts.codeColor;
this.stopText.setVectorFontSize(carWashingConsts.codeFontSize);
this.stopText.anchor.set(0.5);
this.stopText.position.set(width / 2 + 20, -15);
}
let stateText = '';
if (this.states.xcjxj) {
stateText = '就绪';
} else if (this.states.xcyxj) {
stateText = '洗车';
} else if (this.states.tgyxj) {
stateText = '通过';
} else if (this.states.cfjList.length === 2) {
if (this.states.cfjList[1]) {
stateText = '尾部';
} else if (this.states.cfjList[0]) {
stateText = '头部';
}
} else if (this.states.cfjList.length === 3) {
if (this.states.cfjList[1]) {
stateText = '尾部';
} else if (this.states.cfjList[2]) {
stateText = '中部';
} else if (this.states.cfjList[0]) {
stateText = '头部';
}
}
this.stateText.text = stateText;
this.stateText.style.fill = carWashingConsts.codeColor;
this.stateText.setVectorFontSize(carWashingConsts.codeFontSize);
this.stateText.anchor.set(0.5);
this.stateText.position.set(width / 2 + 15, 15);
}
buildRelation() {
const sections = this.queryStore
.queryByType<Section>(Section.Type)
.filter((s) => s.datas.sectionType === SectionType.Physical);
let xj = false;
const se = sections.find((section) => {
const points = section.linePoints;
points.forEach((point, index) => {
if (index !== 0) {
xj =
linePoint(
section.localToCanvasPoint(points[index - 1]),
section.localToCanvasPoint(point),
this.localToCanvasPoint({ x: 0, y: 0 }),
8
) || xj;
}
});
return xj;
});
if (se) {
this.datas.linkSection = se.datas.id;
}
} }
} }
export class CarWashingTemplate extends JlGraphicTemplate<CarWashing> { export class CarWashingTemplate extends JlGraphicTemplate<CarWashing> {
constructor(dataTemplate: ICarWashingData) { constructor(dataTemplate: ICarWashingData, stateTemplate?: ICarWashingState) {
super(CarWashing.Type, { dataTemplate }); super(CarWashing.Type, { dataTemplate, stateTemplate });
} }
new(): CarWashing { new(): CarWashing {
const carWashing = new CarWashing(); const carWashing = new CarWashing();
carWashing.loadData(this.datas); carWashing.loadData(this.datas);
carWashing.loadState(this.states);
return carWashing; return carWashing;
} }
} }

View File

@ -1,4 +1,4 @@
import { DisplayObject, FederatedMouseEvent, Point } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent, Point, IHitArea } from 'pixi.js';
import { import {
AbsorbableLine, AbsorbableLine,
AbsorbablePosition, AbsorbablePosition,
@ -8,7 +8,13 @@ import {
IDrawApp, IDrawApp,
JlGraphic, JlGraphic,
} from 'jl-graphic'; } from 'jl-graphic';
import { CarWashing, CarWashingTemplate, ICarWashingData } from './CarWashing'; import {
CarWashing,
CarWashingTemplate,
ICarWashingData,
carWashingConsts,
} from './CarWashing';
import { Section } from '../section/Section';
export interface ICarWashingDataDrawOptions { export interface ICarWashingDataDrawOptions {
newData: () => ICarWashingData; newData: () => ICarWashingData;
@ -49,6 +55,7 @@ export class CarWashingDraw extends GraphicDrawAssistant<
prepareData(data: ICarWashingData): boolean { prepareData(data: ICarWashingData): boolean {
data.transform = this.container.saveTransform(); data.transform = this.container.saveTransform();
data.code = 'CarWash'; data.code = 'CarWash';
data.duanNum = 3;
return true; return true;
} }
} }
@ -60,28 +67,46 @@ function buildAbsorbablePositions(
carWashing: CarWashing carWashing: CarWashing
): AbsorbablePosition[] { ): AbsorbablePosition[] {
const aps: AbsorbablePosition[] = []; const aps: AbsorbablePosition[] = [];
const carWashings = carWashing.queryStore.queryByType<CarWashing>( const sections = carWashing.queryStore.queryByType<Section>(Section.Type);
CarWashing.Type sections.forEach((item) => {
); const p1 = item.localToCanvasPoint(item.getStartPoint());
const canvas = carWashing.getCanvas(); const p2 = item.localToCanvasPoint(item.getEndPoint());
carWashings.forEach((item) => {
if (item.id === carWashing.id) {
return;
}
const ala = new AbsorbableLine( const ala = new AbsorbableLine(
new Point(item.x, 0), new Point(p1.x, p1.y),
new Point(item.x, canvas.height) new Point(p2.x, p2.y)
);
const alb = new AbsorbableLine(
new Point(0, item.y),
new Point(canvas.width, item.y)
); );
aps.push(ala); aps.push(ala);
aps.push(alb);
}); });
return aps; return aps;
} }
export class CarWashingGraphicHitArea implements IHitArea {
carWashing: CarWashing;
constructor(carWashing: CarWashing) {
this.carWashing = carWashing;
}
contains(x: number, y: number): boolean {
const bound = this.carWashing.rectBody.getLocalBounds();
const maxX = bound.x + bound.width;
const minX = bound.x;
const maxY = bound.y + bound.height;
const minY = bound.y;
const flag1 = maxX >= x && x >= minX && maxY >= y && y >= minY;
const maxX1 = bound.x + bound.width - carWashingConsts.bodyRectLineWidth;
const minX1 = bound.x + carWashingConsts.bodyRectLineWidth;
const maxY1 = bound.y + bound.height - carWashingConsts.bodyRectLineWidth;
const minY1 = bound.y + carWashingConsts.bodyRectLineWidth;
const flag2 = maxX1 >= x && x >= minX1 && maxY1 >= y && y >= minY1;
const bound1 = this.carWashing.codeGraph.getLocalBounds();
const maxX2 = bound1.x + bound1.width;
const minX2 = bound1.x;
const maxY2 = bound1.y + bound1.height;
const minY2 = bound1.y;
const flag3 = maxX2 >= x && x >= minX2 && maxY2 >= y && y >= minY2;
return (flag1 && !flag2) || flag3;
}
}
export class CarWashingInteraction extends GraphicInteractionPlugin<CarWashing> { export class CarWashingInteraction extends GraphicInteractionPlugin<CarWashing> {
static Name = 'car_washing_transform'; static Name = 'car_washing_transform';
constructor(app: IDrawApp) { constructor(app: IDrawApp) {
@ -100,6 +125,8 @@ export class CarWashingInteraction extends GraphicInteractionPlugin<CarWashing>
g.cursor = 'pointer'; g.cursor = 'pointer';
g.scalable = true; g.scalable = true;
g.rotatable = true; g.rotatable = true;
g.rectBody.hitArea = new CarWashingGraphicHitArea(g);
g.codeGraph.cursor = 'pointer';
g.codeGraph.draggable = true; g.codeGraph.draggable = true;
g.codeGraph.selectable = true; g.codeGraph.selectable = true;
g.codeGraph.rotatable = true; g.codeGraph.rotatable = true;

View File

@ -42,7 +42,7 @@ const esbButtonConsts = {
export class EsbButton extends JlGraphic { export class EsbButton extends JlGraphic {
static Type = 'esbButton'; static Type = 'esbButton';
codeGraph: VectorText = new VectorText(''); codeGraph: VectorText = new VectorText('');
circleBody: Graphics = new Graphics(); textGraph: VectorText = new VectorText('E');
rectBody: Graphics = new Graphics(); rectBody: Graphics = new Graphics();
lineBody: Graphics = new Graphics(); lineBody: Graphics = new Graphics();
@ -51,7 +51,7 @@ export class EsbButton extends JlGraphic {
this.addChild(this.codeGraph); this.addChild(this.codeGraph);
this.addChild(this.rectBody); this.addChild(this.rectBody);
this.addChild(this.lineBody); this.addChild(this.lineBody);
this.addChild(this.circleBody); this.addChild(this.textGraph);
this.codeGraph.name = 'esb_code'; this.codeGraph.name = 'esb_code';
} }
get code(): string { get code(): string {
@ -80,15 +80,9 @@ export class EsbButton extends JlGraphic {
} else { } else {
codeGraph.position.set(-30, 0); codeGraph.position.set(-30, 0);
} }
this.circleBody.clear(); this.textGraph.style.fill = esbButtonConsts.codeColor;
this.circleBody.beginFill( this.textGraph.setVectorFontSize(esbButtonConsts.codeFontSize);
this.state.down this.textGraph.anchor.set(0.5);
? esbButtonConsts.pressedColor
: esbButtonConsts.bodyCircleColor,
1
);
this.circleBody.drawCircle(0, 0, esbButtonConsts.bodyCircleRadius);
this.circleBody.endFill();
this.rectBody.clear(); this.rectBody.clear();
this.rectBody.beginFill(esbButtonConsts.bodyColor, 0); this.rectBody.beginFill(esbButtonConsts.bodyColor, 0);
this.rectBody.lineStyle( this.rectBody.lineStyle(

View File

@ -1,10 +1,14 @@
import { Graphics } from 'pixi.js'; import { Graphics } from 'pixi.js';
import { import {
GraphicData, GraphicData,
GraphicState,
JlGraphic, JlGraphic,
JlGraphicTemplate, JlGraphicTemplate,
VectorText, VectorText,
linePoint,
} from 'jl-graphic'; } from 'jl-graphic';
import { request } from 'src/protos/request';
import { Section, SectionType } from '../section/Section';
export interface IFloodGateData extends GraphicData { export interface IFloodGateData extends GraphicData {
get code(): string; get code(): string;
@ -13,30 +17,52 @@ export interface IFloodGateData extends GraphicData {
set linkSection(v: number); set linkSection(v: number);
get centralizedStations(): number[]; get centralizedStations(): number[];
set centralizedStations(v: number[]); set centralizedStations(v: number[]);
get refPslMapCode(): string;
set refPslMapCode(v: string);
clone(): IFloodGateData; clone(): IFloodGateData;
copyFrom(data: IFloodGateData): void; copyFrom(data: IFloodGateData): void;
eq(other: IFloodGateData): boolean; eq(other: IFloodGateData): boolean;
} }
const floodGateConsts = { export interface IFloodGateState extends GraphicState {
get id(): number;
set id(v: number);
get mgj(): boolean; //防淹门关闭继电器
set mgj(v: boolean);
get param(): request.CkmParam;
set param(v: request.CkmParam);
get local(): boolean;
set local(v: boolean);
get mplj(): boolean;
set mplj(v: boolean);
}
const garageConsts = {
codeFontSize: 12, codeFontSize: 12,
codeColor: 0xffffff, codeColor: 0xffffff,
bodyLineColor: 0xffffff, bodyLineColor: 0xffffff,
lossStateColor: 0x0000ff,
localStateColor: 0x00ff00,
bodyLineWidth: 2, bodyLineWidth: 2,
bodyColor: 0x000000, bodyColor: 0x000000,
bodyRectWidth: 10, bodyRectWidth: 10,
bodyRectHeight: 20, bodyRectHeight: 20,
rectButtonWidth: 10,
rectColor: 0xffffff,
}; };
export class FloodGate extends JlGraphic { export class FloodGate extends JlGraphic {
static Type = 'floodGate'; static Type = 'floodGate';
codeGraph: VectorText = new VectorText(''); codeGraph: VectorText = new VectorText('');
lineBody: Graphics = new Graphics(); lineBody: Graphics = new Graphics();
rectBody: Graphics = new Graphics();
constructor() { constructor() {
super(FloodGate.Type); super(FloodGate.Type);
this.addChild(this.codeGraph); this.addChild(this.codeGraph);
this.addChild(this.lineBody); this.addChild(this.lineBody);
this.addChild(this.rectBody);
this.codeGraph.name = 'flood_code'; this.codeGraph.name = 'flood_code';
this.rectBody.name = 'flood_rect_body';
} }
get code(): string { get code(): string {
return this.datas.code; return this.datas.code;
@ -44,11 +70,15 @@ export class FloodGate extends JlGraphic {
get datas(): IFloodGateData { get datas(): IFloodGateData {
return this.getDatas<IFloodGateData>(); return this.getDatas<IFloodGateData>();
} }
get states(): IFloodGateState {
return this.getStates<IFloodGateState>();
}
doRepaint(): void { doRepaint(): void {
const codeGraph = this.codeGraph; const codeGraph = this.codeGraph;
codeGraph.text = this.datas.code; codeGraph.text = this.datas.code;
codeGraph.style.fill = floodGateConsts.codeColor; codeGraph.style.fill = garageConsts.codeColor;
codeGraph.setVectorFontSize(floodGateConsts.codeFontSize); codeGraph.setVectorFontSize(garageConsts.codeFontSize);
codeGraph.anchor.set(0.5); codeGraph.anchor.set(0.5);
const codeTransform = this.datas?.childTransforms?.find( const codeTransform = this.datas?.childTransforms?.find(
(item) => item.name === 'flood_code' (item) => item.name === 'flood_code'
@ -62,38 +92,94 @@ export class FloodGate extends JlGraphic {
codeGraph.position.set(0, -30); codeGraph.position.set(0, -30);
} }
this.lineBody.clear(); this.lineBody.clear();
this.lineBody.lineStyle( let color = garageConsts.bodyLineColor;
floodGateConsts.bodyLineWidth, if (this.states.local) {
floodGateConsts.bodyLineColor color = garageConsts.localStateColor;
); }
if (this.states.param?.fault === request.Ckm.Fault.FA_State_Loss) {
color = garageConsts.lossStateColor;
}
this.lineBody.lineStyle(garageConsts.bodyLineWidth, color);
this.lineBody.moveTo( this.lineBody.moveTo(
-floodGateConsts.bodyRectWidth / 2, -garageConsts.bodyRectWidth / 2,
-floodGateConsts.bodyRectHeight / 2 -garageConsts.bodyRectHeight / 2
); );
this.lineBody.lineTo( this.lineBody.lineTo(
floodGateConsts.bodyRectWidth / 2, garageConsts.bodyRectWidth / 2,
-floodGateConsts.bodyRectHeight / 2 -garageConsts.bodyRectHeight / 2
); );
this.lineBody.moveTo( this.lineBody.moveTo(
-floodGateConsts.bodyRectWidth / 2, -garageConsts.bodyRectWidth / 2,
floodGateConsts.bodyRectHeight / 2 garageConsts.bodyRectHeight / 2
); );
this.lineBody.lineTo( this.lineBody.lineTo(
floodGateConsts.bodyRectWidth / 2, garageConsts.bodyRectWidth / 2,
floodGateConsts.bodyRectHeight / 2 garageConsts.bodyRectHeight / 2
); );
this.lineBody.moveTo(0, -floodGateConsts.bodyRectHeight / 2); if (this.states.mgj) {
this.lineBody.lineTo(0, floodGateConsts.bodyRectHeight / 2); this.lineBody.moveTo(0, -garageConsts.bodyRectHeight / 2);
this.lineBody.lineTo(0, garageConsts.bodyRectHeight / 2);
} else {
this.lineBody.moveTo(0, -garageConsts.bodyRectHeight / 2);
this.lineBody.lineTo(0, -garageConsts.bodyRectHeight / 4);
this.lineBody.moveTo(0, garageConsts.bodyRectHeight / 4);
this.lineBody.lineTo(0, garageConsts.bodyRectHeight / 2);
}
this.rectBody.clear();
this.rectBody.beginFill(garageConsts.rectColor, 1);
// this.rectBody.lineStyle(1, garageConsts.rectColor);
this.rectBody.drawRect(
-garageConsts.bodyRectWidth / 2,
garageConsts.bodyRectHeight / 2 + 3,
garageConsts.rectButtonWidth,
garageConsts.rectButtonWidth
);
this.rectBody.endFill();
const rectTransform = this.datas?.childTransforms?.find(
(item) => item.name === 'flood_rect_body'
);
if (rectTransform) {
const position = rectTransform?.transform.position;
const rotation = rectTransform?.transform?.rotation;
this.rectBody.position.set(position?.x, position?.y);
this.rectBody.rotation = rotation || 0;
}
}
buildRelation() {
const sections = this.queryStore
.queryByType<Section>(Section.Type)
.filter((s) => s.datas.sectionType === SectionType.Physical);
let xj = false;
const se = sections.find((section) => {
const points = section.linePoints;
points.forEach((point, index) => {
if (index !== 0) {
xj =
linePoint(
section.localToCanvasPoint(points[index - 1]),
section.localToCanvasPoint(point),
this.localToCanvasPoint({ x: 0, y: 0 }),
8
) || xj;
}
});
return xj;
});
if (se) {
this.datas.linkSection = se.datas.id;
}
} }
} }
export class FloodGateTemplate extends JlGraphicTemplate<FloodGate> { export class FloodGateTemplate extends JlGraphicTemplate<FloodGate> {
constructor(dataTemplate: IFloodGateData) { constructor(dataTemplate: IFloodGateData, stateTemplate?: IFloodGateState) {
super(FloodGate.Type, { dataTemplate }); super(FloodGate.Type, { dataTemplate, stateTemplate });
} }
new(): FloodGate { new(): FloodGate {
const floodGate = new FloodGate(); const floodGate = new FloodGate();
floodGate.loadData(this.datas); floodGate.loadData(this.datas);
floodGate.loadState(this.states);
return floodGate; return floodGate;
} }
} }

View File

@ -1,4 +1,4 @@
import { DisplayObject, FederatedMouseEvent, Point } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent, Point, IHitArea } from 'pixi.js';
import { import {
AbsorbableLine, AbsorbableLine,
AbsorbablePosition, AbsorbablePosition,
@ -80,6 +80,21 @@ function buildAbsorbablePositions(floodGate: FloodGate): AbsorbablePosition[] {
return aps; return aps;
} }
export class FloodGateGraphicHitArea implements IHitArea {
floodGate: FloodGate;
constructor(floodGate: FloodGate) {
this.floodGate = floodGate;
}
contains(x: number, y: number): boolean {
const bound = this.floodGate.getLocalBounds();
const maxX = bound.x + bound.width;
const minX = bound.x;
const maxY = bound.y + bound.height;
const minY = bound.y;
return maxX >= x && x >= minX && maxY >= y && y >= minY;
}
}
export class FloodGateInteraction extends GraphicInteractionPlugin<FloodGate> { export class FloodGateInteraction extends GraphicInteractionPlugin<FloodGate> {
static Name = 'flood_gate_transform'; static Name = 'flood_gate_transform';
constructor(app: IDrawApp) { constructor(app: IDrawApp) {
@ -98,11 +113,17 @@ export class FloodGateInteraction extends GraphicInteractionPlugin<FloodGate> {
g.cursor = 'pointer'; g.cursor = 'pointer';
g.scalable = true; g.scalable = true;
g.rotatable = true; g.rotatable = true;
g.hitArea = new FloodGateGraphicHitArea(g);
g.codeGraph.draggable = true; g.codeGraph.draggable = true;
g.codeGraph.selectable = true; g.codeGraph.selectable = true;
g.codeGraph.rotatable = true; g.codeGraph.rotatable = true;
g.codeGraph.transformSave = true; g.codeGraph.transformSave = true;
g.codeGraph.eventMode = 'static'; g.codeGraph.eventMode = 'static';
g.rectBody.draggable = true;
g.rectBody.selectable = true;
g.rectBody.rotatable = true;
g.rectBody.transformSave = true;
g.rectBody.eventMode = 'static';
g.on('transformstart', this.transformstart, this); g.on('transformstart', this.transformstart, this);
} }
unbind(g: FloodGate): void { unbind(g: FloodGate): void {
@ -114,6 +135,11 @@ export class FloodGateInteraction extends GraphicInteractionPlugin<FloodGate> {
g.codeGraph.rotatable = false; g.codeGraph.rotatable = false;
g.codeGraph.transformSave = false; g.codeGraph.transformSave = false;
g.codeGraph.eventMode = 'none'; g.codeGraph.eventMode = 'none';
g.rectBody.draggable = false;
g.rectBody.selectable = false;
g.rectBody.rotatable = false;
g.rectBody.transformSave = false;
g.rectBody.eventMode = 'none';
g.off('transformstart', this.transformstart, this); g.off('transformstart', this.transformstart, this);
} }
transformstart(e: GraphicTransformEvent) { transformstart(e: GraphicTransformEvent) {

View File

@ -1,10 +1,14 @@
import { Graphics } from 'pixi.js'; import { Graphics } from 'pixi.js';
import { import {
GraphicData, GraphicData,
GraphicState,
JlGraphic, JlGraphic,
JlGraphicTemplate, JlGraphicTemplate,
VectorText, VectorText,
linePoint,
} from 'jl-graphic'; } from 'jl-graphic';
import { request } from 'src/protos/request';
import { Section, SectionType } from '../section/Section';
export interface IGarageDoorData extends GraphicData { export interface IGarageDoorData extends GraphicData {
get code(): string; get code(): string;
@ -13,30 +17,52 @@ export interface IGarageDoorData extends GraphicData {
set linkSection(v: number); set linkSection(v: number);
get centralizedStations(): number[]; get centralizedStations(): number[];
set centralizedStations(v: number[]); set centralizedStations(v: number[]);
get refPslMapCode(): string;
set refPslMapCode(v: string);
clone(): IGarageDoorData; clone(): IGarageDoorData;
copyFrom(data: IGarageDoorData): void; copyFrom(data: IGarageDoorData): void;
eq(other: IGarageDoorData): boolean; eq(other: IGarageDoorData): boolean;
} }
export interface IGarageDoorState extends GraphicState {
get id(): number;
set id(v: number);
get mgj(): boolean; //车库门关闭继电器
set mgj(v: boolean);
get param(): request.CkmParam;
set param(v: request.CkmParam);
get local(): boolean;
set local(v: boolean);
get mplj(): boolean;
set mplj(v: boolean);
}
const garageConsts = { const garageConsts = {
codeFontSize: 12, codeFontSize: 12,
codeColor: 0xffffff, codeColor: 0xffffff,
bodyLineColor: 0x0000ff, bodyLineColor: 0xffffff,
lossStateColor: 0x0000ff,
localStateColor: 0x00ff00,
bodyLineWidth: 2, bodyLineWidth: 2,
bodyColor: 0x000000, bodyColor: 0x000000,
bodyRectWidth: 10, bodyRectWidth: 10,
bodyRectHeight: 20, bodyRectHeight: 20,
rectButtonWidth: 10,
rectColor: 0xffffff,
}; };
export class GarageDoor extends JlGraphic { export class GarageDoor extends JlGraphic {
static Type = 'garageDoor'; static Type = 'garageDoor';
codeGraph: VectorText = new VectorText(''); codeGraph: VectorText = new VectorText('');
lineBody: Graphics = new Graphics(); lineBody: Graphics = new Graphics();
rectBody: Graphics = new Graphics();
constructor() { constructor() {
super(GarageDoor.Type); super(GarageDoor.Type);
this.addChild(this.codeGraph); this.addChild(this.codeGraph);
this.addChild(this.lineBody); this.addChild(this.lineBody);
this.addChild(this.rectBody);
this.codeGraph.name = 'garage_code'; this.codeGraph.name = 'garage_code';
this.rectBody.name = 'garage_rect_body';
} }
get code(): string { get code(): string {
return this.datas.code; return this.datas.code;
@ -44,6 +70,10 @@ export class GarageDoor extends JlGraphic {
get datas(): IGarageDoorData { get datas(): IGarageDoorData {
return this.getDatas<IGarageDoorData>(); return this.getDatas<IGarageDoorData>();
} }
get states(): IGarageDoorState {
return this.getStates<IGarageDoorState>();
}
doRepaint(): void { doRepaint(): void {
const codeGraph = this.codeGraph; const codeGraph = this.codeGraph;
codeGraph.text = this.datas.code; codeGraph.text = this.datas.code;
@ -62,10 +92,14 @@ export class GarageDoor extends JlGraphic {
codeGraph.position.set(0, -30); codeGraph.position.set(0, -30);
} }
this.lineBody.clear(); this.lineBody.clear();
this.lineBody.lineStyle( let color = garageConsts.bodyLineColor;
garageConsts.bodyLineWidth, if (this.states.local) {
garageConsts.bodyLineColor color = garageConsts.localStateColor;
); }
if (this.states.param?.fault === request.Ckm.Fault.FA_State_Loss) {
color = garageConsts.lossStateColor;
}
this.lineBody.lineStyle(garageConsts.bodyLineWidth, color);
this.lineBody.moveTo( this.lineBody.moveTo(
-garageConsts.bodyRectWidth / 2, -garageConsts.bodyRectWidth / 2,
-garageConsts.bodyRectHeight / 2 -garageConsts.bodyRectHeight / 2
@ -82,18 +116,70 @@ export class GarageDoor extends JlGraphic {
garageConsts.bodyRectWidth / 2, garageConsts.bodyRectWidth / 2,
garageConsts.bodyRectHeight / 2 garageConsts.bodyRectHeight / 2
); );
if (this.states.mgj) {
this.lineBody.moveTo(0, -garageConsts.bodyRectHeight / 2); this.lineBody.moveTo(0, -garageConsts.bodyRectHeight / 2);
this.lineBody.lineTo(0, garageConsts.bodyRectHeight / 2); this.lineBody.lineTo(0, garageConsts.bodyRectHeight / 2);
} else {
this.lineBody.moveTo(0, -garageConsts.bodyRectHeight / 2);
this.lineBody.lineTo(0, -garageConsts.bodyRectHeight / 4);
this.lineBody.moveTo(0, garageConsts.bodyRectHeight / 4);
this.lineBody.lineTo(0, garageConsts.bodyRectHeight / 2);
}
this.rectBody.clear();
this.rectBody.beginFill(garageConsts.rectColor, 1);
// this.rectBody.lineStyle(1, garageConsts.rectColor);
this.rectBody.drawRect(
-garageConsts.bodyRectWidth / 2,
garageConsts.bodyRectHeight / 2 + 3,
garageConsts.rectButtonWidth,
garageConsts.rectButtonWidth
);
this.rectBody.endFill();
const rectTransform = this.datas?.childTransforms?.find(
(item) => item.name === 'garage_rect_body'
);
if (rectTransform) {
const position = rectTransform?.transform.position;
const rotation = rectTransform?.transform?.rotation;
this.rectBody.position.set(position?.x, position?.y);
this.rectBody.rotation = rotation || 0;
}
}
buildRelation() {
const sections = this.queryStore
.queryByType<Section>(Section.Type)
.filter((s) => s.datas.sectionType === SectionType.Physical);
let xj = false;
const se = sections.find((section) => {
const points = section.linePoints;
points.forEach((point, index) => {
if (index !== 0) {
xj =
linePoint(
section.localToCanvasPoint(points[index - 1]),
section.localToCanvasPoint(point),
this.localToCanvasPoint({ x: 0, y: 0 }),
8
) || xj;
}
});
return xj;
});
if (se) {
this.datas.linkSection = se.datas.id;
}
} }
} }
export class GarageDoorTemplate extends JlGraphicTemplate<GarageDoor> { export class GarageDoorTemplate extends JlGraphicTemplate<GarageDoor> {
constructor(dataTemplate: IGarageDoorData) { constructor(dataTemplate: IGarageDoorData, stateTemplate?: IGarageDoorState) {
super(GarageDoor.Type, { dataTemplate }); super(GarageDoor.Type, { dataTemplate, stateTemplate });
} }
new(): GarageDoor { new(): GarageDoor {
const garageDoor = new GarageDoor(); const garageDoor = new GarageDoor();
garageDoor.loadData(this.datas); garageDoor.loadData(this.datas);
garageDoor.loadState(this.states);
return garageDoor; return garageDoor;
} }
} }

View File

@ -1,4 +1,4 @@
import { DisplayObject, FederatedMouseEvent, Point } from 'pixi.js'; import { DisplayObject, FederatedMouseEvent, Point, IHitArea } from 'pixi.js';
import { import {
AbsorbableLine, AbsorbableLine,
AbsorbablePosition, AbsorbablePosition,
@ -82,6 +82,21 @@ function buildAbsorbablePositions(
return aps; return aps;
} }
export class GarageDoorGraphicHitArea implements IHitArea {
garageDoor: GarageDoor;
constructor(garageDoor: GarageDoor) {
this.garageDoor = garageDoor;
}
contains(x: number, y: number): boolean {
const bound = this.garageDoor.getLocalBounds();
const maxX = bound.x + bound.width;
const minX = bound.x;
const maxY = bound.y + bound.height;
const minY = bound.y;
return maxX >= x && x >= minX && maxY >= y && y >= minY;
}
}
export class GarageDoorInteraction extends GraphicInteractionPlugin<GarageDoor> { export class GarageDoorInteraction extends GraphicInteractionPlugin<GarageDoor> {
static Name = 'garage_door_transform'; static Name = 'garage_door_transform';
constructor(app: IDrawApp) { constructor(app: IDrawApp) {
@ -100,11 +115,17 @@ export class GarageDoorInteraction extends GraphicInteractionPlugin<GarageDoor>
g.cursor = 'pointer'; g.cursor = 'pointer';
g.scalable = true; g.scalable = true;
g.rotatable = true; g.rotatable = true;
g.hitArea = new GarageDoorGraphicHitArea(g);
g.codeGraph.draggable = true; g.codeGraph.draggable = true;
g.codeGraph.selectable = true; g.codeGraph.selectable = true;
g.codeGraph.rotatable = true; g.codeGraph.rotatable = true;
g.codeGraph.transformSave = true; g.codeGraph.transformSave = true;
g.codeGraph.eventMode = 'static'; g.codeGraph.eventMode = 'static';
g.rectBody.draggable = true;
g.rectBody.selectable = true;
g.rectBody.rotatable = true;
g.rectBody.transformSave = true;
g.rectBody.eventMode = 'static';
g.on('transformstart', this.transformstart, this); g.on('transformstart', this.transformstart, this);
} }
unbind(g: GarageDoor): void { unbind(g: GarageDoor): void {
@ -116,6 +137,11 @@ export class GarageDoorInteraction extends GraphicInteractionPlugin<GarageDoor>
g.codeGraph.rotatable = false; g.codeGraph.rotatable = false;
g.codeGraph.transformSave = false; g.codeGraph.transformSave = false;
g.codeGraph.eventMode = 'none'; g.codeGraph.eventMode = 'none';
g.rectBody.draggable = false;
g.rectBody.selectable = false;
g.rectBody.rotatable = false;
g.rectBody.transformSave = false;
g.rectBody.eventMode = 'none';
g.off('transformstart', this.transformstart, this); g.off('transformstart', this.transformstart, this);
} }
transformstart(e: GraphicTransformEvent) { transformstart(e: GraphicTransformEvent) {

View File

@ -1,110 +0,0 @@
import { Graphics } from 'pixi.js';
import {
GraphicData,
JlGraphic,
JlGraphicTemplate,
VectorText,
} from 'jl-graphic';
export interface IGarageDoorBox extends GraphicData {
get code(): string;
set code(v: string);
get flip(): boolean;
set flip(v: boolean);
get refGarageDoorId(): number;
set refGarageDoorId(v: number);
get refPslMapCode(): string;
set refPslMapCode(v: string);
clone(): IGarageDoorBox;
copyFrom(data: IGarageDoorBox): void;
eq(other: IGarageDoorBox): boolean;
}
const garageDoorBoxConsts = {
codeFontSize: 12,
codeColor: 0xffffff,
bodyLineColor: 0xffffff,
bodyLineWidth: 4,
bodyRectLineColor: 0xffffff,
bodyRectLineWidth: 2,
bodyRectWidth: 20,
bodyRectHeight: 20,
bodyColor: 0x000000,
};
export class GarageDoorBox extends JlGraphic {
static Type = 'garageDoorBox';
codeGraph: VectorText = new VectorText('');
rectBody: Graphics = new Graphics();
lineBody: Graphics = new Graphics();
textGraph: VectorText = new VectorText('G');
constructor() {
super(GarageDoorBox.Type);
this.addChild(this.codeGraph);
this.addChild(this.rectBody);
this.addChild(this.lineBody);
this.addChild(this.textGraph);
this.codeGraph.name = 'g_d_b_code';
}
get code(): string {
return this.datas.code;
}
get datas(): IGarageDoorBox {
return this.getDatas<IGarageDoorBox>();
}
doRepaint(): void {
const codeGraph = this.codeGraph;
codeGraph.text = this.datas.code;
codeGraph.style.fill = garageDoorBoxConsts.codeColor;
codeGraph.setVectorFontSize(garageDoorBoxConsts.codeFontSize);
const codeTransform = this.datas?.childTransforms?.find(
(item) => item.name === 'g_d_b_code'
);
if (codeTransform) {
const position = codeTransform?.transform.position;
const rotation = codeTransform?.transform?.rotation;
codeGraph.position.set(position?.x, position?.y);
codeGraph.rotation = rotation || 0;
} else {
codeGraph.position.set(20, 0);
}
codeGraph.anchor.set(0.5);
this.textGraph.style.fill = garageDoorBoxConsts.codeColor;
this.textGraph.setVectorFontSize(garageDoorBoxConsts.codeFontSize);
this.textGraph.anchor.set(0.5);
this.rectBody.clear();
this.rectBody.beginFill(garageDoorBoxConsts.bodyColor, 0);
this.rectBody.lineStyle(
garageDoorBoxConsts.bodyRectLineWidth,
garageDoorBoxConsts.bodyRectLineColor
);
this.rectBody.drawRect(
-garageDoorBoxConsts.bodyRectWidth / 2,
-garageDoorBoxConsts.bodyRectHeight / 2,
garageDoorBoxConsts.bodyRectWidth,
garageDoorBoxConsts.bodyRectHeight
);
this.rectBody.endFill();
this.lineBody.clear();
const lineY = this.datas.flip
? garageDoorBoxConsts.bodyRectHeight / 2
: -garageDoorBoxConsts.bodyRectHeight / 2;
this.lineBody.lineStyle(
garageDoorBoxConsts.bodyLineWidth,
garageDoorBoxConsts.bodyLineColor
);
this.lineBody.moveTo(-garageDoorBoxConsts.bodyRectWidth / 2, lineY);
this.lineBody.lineTo(garageDoorBoxConsts.bodyRectWidth / 2, lineY);
}
}
export class GarageDoorBoxTemplate extends JlGraphicTemplate<GarageDoorBox> {
constructor(dataTemplate: IGarageDoorBox) {
super(GarageDoorBox.Type, { dataTemplate });
}
new(): GarageDoorBox {
const garageDoorBox = new GarageDoorBox();
garageDoorBox.loadData(this.datas);
return garageDoorBox;
}
}

View File

@ -0,0 +1,102 @@
import { Graphics } from 'pixi.js';
import {
GraphicData,
JlGraphic,
JlGraphicTemplate,
VectorText,
} from 'jl-graphic';
export interface IHoldButtonData extends GraphicData {
get code(): string;
set code(v: string);
get flip(): boolean;
set flip(v: boolean);
get refStand(): number;
set refStand(v: number);
}
const holdButtonConsts = {
codeFontSize: 12,
codeColor: 0xffffff,
bodyLineColor: 0xffffff,
bodyLineWidth: 4,
bodyRectLineColor: 0xffffff,
bodyRectLineWidth: 2,
bodyRectWidth: 20,
bodyRectHeight: 20,
bodyColor: 0x000000,
};
export class HoldButton extends JlGraphic {
static Type = 'holdButton';
codeGraph: VectorText = new VectorText('');
rectBody: Graphics = new Graphics();
lineBody: Graphics = new Graphics();
textGraph: VectorText = new VectorText('H');
constructor() {
super(HoldButton.Type);
this.addChild(this.codeGraph);
this.addChild(this.rectBody);
this.addChild(this.lineBody);
this.addChild(this.textGraph);
this.codeGraph.name = 'hold_button_code';
}
get datas(): IHoldButtonData {
return this.getDatas<IHoldButtonData>();
}
doRepaint(): void {
const codeGraph = this.codeGraph;
codeGraph.text = this.datas.code;
codeGraph.style.fill = holdButtonConsts.codeColor;
codeGraph.setVectorFontSize(holdButtonConsts.codeFontSize);
const codeTransform = this.datas?.childTransforms?.find(
(item) => item.name === 'hold_button_code'
);
if (codeTransform) {
const position = codeTransform?.transform.position;
const rotation = codeTransform?.transform?.rotation;
codeGraph.position.set(position?.x, position?.y);
codeGraph.rotation = rotation || 0;
} else {
codeGraph.position.set(20, 0);
}
codeGraph.anchor.set(0.5);
this.textGraph.style.fill = holdButtonConsts.codeColor;
this.textGraph.setVectorFontSize(holdButtonConsts.codeFontSize);
this.textGraph.anchor.set(0.5);
this.rectBody.clear();
this.rectBody.beginFill(holdButtonConsts.bodyColor, 0);
this.rectBody.lineStyle(
holdButtonConsts.bodyRectLineWidth,
holdButtonConsts.bodyRectLineColor
);
this.rectBody.drawRect(
-holdButtonConsts.bodyRectWidth / 2,
-holdButtonConsts.bodyRectHeight / 2,
holdButtonConsts.bodyRectWidth,
holdButtonConsts.bodyRectHeight
);
this.rectBody.endFill();
this.lineBody.clear();
const lineY = this.datas.flip
? holdButtonConsts.bodyRectHeight / 2
: -holdButtonConsts.bodyRectHeight / 2;
this.lineBody.lineStyle(
holdButtonConsts.bodyLineWidth,
holdButtonConsts.bodyLineColor
);
this.lineBody.moveTo(-holdButtonConsts.bodyRectWidth / 2, lineY);
this.lineBody.lineTo(holdButtonConsts.bodyRectWidth / 2, lineY);
}
}
export class HoldButtonTemplate extends JlGraphicTemplate<HoldButton> {
constructor(dataTemplate: IHoldButtonData) {
super(HoldButton.Type, { dataTemplate });
}
new(): HoldButton {
const holdButton = new HoldButton();
holdButton.loadData(this.datas);
return holdButton;
}
}

View File

@ -8,36 +8,32 @@ import {
IDrawApp, IDrawApp,
JlGraphic, JlGraphic,
} from 'jl-graphic'; } from 'jl-graphic';
import { import { IHoldButtonData, HoldButton, HoldButtonTemplate } from './HoldButton';
GarageDoorBox,
GarageDoorBoxTemplate,
IGarageDoorBox,
} from './GarageDoorBox';
export interface IGarageDoorBoxDrawOptions { export interface IHoldButtonDataDrawOptions {
newData: () => IGarageDoorBox; newData: () => IHoldButtonData;
} }
export class GarageDoorBoxDraw extends GraphicDrawAssistant< export class HoldButtonDraw extends GraphicDrawAssistant<
GarageDoorBoxTemplate, HoldButtonTemplate,
IGarageDoorBox IHoldButtonData
> { > {
_garageDoorBox: GarageDoorBox | null = null; _holdButton: HoldButton | null = null;
constructor(app: IDrawApp, template: GarageDoorBoxTemplate) { constructor(app: IDrawApp, template: HoldButtonTemplate) {
super( super(
app, app,
template, template,
'svguse:../../drawIcon.svg#icon-garage-door-box', 'svguse:../../drawIcon.svg#icon-hold-button',
'设置车库门GarageDoorBox' '扣车按钮HoldButton'
); );
GarageDoorBoxInteraction.init(app); HoldButtonInteraction.init(app);
} }
public get garageDoorBox(): GarageDoorBox { public get holdButton(): HoldButton {
if (!this._garageDoorBox) { if (!this._holdButton) {
this._garageDoorBox = this.graphicTemplate.new(); this._holdButton = this.graphicTemplate.new();
this._garageDoorBox.loadData(this.graphicTemplate.datas); this._holdButton.loadData(this.graphicTemplate.datas);
this.container.addChild(this._garageDoorBox); this.container.addChild(this._holdButton);
} }
return this._garageDoorBox; return this._holdButton;
} }
onLeftUp(e: FederatedMouseEvent): void { onLeftUp(e: FederatedMouseEvent): void {
@ -46,30 +42,30 @@ export class GarageDoorBoxDraw extends GraphicDrawAssistant<
} }
redraw(p: Point): void { redraw(p: Point): void {
this.garageDoorBox.repaint(); this.holdButton.repaint();
this.container.position.set(p.x, p.y); this.container.position.set(p.x, p.y);
} }
prepareData(data: IGarageDoorBox): boolean { prepareData(data: IHoldButtonData): boolean {
data.transform = this.container.saveTransform(); data.transform = this.container.saveTransform();
data.code = 'G'; data.code = 'H';
return true; return true;
} }
} }
/** /**
* 线 * 线
* @param garageDoorBox * @param holdButton
*/ */
function buildAbsorbablePositions( function buildAbsorbablePositions(
garageDoorBox: GarageDoorBox holdButton: HoldButton
): AbsorbablePosition[] { ): AbsorbablePosition[] {
const aps: AbsorbablePosition[] = []; const aps: AbsorbablePosition[] = [];
const garageDoorBoxs = garageDoorBox.queryStore.queryByType<GarageDoorBox>( const holdButtons = holdButton.queryStore.queryByType<HoldButton>(
GarageDoorBox.Type HoldButton.Type
); );
const canvas = garageDoorBox.getCanvas(); const canvas = holdButton.getCanvas();
garageDoorBoxs.forEach((item) => { holdButtons.forEach((item) => {
if (item.id === garageDoorBox.id) { if (item.id === holdButton.id) {
return; return;
} }
const ala = new AbsorbableLine( const ala = new AbsorbableLine(
@ -86,20 +82,20 @@ function buildAbsorbablePositions(
return aps; return aps;
} }
export class GarageDoorBoxInteraction extends GraphicInteractionPlugin<GarageDoorBox> { export class HoldButtonInteraction extends GraphicInteractionPlugin<HoldButton> {
static Name = 'garage_door_box_transform'; static Name = 'hold_button_transform';
constructor(app: IDrawApp) { constructor(app: IDrawApp) {
super(GarageDoorBoxInteraction.Name, app); super(HoldButtonInteraction.Name, app);
} }
static init(app: IDrawApp) { static init(app: IDrawApp) {
return new GarageDoorBoxInteraction(app); return new HoldButtonInteraction(app);
} }
filter(...grahpics: JlGraphic[]): GarageDoorBox[] | undefined { filter(...grahpics: JlGraphic[]): HoldButton[] | undefined {
return grahpics return grahpics
.filter((g) => g.type === GarageDoorBox.Type) .filter((g) => g.type === HoldButton.Type)
.map((g) => g as GarageDoorBox); .map((g) => g as HoldButton);
} }
bind(g: GarageDoorBox): void { bind(g: HoldButton): void {
g.eventMode = 'static'; g.eventMode = 'static';
g.cursor = 'pointer'; g.cursor = 'pointer';
g.scalable = true; g.scalable = true;
@ -111,7 +107,7 @@ export class GarageDoorBoxInteraction extends GraphicInteractionPlugin<GarageDoo
g.codeGraph.eventMode = 'static'; g.codeGraph.eventMode = 'static';
g.on('transformstart', this.transformstart, this); g.on('transformstart', this.transformstart, this);
} }
unbind(g: GarageDoorBox): void { unbind(g: HoldButton): void {
g.eventMode = 'none'; g.eventMode = 'none';
g.scalable = false; g.scalable = false;
g.rotatable = false; g.rotatable = false;
@ -124,9 +120,9 @@ export class GarageDoorBoxInteraction extends GraphicInteractionPlugin<GarageDoo
} }
transformstart(e: GraphicTransformEvent) { transformstart(e: GraphicTransformEvent) {
const target = e.target as DisplayObject; const target = e.target as DisplayObject;
const garageDoorBox = target.getGraphic() as GarageDoorBox; const holdButton = target.getGraphic() as HoldButton;
garageDoorBox.getGraphicApp().setOptions({ holdButton.getGraphicApp().setOptions({
absorbablePositions: buildAbsorbablePositions(garageDoorBox), absorbablePositions: buildAbsorbablePositions(holdButton),
}); });
} }
} }

View File

@ -16,7 +16,7 @@ export interface IIbpBoxDrawOptions {
export class IbpBoxDraw extends GraphicDrawAssistant<IbpBoxTemplate, IIbpBox> { export class IbpBoxDraw extends GraphicDrawAssistant<IbpBoxTemplate, IIbpBox> {
_gatedBox: IbpBox | null = null; _gatedBox: IbpBox | null = null;
constructor(app: IDrawApp, template: IbpBoxTemplate) { constructor(app: IDrawApp, template: IbpBoxTemplate) {
super(app, template, 'svguse:../../drawIcon.svg#icon-spks-switch', 'Ibp'); super(app, template, 'svguse:../../drawIcon.svg#icon-ibp-box', 'Ibp');
IbpBoxInteraction.init(app); IbpBoxInteraction.init(app);
} }
public get gatedBox(): IbpBox { public get gatedBox(): IbpBox {

View File

@ -31,6 +31,8 @@ export interface IPslButtonState extends GraphicState {
set code(v: string); set code(v: string);
get down(): boolean; get down(): boolean;
set down(v: boolean); set down(v: boolean);
get active(): boolean;
set active(v: boolean);
} }
export class PslButton extends JlGraphic { export class PslButton extends JlGraphic {

View File

@ -12,6 +12,10 @@ export interface IRelayData extends GraphicData {
set code(v: string); set code(v: string);
get newModel(): relayCabinetGraphicData.Relay.ModelType; // 型号 get newModel(): relayCabinetGraphicData.Relay.ModelType; // 型号
set newModel(v: relayCabinetGraphicData.Relay.ModelType); set newModel(v: relayCabinetGraphicData.Relay.ModelType);
get showCode(): string; // 展示的编号
set showCode(v: string);
get defaultInitialPosition(): relayCabinetGraphicData.CjDataItem.PostionType; // 默认初始位置
set defaultInitialPosition(v: relayCabinetGraphicData.CjDataItem.PostionType);
clone(): IRelayData; clone(): IRelayData;
copyFrom(data: IRelayData): void; copyFrom(data: IRelayData): void;
eq(other: IRelayData): boolean; eq(other: IRelayData): boolean;
@ -57,7 +61,11 @@ export class Relay extends JlGraphic {
} }
doRepaint(): void { doRepaint(): void {
if (this.datas.showCode) {
this.labelGraphic.text = this.datas.showCode;
} else {
this.labelGraphic.text = this.datas.code; this.labelGraphic.text = this.datas.code;
}
this.labelGraphic.position.set(0, 20); this.labelGraphic.position.set(0, 20);
this.refDevice.position.set(0, -20); this.refDevice.position.set(0, -20);
const relayGraphic = this.relayGraphic; const relayGraphic = this.relayGraphic;

View File

@ -9,6 +9,7 @@ import {
} from 'jl-graphic'; } from 'jl-graphic';
import { IRelayData, Relay, RelayTemplate } from './Relay'; import { IRelayData, Relay, RelayTemplate } from './Relay';
import { relayCabinetGraphicData } from 'src/protos/relayCabinetLayoutGraphics';
export interface IRelayDrawOptions { export interface IRelayDrawOptions {
newData: () => IRelayData; newData: () => IRelayData;
@ -39,6 +40,8 @@ export class RelayDraw extends GraphicDrawAssistant<RelayTemplate, IRelayData> {
} }
prepareData(data: IRelayData): boolean { prepareData(data: IRelayData): boolean {
data.transform = this.container.saveTransform(); data.transform = this.container.saveTransform();
data.defaultInitialPosition =
relayCabinetGraphicData.CjDataItem.PostionType.NONE;
return true; return true;
} }
} }

View File

@ -13,8 +13,8 @@ export interface ISpksSwitchData extends GraphicData {
set flip(v: boolean); set flip(v: boolean);
get refStand(): number; get refStand(): number;
set refStand(v: number); set refStand(v: number);
get refSections(): number[]; // get refSections(): number[];
set refSections(v: number[]); // set refSections(v: number[]);
} }
const spksSwitchConsts = { const spksSwitchConsts = {

View File

@ -8,7 +8,6 @@ import Tcc_Button_Assets from './tcc-button-spritesheet.png';
import Tcc_Button_JSON from './tcc-button-data.json'; import Tcc_Button_JSON from './tcc-button-data.json';
import { Assets, Sprite, Spritesheet, Texture } from 'pixi.js'; import { Assets, Sprite, Spritesheet, Texture } from 'pixi.js';
import { tccGraphicData } from 'src/protos/tccGraphics';
interface TccButtonTextures { interface TccButtonTextures {
redBtn: Texture; redBtn: Texture;
@ -41,6 +40,7 @@ export class TccButton extends JlGraphic {
this._tccButton = new Sprite(); this._tccButton = new Sprite();
this._tccButton.texture = this.tccButtonTextures.redBtn; this._tccButton.texture = this.tccButtonTextures.redBtn;
this._tccButton.anchor.set(0.5); this._tccButton.anchor.set(0.5);
this._tccButton.scale.set(0.7);
this.addChild(this._tccButton); this.addChild(this._tccButton);
} }
get code(): string { get code(): string {

Some files were not shown because too many files have changed in this diff Show More