TWaver在电力系统中的应用

TWaver作为一款专业的图形界面控件,可以应用在各行各业中。本文我们就来详细介绍一下TWaver如何绘制出电力系统的界面。我们现在看看几张电力系统的图:



 

某变电站设备接线图一



 

某变电所的接线图二

当然这些是我在网上搜索的一些资源,那么TWaver是否能实现这样的界面呢?回答是肯定的,我们先来分析一下,电力电气系统中这些界面都是由很多电气元素组成的,比如变压器,刀闸,开关,接地开关,电容器,发电机等。

接下来我们看看如何去扩展这些电气元素,先整个简单的刀闸,刀闸一般有两种状态,打开关闭,因此我们可以定义一个刀闸的类,继承于ResizableNode,添加turnOn的属性来控制开关状态

public class Switch extends ResizableNode{
	private boolean turnOn = true;

	public Switch() {
		super();
		init();
	}

	public Switch(Object id){
		super(id);
		init();
	}

	private void init(){
		this.setSize(5,30);
		this.putBorderColor(Color.black);
		this.putBorderInsets(12);
	}

	 public String getUIClassID() {
        return SwitchUI.class.getName();
    }

	 public boolean isTurnOn() {
		return turnOn;
	}

	 public void setTurnOn(boolean turnOn) {
		if(this.turnOn != turnOn){
			boolean oldValue = this.turnOn;
			this.turnOn = turnOn;
			this.firePropertyChange("turnOn", oldValue, this.turnOn);
		}
	}
}
 

接着需要在UI上需要根据turnOn的属性来绘制开关的形状,下面贴一下主要的paint方法

public void paintBody(Graphics2D g) {
	g.setStroke(TWaverConst.DOUBLE_WIDTH_STROKE);

	Switch switzh = (Switch)this.getElement();

	//get position
	final Point location = switzh.getLocation();
	final Dimension size = switzh.getSize();
	boolean trunOn = switzh.isTurnOn();
	final int x = location.x;
	final int y = location.y;
	final int width = size.width;
	final int height = size.height;

	//draw color frame
	g.setColor(new Color(170,0,225));
	g.drawOval(x, y, width, width);
	g.drawOval(x, y+height-width, width, width);

	if(trunOn){
		g.drawLine(x+width/2, y+height-width, x+height/2,y+width);
	}else{
		g.drawLine(x+width/2, y+height-width, x+width/2, y+width);
	}
}
 

通过一个main来运行看看扩展出来的效果:


 
这是简单的刀闸元素,扩展起来还是比较容易的。接下来来个稍微复杂一点的--接地开关,同样它和刀闸一样,也有两种状态


 
这个例子中我们给接地开关设置了几个不同的方向,同样上面的也可以这么做一下处理,我们来看看如何绘制这个接地开关的

public void paintBody(Graphics2D g) {
	g.setStroke(TWaverConst.BASIC_STROKE);
	g.setColor(Color.black)

	EarthingSwitch earthingSwitch = (EarthingSwitch)this.getElement();
	final Point location = earthingSwitch.getLocation();

	boolean turnOn = earthingSwitch.isTurnOn();
	int position = earthingSwitch.getSwitchPosition();
	final int x = location.x;
	final int y = location.y;
	int width = earthingSwitch.getWidth();
	int height = earthingSwitch.getHeight();
	//draw body
	if(turnOn){
		if(position == Utils.SWITCH_POSITION_TOP){
			g.drawLine(x+width/4, y, x+width/4*3, y);
			g.drawLine(x+width/6, y+2, x+width/6*5, y+2);
			g.drawLine(x, y+4, x+width, y+4);
			g.drawLine(x+width/2, y+4, x+width/2, y+7);
			g.drawLine(x+width/2, y+7, x+width, y+height-10);
			g.drawLine(x+width/2, y+height-3, x+width/2, y+height);
		}else if(position == Utils.SWITCH_POSITION_LEFT){
			//transfer width and height
			int middle = width;
			width = height;
			height = middle;

			g.drawLine(x,y+height/4, x, y+height/4*3);
			g.drawLine(x+2, y+height/6, x+2, y+height/6*5);
			g.drawLine(x+4, y, x+4, y+height);
			g.drawLine(x+4, y+height/2, x+7, y+height/2);
			g.drawLine(x+7, y+height/2, x+width-10, y);
			g.drawLine(x+width-3, y+height/2, x+width, y+height/2);
		}else if(position == Utils.SWITCH_POSITION_BOTTOM){
			g.drawLine(x+width/4, y+height, x+width/4*3, y+height);
			g.drawLine(x+width/6, y+height-2, x+width/6*5, y+height-2);
			g.drawLine(x, y+height-4, x+width, y+height-4);
			g.drawLine(x+width/2, y+height-4, x+width/2, y+height-7);
			g.drawLine(x+width/2, y+height-7, x, y+10);
			g.drawLine(x+width/2, y+3, x+width/2, y);
		}else if(position == Utils.SWITCH_POSITION_RIGHT){
			//transfer width and height
			int middle = width;
			width = height;
			height = middle;

			g.drawLine(x+width,y+height/4, x+width, y+height/4*3);
			g.drawLine(x+width-2, y+height/6, x+width-2, y+height/6*5);
			g.drawLine(x+width-4, y, x+width-4, y+height);
			g.drawLine(x+width-4, y+height/2, x+width-7, y+height/2);
			g.drawLine(x+width-7, y+height/2, x+10, y);
			g.drawLine(x+3, y+height/2, x, y+height/2);
		}
	}else{
		if(position == Utils.SWITCH_POSITION_TOP){
			g.drawLine(x+width/4, y, x+width/4*3, y);
			g.drawLine(x+width/6, y+2, x+width/6*5, y+2);
			g.drawLine(x, y+4, x+width, y+4);
			g.drawLine(x+width/2, y+4, x+width/2, y+7);
			g.drawLine(x+width/2, y+7, x+width/2, y+height-3);
			g.drawLine(x+width/2, y+height-3, x+width/2, y+height);
		}else if(position == Utils.SWITCH_POSITION_LEFT){
			//transfer width and height
			int middle = width;
			width = height;
			height = middle;

			g.drawLine(x,y+height/4, x, y+height/4*3);
			g.drawLine(x+2, y+height/6, x+2, y+height/6*5);
			g.drawLine(x+4, y, x+4, y+height);
			g.drawLine(x+4, y+height/2, x+7, y+height/2);
			g.drawLine(x+7, y+height/2, x+width-3, y+height/2);
			g.drawLine(x+width-3, y+height/2, x+width, y+height/2);
		}else if(position == Utils.SWITCH_POSITION_BOTTOM){
			g.drawLine(x+width/4, y+height, x+width/4*3, y+height);
			g.drawLine(x+width/6, y+height-2, x+width/6*5, y+height-2);
			g.drawLine(x, y+height-4, x+width, y+height-4);
			g.drawLine(x+width/2, y+height-4, x+width/2, y+height-7);
			g.drawLine(x+width/2, y+height-7, x+width/2, y+3);
			g.drawLine(x+width/2, y+3, x+width/2, y);
		}else if(position == Utils.SWITCH_POSITION_RIGHT){
			//transfer width and height
			int middle = width;
			width = height;
			height = middle;

			g.drawLine(x+width,y+height/4, x+width, y+height/4*3);
			g.drawLine(x+width-2, y+height/6, x+width-2, y+height/6*5);
			g.drawLine(x+width-4, y, x+width-4, y+height);
			g.drawLine(x+width-4, y+height/2, x+width-7, y+height/2);
			g.drawLine(x+width-7, y+height/2, x+3, y+height/2);
			g.drawLine(x+3, y+height/2, x, y+height/2);
		}
	}
}
 


还有一些其他的元素,比如开关,发电机,变压器这些可以直接通过TWaver提供的customDraw很容易的配置出来,这些就比较简单了,此处代码省略100字,直接上图了


 
有了这些基础的元素,那么来绘制电力系统界面就显得不是那么复杂了,我们通过上面扩展的这些电力元素用twaver的工具画出了一个电力系统图,如下:


 
最后我们可以在界面上加上交互,比如双击打开关闭刀闸开关,然后添加自己的业务,这样一个简单的电力系统界面就完成了

network.addElementDoubleClickedActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e) {
		Element ele = network.getSelectionModel().lastElement();
		if(ele instanceof Switch){
			boolean turnOn = ((Switch)ele).isTurnOn();
			((Switch)ele).setTurnOn(!turnOn);
		}
	}
});
 


同样最先贴出来的两张变电所的图是不是也就很容易的做出来呢!最后再附上TWaver做的另一张电力界面图


原文链接:http://twaver.servasoft.com/?p=3945

