(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf_第1页
(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf_第2页
(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf_第3页
(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf_第4页
(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf_第5页
已阅读5页,还剩46页未读 继续免费阅读

(测试计量技术及仪器专业论文)激光标刻系统软件设计.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 激光打标是利用高能量密度的激光束在物件表面制作永久性标记。激光打标机是集 激光、光学、机械、电子和计算机等技术于一体的机电一体化设备。激光打标较传统 打标方式有诸多优点,在许多领域得到了广泛应用。其中,以高速在线打标市场前景 最大。但目前高速在线打标全由外国产品所垄断。本文设计实现的阵列式高速在线激 光打标机全由国产器件实现,适用于纺织品、食品、饮料、烟酒、药品等生产线的高 速在线打标。 本文首先对动态链接库编程和多线程编程进行了深入讨论,用v i s u a lc 抖作为开 发工具,设计实现了功能强大、界面友好、操作方便、能运行于各种w i n d o w s 操作系 统的控制系统。该控制系统的显著特点是:能够实现稳定的高精度、高频率控制信号输 出:打标仿真的实现,能够形象地模拟整个打标过程,多线程技术和自动检测实现了整 个打标过程的全自动化,用动态链接库来存储字符点阵信息,利于软件功能的扩展和升 级。 关键词:激光打标机动态链接库多线程高精度定时控制系统 a b s t r a c t l a s e rm a r k i n gi sak i n do ft e c h n i q u eo fm a r k i n gp e r m a n e n tm a r ko nt h eo b j e c t i v e s u r f a c eb yu s i n gl a s e rb e a mw i t hh i g he n e r g yd e n s i t y l a s e rm a r k e ri sa ni n t e g e r a t e d m a c h i n e - e l e c t r i c i t yf a c i l i t y t h a ta p p l i e sm a n yt e c h n i q u e sr e f e r r i n gt ol a s e r , o p t i c s , m e c h a n i s m , e l e x m i c i t y , a n dc o m p u t e re t c l a s e rm a r k i n gh a sm o r ea d v a n t a g e st h a n t r a d i t i o n a lm e t h o d s ,i th a sb e e nw i d e l yu s e di nm a n yf i e l d s f o rt h ep r e s e n t , i nt h el a s e r m a r k i n gm a r k e t , o n - l i n el a s e rm a r k i n gi st h em o s tp r o m i s i n g b u ti ti sm o n o p o l i z e db y f o r e i 盟c o m p a n i e s i nt h i sp a p e r , w ed e s i g na n dr e a l i z e da r r a y e d 峥s p e e do n - l i n ec o z l a s e rm a r k e r , u s i n gc o m p o n e n t sp r o d u c e da th o m e , w h i c hc a nb ea p p l i e dt oh i g h - s p e 圮d o n - l i n em a r k i n go nm a n yp r o d u c tl i n e s ,s u c ha sf o o d s t u f f , b e v e r a g e , t o b a c c o ,a n dl c h d o m e t c i nt h i sp a p e r , w ef i r s t l yr e s e a r c hi n t od l l ( d y n a m i c - l i n kl i b r a r y ) a n dm u l t i - t h r e a d p r o g r a m m i n g , a n du s ev i s u a lc 抖a sd e v e l o p i n gt o o l ,w ed e s i g n e da n dr e a l i z e dt h ec o n t r o l s y s t e mw h i c hh a saf r i e n d l yi n t e r f a c ea n dc a nr i l n o nv a r i o u sw i n d o w sp l a t f o r m s t h e r e m a r k a b l ec h a r a c t e r i s t i c sa r ea s f o l l o w s :s t e a d y c o n t r o l s i g n a lo u t p u t b a s e do n h i g hp r e ;c i s i o n a n d h i g hf r e q u e n c y ;m a r k i n ge m u l a t i o nc a nw a l ls i m u l a t et h em a r k i n g p r o c e s s ;m u l t i - t h r e a dt e c h n o l o g y a n da u t o m a t i c0 b j e c 时v 争d e t e c t i o nm a k et h em a r k i n g p r o c e s sw o r ka u t o m a t i c a u y ;d l lt e c h n o l o g yu s e dt os t o r et h el a t t i c ei n f o r m a t i o nm a k e st h e s o i i w a r ee x t e n df a n i o no ru p g r a d ee a s i l y 。 k e yw o r d s :l a s e rm a r k e rd y n a m i c - l i n kl i b r a r y m u l t i - t h r e a d h i g h - p r e c i s i o nt i m i n g c o n t r o ls y s t e m 长春理工大学硕士( 或博士) 学位论文原创性声明( 4 号宋体) ( 以下正文内容用小4 号宋体) 本人郑重声明:所呈交的硕士( 或博士) 学位论文, = o i :m o 谯线搬标 迸给方向偏箍汁黧 m 线啦标进给万硒事i ; 蕨计馋 l i _u十xf 钿+ l = f m y 2l 1l 2+ yf m + 1 = f m + x 2 l 2l 3 - x l 3l 4一y 四个象限的终点坐标值均取其数字的绝对值,表中f m 表示当前点的偏差,f m 表示迸给 后到达的点偏差,l 1 ,l 2 ,l 3 ,l 4 表示当前点所在的象限,+ x ,一x ,+ y ,一y 分别表 示进给方向,起始点的坐标为( x 1 ,y 1 ) ,( x 2 ,y 2 ) 为结束点的坐标。 算法的思想用流程图3 4 描述如下: 图3 4 直线插补算法流程 由于p l t 文件是由一段段的直线构成的,因此,我们用直线插补算法编写了一个 画直线的函数:v i o d c l a s e r c t r l :( i n tx l ,i n ty l ,i n tx 2 ,i n ty 2 ) 。在此基础上, 我们构造了画一个p l t 图形文件的函数,其代码如下: v i o d c l a s e r c t r l :d r a w ( ) i n ti : f o r ( i = 1 :i 0 ) m o v e y ( t a g ) :在y 轴方向上移动一步 n 一一 ) ) 3 2 3 在线点阵打标的速度补偿 由于在线打标的标记工作而是随生产线运动的,所以在打标过程中垂直于生产线 方向( y 轴) 的标记线会因生产线的运动n 们发生一定角度的倾斜,生产线速度越快倾斜角 度越大,所以要在生产线上的工件表面打出精美的标记,关键在于如何实现对生产线 的速度进行补偿,确保打标机的精确定位。 生产线的运动方向与打标振镜x 轴的偏转方向相同,那么在进行打标操作时,首 先给x 轴振镜预置一个与生产线相同的速度分量,就可以实现对其速度的补偿,这样 就可以像静态打标一样进行标记了。然而在实际操作中,上述补偿校正方案操作起来 非常困难,因为扫描振镜的内部是用一个精密步进电机控制的,并且步进电机的转动 角速度是固定的。我们对扫描振镜只能控制其偏转角度的大小,而不能控制其偏转线 速度,而对固定角速度的扫描振镜来讲,它在平行啪1 于生产线的x 轴方向上的线速度 2 l 是不稳定的,要想实现对其偏转线速度的控制,保证扫描振镜速度与生产线同步,只 能将扫描振镜的整个偏转过程分解为多步完成,通过调节步与步之间的延迟时间调节 其偏转线速度,从而使其偏转线速度与生产线速度同步。我们考虑不直接对生产线的 速度进行补偿,而是对要标记的点进行位置补偿,具体分析如下: 设生产线速度为v l ,振镜扫描速度为v 2 ,点阵字符每列中相邻点间距为s l ,则y 轴振镜由前一扫描到下一点的时间为: t l = s l v l ( 3 5 ) 在这段时间内由于生产线的运动而造成的位置偏移: s 2 = v 2 t 1 = v 2 木s 1 v l ( 3 6 ) 由于点阵字符的点间距离较小,所以t l 约等于振镜的小角度响应时间。这样在标 记每个点时,按照该点原本的位置坐标加上由于生产线的运动造成的位置偏移,得到 该点的实际位置坐标,而控制x 轴及y 轴振镜直接按该点的实际坐标偏转到相应位置 进行打点操作。这样可以有效地实现在线打标,并且提高了标记速度。 具体运行过程如下:按照点阵结构从第一列的第一点开始,首先将振镜摆动到原 点位置,然后取该点的点阵信息,判断是否打点,是则控制激光器出光。标记完成后, 控制y 轴振镜摆动到该列第二点位置,同时x 轴振镜按生产线相同的运动方向摆动一 定距离进行点位置补偿,使其在标记该点时,其位置处于上一点的正下方,振镜稳定 后判断是否标记第二点,以此类推,直到该列所有的点标记完成。然后y 轴振镜回到 初始位置,而x 轴振镜则继续摆动一定距离,这个距离与前面的点补偿距离不同,摆 动完成后应使光束所处位置在上- - n 第一点的后面一定距离嘧,所以称它为列补偿。 然后开始标记第二列,方法与第一列相同,以此类推直到标记完所有字符。 在标记列的每一点时的稳定时间,如果在标记每一列时,不是让y 轴振镜在每一 点都停下来,而是由初始位置直接摆动到末点位置,然后在摆动过程中进行标记,这 样对位置补偿只进行列位置补偿,而不进行点位置补偿,这样就完全省去了在标记列 的每一点时所耗费的稳定时间,大大提高了标记的速度。采用这种方案进行标记,公 式( 3 6 ) 修正为: v = l 2 n t( 3 7 ) 式中v 为标记字符速率,n 为每个字符的列数,t 为小角度响应时间。整个流程如 图3 5 所示: 3 3 本章小节 卤回 图3 5 流程图 本章主要研究激光打标控制系统对硬件的控制,对激光功率、q 开关频率、打标速 度等参数及振镜控制进行了分析。由于控制系统的机电部分的执行速度与微型机的指 令执行速度有差异以及激光开关的延迟,在软件中需设置相应的延迟补偿参数,对矢 量打标的插补算法进行的改进能较好的解决激光头的归位的问题,在线点阵打标的速 度补偿可以尽量减轻标记失真。 第四章系统软件设计 激光标刻系统的软件部分采用m i c r o s o f tv i s u a ls t u d i o6 0v i s u a lc + + 开发, v c 6 0 开发应用程序的特点是灵活。灵活的特性决定了在这个丌发环境之下丌发出来的 应用程序具有很大的扩展性。v c 方案采取m d i 心羽多文档结构,系统由菜单区、工具栏、 编辑区、状态栏、列表框、属性页组成,在每个视图中可以独立对相应文档进行操作。 4 1系统分析 软件系统总体上包括三大块。第一大块是界面层,负责实现用户的请求,完成数 字图像处理工作,数字图像处理,能针对点阵图、矢量图进行分别处理,支持读入现 成的图像,也可以通过矢量图绘制来获得点阵图的绘制,用户在界面层可以按照需求 操作来获取需要标刻的图案,当得到满意的图案之后可以进入标刻环节。第二大块是 后台处理层,后台处理层时刻监听用户的标刻请求,当有标刻请求过来时,监听程序 将会捕获该消息,并且接受标刻执行码( e x e c u t i o nc o d e ,以下简称e c ) ,同时通知任 务调度程序将该标刻任务调入任务队列,任务调度程序接到通知后马上添加任务,并 列入标刻队列,将界面传过来的e c 挂靠到该任务名下。第三大块即软硬件接口部分, 软件部分要完成标刻,必须通过硬件才能实现,那软件部分编辑完成的数字图像如何 才能传到硬件呢? 就是通过p c i 总线接口驱动程序传送过去。所以p c i 总线乜接口驱 动也是软件设计的一项重要内容,它要负责将主程序编码得到的硬件能够识别的标刻 执行码顺利地送到硬件功能模块。整个系统框图如图4 1 所示。 图4 1 系统总体框图 至此,软件系统的总体框架的一个架构已经确定下来。接下去将对整个软件进行 一个总体设计的阐述。 4 2p ci 设备中的帅m 驱动程序的设计 在p c i 设备功能驱动程序中,需要处理p c i 设备的内存、端口的读写、中断处理 和d m a 数据传输,实现p c i 设备的功能,因此,p c i 设备功能驱动程序是很标准的w d m 设备驱动程序。p c i 设备驱动程序在框架上与其他类型的设备驱动程序基本相同,包括 初始化、创建设备、卸载和删除设备、即插即用处理、分发例程处理、电源管理、w m i 等部分,限于篇幅,本文只列出设计过程中p c i 设备的有别于其他设备之处。 4 2 1p o i 设备资源的获得 p c i 设备的硬件资源是由p c i 配置机构动态分配的,由p c i 设备实现p c i 配置寄存 器,提出需要分配的硬件资源,由p c i 配置机构分配资源。驱动程序需要取得这些资 源,才能操作硬件。因此,p c i 设备的硬件资源分配与管理是驱动程序中很重要的部分。 硬件资源主要包括映射内存空间、i o 空间、中断。在w d m 体系中,取得这些资源有四 种方法:读写p c i 配置寄存器、调用硬件抽象层( h a l ) 函数、向p c i 总线驱动程序发 送读写配置i r p 和向p c i 总线驱动程序传递开启设备i r p 。 第一种方法通过读写p c i 总线配置i o 寄存器,来取得p c i 设备的配置信息, 其中包括资源的分配。这种方法需要将几乎所有的p c i 设备枚举一遍,考虑到这种方 法是对公共寄存器的读写,不利于系统的安全性,最好不使用这种方法,但是在调试 p c i 设备硬件时是个很好的方法。第二种方法通过调用函数h a l g e t b u s d a t a 和 h a l g e t b u s d a t a b y o f f s e t 来实现的,但是这种方法是为了能够与w i n d o w sn t 的驱动程 序兼容,而保留下来的方法,不推荐使用,其功能被第三种方法取代。在w d m 体系中, 总线驱动程序必须实现总线上设备的管理功能。p c i 总线驱动程序实现了对p c i 设备资 源的枚举,设备驱动程序通过向p c i 总线驱动程序传递设备配置i r p j u p n p ,经总线 驱动程序的处理后,设备驱动程序得到p c i 设备的资源信息。第四种方法是推荐的方 法,当系统的p n p 管理器在取得设备的资源后会自动向驱动程序发出 i r p 心s t a r t _ d e v i c e 的i r p ,在该i r p 栈中包含了设备的资源信息。好的驱动程序都 应该使用这种方法,在此主要讨论该方法。 4 2 2 内存读写 w i n d o w s 工作在保护模式下,与实模式协1 的区别在于c p u 寻址方式不同,可以实现 虚拟内存。在w i n d o w s 系统中对内存又分为分页和非分页内存。分页内存一般用于应 用程序,系统提供分页和分段使用户应用程序使用的内存可以在程序空闲的时候由系 统将其从物理内存调配到硬盘中,以节省物理内存资源,当程序重新运行的时候,再 由系统将其调配到物理内存,这样,系统可以得到比物理内存非常大的内存量,允许 更多得应用程序保持运行。而非分页内存为系统常驻内存,不可以从物理内存调配到 硬盘上,因此内存无需分页。在w d m 驱动程序中,对于硬件的内存映射一般需要用非 分页内存,因为在一些运行在d i s p a t c h _ l e v e l 或更高得中断级例程中,禁止使用分页 内存,比如在中断处理程序中就不可以使用分页内存。再者,使用非分页内存无需太 多的转换,非常安全,效率也高。如果使用分页内存,系统就有可能将其调配到硬盘 上,容易产生错误,但是,不能过多地使用非分页内存。 在p c i 设备的驱动程序中,获得的设备内存是一段映射物理内存,这是无法使用 的,需要将其映射成系统可以访问的非分页内存。函数删a p i o s p a c e 完成该功能。该 函数的原型为: p v o i dm m m a p i o s p a c e ( i np h y s i c a l _ a d d r e s sp h y s i c a l a d d r e s s , i nu l o n gn u m b e r o f b y t e s , i n 娅m o r y _ c a c h i n gt y p ec a c h e e n a b l e ) : 参数p h y s i c a l a d d r e s s 为物理地址;n u m b e r o f b y t e s 为地址的数量;c a c h e e n a b l e 为内 存是否可以隐藏,取值可为m m n o n c a c h e d ,m m c a c h e d ,m m w r i t e c o m b i n e d ,这里必须取 为m m n o n c a c h e d 。其应用实例见以上代码中的“内存资源处理部分。 当访问设备内存时,使用函数 u c h a rr e a d _ r e g i s t e r _ u c 姒r ( i np u c h a rr e g i s t e r ) : u l o n gr e a d _ r e g i s t e r _ _ u l o n g ( i np u l o n gr e g i s t e r ) : u s h o r tr e a d _ r e g i s t e ru s h o r t ( i np u s h o r tr e g is t e r ) : v o i dr e a d _ r e g i s t e r _ b u f f e r _ u c h a r ( i np u c 姒rr e g is t e r , i np u c h a rb u f f e r , i nu l o n gc o u n t ) : v o i dr e a d _ r e g i s t e r _ b u f f e r _ u c h a r ( i np u l o n gr e g is t e r , i np u l o n gb u f f e r , i nu l o n gc o u n t ) : v o i dr e a d _ r e g i s t e r _ b u f f e r u c h a r ( i np u s h o r tr e g is t e r , i np u s h o r tb u f f e r , i nu l o n gc o u n t ) : v o i dw r i t e _ r e g i s t e r _ _ u c h a r ( i np u c h a rr e g i s t e r , i nu c 姒rv a l u e ) : v o i dw r i t e _ r e g i s t e r _ _ u l o n g ( i np u l o n gr e g is t e r , i nu l o n gv a l u e ) : v o i dw r i t e _ r e g i s t e r _ u s h o r t ( i np u s h o r tr e g is t e r , i nu s h o r tv a l u e ) : 2 6 v o i dw r i t er e g i s t e r _ b u f f e r _ u c h a r ( i np u c h a rr e g is t e r , i np u c h a rb u f f e r , i nu l o n gc o u n t ) : v o i dw r i t er e g i s t e r _ b u f f e r _ u c h a r ( i np u l o n gr e g is t e r , i np u l o n gb u f f e r , i nu l o n gc o u n t ) : v o i dw r i t e _ r e g i s t e r _ b u f f e ru c h a r ( i np u s h o r t r e g is t e r , i np u s h o r tb u f f e r , i nu l o n gc o u n t ) : 以上函数对应的分别是对p c i 设备内存的读写函数,参数r e g i s t e r 为映射后的内 存地址,在使用时,应进行相应的数据类型转换。其他参数为数据参数。 x x x _ r e g i s t e r _ x x x 读写单个地址的内容;x x x _ r e g i s t e r _ b u f f e r _ x x x 读写一段内存的 内容,这在p c i 设备支持突发读写( b u r s tt r a n s m i s s i o n ) 时应用。在本次开发中应 用到的只有1 6 位数据、3 2 位数据读写、寄存器汹3 读写,限于篇幅,此处只列举一个示 例: n t s t a t u sd i s p a t c h i o c o n t r o l ( i np d e v i c e _ o b j e c tf d o , i np i r pp i r p ) d is p a t c h i o c o n t r o l 省略初始部分代码及中间代码只列出关键部分代码 s w i t c h ( p l r p s t a c k 一 p a r a m e t e r s d e v i c e i o c o n t r 0 1 i o c o n t r o l c o d e ) c a s ei o c t l _ x r l c t l _ w r i t e _ d w o r d :写地址加3 2 位数 u l o n gb u f f e r 2 : p d c a d d r e s s = ( u l o n g ) p d x 一 p d c m e m b a s e : r tl c o p y m e m o r y ( b u f f e r , p l r p 一 a s s o c i a t e d i r p s y s t e m b u f f e r ,8 ) : w r i t e _ r e g i s t e r _ u l o n g ( ( u n s i g n e dl o n g 木) ( p d c a d d r e s s + b u f f e r 0 ) ,b u f f e r 1 ) : d e b u g p r i n t ( w r i t e3 2 b i td a t av a l u ei s x , w r i t e b u f f e r 4 1 ) : r e t u r n e d v a l u e = 0 : b r e a k : ) 2 7 本例将一个3 2 位长的数写到偏移地址为b u f f e r o 的地址处 4 2 3 驱动程序的安装 p c i 设备驱动程序安装与其他类型的驱动程序一样,通过i n f 文件进行安装。不 同的是设备标识符,其形式如下: p c i v e n _ io b a & d e v _ 10 0 0 l o b a 是厂商( p l x 公司) 标识符,由p c i 组织赋予每个厂商,1 0 0 0 是设备标识符,由 厂商赋予每个设备。 4 2 4 驱动程序的调试调用 由于p c i 设备的硬件资源是动态啪1 配置的,只有当p c i 设备上电后,驱动程序才 能获得资源信息,再加上驱动程序主要是对硬件的操作,调试驱动程序应很小心,最 好采取循序渐进的方法,一步一步实现功能,否则,经常死机,错误不容易查找。 本文开发的p c i 卡在驱动调试时是通过d e b u g p r i n t 来反馈驱动程序跟系统的数据 交换的。d e b u g p r i n t 随时打印出我们的d e v i c e i o c o n t r o l 发送给硬件的数据。w d m 驱 动程序的设备访问可以符号链接,也可以使用设备接口标识。两者的应用对于p c i 设 备驱动程序一样,本文开发的驱动采用全局唯一i d ( g u i d ) 来标识一块p c i 卡。下面 附上本文对硬件驱动程序的调用部分的部分关键性代码: # d e f i n ex r l c t l d e v i c e _ c l a s s _ g u i d | o x 6 d c 7 8 2 6 b ,o x 2 1 9 d ,0 x 4 4 6 c , o x 8 c ,o x f e ,o x 9 c ,o x d 9 ,0 x 3 6 ,o x e 9 ,o x o ,o x b 9 通过g u i d 连接硬件,获得硬件句柄 h a n d l e c o n n e c t t o x r l c t l ( v o i d ) h a n d l e h d e v i c e = i n v a l i d _ h a n d l 芝脚l u e ; g u i dc l a s s g u i d = x r l c t l d e v i c e _ c l a s sg u i d ; d w o r de r r c o d e : h d e v i c e = o p e n b y i n t e r f a c e ( & c l a s s g u i d ,0 ,& e r r c o d e ) : r e t u r nh d e v i c e : b o o lw r i t e _ d w o r dt o x r l c t l ( h a n d l eh d e v i c e h w n d , u n s i g n e dl o n go f f s e t a d d r , u n s i g n e dl o n gd a t a t o w r i t e ) u n s i g n e dl o n gb u f f e r 2 : u n s i g n e dl o n g 宰p d ; u n s i g n e dl o n gr e s u l t : b u f f e re 0 = o f f s e t a d d r : b u f f e r 1 = d a t a t o w r i t e ; p d = b u f f e r : 与上述w r i t e _ r e g i s t e r _ _ u l o n g 对应,界面程序通过调用 d e v i c e i o c o n t r o l ,来写3 2 位长的数到硬件。 i f ( ! d e v i c e i o c o n t r o l ( h d e v i c e h w n d , i o c t l _ x r l c t l _ w r it e _ d w o r d , p d ,8 ,n u l l ,0 ,& r e s u l t ,n u l l ) ) c l o s e h a n d l e ( h d e v i c e h w n d ) : r e t u r nf a l s e : ) r e t u r nt r u e : ) 4 3 主程序框架及功能模块设计 主程序框架的主要功能是完成数字图像的处理,包括图像读入,矢量汹1 图绘制, 矢量图编辑,标刻参数设置,标刻编码的生成。为了完成这些功能,最终将主框架编 写成m d i ,m d l 支持对多个文档同时进行编辑,单个文档可以有多个视图同时查阅便于 对比编辑其不同部分。定下上述框架功能,即开始整个系统的详细设计。 4 3 1 界面层设计 界面层设计的目的就是便于用户使用,使用户可以随心所欲地在视图上进行图形 编辑操作。整个界面层包括菜单栏、文件工具栏、绘图工具栏、对象列表、对象属性 列表、绘图工作区视图啪1 等。设计效果见图: 菜单栏:完成常规的操作及一些基本的功能,如标刻参数设置对话框入口,界面风格 替换等等。 文件工具栏:功能相当于菜单栏中的基本文件操作功能。 绘图工具栏:支持基本图形绘制、图形读入、文字处理等功能。 对象列表;负责显示当前活动文档视图中的对象信息。 对象属性列表:负责显示当前选中的对象的各种属性,并且属性可以在这里编辑,如 果当前活动文档视图中没有选中的对象,则对象属性列表为空。 绘图工作区视图:视图主要是完成文档中各种对象的显示,用户可以在该视图中进行 图形对象的基本操作。 整个框架设计工作包含一个多文档工程、两个d o c l ( b a r 的设计,文档视图的设计。 l - m a i n f r a m e 类、c c h i l d f r a m e 类、c m y v i e w 类、c c a n v a s 类、c m y d o c 类、c n o t i c e 类, 此外,为了让软件系统支持浮点数标刻,还增加了支持浮点数的c m y d c 类,继承自 c d c n 3 】,进行了多文档多视图支持、浮点坐标支持改造,使得同一文档的多个视图可以 同步更新。框架类的各部分功能描述如表4 _ l 。 表4 - 1 框架类明细表 类名父类功能 在m d i 应用程序中它是主窗口类,所有工具栏,子 c m a i n f r a m ec 肋i f r a m e w n d 窗口都在该框架里边进行操作。 c c h ii d f r a m ec 皿i c h ii d w n d画布的载体 c m y v i e w c v i e w视图类,完成了图形对象的显示的基本操作 c m y v i e w c c a n v a s画布类,具体实现图形对象的显示工作 c n o t i c e c d o c u m e n t文档类,所有图形对象都在文档类里边存储,被操 c m y d o c c n o t i c e 作! 继承自c d c 对c d c 增加了多文档多视图支持,浮点 c m y d c c d c 坐标支持 c n o t i c e 类无负责整个程序的消息分发 c g r a p h i c c w n d对象列表类,负责显示当前视图中的对象列表 o b j e c t l is t c p r o p e r t i e s l i s tc l is t c t r l负责显示当前被选中的对象的属性 4 3 2 数据对象层设计 数据对象层包括各种图形对象的数据结构描述及在这数据结构之上的各种操作。 在早期测试版软件中支持以下几种图形对象: 图形对象基类c g r a p h ic o b j e c t 类 它是所有图形对象的基类,继承自c n o t i c e 类,提供了图形对象的公共属性,操 作方法。它提供一系列的虚函数跟属性来描述子类啪1 的可能的行为,子类只要重载虚 函数即能够完成相应的功能。 方法属性: 对象点击测试虚函数,供子类实现 以下所有虚函数都是供子类实现 v i r t u a lb o o lv t h i t t e s t ( c f p o i n t 木p t ) : 重画 v i r t u a lv o i dv t p a i n t ( c m y d c 木p d c ) : 鼠标左键单击事件,s e l e c t o b j e c t 动作实现 v i r t u a lv o i dv t l b u t t o n d o w n ( u i n tn f l a g s , c f p o i n tp o i n t ) ; 设置对象状态 v i r t u a lv o i dv t s e t s t a t u s ( d w o r dd w s t a t u s , b o o lb n o tif y = t r u e ) ; 获取对象状态 v i r t u a ld w o r dv t g e t s t a t u s0 : 获取对象类型 v i r t u a ld w o r dv t g e t t y p e0 : 设置对象实例化后的c a p t i o n v i r t u a lv o i dv t s e t c a p t i o n ( c s t r i n g s t ) : 获取对象实例化后的c a p t i o n v i r t u a lc s t r i n gy t g e t c a p t i o n0 : 对象第一次生成自动命名函数 v i r t u a lc s t r i n gv t n a m i n g0 : 鼠标左键弹起触发事件通知 v i r t u a lv o idv t l b u t t o n u p ( d w o r dn f l a g s , c f p o i n tp o i n t ) : 鼠标移动事件 v i r t u a lv o i dv t m o u s e m o v e ( d w o r dn f l a g s , c f p o i n tp o i n t ) : 通知事件,是继承于c n o t i c e 类的重载 v i r t u a lh r e s u l tn o t i f y ( i n tn c o d e , v al i s ta r g l i s t ) : v i r t u a lv o i dd o p r o p e r t i e s i t e m i n s e r t ( c p r o p e r t i e s l i s t * p p l ) : 编码函数 v i r t u a lv o i dv t l e e n c o d e ( c l a s e r e x e c u tio n e n c o d e 木le e n c o d e ) : 设置f r e c t ,使得对象大小实时缩放 v o i ds e t f r e c t ( c f r e c t & f r c ,b 0 0 lb n o t i f y = t r u e ) : 过去对象存储的尺寸 v i r t u a lu l o n gv t g e t o b j s a v e s i z e0 : 对象装载时调用,重构对象 v i r t u a lv o i dv t l o a d ( c a r c h i v e & a r , g r a p h i c o b j e c t s t r u c t * p g o s ) : 对象重构前的初始化工作 s t a t i cc g r a p h i c o b j e c t * l o a d ( c a r c h i v e & a r , c n o t i c e * p n o t i c e ) : 对象保存函数 v i r t u a lb o o lv t s a v e ( c a r c h i v e a r ) : 获得当前对象的所属文档 m y d o c 木g e t d o c u m e n t0 : 获得对象外框大小 c f r e c t g e t f r e c t0 : 获得对象的缩放倍数 f l o a tg e t z o o m v a l u e0 : 设置缩放倍数 b o o ls e t z o o m v a l u e ( f l o a tz v ) : 缩放倍数 f l o a tm _ f z o o m v a l u e : 对象边框范围 c f r e c t m _ f r c w i n d o w : 对象状态 d w o r d m _ d w s t a t u s : 对象标识名 c s t r i n g m _ s t c a p t i o n : 通知对象 c n o t i c e * m _ p n o t i c e : 在当前版本中图形对象类库有以下图形对象: 直线对象( c l i n e o b j e c c t 类) 、椭圆( 圆) 对象( c e l l i p s e o b j e c t 类) 、矩形对象 ( c r e c t a n g l e o b j e c t 类) 、贝塞尔对象( c b e z i e r o b j e c t 类) 、文字对象( c t e x t o b j e c t 类) 、 画笔对象( c p e n o b j e c t 类) 等,它们都的具体描述见表4 - 2 。 3 2 表4 2 图形对象类明细表 类名 父类详细描述 c 1 i n e c g r a p h ic 描述用户在作图区画的一条直线,直线可以被二次编辑,记录 直线位置的是通过m _ f r c w i n d o w 属性做到的,该属性描述了直 o b j e c to b j e c t 线的最大外框。 c e l l i p s ec g r a p h i c椭圆或圆对象描述一个椭圆形状的对象,其外框大小 o b j e c t o b j e c tm _ f r c w i n d o w 同样描述了它的大小。 c r e c t a n g l ec g r a p h i c矩形对象跟椭圆对象类似,通过外框m f r c w i n d o w 即可描述其 o b j e c to b j e c t 本身大小。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论