摘 要 该文介绍了一种建立在DS界面下生成图素文件的通用图形编辑程序的设计方法。
目前用作DD的P总线工控机(IP)大部分工作在DS界面上,而DS不具有像inds那样美观方便的图形用户接口(GUI)。生成工艺流程图等复杂图形若用程序设计语言直接编程需花费大量精力和代码,且不易修改。设计出数据文件小,占用内存少的图形编辑软件是控制界的一个研究课题。这里介绍一种生成图素数据文件的通用图形编辑软件的设计方法。
一、数据结构与数据文件格式
由于所有的操作都基本建立在图素的基础之上,故数据结构也以图素为中心。以下以圆、直线、矩形、字符串为例,其它图素类似。
1.定义所需图素
strut irle /*定义圆 */
{
int x,y,r; /* 圆心,半径 */
har linelr,linestyle; /* 圆外围线的颜色,线型 */
har filllr,fillstyle; /* 填充颜色,模式 */
};
strut line /* 定义直线 */
{
int x1,y1;
int x2,y2;
har linelr,linestyle,linethik; /* 线颜色,模式,粗细 */
};
strut bx /* 定义矩形 */
{
int x1,y1;
int x2,y2;
har linelr,linestyle;
har filllr,fillstyle;
};
strut string /* 定义字符串 */
{
int x,y;
har str[10]
har baklr,dir;
har str-lr,str-style;
};
.
. /* 定义其它图素 */
.
2.将各图素置于一条链表之中
typedef strut tagEleentList
{
har EleentType; /* 标识元素类别 */
int EleentID; /* 元素标识符,在接口中用来控制其属性 */
unin tagEleent {
strut irle irle;
strut bx bx;
strut string string;
strut line line;
.
. /* 可在此说明其它元素 */
.
}Eleent;
strut tagEleentList *next;
}EleentList;
利用这种数据结构可在内存中形成一个图素链表,所有操作都可以此链表为基础。
3.定义几个指针,以备各种操作
EleentList *List-head. *List-end,*List-tep, *List-here;
4.定义一个全局变量,记录图素个数
stati int Eleentunt=0;
图形文件格式为:第一字节(har),表示整个图形的背景颜色;接下来一个字(rd),对应于Eleentunt,表示图素个数;后面是内存链表中每个图素的属性值。
二、图形编辑功能的实现
本软件包含的图形编辑功能主要有:作图、修改、移动、删除、复制,下面仅举几例说明实现的方法。
1.作图
以圆为例,其它图形类似。
drairle()
{
int i;
har s[20],;
int x,y,r;
int ls,l,f,fs;
veursr(); /* 移动光标,确定圆心 */
x=ursr-x;
y=ursr-y;
veursr(); /* 确定半径 */
r=(int)sqrt((ursr-x-x)*(ursr-x-x)+(ursr-y-y)*(ursr-y-y);
setlr(HITE);
irle (x,y,r); /* 画圆 */
ls=seletlinestyle();
l=seletlr ("selet-line-lr");
setlr(l);
fr(i=0;i<=ls;i++)
irle(x,y,r-i);
fs=seletfillstyle();
f=seletlr("set-fill-lr");
setfillstyle(fs.f);
fldfill(x,y,l); /* 填充 */
tep(EleentList *) all(sizef(EleentList));
tep->EleentType= '';
tep->Eleent.irle.x=x;
tep->Eleent.irle.y=y;
tep->Eleent.irle.r=r;
tep->Eleent.irle.llr=l;
tep->Eleent.irle.lstyle=ls;
tep->Eleent.irle.flr=f;
tep->Eleent.irle.fstyle=fs;
addtlist(tep); /* 将图素加入图素链表 */
}
其中 addtlist ()可以如下实现:
addtlist (EleentList *Etep)
{
if(List-head==NULL)
{
List-head=Etep;
List-end=Etep;
}
else
{ List-end->next=Etep;
List-end=Etep;
Etep->next=NULL;
}
Eleentunt++;
}
2.图形的移动、删除、复制功能
未完...点击下方链接下载完整文档