找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2738|回复: 16

[教学]:形的编译与使用

[复制链接]
发表于 2003-12-2 19:25:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
形的编译与使用

    形是一种对象,用法与块相似。使用形时,首先要用LOAD命令加载包含所需形定义的编译后的形文件,然后用SHAPE命令将形从该文件插入图形中。将形加入图形时,可进行缩放和旋转。AutoCAD字体与形的定义方式相同。

    与形相比,块更容易使用,且用途更加广泛。但对AutoCAD而言,形占用空间较小,绘制速度较快。当用户必须重复插入一个简单图形且速度非常重要时,用户定义的形将非常有用。

    一、编译形文件

    用户在扩展名为*.shp 的特殊格式的文本文件中输入形的说明。要创建这样的文件,请使用文本编辑器或字处理器编辑ASCII格式的文件,然后编译该ASCII文件。编译形定义文件生成能被LOAD或STYLE命令接受的文件格式。
   
    要编译形或字体文件,请输入:

    命令:compile

    AutoCAD显示"选择形文件"对话框,用户可从中选择形定义文件(*.shp)。在选择文件名后,即开始编译。如果AutoCAD在形说明中发现错误,将显示信息,指明错误类型和行号。编译完成时将显示如下信息:编译成功。

    输出文件name.shx包含nnn字节。编译后的文件与形定义文件同名,但其文件类型为*.shx。

    二、形定义文件

    AutoCAD字体和形文件(*.shx)从形定义文件(*.shp)生成(编译成)。形定义文件可用文本编辑器或能将文件存为ASCII格式的字处理器创建或编辑。

    每个形(或字符)的形说明语法都不考虑形说明的最后用法(用作形或字体)。如果形定义文件被用作字体文件,则文件中的第一个条目必须描述字体本身,而不是该文件中的形;如果第一个条目描述一个形,则该文件被用作形文件。

    形说明:

    形定义文件的每一行最多可包含128个字符,超过此长度的行不能编译。AutoCAD忽略空行和分号右边的文字。利用分号可以在形定义文件中包含注释。

    每个形说明都有一个标题行(格式如下),以及一行或多行定义字节。这些定义字节之间用逗号分隔,最后以0结束。

    *shapenumber,defbytes,shapename

    specbyte1,specbytec2,specbytec3,...,0

    下表描述了形说明的各个字段:

    shapenumber

    数字,在文件中唯一,在1到258之间,带前缀星号(*)。形文件中的每个形必须有一数字编号(256、257和258分别是符号标识符Degree_Sign、Plus_Or_Minus_Sign 和Diameter_Symbol的编号)。字体(包含每个字符的形定义的文件)的编号要与每个字符的ASCII码对应;其他形可指定任意数字。

    defbytes

    用于描述形的数据字节(specbytes)的数目,包括末尾的零。每个形最多可有2,000个数据字节。

    shapename

    形的名称。形名称必须大写,以便于区分。包含小写字符的名称被忽略,并且通常用作字体形定义的标签。

    specbyte

    形定义字节。每个定义字节都是一个代码,或者定义矢量长度和方向,或者是特殊代码的对应值之一。在形定义文件中,定义字节可以用十进制或十六进制表示。与许多形定义文件一样,本节样例中同时使用了十进制和十六进制定义字节值。如果形定义字节的第一个字符为0(零),则后面的两个字符解释为十六进制值。

    1.矢量长度和方向代码

    简单的形定义字节在一个定义字节(一个specbyte字段)中包含矢量长度和方向的编码。每个矢量的长度和方向代码是一个三字符的字符串。第一个字符必须为 0,用于指示AutoCAD将后面的两个字符解释为十六进制值。第二个字符指定矢量的长度。有效的十六进制值包括从1(一单位长度)到F(十五单位长度)。第三个字符指定矢量的方向。图一展示了方向代码。

    图中的所有矢量都按同样的长度定义绘制。对角矢量长度延长,以匹配最接近的正交矢量的X或Y位移。这与AutoCAD中的捕捉栅格操作相似。

    下例构造名为DBOX的形,指定形的编号为230。

    *230,6,DBOX

    014,010,01C,018,012,0

    上述定义字节序列定义了一个单位长度、单位宽度的方框,以及从左下角到右上角的对角线。将文件保存为 dbox.shp后,用COMPILE命令生成dbox.shx文件。用LOAD命令加载包含此定义的形文件,然后如下使用SHAPE命令:

    命令:shape

    形名称(或 ?):dbox

    起点:1,1

    高度<当前值>:2

    旋转角度<当前值>:0

    结果形如图二所示:

    2.特殊代码

    除定义矢量之外,定义字节也可用下列特殊代码创建其他格式、指定特定操作。要使用特殊代码,三字符串中的第二个字符(矢量长度定义)必须为0,或者也可直接指定代码数字(例如,008和8都是有效的特殊代码定义)。

    定义字节代码

    代  码        说        明
    000                形定义结束
    001                激活绘图模式(落笔)
    002                停止绘图模式(抬笔)
    003                将矢量长度除以下一字节
    004                将矢量长度乘以下一字节
    005                将当前位置压入堆栈
    006                从堆栈弹出当前位置
    007                绘制编号由下一字节指定的子形
    008                由下两个字节指定的 X-Y 位移
    009                多个 X-Y 位移,以 (0,0) 终止
    00A                由下两个字节定义的八分圆弧
    00B                由下五个字节定义的 Fractional arc
    00C                由 X-Y 位移和凸度定义的圆弧
    00D                多个指定凸度的圆弧
    00E                仅对垂直文字执行下一命令

    代码0:形结束

    代码0标识形定义结束。

    代码1和2:绘图模式控制

    代码1和2控制绘图模式。绘图模式在绘制每个形的开始时激活。当绘图模式打开时,一个矢量说明将绘制一条直线;当绘图模式关闭时,矢量说明只移到新位置,而不绘制直线。

    代码3和4:尺寸控制

    代码3和4控制每个矢量的相对尺寸。SHAPE命令指定的高度最初被当作单个正交矢量(方向为0、4、8或C)的长度。代码3和4后跟一个定义字节,该字节包含一个整数比例因子(1到255)。如果要用形高度来指定整个形的尺寸,并要用矢量长度10绘制,则可用3,10缩放高度定义。比例因子在同一形中是累计的,即,乘以2后再乘以6,结果比例因子为12。通常用户需要在形的结尾恢复原比例因子,尤其是对子形和字体形。AutoCAD不会为用户自动重置比例因子。

    代码5和6:位置保存/恢复

    代码5和6在绘制形时压入(保存)和弹出(恢复)当前坐标位置,这样就可从形中的其他点返回该点。位置堆栈只能保存四个位置值。如果由于过多的压入操作而造成堆栈溢出,则在绘制形时将显示如下信息:

    位置堆栈上溢,位于形nnn中

    与此类似,如果试图从堆栈中弹出过多的位置值,则在绘制形时将显示如下信息:

    位置堆栈下溢,位于形 nnn 中

    代码7:子形
   
    代码7是子形引用。代码7后面的定义字节是1到255之间的形数字编号。此编号的形(在同一形文件中)在此时绘制。注意:绘图模式不会为新形重置。当子形绘制结束后,继续绘制当前形。

    代码8和9:X-Y位移

    普通矢量定义字节只能在十六个预定义的方向上绘制,并且最大长度为15。这些限制使形定义更为有效,但有时会变得过于局限。通过代码8和9可用X、Y位移绘制非标准矢量。代码8后必须跟两个定义字节:

    8,X-displacement,Y-displacement

    X、Y位移范围为-128到+127。前面的+可选,并且可用括号增强可读性。下例中的矢量向左绘制(或移动)10单位,再向上绘制(或移动)3单位。

    8,(-10,3)

    在两个位移定义字节之后,形返回普通矢量模式。

    用代码9可绘制一系列非标准矢量。此代码后面可跟任意数量的X、Y位移对,由(0,0)对终止。下例绘制三个非标准矢量后返回普通矢量模式。

    9,(3,1),(3,2),(2,-3),(0,0)

    注意:必须用(0,0)对终止X、Y位移对序列,使AutoCAD能认识后面的普通矢量或特殊代码。

    代码00A:八分圆弧

    特殊代码00A(或10)用下两个定义字节定义一个圆弧。此圆弧称为八分圆弧,因为它跨越一个或多个45度的八分圆,起点和终点都在八分圆边界上。八分圆从三点的位置逆时针编号,如图三所示:

    圆弧定义为:10,radius,(-)0SC

    半径radius 可以是1到255之间的任意值。第二个定义字节指定圆弧的方向(如果为正,则为逆时针;如果为负,则为顺时针)、开始八分圆(S,值为0到7)和跨越的八分圆数(C,值为0到7。其中,0等于八个八分圆或整个圆)。可用括号增强可读性。例如,考虑形定义的如下片断:

    ...012,10,(1,-032),01E,...

    此代码依次分别绘制:向右上的一个单位矢量、从八分圆 3 开始的顺时针圆弧(半径为一个单位,跨越两个八分圆)和向右下的一个单位矢量,如图四所示:

    特殊代码00B(11)绘制起点和终点不一定在八分圆边界上的圆弧。其定义使用五个定义字节:

    11,start_offset,end_offset,high_radius,radius,(-)0SC

    start_offset和end_offset表示与圆弧起点和终点所在的八分圆边界的距离。high_radius表示半径的高八位有效数字,当半径不大于255时其值为0。将 high_radius值与256相乘并加上radius值,可生成大于255的圆弧半径。radius和最后的定义字节与八分圆弧的定义(代码00A,如前所述)一样。

    计算起点八分圆边界(45度的倍数)与圆弧起点之间所差的度数,再将其乘以256,除以45,即得到起点偏移。如果圆弧从八分圆边界开始,则其起点偏移为0。

    终点偏移的计算方式与起点偏移相似,但必须用最后一个八分圆边界与圆弧终点之间所差的度数进行计算。如果圆弧在八分圆边界结束,则其终点偏移为0。

    例如,从55度到95度,半径为3单位的特殊圆弧编码如下:

    11,(56,28,0,3,012)

    解释如下:

    start_offset= 56        因为 ((55 - 45) * 256 / 45) = 56
    end_offset= 28        因为 ((95 - 90) * 256 / 45) = 28
    high_radius= 0        因为 (半径 < 255)
    radius= 3       
    starting octant= 1        因为圆弧起点在 45 度八分圆中
    ending octant= 2        因为圆弧终点在 90度八分圆中

    代码00  00D:指定凸度的圆弧

    特殊代码00C和00D(12和13)提供另一种在形说明中包括圆弧的机制。它们与代码8和9相似,在代码8和9中通过指定X、Y位移来绘制圆弧,而在代码00C和00D中通过将凸度因子应用到位移矢量来绘制圆弧。代码00C 绘制一段圆弧,而代码00D绘制多段圆弧(polyarcs),直到该圆弧被(0,0)偏移终止为止。

    代码00C后必须跟上三个描述圆弧的字节:

    0C,X-displacement,Y-displacement,Bulge

    X、Y位移和凸度(指定圆弧的曲率)的取值范围为-127 到+127。如果位移指定的线段长度为D,垂足与该线段中点的距离为H,则凸度的幅值为((2*H/D)*127)。如果圆弧从当前位置到新位置是顺时针走向的,则符号为负。

    半圆的凸度为127(或-127),是用这种编码所能表示的最大的单段圆弧(用两个连续的圆弧段表示更大的圆弧)。凸度定义可以为0,表示直线段。注意:用代码8表示直线段在形说明中只占用一个字节。

    多段圆弧代码(00D或13)后面可跟0或多个圆弧段定义,最后被(0,0)偏移终止。(注意:最后一个位移之后不能再指定凸度。)例如,字母S可以如下定义:

    13,(0,5,127),(0,5,-127),(0,0)

    零凸度线段用于在多段圆弧中表示直线段,它们相当有用。与终止多段圆弧、插入直线段后再开始另一多段圆弧这种方法相比,其效率要高得多。

    在单段圆弧和多段圆弧定义中不能使用数字-128。

    代码00E:标记垂直文字命令

    特殊代码00E(14)仅用于双向字体说明中。双向字体说明中的字体在水平和垂直两个方向上使用。在字符定义中遇到此特殊代码时,下一代码是否进行处理由该字符的方向决定。如果方向为垂直的,则下一代码被处理;如果方向为水平的,则下一代码被忽略。

    在水平文字中,每个字符的起点是基线的左端;在垂直文字中,起点假定为字符的上方正中。在每个字符的结尾,通常需要用空线段绘至下个字符的起点。对水平文字,该线段是向右绘制的;而对垂直文字,该线段是向下绘制的。特殊代码00E(14)主要用于调整不同的起点和终点,使同一字符形可用于水平文字,也可用于垂直文字。例如,如下对大写D的定义可用于水平文字,也可用于垂直文字。

    *68,22,ucd

    2,14,8,(-2,6),1,030,012,044,016,038,2,010,1,06C,2,050,

    14,8,(-4,-3),0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2003-12-2 19:30:04 | 显示全部楼层