TWaver Java 4.1试用版完整开发资源包 TWaver Java基于Java Swing构建,采用模型-视图分离(M-V)架构,实现数据与表现的解耦。其核心由DataModel管理元素状态,和Link等图元通过样式(Style)和绑定机制动态渲染,支持大规模拓扑结构的高效展示。框架采用轻量级组件设计,所有图形继承自Element基类,便于扩展与定制。在企业级可视化系统开发中,统一且具备品牌识别度的视觉风格是提升用户体验、增强专业形象的关键要素。 阅读详情

相关推荐

FFT的在电力系统中的应用

FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。

vue.js 登录界面_vue.js的可刷卡界面

vue.js 登录界面 VueSwing (VueSwing) A Vue.js wrapper for Swing. Swing is a swipeable cards interface. The swipe-left/swipe-right for yes/no input. As seen in apps like Jelly and Tinder, and many others. ...

cuk5239的博客 627

工厂的供配电系统主接线图

工厂的供配电系统主接线图工厂的供配电系统主接线图

Twaver-HTML5基础学习(17)子网(SubNetwork)

Twaver-HTML5基础学习(17)子网(SubNetwork)

见贤思齐焉,见不贤内自省 587

Web SCADA 电力接线系统图

在电力、油田燃气、供水管网等工业自动化领域 Web SCADA 的概念已经提出了多年,早些年的 Web SCADA 前端技术大部分还是基于 Flex、Silverlight 甚至 Applet 这样的重客户端方案,在 HTML5 流行前 VML 和 SVG 算是真正纯种 Web 方案也是有不少应用,近些年随着 HTML5 的流行,加上移动终端以及浏览器对 HTML5 支持的普及,越来越多新项目开始采用真正纯 HTML5 的方案,更具体的应该说是大数据量应用性能高于 SVG 的 Canvas 方案,已经逐渐成为当今 Web SCADA 前端技术的首选标配方案。

国家电力项目实战(共九天)

国家电力项目实战(共九天) 附详细代码及讲解的web项目,内容平均每天600MB。

twaver API笔记

twaver.Alarm : 告警对象存储, 在告警容器中,告警容器是网元的一部分,用于管理告警对象,每一个告警都可以设置关联网元Id twaver.AlarmBox: 告警容器对象,告警存在网元容器中,作为网元容器的一部分,管理网元容器中所有告警对象 twaver.AlarmElementMapping:告警网元映射对象,定义网元映射关系,一般告警和网元是一对一关系,需要达到一...

weixin_30955617的博客 906

基于vue框架的智能电网规划展示系统

基于vue框架的智能电网规划展示系统源码,本系统基于vue框架采用HTML+JavaScript开发,使用百度地图作为基础底图,功能包括电网查询、潮流数据展示、故障分析以及电网数据维护等。

Vue框架学习----基础

Vue基础 1.vue vue是渐进式框架,可作为应用一部分嵌入。 功能包括: 1)解耦视图、数据 2)可复用组件 3)前端路由技术 4)状态管理 5)虚拟DOM 2.vue安装 方式1:CDN引入 方式2:下载、引入 方式3:NPM安装 随后,新建项目,在项目内设置一个新文件夹,将vue.js放入 3.第一个vuejs 新建文件夹,再在其中新建一个HTML文件 其中,new Vue({参数为对象}) var变量无作用域 一般使用let(变量)、const(常量) 声明式编程,数据与样式分开处理 创

Sw1ng的博客 814

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 406

【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析

Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的...

TomRen 4587

TWaver可视化编辑器的前世今生(四)电力 云计算 数据中心

插播一则广告(长期有效) TWaver需要在武汉招JavaScript工程师若干 要求:对前端技术(JavasScript、HTML、CSS),对可视化技术(Canvas、WebGL)有浓厚的兴趣基础不好的可培养,基础好的可共谋大事感兴趣的给我发邮件:hr@servasoft.com ------------------------------------------------------...

weixin_30446613的博客 114

宜搭子表单(自定义页面全部展示)

效果:增加自定义页面添加表格组件,配置数据源变量: formUuid'表单编码'变量: pageSize10变量: currentPage1。

2301_80286061的博客 2275

TWaver可视化编辑器(四)电力 云计算 数据中心

插播一则广告(长期有效) TWaver需要在武汉招JavaScript工程师若干 要求:对前端技术(JavasScript、HTML、CSS),对可视化技术(Canvas、WebGL)有浓厚的兴趣 基础不好的可培养,基础好的可共谋大事 感兴趣的给我发邮件:hr@servasoft.com ----------------------------------------------

