不管是AutoCAD中的对象还是SVG中的图形都是通过坐标定位的。但是两者的坐标系统是不同的, AutoCAD的世界坐标系的原点在屏幕的左下角, X轴的正向朝右, Y轴的正向向上。SVG的坐标系的原点在初始视口(屏幕)的左上角,X轴的正向朝右, Y轴的正向朝下。两者均可以定义自己的坐标系。在DXF文件向SVG文件转换时,为保证图形显示正确,应将所有的图形进行坐标矩阵变换。在SVG中使用下面语句:
<g transform="matrix(1 0 0 21 0 600)">
</g>
由于在DXF文件中的椭圆记录的特征数据和SVG中的椭圆元素需要的数据是不同的, DXF文件记录了椭圆圆心、长轴的端点(相对于圆心的相对值) 、半长轴与半短轴的比例等数据。SVG中的椭圆元素需要椭圆圆心、半长轴、半短轴等数据。并且AutoCAD中的椭圆的长轴可以和水平轴成任意角度,但直接用SVG中的< ellip se >元素所绘的图形只能使椭圆的长轴平行于水平轴,因此,需要计算长轴和水平轴所成角度,再使用旋转变换。所以应利用下面公式转换:
sl = S qr( x23 x2 + y23 y2)
ss = sl3 r1
aa = A tn ( y2 / x2) 3 180 /3. 141 592 6
其中sl代表椭圆的半长轴, ss代表椭圆的半短轴, aa代表椭圆的长轴与水平轴的角度, x2和y2是长轴的端点(相对于圆心的相对值) , r1是半长轴与半短轴的比例。
对所有图形进行了坐标系统转换,但文字不同于其他图形,转换之后会出现了反转,这时应先将文字相对于原所在位置的基线进行镜像,这样能保证文字按正常状态显示。
转换之后,可能出现SVG中的中文不能显示的情况,这是因为SVG有3种编码形式: iso2885921 (ASCII) 、utf28和utf216, iso2885921 (ASCII)不能直接使用汉字字符, utf28和utf216是Unicode形式的编码, utf28支持多语种,每一个ASCII字符使用一个字节来表示,对于其他字符使用三个字节来表示。utf216对于任何一个字符都是使用两个字节来表示,这两种编码能正常显示汉字。在编程时,如果直接写SVG文档,则文档使用的是ASCII码,所以不能正常显示汉字。解决的方案是:
3.3.1 在SVG中,需要将中文字体名称进行“国际化”,即将汉字字体名称改为英文名称,下面是部分字体对照列表(表2) 。
表2 部分汉字字体与英文名称对照表
FangSong_GB2312 仿宋_GB2312 KaiTi_GB2312 楷体_GB2312
YouYuan 幼圆 LiSu 隶书
SimSun 宋体 SimHei 黑体
3.3.2 将ASCII码的文档转换成Unicode编码后写文件。下面是VB 实现的代码,将ASCII码的文档读入byte 数组mem,通过StrConv( )转换后,写入文件。
fLength = FileLen (" c: / svg1. svg" )
ReDim mem (fLength) AsByte
Open "c: / svg1. svg" For Binary As #2
Get #2, , mem
Close #2
mem = StrConv(mem, vbUnicode, &H804)
Open svgfilename For Binary As #3
Put #3, , mem
Close #3
对于圆弧、椭圆弧等复杂图形,在SVG中用< Path >元素
描述,其中有椭圆弧命令:
A rx ry x2axis2rotation large2arc2flag sweep2flag x y
其中, rx和ry分别是半长轴和半短轴, x2axis2rotation是弧所在椭圆的X 轴与水平方向的夹角, large2arc2flag 和sweep2flag决定椭圆弧的绘制方向,如果large2arc2flag为1代表大角度弧线,为0代表小角度弧线, sweep2flag为1代表起点到终点的弧线绕椭圆中心是顺时针方向,为0是逆时针方向, x和y是椭圆弧终点坐标。这和DXF中的圆弧、椭圆弧描述的特征数据是不一样的,同样需要转换。