《形的编译与使用》一文的Word文档:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-4 15:40:51 | 显示全部楼层
我在教学中心提供了一篇类型的文章。

http://www.xdcad.net/techcenter/art...1396&tempshow=1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-22 13:23:02 | 显示全部楼层
欢迎大家加入QQ群3626255讨论。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-2 13:36:41 | 显示全部楼层
下了,好东东要钱也值得!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-2 16:50:29 | 显示全部楼层
我还是比较喜欢用mkshape
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-15 20:59:36 | 显示全部楼层
好,谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-9 14:37:42 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-13 22:00:31 | 显示全部楼层
花了两个爱心币还是没下得来!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-29 18:03:18 | 显示全部楼层
关于编辑形的有专门的书籍就好了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-31 22:37:13 | 显示全部楼层
搞得有点似懂非懂的,下了。谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-11-30 18:56:10 | 显示全部楼层
shx有什么用处
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 69个

财富等级: 招财进宝

发表于 2016-7-3 12:17:25 | 显示全部楼层
好文章呀。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 4751个

财富等级: 富可敌国

发表于 2017-1-2 00:08:01 | 显示全部楼层
正需要,支持楼主大人了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-1-16 21:56:25 | 显示全部楼层
没学过 支持一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 00:30 , Processed in 0.482991 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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