天气与日历 切换到窄版

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

ObjectARX中acedSSGet选择块定义名称包含“#“字符的图块出错

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
今天,遇到这样一个问题,在模型空间内选择所有块定义名称为"1#11"的块参照,采用acedSSGet接口进行选择。但是经过测试,发现acedSSGet一直返回错误,后来经过反复查资料,确定问题解决方法。

1 cad中的通配符
我们知道,在Windows系统中有“*”、“?”通配符,但实际上,AutoCAD本身也有一套自己的通配符。例如,在图层管理器的搜索功能、find命令都可以使用通配符。
具体一些,在find命令中,如果想搜索一个类似"&dafsdf"的字符串,你设定的关键字可以是".?",其中"."代表任意非字母数字字符。
以下为CAD中的通配符规定,请格外注意图片最后一行。

那这和选择集有什么关系呢?请看第2小节。

2 acedSSGet中的通配符
在int acedSSGet( const ACHAR * str, const void * pt1, const void * pt2, const struct resbuf * ilter, ads_name ss)函数中,如果说过滤器包含符号名称(实体类型、块名、标注样式名、线型名、文字样式、图层名),那么名称中可以包含通配符。
在arx的帮助文档中:

Wildcard Patterns in Filter Lists
Symbol names specified in filter lists–the entity type (0), block name (2), DIMSTYLE name (3), linetype (6), text style (7), and layer name (8)–can include wild-card patterns. The wildcard patterns recognized by acedSSGet() are the same as those recognized by the function acutWcMatch().
The wildcard character, or asterisk (*), also appears in the name of anonymous blocks. So if you try to retrieve an anonymous block, you must escape this character by preceding it with a reverse quote (’).

由此可见,我们在构建过滤器时,如果想找一个名称包含通配符的符号名,比如找到所有块名称为"1#11"的块参照,那我们就不能这样构造过滤器:

rbFilter = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("1#11"), RTNONE);
1
因为这个名称中的“#”代表任意数字,acedSSGet选择集函数实际找到的所有“块名称为4个数字,且第1、2、4位为1”的所有块参照。

我们应该把过滤器创建为:

rbFilter = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("1`#11"), RTNONE);
1
也就是说:将名称中的“#”替换为"`# ",这样反引号之后的将会按字面意思解释(Escapes special characters (reads next character literally). )。

以下为稍完整的代码

[code]void SelectSth()
{
        CString sPrompt[2] = { _T("请拾取对象<退出>:") ,_T("请拾取对象<退出>:") };
        ads_name ssName;
        struct resbuf * rbFilter;

        //将名称中的“#”替换为"`# ",这样反引号之后的将会按字面意思解释
        //rbFilter = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("1#11"), RTNONE);
        rbFilter = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("1`#11"), RTNONE);
        if (RTNORM == acedSSGet(_T(":$"), sPrompt, NULL, rbFilter, ssName))
        {
                //add your code... ...
        }

        acutRelRb(rbFilter);
        acedSSFree(ssName);
}
:https://blog.csdn.net/mary288267/article/details/121950531[/code]

 

 

 

 

ObjectARX中acedSSGet选择块定义名称包含“#“字符的图块出错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 11:42 , Processed in 0.139191 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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