天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 62|回复: 0

学习arx

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
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 了,填充的图案还是没有消除?

 

 

 

 

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

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 10:34 , Processed in 0.159217 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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