acedSSGet函数内容复杂,本介绍仅为对官方手册内容做翻译
原文地址:https://help.autodesk.com/view/OARX/2020/ENU/?guid=OARX-RefGuide-acedSSGet_ACHAR___void___void___struct_resbuf___ads_name
函数原型:
1 int acedSSGet(const ACHAR * str, const void * pt1, const void * pt2, const struct resbuf * filter, ads_name ss);
所在头文件:
acedads.h
参数介绍:
参数名称 | 描述 |
str | 可选字符串,用于指定要使用的实体选择模式 |
pt1 | 可选点,适用于某些选择模式;或者是包含多个点的结果缓冲区列表,用于多边形或围栏选择选项;或者是包含两个字符串的数组,用于替换提示符,用于 :$ mode 选项 |
pt2 | 某些选择模式相关的可选点 |
filter | 可选的结果缓冲区列表,使 acedSSGet() 能够对绘图进行过滤,以选择具有特定类型或特定属性的实体 |
ss | 选择集的名称 |
函数描述:
通过指定 AutoCAD 选择模式之一获取的选择集。选择模式可以通过提示 AutoCAD 用户或过滤绘图数据库来指定。
在完成对选择的处理后,必须释放分配的选择集。如果未能执行此操作,则选择集将保留在堆栈上,直到 AutoCAD 终止。由于 AutoCAD 每个会话只能持有 128 个基于应用程序的选择集,未释放的选择集可能会导致通过 ObjectARX 失败的对象选择。
注意:
此函数只能返回由当前绘图的模型空间和图纸空间中的实体组成的选择集(而不是非图形对象或其他块定义中的实体)。
pt1 变量不能包含定义零长度线段的点。
对于 str 参数,请使用以下表中列出的字符串之一。
str 参数的值 | 描述 | str 参数的值 | 描述 |
NULL | 单点选择(如果指定了 pt1)或用户选择(如果 pt1 也为 NULL) | ":D" | 允许重复 |
"I" | PICKFIRST 集合 | ":E" | 光圈中的所有内容 |
"C" | 跨越选择 | ":K" | 关键字回调 |
"CL" | 对象分类的类 | ":N" | 嵌套 |
"CP" | 跨越多边形选择 | ":S" | 强制仅允许单个对象选择 |
"F" | 围栏(开放多边形)选择 | ":U" | 启用子实体选择 |
"L" | 最后创建的实体 | ":V" | 强制子实体选择 |
"P" | 上一个选择集 | ":r" | 启用长交易中的实体选择 |
"W" | 窗口选择 | "." | 用户选择 |
"WP" | 窗口多边形选择 | "#" | 非几何(所有、最后、上一个) |
"X" | 仅过滤选择 | "A" | 所有 |
"G" | 组 | "B" | 矩形 |
":$" | 提供的提示 | "M" | 多个 |
":?" | "其他" 回调 |
选择方法模式选项
NULL
如果 str、pt1、pt2 和 filter 全部为 NULL,则 acedSSGet() 会检查是否存在当前的 PICKFIRST 集合。如果存在,则 acedSSGet() 返回该集合;否则,它会提示用户使用 AutoCAD 的一般选择对象提示,并等待用户选择一个选择集。在交互式选择期间,实体会在屏幕上高亮显示,但 acedSSGet() 不会高亮显示直接获取或使用 filter 参数获取的实体。acedSSGet() 函数不会返回有关用户如何选择选择集的信息。(acedEntSel() 和 acedNEntSelP() 函数可以同时获取实体和用户选择的点。)如果 str 和 pt2 都为 NULL,但 pt1 是一个点,则效果与用户使用 AutoCAD 指针设备指定单个点选择实体相同。
"I"
获取当前的 PICKFIRST 集合,如果有的话。如果没有,则 acedSSGet() 返回 RTERROR。("I" 代表 "implied"。)请注意,addCommand() 的可选标志 ACRX_CMD_USEPICKSET 和 ACRX_CMD_REDRAW 必须使用才能使 acedSSGet("I", ...) 正常工作。
"C"
AutoCAD 的交叉选择模式。pt1 和 pt2 必须是指定交叉窗口的角点的点。
"CL"
导致 AutoCAD 提示用户输入对象分类类名称。程序无法向 acedSSGet() 提供组名称。
"CP"
AutoCAD 的交叉多边形选择模式。pt1 是定义交叉多边形的点的列表。pt2 必须为 NULL。
"F"
AutoCAD 的围栏选择模式。pt1 是定义围栏的点的列表。pt2 必须为 NULL。
"L"
AutoCAD 的上一个选择模式。选择最后创建的实体。pt1 和 pt2 必须都为 NULL。
"P"
AutoCAD 的上一个选择模式。选择上一个选择集。pt1 和 pt2 必须都为 NULL。
"W"
AutoCAD 的窗口选择模式。pt1 和 pt2 必须是指定窗口的角点的点。
"WP"
AutoCAD 的窗口多边形选择模式。pt1 是定义窗口多边形的点的列表。pt2 必须为 NULL。
"X"
仅过滤选择。
"G"
导致 AutoCAD 提示用户输入组名。程序无法向 acedSSGet() 提供组名称。
冒号模式选项
":$"
此模式选项表示调用者已提供了新的提示作为 pt1 参数。这些提示将替换 AutoCAD 的选择对象和删除对象提示。新的提示字符串以两个指向字符字符串的数组形式传递给 acedSSGet()(char* prompts[2])。索引 0 处的字符串替换选择对象提示,索引 1 处的字符串替换删除对象提示。":?"此模式选项将导致调用设置为 acedSSSetOtherCallbackPtr() 的回调函数在 acedSSGet() 接收到任何它无法理解的文本输入时被调用。
":A"
此模式选项导致 acedSSGet() 在实现子选择过滤器的实体上执行单点选择。
":D"
此模式选项导致 acedSSGet() 允许在选择集中复制实体。因此,每次选择实体时,无论该实体是否已在选择集中,都将将其添加到选择集中。警告在引入此模式选项之前,选择集中的所有条目都是唯一的。由于 :D 选项不能保证每个条目都是唯一的,因此依赖此唯一性的代码不应使用使用 :D 创建的选择集,否则可能导致意外行为。":E"此模式选项将导致 acedSSGet() 在用户进行选择时,在光标的对象选择拾取框内选择所有内容。
":K"
此模式选项将向 acedSSGet 使用的关键字列表添加自定义关键字。此外,如果 AutoCAD 中设置了关键字回调函数指针(通过 acedSSSetKwordCallbackPtr() 设置),则该回调函数将在 acedSSGet() 接收到任何自定义关键字的文本输入时被调用。使用此模式选项时,acedSSGet() 的 pt2 参数必须指向以与 acedInitGet() 相同格式进行格式化的关键字字符串。acedSSGet() 将使用传递的关键字列表字符串的副本。":K" 关键字机制支持全球化,方式与 acedInitGet() 相同。唯一的区别在于,在此情况下,您将您的关键字附加到 AutoCAD 提供的已有关键字列表中,并且现有列表具有本地和全局关键字对,因此您必须提供仅全局关键字(即,您的关键字列表字符串的第一个字符是下划线),或者您的关键字列表必须是本地/全局关键字对(即,您的所有本地关键字后面是下划线,然后是所有匹配的全局关键字)。
":N"
此模式选项将导致后续对 acedSSNameX() 的调用提供有关在 acedSSGet() 操作期间选择的任何实体的容器块和变换矩阵的附加信息。该附加信息仅对通过图形选择方法选择的实体可用,如窗口、交叉、点选等。
":S"
此模式选项导致 acedSSGet() 仅允许进行一次选择。注意在使用此模式选项时,应使用“-M”模式选项移除“Multiple”关键字,否则用户激活“Multiple”关键字选项可能会导致不良行为。
":U"
此模式选项启用子实体选择。它不能与重复(":D")或嵌套(":N")选择模式组合。在此模式下,默认情况下选择顶级实体,但用户可以在进行选择时按住 CTRL 键尝试选择子实体。此选项仅支持交互式选择,如窗口、交叉和多边形。不支持所有、过滤或组选择。
":V"
此模式选项强制子实体选择。它将用户进行的所有交互式、图形选择视为子实体选择。返回的选择集仅包含子实体。此选项不能与重复(":D")或嵌套(":N")选择模式组合。此选项仅支持交互式选择,如窗口和交叉。不支持所有、过滤或组选择。
关键字过滤模式选项
"#"
在“-”列表中使用时,此选项会从关键字列表中移除关键字“Last”、“All”、“Group”和“Previous”。在“+”列表中使用时,此选项会添加关键字“Last”、“All”和“Previous”。控制在 acedSSGet() 关键字列表中添加/移除“Last”、“All”、“Group”和“Previous”关键字。
"."
此选项使用关键字操作语法,但它控制用户使用指针设备或坐标输入进行选择时的“选择”能力的添加/移除。这不是一个显式关键字,而是一个隐含关键字。
"A"
控制在 acedSSGet() 关键字列表中添加/移除“所有”关键字。
"B"
在“-”列表中使用时,此选项会从关键字列表中移除“Box”和“Auto”。在“+”列表中使用时,此选项会将“Window”、“Crossing”、“BOX”、“WPolygon”和“CPolygon”添加到关键字列表中。
"D"
在“-”列表中使用时,此选项会移除“Add”和“Remove”关键字。此选项仅适用于“-”列表 - 在“+”列表中它不起作用。
"M"
控制在 acedSSGet() 关键字列表中添加/移除“多重”关键字。关键字过滤模式选项必须一起分组,并且必须首先出现在模式字符串中。列表采用以下两种形式之一:
禁止关键字列表(列表中的每个关键字过滤模式选项前必须有一个“-”)
包含应允许的所有关键字的列表(列表中的每个关键字过滤模式选项前必须有一个“+”)。
不可能在同一次 acedSSGet() 调用中同时使用“+”和“-”列表。
如果模式字符串 str 以“-”开头,则将模式字符串后面的关键字过滤模式选项指定的关键字从以下完整列表中移除:
"Window/Last/Crossing/BOX/ALL/Fence/WPolygon/CPolygon/Group/Add/Remove/Multiple/Previous/Undo/AUto/Single"
如果模式字符串 str 以“+”开头,则将模式字符串后面的关键字过滤模式选项指定的关键字添加到以下基本列表中:
"Add/Remove/Undo/Single"
注意 在使用“+”过滤模式时,除非“+”关键字列表包括“.”模式选项,否则不可用允许用户在屏幕上“拾取”实体的选项。如果没有添加“.”模式选项,则用户必须输入关键字才能激活选择方法,以选择实体。
除了“#”、“.”、“A”、“B”和“M”关键字过滤模式选项外,还可以使用字母“C”、“F”、“L”、“P”和“W”来控制它们对应的关键字,具体如下:
"C" | "Crossing" 和 "CPolygon" 关键字 |
"F" | "Fence" 关键字 |
"L" | "Last" 关键字 |
"P" | "Previous" 关键字 |
"W" | "Window" 和 "WPolygon" 关键字 |
"G" | "Group" 关键字 |
在大多数情况下,选择方法模式选项不能与包含关键字过滤模式选项或冒号模式选项的模式字符串一起使用。唯一的例外是“:U”和“:V”冒号模式选项,可以与选择方法模式选项组合使用。冒号模式选项和关键字过滤模式选项可以在同一模式字符串中一起使用(例如:"-#-W:$:?:K:N")。
注意 对于多边形选项“CP”和“WP”(但不适用于“F”),acedSSGet()会自动关闭点列表。您不需要构建一个指定与第一个点相同的最终点的列表。
如果 str 等于 "X" 但 filter 为 NULL,则 acedSSGet() 会选择绘图数据库中的所有实体。
筛选器是指定 DXF 组代码的结果缓冲区的链接列表。您可以将筛选器筛选列表与前述任何选择模式结合使用。
使用 acedSSGet() 获取的选择集中的实体名称始终为主实体的名称。acedSSGet() 函数无法获取子实体(块属性和多段线顶点)的名称。要获取子实体名称的方法,请参阅 acdbEntNext() 函数的描述。
由 acedSSGet() 返回的选择集可以通过 acedCmd() 或 acedCommand() 传递给 AutoCAD,以响应任何 Select objects 提示,其中也可以选择 Last。AutoCAD 不要求对象在屏幕上可见或通过指定点进行选择。
如果 acedSSGet() 返回错误状态码,则不会创建选择集。
如果 acedSSGet() 成功,则返回 RTNORM;如果数据库中没有任何实体与指定的条件匹配,或者筛选器列表包含无效的组代码,则返回 RTERROR。如果 acedSSGet() 提示用户选择实体,则还可以返回 RTCAN,表示用户通过按 [Ctrl]+[C] 取消了请求。当 acedSSGet() 失败时,它将系统变量 ERRNO 设置为指示失败原因的值。
注意 如果希望函数在每个本地化版本中正确显示,请使用下划线("_")作为前缀,例如 "_P"。如果有多个标签,请在连字符之前放置下划线,例如:“_-M”。
选择集筛选列表
当 acedSSGet() 对绘图进行筛选时,它会扫描整个数据库,并将每个主实体的字段与筛选列表中指定的代码进行比较。如果实体的属性与筛选器指定的代码匹配,则它将包含在返回的选择集中;否则,它将不包含在内。筛选器中的每个结果缓冲区指定一个 DXF 组代码和关联值。除非筛选器包含稍后在本主题中描述的“关系测试”和“条件筛选”部分中的关系或条件代码,否则 acedSSGet() 仅在实体与筛选器指定的所有代码匹配时才将实体包含在选择集中。
名称类型--例如,0(实体类型)、2(块引用)、6(线型)和 8(图层名称)--可以包含通配符。如果名称与通配符模式匹配,则它将包含在选择集中。
每个缓冲区中指定的 resval 必须是适当的类型。例如,名称类型是字符串,如 resval.rstring;厚度是双精度浮点值,如 resval.rreal;颜色和属性跟随值是短整数,如 resval.rint;挤出向量是三维点 resval.rpoint。
注意 某些组代码的含义可能因实体而异,并非所有实体都包含所有组代码。如果在筛选器中指定了特定的组代码,则不包含该代码的实体将被排除在 acedSSGet() 返回的选择集之外。
可过滤的实体
实体筛选列表识别除句柄(组代码 5)、名称(“伪”组代码 -1)和扩展实体数据代码(在 1,000-2,000 范围内)之外的所有 DXF 组代码。要检索扩展实体数据,筛选列表必须指定数据的注册应用程序名称。
如果筛选器包含无效的组代码,则 acedSSGet() 调用将失败。AutoCAD 版本 12 中增加了 acedSSGet() 筛选器识别的组代码数量。
当它对绘图进行筛选时,acedSSGet() 仅根据筛选列表条件检索实体;它检索到的选择集可能包含来自图纸空间和模型空间的实体。然而,当选择集传递给 AutoCAD 命令时,只使用当前生效的空间中的实体(实体所属的空间由其 67 组的值指定)。
筛选列表中的通配符模式
在筛选列表中指定的符号名称--实体类型(0)、块名称(2)、DIMSTYLE 名称(3)、线型(6)、文本样式(7)和图层名称(8)--可以包含通配符模式。acedSSGet() 识别的通配符模式与函数 acutWcMatch() 所识别的相同。
通配符字符,或星号 (*),也出现在匿名块的名称中。因此,如果您尝试检索匿名块,则必须通过在其前面加上反引号(')来转义此字符。
用于扩展实体数据的筛选
您可以通过在筛选器中指定 -3 组代码来筛选属于特定应用程序或一组应用程序的扩展实体数据。通过逗号分隔多个应用程序名称。字符串中允许使用通配符。
关系测试
默认情况下,acedSSGet() 会选择与筛选列表中的所有条件匹配的实体。筛选器中每个项目之间的隐含关系是“等于”。对于数字组(整数、实数、点和向量),您可以通过包含一个特殊的 -4 结果缓冲区来指定其他关系运算符。这适用于紧随其后的结果缓冲区。关系运算符由字符串指定。以下表格显示了可能的运算符。
选择集筛选列表的关系运算符:
"*" | 任意值(始终为真) |
"=" | 等于 |
"!=" | 不等于 |
"/=" | 不等于 |
"<>" | 不等于 |
"<" | 小于 |
"<=" | 小于或等于 |
">" | 大于 |
">=" | 大于或等于 |
"&" | 按位与(仅适用于整数组) |
"&=" | 按位掩码相等(仅适用于整数组) |
根据你正在测试的组,可以以以下任何方式使用关系运算符。
除了按位运算符 "&" 和 "&=" 外,所有关系运算符都适用于实值和整数值组。
按位运算符 "&" 和 "&=" 仅适用于整数值组。紧随按位运算符的结果缓冲区必须是 RTSHORT 类型,用作整数组的掩码。按位与 "&" 在掩码中设置的位在整数组中也设置时为真((integer_group & mask) != 0)。按位掩码相等 "&=" 在掩码与整数组相同时为真((integer-group ^ mask) == 0)。
对于点组,X、Y 和 Z 测试可以组合成单个字符串,用逗号分隔,例如 ">,>,*"。如果从字符串中省略一个(例如 "=,<>" 省略了 Z 测试),则假定为“任意值” "*"。
方向向量(组类型 210)只能使用运算符 "*", "=", 和 "!="(或等效的 "不等于" 字符串)进行比较。
不能在字符串组中使用关系运算符。请改用通配符测试。
条件筛选
关系运算符是二元运算符。您还可以通过创建使用下表中所示的条件运算符的嵌套布尔表达式来测试组。条件运算符由 -4 组指定,就像关系运算符一样。它们是成对出现的,必须在筛选列表中正确地进行平衡,否则 acedSSGet() 调用将失败。这些运算符可以括起的操作数的数量取决于操作,如下表所示。
选择集筛选列表的条件运算符:
起始运算符 | 包含 | 结束运算符 |
"<AND" | 一个或多个操作数 | "AND>" |
"<OR" | 一个或多个操作数 | "OR>" |
"<XOR" | 两个操作数 | "XOR>" |
"<NOT" | 一个操作数 | "NOT>" |
在条件运算符中,操作数可以是实体字段组、关系运算符后跟实体字段组,或者由这些运算符创建的嵌套表达式。
用于测试扩展实体数据的条件表达式(使用 -3 组)只能包含 -3 组。
条件运算符不区分大小写;您还可以使用它们的小写形式,包括 , 和>, , or>, , xor>, , 和 not>。
本文来自博客园,作者:-Cloud-,转载请注明原文链接:https://www.cnblogs.com/TheRedHouse/p/18182385
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义