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

今天,遇到这样一个问题,在模型空间内选择所有块定义名称为"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);

因为这个名称中的“#”代表任意数字,acedSSGet选择集函数实际找到的所有“块名称为4个数字,且第1、2、4位为1”的所有块参照。

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

rbFilter = acutBuildList(RTDXF0, _T("INSERT"), 2, _T("1`#11"), RTNONE);

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

以下为稍完整的代码

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);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值