1、获取文字的长度
对于获取文字的长度,知道的就只有2个方法,一个是利用AcDbEntity中的getGeoExtents,一个是使用acedTextBox。
方法一:
对于getGeoExtents,首先要获得一个实体的指针,获得指针后就直接使用,这个简单,对于文字角度不是0度的情况下,就需要获得文字的角度,然后使用几何运算就可得到文字的长度了
这里着重将讲下acedTextBox
- int acedTextBox (const struct resbuf *args,
- ads_point pt1, ads_point pt2);
上面的是在sdk中定义的,args是文字链表(这个链表可以使用acutBuiltList,也可以使用acdbEntGet()返回的链表),pt1是相对于文字来说的最小点(左下角),pt2是相对于文字来说的最大点(右上角)。
acdbEntGet()是要一个ads_name类的参数,通常与acdbEntSel()一起获得。这样获得的链表是完整的,但对于那些不在数据库中的文字内容来说,就不能获得这个链表了,只能通过acutBuiltList来建立一个链表。
acutBuiltList的使用方法我这里不多讲!
这里有个例子,可以供大家参考一下:
- //getCurrentTextStyle是子函数,用于获取当前活动的文字样式及宽度因子
- double CBasic::getLength( CString str, double height )
- {
- ACHAR *txtStyle = NULL;
- double width = NULL;
- CBasic::getCurrentTextStyle( txtStyle, width );
- struct resbuf *txtlist;
- //下面的acutBuiltList内容,最好与下面的扩展内容结合来看,注意的是前面的数字,如1,40,41,7
- txtlist = acutBuildList( RTDXF0, _T("TEXT"),
- 1, str,
- 40, height,
- 41, width,
- 7, txtStyle,
- NULL);
- ads_point bottomLeft, upRight;
- acedTextBox( txtlist, bottomLeft, upRight );
- acutRelRb( txtlist );
- return fabs( bottomLeft[X] - upRight[X]);
- }
这里稍微给个扩展内容,就是链表,链表其实跟dxf是对应的,文字的dxf内容如下(复制来自dxf参考手册):
文字组码 | |
组码 | 说明 |
100 | 子类标记 (AcDbText) |
39 | 厚度(可选;默认值 = 0) |
10 | 第一对齐点(在 OCS 中) DXF:X 值;APP:三维点 |
20, 30 | DXF:第一对齐点的 Y 值和 Z 值(在 OCS 中) |
40 | 文字高度 |
1 | 默认值(字符串本身) |
50 | 文字旋转角度(可选;默认值 = 0) |
41 | 相对 X 比例因子 — 宽度(可选;默认值 = 1) 使用拟合类型的文字时,该值也将进行调整。 |
51 | 倾斜角(可选;默认值 = 0) |
7 | 文字样式名(可选;默认值 = 标准) |
71 | 文字生成标志(可选,默认值 = 0): 2 = 反向文字(镜像 X) 4 = 倒置文字(镜像 Y) |
72 | 水平文字对正类型(可选,默认值 = 0)整数代码(非按位编码) 0 = 左对正;1 = 居中;2 = 右对正 3 = 对齐(如果垂直对齐 = 0) 4 = 中间(如果垂直对齐 = 0) 5 = 拟合(如果垂直对齐 = 0) 请参见组 72 和 73 整数代码表以识别对正类型 |
11 | 第二对齐点(在 OCS 中)(可选) DXF:X 值;APP:三维点 只有当 72 或 73 组的值非零时,该值才有意义(如果对正不是基线对正/左对正) |
21, 31 | DXF:第二对齐点的 Y 值和 Z 值(在 OCS 中)(可选) |
210 | 拉伸方向(可选;默认值 = 0, 0, 1) DXF:X 值;APP:三维矢量 |
220, 230 | DXF:拉伸方向的 Y 值和 Z 值(可选) |
100 | 子类标记 (AcDbText) |
73 | 文字垂直对正类型(可选;默认值 = 0)整数代码(不是按位编码) 0 = 基线对正;1 = 底端对正;2 = 居中对正;3 = 顶端对正 详细信息请参见组 72 和 73 整数代码表 |
如一个点坐标为(123455.33,2323455.22,0)
但是输出到文本文件的时候变成了(1.23455E+005,2.323455E+006,0),不是以小数方式表示的,也没有小数位数
int acdbRToS()其中的unit参数可以控制转化格式
long num;
AcDbObjectId id;
num = id.asOldId();
现在想通过程序来消除已填充的图案。为何我将填充的实体ID setNull 了,填充的图案还是没有消除?
要根据ID打开实体,然后erase |