yanghao1 发表于 2009-9-4 22:39:00

为什么的确选择了光栅,函数SendStringToExecute却无法正常对光栅执行scale命令。看

为什么的确选择了光栅,函数SendStringToExecute却无法正常对光栅执行scale命令。看代码:<p>我在图中插入了一个光栅,为什么在提示选择对象后,我明明选择了光栅,函数SendStringToExecute却无法正常执行。</p><p><br/>但在AutoCAD命令行中直接粘贴同样的 ._scale -93.147,421.096,0 0.6811 能正常缩放。</p><p></p><p>看代码:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void tt()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document acDoc = Application.DocumentManager.MdiActiveDocument;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PromptSelectionResult res = ed.GetSelection();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (res.Status == PromptStatus.OK)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; //如果选择了光栅<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acDoc.SendStringToExecute("._scale -93.147,421.096,0 0.6811", true, false, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //acDoc.SendStringToExecute("._line 1000,1000,0 1100,1100,0", true, false, false);//这个画直线命令能正常执行。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p></p>

雪山飞狐_lzh 发表于 2009-9-4 22:44:00

用矩阵变换试过么

yanghao1 发表于 2009-9-4 23:16:00

注:直接粘贴前需要先选中光栅,然后在粘贴,成功缩放了。

yanghao1 发表于 2009-9-4 23:19:00

lzh741206发表于2009-9-4 22:44:00static/image/common/back.gif用矩阵变换试过么

<p>矩阵变换很麻烦,有命令想直接使用命令更简单</p>

yanghao1 发表于 2009-9-4 23:21:00

lzh741206发表于2009-9-4 22:44:00static/image/common/back.gif用矩阵变换试过么

<p>在CAD中使用矩阵变换还没有试过,请先生指点一二,不胜感激!谢谢!</p>

雪山飞狐_lzh 发表于 2009-9-4 23:31:00

<a href="http://www.mjtd.com/helpcenter/netguide/files/WS1a9193826455f5ff2566ffd511ff6f8c7ca-3ee6.htm">http://www.mjtd.com/helpcenter/netguide/files/WS1a9193826455f5ff2566ffd511ff6f8c7ca-3ee6.htm</a>

yanghao1 发表于 2009-9-5 06:53:00

<p>症结所在:<br/>关键在于执行SendStringToExecute时,在scale后面仍要求选择对象的缘故,但直接粘贴到命令行时为什么不要求选择对象,而能直接成功执行呢</p><p>以下是执行tt命令的过程:</p><p>命令: tt<br/>请选择光栅: 找到 1 个<br/>请选择光栅:<br/>命令: ._scale<br/>选择对象: -93.147,421.096,0 指定对角点: 0.6811 找到 0 个</p><p>(这时res.Status仍然是Ok,说明选择的光栅对象没有丢失)<br/></p>

雪山飞狐_lzh 发表于 2009-9-5 07:26:00

<p>有点无语了。。。</p>

雪山飞狐_lzh 发表于 2009-9-5 11:08:00

一定要用命令的话,试下下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;

namespace TlsTest
{
    class Class2
    {
      
      private static extern int acedCmd(IntPtr vlist);
      public static void Command(params object[] args)
      {
            ResultBuffer rb = new ResultBuffer();
            foreach (object val in args)
            {
                if (val == null)
                {
                  rb.Add(new TypedValue((int)LispDataType.Text, ""));
                }
                else
                {
                  if (val is string)
                        rb.Add(new TypedValue((int)LispDataType.Text, val));
                  else if (val is Point2d)
                        rb.Add(new TypedValue((int)LispDataType.Point2d, val));
                  else if (val is Point3d)
                        rb.Add(new TypedValue((int)LispDataType.Point3d, val));
                  else if (val is ObjectId)
                        rb.Add(new TypedValue((int)LispDataType.ObjectId, val));
                  else if (val is SelectionSet)
                        rb.Add(new TypedValue((int)LispDataType.SelectionSet, val));
                  else if (val is double)
                        rb.Add(new TypedValue((int)LispDataType.Double, val));
                  else if (val is short)
                        rb.Add(new TypedValue((int)LispDataType.Int16, val));
                  else if (val is int)
                        rb.Add(new TypedValue((int)LispDataType.Int32, val));
                  else if (val is TypedValue)
                        rb.Add(val);
                }
            }
            try
            {
                acedCmd(rb.UnmanagedObject);
            }
            catch
            { }
            finally
            {
                rb.Dispose();
            }
      }
      
      public static void tt()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            PromptSelectionResult res = ed.GetSelection();
            if (res.Status == PromptStatus.OK)
            {
                Application.SetSystemVariable("CmdEcho", 0);
                Command(
                  "_.scale",
                  res.Value,
                  "",
                  new Point3d(-93.147, 421.096, 0),
                  0.6811);
                Application.SetSystemVariable("CmdEcho", 1);
            }
      }
    }
}

yanghao1 发表于 2009-9-5 12:48:00

lzh741206发表于2009-9-5 11:08:00static/image/common/back.gif一定要用命令的话,试下下面的代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;using Autodesk.AutoCAD.Edito

<p>先生,这个方法有效。但是需请教,res.Value 、&nbsp;""&nbsp; 这两个参数如何得知,哪里有介绍这方面的知识。看来你掌握的面很宽。</p>
页: [1] 2
查看完整版本: 为什么的确选择了光栅,函数SendStringToExecute却无法正常对光栅执行scale命令。看