📄 试刊3.txt
字号:
变RGB()函数的参 数值,可以实现其它颜色的变化。
本程序在Visual FoxPro 3.0中文版中运行通过。
*****************************************************
Turbo C修改Auto CAD的图素
曲国庆(山东建材学院分院 淄博 255200)
摘要:本文通过分析Auto CAD数据交换文件的结构,运用C语言直接读写其中的图
素,并给出了主要源程序,实现了在DOS下修改Auto CAD图素的方法,提高图形编辑
的速度。
关键词:Auto CAD、图素、Turbo C、文件、结构
Auto CAD是一套高效的绘图工具,在地图制图和计算机辅助设计方面得到广泛
的应用。地籍图的数字化和编辑中,常会遇到图形的放大和缩小等情况,而其中的
部分图素则要求保持原样,如界址点的园圈要求无论在何种比例尺地籍图中其半径
均为0.4mm,注记也必须满足规范要求。如何在图形比例变化后,复原部分图素的大
小,是地籍制图工作中非常重要的问题。本文讨论运用Turbo C语言直接读写Auto CAD
的数据交换文件并修改其部分图素的方法。
Auto CAD图形数据库是以十分紧缩的格式存储的,对用户程序来说,很难直接
读出,为便于数据交换,Auto CAD提供了数据交换文件──DXF文件。?此文件是一
种专用的ASCII文件,其一般结构为:HEADER(标题)节、?TABLES?(表格)节、
BLOCK(块)节、ENTITIES(图素)节、EOF(文件结束)节,共五个部分。每个部
分由若干组构成,每个组由两行组成,首行为组代码,其格式为三个字符域向右对
齐,左边填满空格,该组的第二行是组值,采用的格式取决于由组代码规定的组的
类型。
部分组代码及其含义:
0 ──标识一个图素表目的开始;
1 ──一个图素的初始文本值;
6 ──线型名;
8 ──层次名;
10──起始X坐标(线或正文图素的起始点,园的园心,等等);
11-18──其它X坐标;
20──起始Y坐标(线或正文图素的起始点,园的园心,等等);
21-28──其它Y坐标;
30-38──Z坐标;
40-48──浮点值(如文字高度、比例因子等);
50-58──角度;
62──颜色号。
70-78──整数值(如文本注记方式等)
DXF文件各个节的代码及顺序为:
0 (开始标题节) 0 (开始图素节)
SECTION SECTION
2 2
HEADER ENTITIES
. . (图素部分)
0 (开始表节) 0 (终止图素)
SECTOIN ENDSEC
2 0 (文件结束节)
TABLES EOF (文件结束)
.
0 (开始块节)
SECTION
2
BLOCKS
每个图素从标识图素的0开始,分别为图素名、层次组码、层次名等,部分图素的
组代码为:
LINE 10和20(起始点),11和21(终止点)。
POINT 10和20。
CIRCLE 10和20(园心),40(半径)。
ARC 10和20(园心),40(半径),50(起始角度),51(终止角度)。
TEXT 10和20(插入点),40(高度),1(文字值),50(旋转角度,可选项),
41(X的比例因子,可选项),51(倾斜角,可选项),72(对齐类型,可选项),
等。
...
以上图素均有颜色可选项,若用系统颜色,则此项省略,否则,有组码62和组值
(即所用的颜色值)。
以部分图素为例,其在DXF文件中的结构为:
0 (图素开始) 11
TEXT 31.877698 (终点X值)
8 21
0 (0层) 24.488029 (终点Y值)
62 31
1 (1号颜色) 0.0 (终点Z值)
10 0
14.419423 (插入点X值) CIRCLE
20 8
29.015994 (插入点Y值) 0 (0层)
30 10
0.0 (插入点Z值) 21.021801 (园心X值)
40 20
2.0 (文本高度) 14.931725 (园心Y值)
1 30
asdasf (文本值) 0.0 (园心Z值)
50 40
10.0 (旋转角度值) 2.993616 (半径R值)
72 0
1 (对齐方式) ARC
11 8
20.0 (对齐点X值) 0
21 10
30.0 (对齐点Y值) 40.578556 (中心X值)
31 20
0.0 (对齐点Z值) 16.275509 (中心Y值)
0 30
LINE 0.0 (中心Z值)
8 40
0 (0层) 6.505316 (半径R值)
62 50
3 (三号颜色) 54.138194 (起点角度值)
10 51
24.333769 (起点X值) 176.45641 (终点角度值)
20
25.039355 (起点Y值)
30
0.0 (起点Z值)
以修改CIRCLE的半径和TEXT的高度为例。由于大部分图素有可选项,数据结构
不固定,因此难以用Turbo C的结构体进行读写。另外,DXF文件的组码不是左对齐,
也无法按整型数据读取。Turbo C提供了两个函数:fgets(str,n,fp)和fputs(str,fp)。
前者是从fp指向的文件输入n-1个字符,并把它们放到字符数组str中。
若在读入n-1个字符结束之前遇到换行符或EOF读入结束。后者是把str中的字符
输入到fp指向的文件中。设图素的可选项均为系统默认值,源程序如下:
/*修改DXF文件中的园的半径和TEXT的高度*/
#include "stdio.h"
FILE *fp,*fp0;
main()
{
char s1[40],s2[40],s3[40],*ss;
int i;
char outfile[12];
printf("输入DXF文件名(含扩展名): ");
scanf("%s",outfile);
if ((fp=fopen(outfile,"r"))==NULL)
{printf("can not open file\n");
exit(0);
}
if ((fp0=fopen("dxf0.dxf","w"))==NULL)
{printf("error!\n");
exit(0);
}
while (! feof(fp))
{
fgets(s1,20,fp);fputs(s1,fp0);
if (s1[0]=='C'&& s1[1]=='I' && s1[2]=='R')
{for (i=1;i<=9;i++) {fgets(s1,20,fp);fputs(s1,fp0);}
fgets(s1,20,fp);
fputs("1.4\n",fp0);
}
if (s1[0]=='T'&& s1[1]=='E' && s1[2]=='X' && s1[3]=='T')
{for (i=1;i<=11;i++) {fgets(s1,20,fp);fputs(s1,fp0);}
fgets(s1,20,fp);fputs("2.0\n",fp0);
}
}
fclose(fp);fclose(fp0);
}
运行此程序即可将园的半径均修改为0.4,将文本注记的高度均修改为2.0,修
改的结果保存到DXF0.DXF中,在Auto CAD状态下用DXFIN?命令即可调出修改后的图
形。当可选项为非默认值时,读者可仿照此方法,设计相应的子函数,通过组码及
其值的判断完成相应图素的修改。也可以实现交互式编辑。
此方法在地籍制图的实际工作中,已得到应用,并收到良好的效果,特别在批
量修改方面,其优点更为突出。
参考文献
[1] 谭浩强编著,《C程序设计》,清华大学出版社,1991年
[1] 谭浩强编著,《C程序设计》,清华大学出版社,1991年
*****************************************************
*****************************************************
<轻松一刻>
Windows源程序
我终于闯入了微软,盗得了以下的Windows源程序。
#include <windows.h>
#include <系统_错误.h>
#include <stdlib.h>
char 使_程序_看起来_很大[1600000];
main()
{
if (探测到_cache())
使失效_cache();
if (cpu_快())
设置_等待_状态(长时间);
设置_鼠标(速度, 非常_慢);
设置_鼠标(动作,跳动);
设置_鼠标(反应, 偶尔);
打印("欢迎进入Windows 3.999 (我们会工作正常 \
或给芝加哥打电话)\n");
if (系统_ok())
崩溃(to_dos_prompt);
else
系统_内存 = open("a:\swp0001.swp", 创建);
while(1) {
休眠(5);
让_用户_输入();
休眠(5);
执行_用户_输入();
休眠(5);
if (混乱() < 0.9)
崩溃(整个_系统);
}
返回(无法恢复的_系统);
}
*****************************************************
*****************************************************
<有问必答>(以下问答均摘自《索易电脑信箱》)
1.在 vb中怎样在输入数据时按回车就跳到下一个数据框,而不是按 tab.
答:
捕捉Enter键的键码,然后由系统输出代表Tab的键码。
Sub Text1_KeyPress(KeyAscII As Integer)
if keyascii=13 then
keyascii=0
sendkeys "{Tab}"
end if
end sub
2.请问Delphi中Paradox表的DBMEMO字段为何显示不出汉字?
答:
将字段的语言设置为ansi即可.
*****************************************************
*****************************************************
<编者的话>
如果您觉得这份刊物还不错的话,欢迎把它介绍给您的朋友.
不知道您看了这期刊物有什么想法或者是意见,欢迎向我提出来.
本人感激不尽,我的联系方法如下:
E-mail:yaozheng@kali.com.cn
Homepage:http://home.baoding.cn.net/~yaozheng---编程资讯站
http://yaozheng.yeah.net
http://programmer.nethome.com.cn
><<编程技术>>订阅方法:
订阅:向yaozheng@kali.com.cn发封邮件
主题:subscribe 内容无或为您希望收到刊物的E-mail
退订:向yaozheng@kali.com.cn发封邮件
主题:unsubscribe 内容无或为您订阅刊物时的E-mail
******************************THE END*****************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -