乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 89|回复: 5

按DXF代码筛选PrompEntityOptions?

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-6-8 15:07:54 | 显示全部楼层 |阅读模式
我正在尝试通过DXF代码过滤PromptEntityOptons/Result,但我找不到一种方法来优雅地做到这一点:现在,我提示一个块,只允许块,读取xdata,如果块没有它,退出,提示用户输入特定的块。
  1. PromptEntityOptions opt = new PromptEntityOptions("\nPick Valve:");
  2. opt.SetRejectMessage("\nMust be a block reference...");
  3. opt.AddAllowedClass(typeof(BlockReference),true);
  4. // Filter for our Registered App via DXF code here?
  5. PromptEntityResult res = Active.Editor.GetEntity(opt);

我使用PromptSelectionResult成功过滤xData,如下所示,但这允许用户选择多个对象。
  1. PromptSelectionResult valveSet = Active.Editor.GetSelection(XData.SelectionFilter(XData.Filter.ValveBlocks));

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

71

主题

928

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1230
发表于 2015-6-8 17:14:35 | 显示全部楼层
按原样显示GetSelection,但创建一个PromptSelectionOptions,将SingleOnly属性设置为true,并将其作为第一个参数传递给GetSelectation()
回复

使用道具 举报

3

主题

28

帖子

1

银币

初来乍到

Rank: 1

铜币
40
发表于 2015-6-9 06:21:58 | 显示全部楼层
与预期相反,GetSelection的双参数重载的行为与其兄弟不同:没有交互式提示。这就是为什么我认为OP坚持手动处理SelectionAdded事件,这不是一个漂亮的景象,即使在F#中也是如此。module FilterAdd =。
返回数组的其余部分,从注册的应用之后开始。
let regApp (s : string) (a : _[]) = 。
让值找到 =。
int16 DxfCode.ExtendedDataRegAppName, box (s.ToUpper())。
match Array.tryFindIndex ((=) valueToFind) a with。
|一些 i -> a.[i + 1 ..]。
|无 -> 数组.空。
返回控件字符串之间的数组部分。
设 ctlStr (a : _[]) = 。
let startValueToFind =。
int16 DxfCode.ExtendedDataControlString, box “{”。
let endValueToFind =。
int16 DxfCode.ExtendedDataControlString, box “}”。
match Array.tryFindIndex ((=) startValueToFind) a, 。
Array.tryFindIndex ((=) endValueToFind) a with。
|有些是,(有些即)-> a.[is + 1 .. 即 - 1]。
| _ -> Array.empty。
选择添加事件的过滤功能。
让 filterSelectionAdd (e : SelectionAddedEventArgs) =。
let rxClass = RXClass.GetClass typeof。
e.新增对象 。
|> Seq.cast 。
|> Seq.mapi (fun i so ->。
㞖,ObjectId.ObjectClass  rxClass 然后。
某些 i // 不是所需的类,请取消选择元素。
还。
匹配(所以,ObjectId.GetObject OpenMode.ForRead).XData with。
| null -> 某些 i // 没有 xdata,取消选择元素。
| xdata -> 。
xdata.AsArray() 。
|>阵列地图(有趣的电视->电视,类型代码,电视。值)。
|> regApp “foo” // 查找已注册的应用程序名称。
|> ctlStr // 在控制字符串之间提取数据。
找到要过滤的数据,例如'(1070, 123)。
|> Array.tryFind。
((=) (int16 DxfCode.ExtendedDataInteger16, box 123s))。
|>功能。
|无 -> 某些 i // 未找到,取消选择元素。
| _ -> 无) // 所选元素符合筛选条件。
|> Seq.choose id。
|> Seq.iter e.Remove。

[]。
let testCommand() =。
let doc = acadApp.DocumentManager.MdiActiveDocument。
让 db = doc,数据库。
让 ed = doc,编辑 器。
让选择 =。
PromptSelectionOptions(。
消息“添加”= “\n选择块引用”,。
单只 = 真 )。
选择后,事务和回调被释放。
让 res =。
使用 tr =。
分贝,TransactionManager.StartTransaction()。
使用选择添加 =。
Observable.subscribe FilterAdded.filterSelectionAdded ed.选择添加。
编辑,获取选择选项。
如果 res.状态 = PromptStatus.OK 然后。
编辑,WriteMessage(“\n找到单个块”)。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-6-9 15:09:47 | 显示全部楼层
Kaefer,看起来你发布的代码实际上覆盖了编辑器。带有过滤器的SelectionAdded()事件;对吗?直到现在我才知道这是可能的,这是一个多么伟大的方法。这种事情目前我不适合,但我可能很快就会尝试。如果是这样的话,我将在这里发布一些C#代码来说明我最终得到的解决方案。非常感谢为这一解决方案打开大门
目前,我将在相应的提示中使用带有SingleOnly=true的GetSelection方法,以粗略了解功能。它肯定比我最后使用GetEntity()方法时使用的嵌套ifs要好
非常感谢您的建议,这两个建议都比我开始的好得多。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-6-9 19:48:21 | 显示全部楼层
也许这篇文章会让你更清楚。
http://www . the swamp . org/index . PHP?topic = 31864 . msg 454001 # msg 454001
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2015-6-9 22:14:23 | 显示全部楼层
谢谢基思(和吉尔),这是一个完美的例子。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 00:44 , Processed in 0.328471 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表