fiyone 发表于 2014-7-9 12:20:54

editor.command(),用户命令能使用选择集么

我在autocad2015的环境下,join命令可以合并多条直线成多段线。用autocad.net发送命令发现不能识别选择集。
思路如下:
先建一个含两条直线的选择集,如 testset
然后用editor.command("_join",testset)
发现选择集不能被join命令所识别.
请问这个editor.command发送命令函数怎样才能使用选择集?
另外问下这个函数是同步执行命令的么?我不需要sendstringToExecute那样延时运行的发送命令函数。

雪山飞狐_lzh 发表于 2014-7-9 14:31:28

直接传ObjectId试试

ivde 发表于 2014-7-9 16:19:09

用 Editor.CommandAsync 有暂停等用户输入

cooolseee 发表于 2014-7-10 09:57:46

都2015了,真是超前的厉害,致敬

fiyone 发表于 2014-7-10 23:41:02

试着转objectid,如下代码,不行啊。
    Dim testid() As ObjectId
            If acSSPrompt.Status = PromptStatus.OK Then
                Dim acSSet As SelectionSet = acSSPrompt.Value
                testid = acSSet.GetObjectIds()
                ed.Command("_JOIN", testid)               
            End If

另外,用2015版纯粹巧合,工作用10的,小本用15的。

ivde 发表于 2014-7-11 06:36:45

fiyone 发表于 2014-7-10 23:41
试着转objectid,如下代码,不行啊。
    Dim testid() As ObjectId
            If acSSPrompt.Status =...

command需要SelectionSet

雪山飞狐_lzh 发表于 2014-7-11 17:56:13

本帖最后由 雪山飞狐_lzh 于 2014-7-11 17:57 编辑

ed.Command("_JOIN", id1, id2)
建议尽量不要用这个 Jion可以直接用代码实现的 不是很复杂

雪山飞狐_lzh 发表于 2014-7-11 18:20:53

另外你没有搞清楚Join的步骤 他是先选择源对象 再选其他对象,所以调用格式:
editor.command("_join", id, ss)

雪山飞狐_lzh 发表于 2014-7-11 18:30:09

本帖最后由 雪山飞狐_lzh 于 2014-7-11 18:35 编辑

下面是我的测试(用自己的封装,没有2015)

       #region Command

      private static void AddValueToResultBuffer(ref ResultBuffer rb, object obj)
      {
            if (obj == null)
            {
                rb.Add(new TypedValue((int)LispDataType.Text, ""));
            }
            else
            {
                if (obj is string)
                {
                  rb.Add(new TypedValue((int)LispDataType.Text, obj));
                }
                else if (obj is Point2d)
                {
                  rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
                  rb.Add(new TypedValue((int)LispDataType.Point2d, obj));
                }
                else if (obj is Point3d)
                {
                  rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
                  rb.Add(new TypedValue((int)LispDataType.Point3d, obj));
                }
                else if (obj is ObjectId)
                {
                  rb.Add(new TypedValue((int)LispDataType.ObjectId, obj));
                }
                else if (obj is SelectionSet)
                {
                  rb.Add(new TypedValue((int)LispDataType.SelectionSet, obj));
                }
                else if (obj is double)
                {
                  rb.Add(new TypedValue((int)LispDataType.Double, obj));
                }
                else if (obj is short)
                {
                  rb.Add(new TypedValue((int)LispDataType.Int16, obj));
                }
                else if (obj is int)
                {
                  rb.Add(new TypedValue((int)LispDataType.Int32, obj));
                }
                else if (obj is TypedValue)
                {
                  rb.Add(obj);
                }

            }
      }


      
      private static extern int acedCmd(IntPtr vlist);

      /// <summary>
      /// 调用AutoCad命令
      /// </summary>
      /// <param name="endCommandByUser">命令结束方式</param>
      /// <param name="rb">参数</param>
      public static void Command(bool endCommandByUser, ResultBuffer rb)
      {

            ResultBuffer rbend = new ResultBuffer();
            try
            {
                Document doc = Application.DocumentManager.MdiActiveDocument;
                string currCmdName = doc.CommandInProgress;
                acedCmd(rb.UnmanagedObject);
                if (endCommandByUser)
                {
                  rbend.Add(new TypedValue((int)LispDataType.Text, "\\"));
                }
                while (doc.CommandInProgress != currCmdName)
                {
                  acedCmd(rbend.UnmanagedObject);
                }
            }
            catch { }
            finally
            {
                rb.Dispose();
                rbend.Dispose();
            }
      }

      /// <summary>
      /// 调用AutoCad命令
      /// </summary>
      /// <param name="endCommandByUser">命令结束方式</param>
      /// <param name="args">参数</param>
      public static void Command(bool endCommandByUser, params object[] args)
      {
            ResultBuffer rb = new ResultBuffer();
            foreach (object val in args)
            {
                AddValueToResultBuffer(ref rb, val);
            }
            Command(endCommandByUser, rb);
      }

      #endregion

测试代码

            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;

            ObjectId id1,id2;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt, OpenMode.ForWrite);

                Line l1 = new Line(new Point3d(1, 1, 0), Point3d.Origin);
                Line l2 = new Line(Point3d.Origin,new Point3d(-1,-1,0));

                id1 =btr.AppendEntity(l1);
                tr.AddNewlyCreatedDBObject(l1,true);
                id2 =btr.AppendEntity(l2);
                tr.AddNewlyCreatedDBObject(l2,true);

                tr.Commit();

            }

            EdEx.Command(
                false,
                "._join",
                id1,
                SelectionSet.FromObjectIds(new ObjectId[] { id2 }),
                null);

fiyone 发表于 2014-7-13 17:43:11

我用的是vb,楼上的代码有点高大上了。我看看能不能转成vb试试。谢谢
页: [1] 2
查看完整版本: editor.command(),用户命令能使用选择集么