ahopera 发表于 2009-9-3 15:18:00

.net Api怎么实现Lisp里面(textscr)函数的功能

<p>有的时候需要用.net Api处理数据并在cad的文本屏幕上显示出来,但是找了半天也没有找到怎么实现这么一个简单的功能,版主能不能帮忙解决一下?</p>

雪山飞狐_lzh 发表于 2009-9-3 15:44:00

2010版本有提供
Application.DisplayTextScreen = true;

之前的版本估计只有发送命令了
       
        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
                {
                    switch (val.GetType().Name)
                    {
                        case "String":
                            rb.Add(new TypedValue((int)LispDataType.Text, val));
                            break;
                        case "Point2d":
                            rb.Add(new TypedValue((int)LispDataType.Point2d, val));
                            break;
                        case "Point3d":
                            rb.Add(new TypedValue((int)LispDataType.Point3d, val));
                            break;
                        case "ObjectId":
                            rb.Add(new TypedValue((int)LispDataType.ObjectId, val));
                            break;
                        case "SelectionSet":
                            rb.Add(new TypedValue((int)LispDataType.SelectionSet, val));
                            break;
                        case "Double":
                            rb.Add(new TypedValue((int)LispDataType.Double, val));
                            break;
                        case "Int16":
                            rb.Add(new TypedValue((int)LispDataType.Int16, val));
                            break;
                        case "Int32":
                            rb.Add(new TypedValue((int)LispDataType.Int32, val));
                            break;
                        case "TypedValue":
                            rb.Add(val);
                            break;
                    }
                }
            }

            try
            {
                acedCmd(rb.UnmanagedObject);
            }
            catch
            { }
            finally
            {
                rb.Dispose();
            }

        }


       
        public static void TextScr()
        {
            Command("TextScr");
            Document doc = Application.DocumentManager.MdiActiveDocument;
            doc.Editor.WriteMessage("\nHi");
        }

ahopera 发表于 2009-9-3 16:07:00

<p>我是用的vb.net,如果靠发送命令的话,我是这样实现的,</p><p>&nbsp;&nbsp; Public Sub ShowTextScreen()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim Doc As Document = Application.DocumentManager.MdiActiveDocument<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc.SendStringToExecute("textscr ", False, False, False)<br/>&nbsp;&nbsp;&nbsp; End Sub</p><p></p><p>对c#应该是</p><p>public static void ShowTextScreen()</p><p>{</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document Doc = Application.DocumentManager.MdiActiveDocument;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Doc.SendStringToExecute("textscr ", False, False, False);</p><p>}<br/>这个是可以实现的,但是用了这个函数之后,cad默认的命令就是textscr了,很不方便命令的重复使用</p><p>版主有什么办法解决嘛?</p><p></p>

雪山飞狐_lzh 发表于 2009-9-3 16:17:00

<p>你没有试过二楼的代码?这个可以的<br/>SendStringToExecute不要用<br/></p><p>另外注意代码以前最好设置系统变量cmdecho=0<br/></p>

ahopera 发表于 2009-9-3 16:41:00

<p>SendStringToExecute有什么问题嘛?二楼的代码我还要整成vb.net的试下</p>

雪山飞狐_lzh 发表于 2009-9-3 16:54:00

<p>SendStringToExecute和VBA的SendCommand一样,</p><p>应该都是调用Com接口发送,发了就不管:)</p>

ahopera 发表于 2009-9-3 18:40:00

不行啊,这是vb代码:
这是trycommand 里的模块文件内容

Imports System
Imports System.Runtime.InteropServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.ApplicationServices

