.net Api怎么实现Lisp里面(textscr)函数的功能
<p>有的时候需要用.net Api处理数据并在cad的文本屏幕上显示出来,但是找了半天也没有找到怎么实现这么一个简单的功能,版主能不能帮忙解决一下?</p> 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");
}
<p>我是用的vb.net,如果靠发送命令的话,我是这样实现的,</p><p> Public Sub ShowTextScreen()<br/> Dim Doc As Document = Application.DocumentManager.MdiActiveDocument<br/> Doc.SendStringToExecute("textscr ", False, False, False)<br/> End Sub</p><p></p><p>对c#应该是</p><p>public static void ShowTextScreen()</p><p>{</p><p> Document Doc = Application.DocumentManager.MdiActiveDocument;</p><p> Doc.SendStringToExecute("textscr ", False, False, False);</p><p>}<br/>这个是可以实现的,但是用了这个函数之后,cad默认的命令就是textscr了,很不方便命令的重复使用</p><p>版主有什么办法解决嘛?</p><p></p> <p>你没有试过二楼的代码?这个可以的<br/>SendStringToExecute不要用<br/></p><p>另外注意代码以前最好设置系统变量cmdecho=0<br/></p> <p>SendStringToExecute有什么问题嘛?二楼的代码我还要整成vb.net的试下</p> <p>SendStringToExecute和VBA的SendCommand一样,</p><p>应该都是调用Com接口发送,发了就不管:)</p> 不行啊,这是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里用行不通啊
<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> <p>我知道了,这样改了一下:</p><p>把 Public Sub Command(ByVal args As Object)改成</p><p> Public Sub Command(ByVal args() As Object)</p><p>然后把 Command("TextScr")改成 </p><p> Dim CmdStr(0) As Object<br/> CmdStr(0) = "TextScr"<br/> Command(CmdStr)</p><p></p> <p><strong><font face="Verdana" color="#da2549">lzh741206版主:好像Command函数就只能运行单一的文本命令,我这样做程序就会出错:</font></strong></p><p><strong><font face="Verdana" color="#da2549"> <CommandMethod("tscr")> Sub TextScr()<br/> Dim CmdStr() As Object = {"RECTANG", New Point2d(0, 0), New Point2d(1, 1)}</font></strong></p><p><strong><font face="Verdana" color="#da2549"> Command(CmdStr)<br/> 'Dim doc As Document = Application.DocumentManager.MdiActiveDocument<br/> 'doc.Editor.WriteMessage("\nHi")<br/> End Sub</font></strong></p>
页:
[1]
2