TWaver可视化 3267

AI测试入门:如何测试AI对话模型/智能体?「详细介绍」

作为测试人员,我们需要掌握特定的技能和方法来有效地测试这些复杂的AI对话模型和智能体。传统的软件测试方法在这里可能不再完全适用,我们需要开发新的测试策略和技术来应对AI系统的独特特性。在这篇文章中,我们将深入探讨如何测试AI对话模型和智能体。

blues_C的博客 6856

微信公众号 - 超详细 H5 网页接入微信支付功能,开发网站微信支付最详细的教程示例代码(微信公众号前端支付 JS-SDK / JSAPI 微信H5授权登录支付,唤起微信支付)最新超级详细教程

H5页面接入微信支付功能,前端网页端怎么做微信JSAPI支付,vue网站接入微信JSSDK支付,vueH5项目如何做使用微信支付,端h5调用微信支付jsapi方法,前端vue开发的H5网站怎么微信支付最详细的教程示例代码,vue怎么调取微信支付流程,将H5接入微信支付退款,vue网站怎么搞微信支付,H5前端开发网站在微信环境内H5调起微信支付,react项目h5如何调用微信支付的方法,nuxt.js项目vueH5集成微信JS支付,网站怎么做出H5微信公众号支付,请问vue.js这个框

🏆 前端领域优质创作者 8124

如何用Swing去绘制电力系统图

TWaver作为一款专业的图形界面控件,可以应用在各行各业中。本文我们就来详细介绍一下TWaver如何绘制出电力系统的界面。我们现在看看几张电力系统的图: 某变电站设备接线图一 某变电所的接线图二 当然这些是我在网上搜索的一些资源,那么TWaver是否能实现这样的界面呢?回答是肯定的,我们先来分析一下,电力电气系统中这些界面都是由很多电气元素组成的,比如变压器,刀闸,开关,接地开关...

weixin_30902675的博客 476

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 546

别再被输入延时搞懵了!手把手教你用史密斯预测器(SP)搞定工业控制难题

本文详细介绍了史密斯预测器(SP)在工业控制中的应用,帮助解决控制延时问题。通过识别延时症状、MATLAB/Simulink建模实战及FSP/SFSP变体选择,工程师可以有效提升系统响应速度与稳定性。文章还提供了电机控制案例和常见误区避坑指南,助力工业自动化优化。

weixin_30839881的博客 392

自适应控制 (Adaptive Control) 算法详解及案例分析

自适应控制是一种能够在线调整控制器参数以适应系统动态变化的控制方法。其核心思想是通过实时估计系统参数或调整控制器参数,使系统在不确定性或动态变化的环境中仍能保持稳定性和性能。

闲人编程的博客 4083

WCK Operation (WCK 操作)

LPDDR6 SDRAM采用双时钟系统(WCK和CK),其中WCK频率是CK的两倍。为确保数据正确传输,需通过WCK2CK同步操作使两种时钟对齐。LPDDR6支持两种同步模式:Auto-sync off模式和WCK Always on模式,可通过MR22寄存器选择。同步操作由特定命令(Read/Write/MRR等)触发,需在满足特定时序参数(如tWCKENL、tWCKPRE等)后完成。同步前必须完成WCK2CK训练,且不同操作(读取/写入/CAS)有各自的时序要求。该机制确保数据在正确时钟相位下传输,是L

李家小院 649

vue+less 电池电量图标组件

vue+less 动态电池电量图标

weixin_42674490的博客 1899

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

傅里叶变换及其应用 pdf_应用傅里叶-小波检测方式的并联型有源电力滤波器,电能质量高...

并联型有源电力滤波器(SAPF)是治理谐波污染的有效手段,能有效的抑制和补偿电网中的谐波成分。它的关键技术是检测出补偿对象电流中的谐波和无功等电流分量。由于常用小波变换对频域划分粗略,以及变换后不能直接得到频谱信息,所以为了克服此缺点,提出一种傅里叶-小波检测方法。本方法结合了小波变换能准确检测突变信号的优点和傅里叶变换能对平稳信号进行精确分析的优点,应用于谐波检测中,先用小波变化滤除电网中突变信...

weixin_39931146的博客 372

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Flex中定制带图标的Tooltip
下一篇: Make an TWaver HTML5 iPhone App
subnetwork
博客等级 码龄17年 17粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值