明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2289|回复: 10

[事件] 如何添加 实体ID?

[复制链接]
发表于 2015-3-29 07:34 | 显示全部楼层 |阅读模式
以下是一段在选择阶段对实体ID的Remove操作,可以用来增减实体!
  Private Shared AddObjs As SelectedObject

Private Shared Sub M_SelectionAdded(ByVal sender As Object, ByVal e As SelectionAddedEventArgs)’实体被选择时触发
           
                If e.AddedObjects.Count > 0 Then
                    Dim selIds As ObjectId()
                    selIds = Nothing
                    selIds = e.AddedObjects.GetObjectIds()
                  Using tr As Transaction =Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()
                        Dim index As Integer = 0
                        For Each id As ObjectId In selIds
                            If ID Then '###################对ID的条件筛选为 true时
                                e.Remove(index) '###########  是移除
                               ‘问题 -------上面 e.Remove(index)  是从e中减去。如果是增加则是
                                ’ e.Add(AddObjs)  AddObjs必须是SelectedObject
                                ‘ 我如何把实体的ID加入到AddObjs中呢?
                            End If

                            System.Math.Max(System.Threading.Interlocked.Increment(index), index - 1)
                        Next

                    End Using
                End If

           
End Sub

‘ 我如何把实体的ID加入到AddObjs中呢?  请各位大哥多指点,急啊!!
发表于 2015-3-29 09:25 | 显示全部楼层
注意:
1、SelectionAddedEventArgs参数中SelectionSet(最终选择集)和AddedObjects(当前选择的部分)都是选择集,你的任务就是对AddedObjects进行操作,加入到SelectionSet是Cad自己的事,不需要你操心
2、e.Remove(index),这个要注意,一边遍历一边删除index会变的
3、选择集是selectedobject的集合,而不仅仅包含id!
 楼主| 发表于 2015-3-30 12:34 | 显示全部楼层
我的想法,不知是否能够实现,是个新手,只是个想法!请飞狐老师不要笑我。
想法是: 使用AUTOCAD的命令(注意不是我定义的命令),在命令开始前的 选择实体阶段,加入我想要加入的实体,这样就可以实现,“我的实体” 与 AutoCAD操作人”在屏幕上选定的实体“在以后一同执行AutoCAD操作人指定的”AUTOCAD的命令“
不知是否可行?
请飞狐老师明示,解惑!!
谢谢!
 楼主| 发表于 2015-3-30 12:42 | 显示全部楼层
使用 e.AddedObjects.FromObjectIds() 未能成功!

但 程序有迹象表明,已经被第二次执行了SelectionAdded事件,可是查询Object数量没有变化,
并且 我添加的实体也并没有被执行”AUTOCAD命令“
发表于 2015-3-30 12:44 来自手机 | 显示全部楼层
试下selectionset.fromobjectids获取选集
 楼主| 发表于 2015-3-30 12:53 | 显示全部楼层
用了!selectionset.fromobjectids
selectionset.fromobjectids 与  e.AddedObjects.FromObjectIds() 是一样的!
用e.AddedObjects.FromObjectIds() 时系统要求改为selectionset.fromobjectids

奇怪的是,明明有了 加入我的ID 的  SelectionAdded事件(我在该事件中写了MSGBOX 用来显示SelectionAdded执行时对象的ID),为什么在后面的”AUTOCAD命令“中却不被一同执行呢?

请大师写个例子如何?!
谢谢!!
发表于 2015-3-30 13:12 来自手机 | 显示全部楼层
上一选集   
 楼主| 发表于 2015-3-30 14:09 | 显示全部楼层
上一选集 ? 不明白! 能否详解!
请不吝赐教!
谢谢!
发表于 2015-3-30 15:12 来自手机 | 显示全部楼层
ssget   p      
发表于 2015-3-30 21:36 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2015-3-30 21:37 编辑

好像想多了 如果不复杂的话 用组就可以了

我的测试结果。。。总在不停的崩溃

        [CommandMethod("t10")]
        public static void Test10()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            ed.SelectionAdded -= new SelectionAddedEventHandler(ed_SelectionAdded);
            ed.SelectionAdded += new SelectionAddedEventHandler(ed_SelectionAdded);


        }

        static void ed_SelectionAdded(object sender, SelectionAddedEventArgs e)
        {

            if (e.Flags == SelectionFlags.PickfirstSet)
            {

                Editor ed = (Editor)sender;
                Document doc = ed.Document;
                Database db = doc.Database;

                using (var tr = db.TransactionManager.StartTransaction())
                {

                    foreach (SelectedObject selobj in e.AddedObjects)
                    {
                        Line line = tr.GetObject(selobj.ObjectId, OpenMode.ForRead) as Line;
                        if (line != null)
                        {
                            var res = ed.SelectAll(
                                new ResultTree
                                {
                                    {0, "circle"},
                                    new ResultTree("or")
                                    {
                                        {10, line.StartPoint},
                                        {10, line.EndPoint}
                                    }
                                });
                            if (res.Status == PromptStatus.OK)
                            {
                                foreach (SelectedObject obj in res.Value)
                                    e.Add(obj);
                            }
                        }
                    }
                }
            }
        }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-27 04:38 , Processed in 0.165964 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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