查看: 3204|回复: 0
收起左侧

OpenCPN探索--HPGL指令分析--ECDIS 电子海图讲座

[复制链接]
发表于 2013-12-30 15:38 | 显示全部楼层 |阅读模式 来自: 中国天津
OpenCPN探索--HPGL指令分析--ECDIS 电子海图讲座

摘要: OpenCPN探索—绘图指令解读概述:    前面已经发表过OpenCPN海图显示的相关文章,海图显示一文主要从函数级别上讲解显示的流程步骤。今天的绘图指令解读主要从文件级别上解析绘图指令含义以及在OpenCPN上是如何分解  ...

opencpn探索绘图指令解读概述:

       前面已经发表过OpenCPN海图显示的相关文章,海图显示一文主要从函数级别上讲解显示的流程步骤。今天的绘图指令解读主要从文件级别上解析绘图指令含义以及在OpenCPN上是如何分解转义该指令的。
       OpenCPN中绘图指令初始化获取的方式有两种:
       1:根据obj对象查找对应的S52绘图指令;
       2:条件符号化的绘图指令转移到回调函数中动态生成;
       具体生成指令的方式将在后面发表的文章中详述,本文先针对S52中的绘图指令进行分析。
分析:
       OpenCPNS52绘图指令主要来源于chartsymbols.xml/S52RAZDS.RLE,这两个文件可以在OpenCPN工程中找到。两个文件格式不太一样,但是内容几乎是一样的,OpenCPN中对这两个文件进行了区分,S52RAZDS.RLE属于旧格式文件,chartsymbols.xml是新格式文件。为了方便阅读,本文以chartsymbols.xml作为介绍对象。
chartsymbols.xml介绍
文件结构:文件分为5部分,分别是:
1color-tables  记录的是S52标准下各种现实模式的基准色;
2lookups      记录的是各种类型S52标准的点线面绘制;
3line-styles    记录的是各种线型;
4patterns     记录的是各种类型图案的绘制;
5symbols      记录的是各种类型符号的绘制;
这几部分的关系是:lookups提供总体绘制方法,在绘制方法中调用其他部分的定义实现最终的绘制。也就是说,一个obj对象的绘制,首先需要定位到它属于lookups中的哪一类,再根据lookups的记录查找线、图案、符号和颜色完成绘制和填充。
OpenCPNobj对象绘制前必须与S52文件中的一个lookups匹配上,根据匹配的结果中记录的绘制指令进行绘制。
在文件中各个符号简称是有意义的:
SY--------------------------------符号类型,它带的参数需要到symbols中去找对应的绘制指令;
CS--------------------------------条件符号化,这个目前比较复杂,在OpenCPN中很多条件符号化的指令都是在代码中动态生成的,本文对此不做介绍,以后针对条件符号化解析会有详细介绍。
LS---------------------------------简单线,在color-tables查找颜色,宽度和线型在括号中;
LC---------------------------------复杂线,在symbols中可以查找指令;
AC---------------------------------颜色填充,在color-tables中查找颜色;
AP---------------------------------图案填充,在patterns中查找图案
TE--------------------------------数值类文字,需要字母加以区分
TX---------------------------------普通字符串
       OpenCPN工程根据这些将obj进行匹配,最终得到一串绘制指令,类似于:SPCU1500,565;ST0M0;CI110M2;FPU1500,840M0;CI110M2;FP…这个指令即用来完成最终图像绘制。解读这个指令的函数是RenderFromHPGL::Render
解析函数介绍
解析函数RenderFromHPGL::Render的理解最好能跟着一段解析调试过程进行理解。
解析的步骤:
1SP---------获取绘制的画笔颜色和画刷颜色;
2SW--------获取画笔的宽度;
3PU
A:设置画笔
B:获取线的起始点
C:偏转计算
4PD
A:获取线的结束点
B:绘制一根线
5CI----------设置半径直接画圆;
6PM---------绘制复杂多边形,中间会调用PDCI绘制线和圆;
7FP----------绘制多边形;
指令解释(请参考S52标准):
SP用于选择一种画笔颜色,参数是一个字母(ASCII>=64),该参数标示一种S52颜色表中标定的颜色。当一种画笔颜色被选定以后直到出现新的SP指令选择新的画笔前,所有的绘制指令均采用上一次设置的画笔进行绘制。
ST 透明度,仅对填充区域有效。
SW 宽度,定义了线的物理宽度。
PU 移动的过程,中间并没有任何绘制过程,仅仅是移动画笔。
PD 绘制的过程,移动过程中完成一条线的绘制。
CI 绘制圆的过程,绘制完成后,画笔重新回到圆心。
AA 绘制弧的过程,顺时针绘制,绘制完成后不返回画笔初始位置。
PM 多边形定义模式。在该模式下,您可以使用其他指示构造多边形(PU、PD、CI、AA)。这些指令都在存储缓冲区多边形;他们不执行,直到多边形完全定义。为了绘制多边形必须填补它与FP指令和/或EP指令。
EP绘制已经存储的多边形。完成后,恢复原来的笔的位置和状态。
FP 填充已经存储的多边形。完成后,恢复原来的笔的位置和状态。
SC 调用一个符号定义,完成符号的绘制。

OpenCPN探索--HPGL指令分析.pdf
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|标签|免责声明|龙船社区

GMT+8, 2024-12-16 01:38

Powered by Imarine

Copyright © 2006, 龙船社区

快速回复 返回顶部 返回列表