|
1、获取文字的长度
2、如何转换实体坐标计数方式和小数位数
3、AcDbObjectId转int,CString
4、如何消除已经创建的填充?
获取文字的长度
对于获取文字的长度,知道的就只有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参数可以控制转化格式
AcDbObjectId转int,CString
long num;
AcDbObjectId id;
num = id.asOldId();
如何消除已经创建的填充?
现在想通过程序来消除已填充的图案。为何我将填充的实体ID setNull 了,填充的图案还是没有消除? |
|