arx的问题集

1、获取文字的长度

2、如何转换实体坐标计数方式和小数位数 

3、AcDbObjectId转int,CString

4、如何消除已经创建的填充?

获取文字的长度

对于获取文字的长度,知道的就只有2个方法,一个是利用AcDbEntity中的getGeoExtents,一个是使用acedTextBox。
方法一:
对于getGeoExtents,首先要获得一个实体的指针,获得指针后就直接使用,这个简单,对于文字角度不是0度的情况下,就需要获得文字的角度,然后使用几何运算就可得到文字的长度了

 

这里着重将讲下acedTextBox

  1. int acedTextBox (const struct resbuf *args,
  2.                   ads_point pt1, ads_point pt2);

上面的是在sdk定义的,args是文字链表(这个链表可以使用acutBuiltList,也可以使用acdbEntGet()返回的链表),pt1是相对于文字来说的最小点(左下角),pt2是相对于文字来说的最大点(右上角)。
acdbEntGet()是要一个ads_name类的参数,通常与acdbEntSel()一起获得。这样获得的链表是完整的,但对于那些不在数据库中的文字内容来说,就不能获得这个链表了,只能通过acutBuiltList来建立一个链表。
acutBuiltList的使用方法我这里不多讲!


这里有个例子,可以供大家参考一下:

  1. //getCurrentTextStyle是子函数,用于获取当前活动的文字样式及宽度因子
  2. double CBasic::getLength( CString str, double height )
  3. {
  4. ACHAR *txtStyle = NULL;
  5. double width = NULL;
  6. CBasic::getCurrentTextStyle( txtStyle, width );
  7. struct resbuf *txtlist;
  8. //下面的acutBuiltList内容,最好与下面的扩展内容结合来看,注意的是前面的数字,如1,40,41,7
  9. txtlist = acutBuildList( RTDXF0, _T("TEXT"),
  10.                                           1, str,
  11.                                           40, height,
  12.                                           41, width,
  13.                                           7, txtStyle,
  14.                                           NULL);
  15. ads_point bottomLeft, upRight;
  16. acedTextBox( txtlist, bottomLeft, upRight );
  17. acutRelRb( txtlist );
  18. return fabs( bottomLeft[X] - upRight[X]);
  19. }

这里稍微给个扩展内容,就是链表,链表其实跟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 了,填充的图案还是没有消除?

要根据ID打开实体,然后erase

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值