明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1251|回复: 6

C++学习求助

[复制链接]
发表于 2014-9-4 20:14:45 | 显示全部楼层 |阅读模式
本人采用AutoCAD.net(VS2008,acad2008, 项目已选用NET Framework 2.0)编写一个简单的lisp函数,编译时出现如下提示:
------ 已启动全部重新生成: 项目: ClassLibrary2, 配置: Debug Any CPU ------C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\AutoCAD 2008\acdbmgd.dll" /reference:"C:\Program Files\AutoCAD 2008\acmgd.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\ClassLibrary2.dll /target:library Class1.cs Properties\AssemblyInfo.cs

编译完成 -- 0 个错误,0 个警告
ClassLibrary2 -> G:\c++bak\ClassLibrary2\ClassLibrary2\bin\Debug\ClassLibrary2.dll
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

而在CAD运行时出现如下错误:System.ArgumentException: 绑定到目标方法时出错。   在 System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo
method, Boolean throwOnBindFailure)
   在 AcMgCommandClass.InvokeWorker(AcMgCommandClass* , MethodInfo mi, Object
commandObject, Boolean bLispFunction)
   在 AcMgCommandClass.InvokeWorkerWithExceptionFilter(AcMgCommandClass* ,
MethodInfo mi, Object commandObject, Boolean bLispFunction)
   在 AcMgCommandClass.Invoke(AcMgCommandClass* ,
gcroot<System::Reflection::MethodInfo ^>* mi, Boolean bLispFunction)
   在 AcMgCommandClass.CommandThunk.InvokeLisp(CommandThunk* )
错误:ADS 请求错误

不知是如何原因

发表于 2014-9-4 20:22:00 来自手机 | 显示全部楼层
代码呢 不要贴一大堆错误提示
 楼主| 发表于 2014-9-5 20:16:49 | 显示全部楼层
谢谢,代码很简单。
using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using System.Runtime.InteropServices; // 用DllImport 需用此命名空间
using System.Reflection; // 使用Assembly 类需用此命名空间
using System.Reflection.Emit; // 使用ILGenerator 需用此命名空间

namespace ClassLibrary2
{
    public class Class1
    {
[LispFunction("bb")]
        public static void bb(ResultBuffer rbArgs)
        {
            if (rbArgs != null)
            {
                string strVal1 = "";
                string strVal2 = "";
                int nCnt = 0;
                foreach (TypedValue rb in rbArgs)
                {
                    if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
                    {
                        switch (nCnt)
                        {
                            case 0:
                                strVal1 = rb.Value.ToString();
                                break;
                            case 1:
                                strVal2 = rb.Value.ToString();
                                break;
                        }
                        nCnt = nCnt + 1;
                    }
                }

                Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nName: " + strVal1 + " " + strVal2);               
            }
        }
    }
发表于 2014-9-5 20:23:37 来自手机 | 显示全部楼层
LispFunction应该有返回值吧 你可以用TypedValue返回一个值或者用resultbuffer返回一个列表或点对
 楼主| 发表于 2014-9-7 12:29:03 | 显示全部楼层
谢谢,三楼代码从《Autocad.net开发指南-2012版》抄来,
现改为如下代码:
using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using System.Runtime.InteropServices; // 用DllImport 需用此命名空间
using System.Reflection; // 使用Assembly 类需用此命名空间
using System.Reflection.Emit; // 使用ILGenerator 需用此命名空间


namespace ClassLibrary4
{
    public class Class1
    {
        [LispFunction("bb")]
        public string bb(ResultBuffer rbArgs)
        {
            if (rbArgs != null)
            {
                string strVal1 = "";
                string strVal2 = "";
                int nCnt = 0;
                foreach (TypedValue rb in rbArgs)
                {
                    if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
                    {
                        switch (nCnt)
                        {
                            case 0:
                                strVal1 = rb.Value.ToString();
                                break;
                            case 1:
                                strVal2 = rb.Value.ToString();
                                break;
                        }
                        nCnt = nCnt + 1;
                    }
                }

                Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nName: " + strVal1 + " " + strVal2);
                return strVal1;               
            }

        }
    }
}
编译时出现如下错误:
已启动全部重新生成: 项目: ClassLibrary4, 配置: Debug Any CPU ------
C:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\AutoCAD 2008\acdbmgd.dll" /reference:"C:\Program Files\AutoCAD 2008\acmgd.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\ClassLibrary4.dll /target:library Class1.cs Properties\AssemblyInfo.cs
G:\c++bak\ClassLibrary4\ClassLibrary4\Class1.cs(18,23): 错误 CS0161: “ClassLibrary4.Class1.bb(Autodesk.AutoCAD.DatabaseServices.ResultBuffer)”: 并非所有的代码路径都返回值

编译完成 -- 1 个错误,0 个警告
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
发表于 2014-9-8 14:22:10 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2014-9-8 14:53 编辑

按下面的格式

示例,判断字符串是否是由数字组成
  1.         [LispFunction("Tls:IsNumber")]
  2.         public static object IsNumber(ResultBuffer rb)
  3.         {

  4.             var t = new TypedValue((int)LispDataType.T_atom);
  5.             var nil = new TypedValue((int)LispDataType.Nil);

  6.             if (rb == null)
  7.                 return nil;

  8.             var arr = rb.AsArray();
  9.             if (arr.Length != 1 || arr[0].TypeCode != (short)LispDataType.Text)
  10.             {
  11.                 return nil;
  12.             }
  13.             else
  14.             {
  15.                 Regex r = new Regex(@"^\d+(\.)?\d*$");
  16.                 return r.IsMatch((string)arr[0].Value) ? t : nil;
  17.             }
  18.         }
命令: (tls:IsNumber "123")
T

命令: (tls:IsNumber "12a3")
nil
发表于 2014-9-8 14:59:47 来自手机 | 显示全部楼层
TypeValue [] tvs = rbArgs.AsArray();
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:51 , Processed in 0.170302 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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