Module Example
    <DllImport("acad.exe")> Public Function acedCmd(ByVal vlist As IntPtr) As Integer
    End Function
    Public Sub Command(ByVal args As Object)
      Dim rb As ResultBuffer = New ResultBuffer()
      Dim val As Object
      For Each val In args
            If (val = Nothing) Then
                rb.Add(New TypedValue(CInt(LispDataType.Text), ""))
            Else
                Select Case val.GetType().Name
                  Case "String"
                        rb.Add(New TypedValue(CInt(LispDataType.Text), val))
                        Exit Select
                  Case "Point2d"
                        rb.Add(New TypedValue(CInt(LispDataType.Point2d), val))
                        Exit Select
                  Case "Point3d"
                        rb.Add(New TypedValue(CInt(LispDataType.Point3d), val))
                        Exit Select
                  Case "ObjectId"
                        rb.Add(New TypedValue(CInt(LispDataType.ObjectId), val))
                        Exit Select
                  Case "SelectionSet"
                        rb.Add(New TypedValue(CInt(LispDataType.SelectionSet), val))
                        Exit Select
                  Case "Double"
                        rb.Add(New TypedValue(CInt(LispDataType.Double), val))
                        Exit Select
                  Case "Int16"
                        rb.Add(New TypedValue(CInt(LispDataType.Int16), val))
                        Exit Select
                  Case "Int32"
                        rb.Add(New TypedValue(CInt(LispDataType.Int32), val))
                        Exit Select
                  Case "TypedValue"
                        rb.Add(val)
                        Exit Select
                End Select
            End If
            Try
                acedCmd(rb.UnmanagedObject)
            Catch
            Finally
                rb.Dispose()
            End Try
      Next val
    End Sub
End Module

这是trycommand里的类内容


Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Application = Autodesk.AutoCAD.ApplicationServices.Application
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.DatabaseServices
Imports System
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports SysApplication = System.Windows.Forms.Application


Public Class Class1
    <CommandMethod("tscr")> Sub TextScr()
      Command("TextScr")
      Dim doc As Document = Application.DocumentManager.MdiActiveDocument
      doc.Editor.WriteMessage("\nHi")
    End Sub
End Class
在vb.net里用行不通啊

ahopera 发表于 2009-9-3 18:48:00

<p>这是源文件,帮我看下,vs2008,怎么都没有效果,运行之后就只有这个:</p><p>命令: netload<br/>命令: tscr<br/>命令:<br/>命令:<br/>命令:<br/>命令:<br/>命令:<br/>命令:<br/>命令: \nHi</p><p>我数了一下,刚好是六个空命令加一个空格("\nhi"前面有一个空格),对应textscr七个字符,如果是Command<font color="#ff0000">(</font><font color="#880000">"Line"</font><font color="#ff0000">),运行结果就是这样的</font><br/></p><p>命令: tscr<br/>命令:<br/>命令:<br/>命令:<br/>命令: \nHi</p><p></p>

ahopera 发表于 2009-9-3 18:57:00

<p>我知道了,这样改了一下:</p><p>把 Public Sub Command(ByVal args As Object)改成</p><p>&nbsp;Public Sub Command(ByVal args() As Object)</p><p>然后把 Command("TextScr")改成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p>    &nbsp;Dim CmdStr(0) As Object<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CmdStr(0) = "TextScr"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Command(CmdStr)</p><p></p>

ahopera 发表于 2009-9-3 19:17:00

<p><strong><font face="Verdana" color="#da2549">lzh741206版主:好像Command函数就只能运行单一的文本命令,我这样做程序就会出错:</font></strong></p><p><strong><font face="Verdana" color="#da2549">&nbsp;&nbsp;&nbsp; &lt;CommandMethod("tscr")&gt; Sub TextScr()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim CmdStr() As Object = {"RECTANG", New Point2d(0, 0), New Point2d(1, 1)}</font></strong></p><p><strong><font face="Verdana" color="#da2549">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Command(CmdStr)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Dim doc As Document = Application.DocumentManager.MdiActiveDocument<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'doc.Editor.WriteMessage("\nHi")<br/>&nbsp;&nbsp;&nbsp; End Sub</font></strong></p>
页: [1] 2
查看完整版本: .net Api怎么实现Lisp里面(textscr)函数的功能