明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2666|回复: 13

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

[复制链接]
发表于 2014-7-9 12:20:54 | 显示全部楼层 |阅读模式
我在AutoCAD2015的环境下,join命令可以合并多条直线成多段线。用autocad.net发送命令发现不能识别选择集。
思路如下:
先建一个含两条直线的选择集,如 testset
然后用editor.command("_join",testset)
发现选择集不能被join命令所识别.
请问这个editor.command发送命令函数怎样才能使用选择集?
另外问下这个函数是同步执行命令的么?我不需要sendstringToExecute那样延时运行的发送命令函数。
发表于 2014-7-9 14:31:28 | 显示全部楼层
直接传ObjectId试试
发表于 2014-7-9 16:19:09 | 显示全部楼层
用 Editor.CommandAsync 有暂停等用户输入
发表于 2014-7-10 09:57:46 | 显示全部楼层
都2015了,真是超前的厉害,致敬
 楼主| 发表于 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的。
发表于 2014-7-11 06:36:45 来自手机 | 显示全部楼层
fiyone 发表于 2014-7-10 23:41
试着转objectid,如下代码,不行啊。
    Dim testid() As ObjectId
            If acSSPrompt.Status =  ...

command需要SelectionSet
发表于 2014-7-11 17:56:13 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2014-7-11 17:57 编辑

ed.Command("_JOIN", id1, id2)
建议尽量不要用这个 Jion可以直接用代码实现的 不是很复杂
发表于 2014-7-11 18:20:53 | 显示全部楼层
另外你没有搞清楚Join的步骤 他是先选择源对象 再选其他对象,所以调用格式:
editor.command("_join", id, ss)
发表于 2014-7-11 18:30:09 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2014-7-11 18:35 编辑

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

  1.        #region Command

  2.         private static void AddValueToResultBuffer(ref ResultBuffer rb, object obj)
  3.         {
  4.             if (obj == null)
  5.             {
  6.                 rb.Add(new TypedValue((int)LispDataType.Text, ""));
  7.             }
  8.             else
  9.             {
  10.                 if (obj is string)
  11.                 {
  12.                     rb.Add(new TypedValue((int)LispDataType.Text, obj));
  13.                 }
  14.                 else if (obj is Point2d)
  15.                 {
  16.                     rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
  17.                     rb.Add(new TypedValue((int)LispDataType.Point2d, obj));
  18.                 }
  19.                 else if (obj is Point3d)
  20.                 {
  21.                     rb.Add(new TypedValue((int)LispDataType.Text, "_non"));
  22.                     rb.Add(new TypedValue((int)LispDataType.Point3d, obj));
  23.                 }
  24.                 else if (obj is ObjectId)
  25.                 {
  26.                     rb.Add(new TypedValue((int)LispDataType.ObjectId, obj));
  27.                 }
  28.                 else if (obj is SelectionSet)
  29.                 {
  30.                     rb.Add(new TypedValue((int)LispDataType.SelectionSet, obj));
  31.                 }
  32.                 else if (obj is double)
  33.                 {
  34.                     rb.Add(new TypedValue((int)LispDataType.Double, obj));
  35.                 }
  36.                 else if (obj is short)
  37.                 {
  38.                     rb.Add(new TypedValue((int)LispDataType.Int16, obj));
  39.                 }
  40.                 else if (obj is int)
  41.                 {
  42.                     rb.Add(new TypedValue((int)LispDataType.Int32, obj));
  43.                 }
  44.                 else if (obj is TypedValue)
  45.                 {
  46.                     rb.Add(obj);
  47.                 }

  48.             }
  49.         }


  50.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl)]
  51.         private static extern int acedCmd(IntPtr vlist);

  52.         /// <summary>
  53.         /// 调用AutoCad命令
  54.         /// </summary>
  55.         /// <param name="endCommandByUser">命令结束方式</param>
  56.         /// <param name="rb">参数</param>
  57.         public static void Command(bool endCommandByUser, ResultBuffer rb)
  58.         {

  59.             ResultBuffer rbend = new ResultBuffer();
  60.             try
  61.             {
  62.                 Document doc = Application.DocumentManager.MdiActiveDocument;
  63.                 string currCmdName = doc.CommandInProgress;
  64.                 acedCmd(rb.UnmanagedObject);
  65.                 if (endCommandByUser)
  66.                 {
  67.                     rbend.Add(new TypedValue((int)LispDataType.Text, "\\"));
  68.                 }
  69.                 while (doc.CommandInProgress != currCmdName)
  70.                 {
  71.                     acedCmd(rbend.UnmanagedObject);
  72.                 }
  73.             }
  74.             catch { }
  75.             finally
  76.             {
  77.                 rb.Dispose();
  78.                 rbend.Dispose();
  79.             }
  80.         }

  81.         /// <summary>
  82.         /// 调用AutoCad命令
  83.         /// </summary>
  84.         /// <param name="endCommandByUser">命令结束方式</param>
  85.         /// <param name="args">参数</param>
  86.         public static void Command(bool endCommandByUser, params object[] args)
  87.         {
  88.             ResultBuffer rb = new ResultBuffer();
  89.             foreach (object val in args)
  90.             {
  91.                 AddValueToResultBuffer(ref rb, val);
  92.             }
  93.             Command(endCommandByUser, rb);
  94.         }

  95.         #endregion


测试代码

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

  4.             ObjectId id1,id2;

  5.             using (Transaction tr = db.TransactionManager.StartTransaction())
  6.             {
  7.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  8.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

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

  11.                 id1 =  btr.AppendEntity(l1);
  12.                 tr.AddNewlyCreatedDBObject(l1,true);
  13.                 id2 =  btr.AppendEntity(l2);
  14.                 tr.AddNewlyCreatedDBObject(l2,true);

  15.                 tr.Commit();

  16.             }

  17.             EdEx.Command(
  18.                 false,
  19.                 "._join",
  20.                 id1,
  21.                 SelectionSet.FromObjectIds(new ObjectId[] { id2 }),
  22.                 null);

 楼主| 发表于 2014-7-13 17:43:11 | 显示全部楼层
我用的是vb,楼上的代码有点高大上了。我看看能不能转成vb试试。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:44 , Processed in 0.161324 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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