天气与日历 切换到窄版

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

学习arx

[复制链接]
  • TA的每日心情
    开心
    昨天 15:23
  • 签到天数: 69 天

    [LV.6]常住居民II

    410

    主题

    167

    回帖

    2704

    积分

    管理员

    积分
    2704
    发表于 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-7-1 05:22 , Processed in 0.058742 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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