精华内容
下载资源
问答
  • 目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblogs.com/bomb12138/p/3600842.html  从程序复杂度来看,COM方式更简单一些...

    目前我已经掌握的创建CAD菜单方法有两种:

    COM方式:

    http://www.cnblogs.com/bomb12138/p/3607929.html

    CUI方式:

    http://www.cnblogs.com/bomb12138/p/3600842.html

     

      从程序复杂度来看,COM方式更简单一些,CUI方式较复杂。

      从版本特性来看,COM方式更通用一些,CUI方式仅支持CAD2007+的版本。

      从兼容性来看,基本一样;在测试程序中,对于CUI方式,我引用的是CAD2008的类库,而最后生成的程序也可以在CAD2007中正常运行;而对于COM方式,这里要介绍一下CAD提供的COM组件了。CAD的COM组件基本上是每三年一个系列,比如04、05、06提供的是V16系列,07、08、09是V17系列,每个系列中仅注册最高版本的COM组件,比如我电脑上安装离CAD2007和CAD2008,但是仅注册了CAD2008的组件,高版本的COM可以兼容低版本。在我的测试程序中,引用的是AutoCAD 2008 Type Library,起初引用属性中的“复制本地”为False,这个时候生成的DLL拿到了虚拟机中测试,出现了以下情况:

      在虚拟机A中,仅安装了AutoCAD 2007,用CAD加载我的DLL,会崩溃,提示找不到程序集。

      在虚拟机B中,仅安装了AutoCAD 2009,用CAD加载我的DLL,运行正常。

      之后,我把引用属性中的“复制本地“改为了True,把我的DLL和引用到的Autodesk.AutoCAD.Interop.dll一起复制到两个虚拟机中,都可以正常运行。

      因此,在编译CAD程序时,如果在创建项目时,引用每个系列中的最低版本类库,则理论上,生成的DLL可以兼容三个版本。

      从自动加载实现来看,COM方式配合注册表控制、IExtensionApplication接口实现可以很好地实现菜单的自动加载;而CUI必须用cuiload命令进行加载,所以要实现其自动加载,必须在IExtensionApplication接口中向CAD发送lisp命令来调用cuiload(网上到处都说可以用这种方法实现,但是我不停在尝试,从来未成功,所以不得不怀疑其可行性)。

     

      最终个人认为,还是Com方式较优,虽然这样一来,需要为每个版本的CAD都发布一次程序(因为引用到了COM),但也许我们的程序里还有其他地方会用到COM呢。

      而且事实上,我们仅需要一套代码,通过为每个版本的CAD创建一个项目,然后将代码以链接的方式加载到项目中,就可以很方便地发布不同版本的程序集了。如果程序中在些地方不同版本CAD中的写法支持不一样的话,可以用预编译指令进行控制。

      以链接方式加载代码的方式如下:

      在项目中点鼠标右键,选择“添加现有项”,然后选中要添加的代码文件,点“添加”按钮旁的向下箭头,即可找到“添加为链接”,以这种方式添加的代码文件像桌面快捷方式一样左下角有个箭头。

      

    展开全文
  • autolisp 加载mnu文件后无法显示菜单的问题 包罗万码原创作品 需要手动加载下拉菜单 例子: xyx.mnu文件夹如下 ...autolisp代码如下: ...加载菜单栏方法1 xyx是你的menugroup名称 有三处要填写 p30代...

    autolisp 加载mnu文件后无法显示菜单的问题

    包罗万码原创作品

    需要手动加载下拉菜单

     

    例子:

    xyx.mnu文件夹如下

    ***MENUGROUP=XYX
    
    ***POP1
    [许业旭工具箱]
    
    P1-1[生成A图模板]XMA  

     

    autolisp代码如下:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    ;;加载菜单栏方法1  xyx是你的menugroup名称 有三处要填写 p30代表加载30行,根据实际修改
     

     
    
    (defun C:xload (/)
     (and
       (not (menugroup "XYX"))
       (findfile "C:/.../XYX.cuix")
       (command "_.menuload" "C:/.../XYX.cuix")
     ) ;_ and
     (and
       (menugroup "XYX")
       (menucmd "p30=+XYX.POP1")
     ) ; 
    ) ; 
    
    

     ;加载菜单栏方法2

    
     (defun C:XLOAD2 (  )
     (vl-load-com)
     (or (menugroup "XYX")
         (and (findfile "C:/.../XYX.cuix")
              (vla-load
                (vla-get-MenuGroups
                  (vlax-get-acad-object)) "C:/.../XYX.cuix")))
    
     (and (menugroup "XYX")
          (menucmd "p30=+XYX.POP1")))
    

     

     

    展开全文
  • cad.net 定义lisp

    2019-10-06 02:31:10
    首先是传参型lisp的定义:(addLine (getpoint)) //定义lisp传入参数的例子 //复制到命令运行: (addLine (getpoint)) [LispFunction("addLine")] //注意: 这里不是command! public static ResultBuff...

    首先是传参型lisp的定义: (addLine (getpoint))

            //定义lisp传入参数的例子
            //复制到命令栏运行:  (addLine (getpoint))
            [LispFunction("addLine")] //注意: 这里不是command!
            public static ResultBuffer AddLine(ResultBuffer rbArgs)
            {
                Database db = Application.DocumentManager.MdiActiveDocument.Database;
                Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    
                Point3d p1 = new Point3d(1000, 1000, 0);
                Point3d p2 = new Point3d(2000, 2000, 0);
                if (rbArgs != null)
                {
                    foreach (TypedValue rb in rbArgs)
                    {
                        ed.WriteMessage(Environment.NewLine + " rb.ToString()=" + rb.ToString());
                        ed.WriteMessage(Environment.NewLine + " rb.TypeCode.ToString()=" + rb.TypeCode.ToString());
                        ed.WriteMessage(Environment.NewLine + " rb.Value.ToString()=" + rb.Value.ToString());
                    }
                }
                var line = new Line(p1, p2);
                using (Transaction trans = db.TransactionManager.StartTransaction())
                {
                    BlockTable acBlkTbl = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord acBlkTblRec = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                    line.SetDatabaseDefaults();
                    acBlkTblRec.AppendEntity(line);
                    trans.AddNewlyCreatedDBObject(line, true);
                    trans.Commit();
                }
                var rbrtn = new ResultBuffer(new TypedValue[]
               {
                    new TypedValue((int)LispDataType.ObjectId, line.ObjectId),
                    new TypedValue((int)LispDataType.Point3d, p1),
                    new TypedValue((int)LispDataType.Point3d, p2)
               });
                ed.WriteMessage(Environment.NewLine + " rbrtn=" + rbrtn.ToString() + Environment.NewLine + "");
                return rbrtn; //返回值此处有图元名
            }
    View Code

     

    再来是通过接口发送lisp,这个可以避免用明文方式发送到命令栏,而且它在自动执行函数上面也是同步发送的,很有趣哟: testLisp

    #if AC2008 || AC2012
            [System.Security.SuppressUnmanagedCodeSecurity]
            [DllImport("acad.exe", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl,
                EntryPoint = "?acedEvaluateLisp@@YAHPB_WAAPAUresbuf@@@Z")]
            private static extern int AcedEvaluateLisp(string lispLine, out IntPtr result);
    
            [DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedInvoke")]
            private static extern int AcedInvoke(IntPtr args, out IntPtr result);
    #else
            [System.Security.SuppressUnmanagedCodeSecurity]
            [DllImport("accore.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl,
            EntryPoint = "?acedEvaluateLisp@@YAHPEB_WAEAPEAUresbuf@@@Z")]
            private static extern int AcedEvaluateLisp(string lispLine, out IntPtr result);
    
            [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedInvoke")]
            private static extern int AcedInvoke(IntPtr args, out IntPtr result);
    #endif
    
            /// <summary>
            /// 定义lisp
            /// </summary>
            /// <param name="arg">lisp语句</param>
            /// <returns>缓冲结果,返回值</returns>
            public static ResultBuffer RunLisp(string arg)
            {
                AcedEvaluateLisp(arg, out IntPtr rb);
                if (rb != IntPtr.Zero)
                {
                    try
                    {
                        var rbb = DisposableWrapper.Create(typeof(ResultBuffer), rb, true) as ResultBuffer;
                        return rbb;
                    }
                    catch
                    {
                        return null;
                    }
                }
                return null;
            }
    
            /// <summary>
            /// c#发送lisp,这个同步方式可以在自动运行函数上跑,也是同步的
            /// </summary>
            /// <returns></returns>
            [CommandMethod("testLisp")]
            public void Cmdtest()
            {
                string Strlisp = "(setq a 10)";
                var res = RunLisp(Strlisp); //有lisp的返回值
            }
    View Code

     

    最后是提供一些发送命令的函数,这里有些备注,他们可以异步发送lisp,有些会导致自动执行时候发送lisp出错,但是却是异步发送的必需品.

        public partial class SendToCad
        {
    #if AC2006 || AC2007 || AC2008 || AC2009 || AC2010 || AC2011 || AC2012
            /// <summary> 
            /// 发送命令
            /// </summary>
            /// <param name="strExpr"></param>
            /// <returns></returns>    
            [DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl, EntryPoint = "ads_queueexpr")]
            private static extern int Ads_queueexpr(string strExpr);//非同步,这个在08/12发送lisp不会出错,但是发送bo命令出错了..
    
            /// <summary>
            /// 发送命令,设置CommandFlags.Session可以同步,
            /// 发送lisp也可以,但是非同步,在自动执行函数上面会非同步
            /// </summary>
            /// <param name="str"></param>
            public static void SendLisp(string str)
            {
                try
                {
                    Ads_queueexpr(str + "\n");
                }
                catch (Exception ee)
                {
                    //自执行发送lisp都是在最后的(异步执行)   
                    var ed = Application.DocumentManager.MdiActiveDocument.Editor;
                    ed.WriteMessage(Environment.NewLine + "发送命令失败,导致加载失败!");
                    ed.WriteMessage(Environment.NewLine + "" + ee.Message + Environment.NewLine);
                }
            }
    
            /// <summary>
            /// 发送命令
            /// </summary>
            /// <param name="strExpr"></param>
            /// <returns></returns> 
            [DllImport("acad.exe", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedPostCommand@@YAHPB_W@Z")]
            private static extern int AcedPostCommand(string strExpr);
    #else
            /// <summary>
            /// 发送命令
            /// </summary> 
            /// <param name="str">发送lisp加载命令</param> 
            /// <returns></returns>
            public static void SendLisp(string str)
            {
                Document dc = Application.DocumentManager.MdiActiveDocument;
                string commands = str + "\n";
                try
                {
                    dc.SendStringToExecute(commands, false, false, false);//08所有都flase会有问题,出现报错
                }
                catch (System.Exception ee)
                {
                    //自执行发送lisp都是在最后的(异步执行)   
                    var ed = dc.Editor;
                    ed.WriteMessage(ee.Message);
                    ed.WriteMessage(Environment.NewLine + "发送命令失败,导致加载失败!");
                    ed.WriteMessage(Environment.NewLine + ee.Message);
                }
            }
    #endif  
            /// <summary>
            /// 发送命令
            /// </summary>
            /// <param name="str">命令</param>
            /// <returns></returns>
            public static bool SendCommand(string str) //非同步,这里加载lisp第二个文档有问题...
            {
                object ActiveDocument = Com.App.GetType().InvokeMember("ActiveDocument", BindingFlags.GetProperty, null, Com.App, null);
                object[] commandArray = { str + "\n" };
                ActiveDocument.GetType().InvokeMember("SendCommand", BindingFlags.InvokeMethod, null, ActiveDocument, commandArray);
                return true;
            }
        }
    View Code

     

    最后的最后是一个发送esc的操作,我也不知道为什么要放这里,可能他存在的价值不高...

            //http://www.tiancao.net/blogview.asp?logID=1871&cateID=3&tdsourcetag=s_pcqq_aiomsg
            /*
            我想从我的非模态对话框的按钮中启动一些命令。我已经发现,对于SendStringToExecute,我应该使用‘\x03’字符而不是^C。
            我唯一的问题是,在这种情况下,如果没有运行命令,那么我将在命令窗口,如果单击菜单项时没有运行命令,则菜单的^C^C不会导致* Cancel*出现。
            我怎样才能达到同样的目的呢?
            解:
            你可以查帐CMDNAMES系统变量,根据当前运行的命令数量,可以在命令字符串的开头添加许多转义字符。
            这里有一个样本这表明:  
            */
            [CommandMethod("sendEsc")]
            public void SendEsc()
            {
                //c#非模态窗体发命令
                string esc = "";
                string cmds = CadSystem.Getvar("CMDNAMES");
                if (cmds.Length > 0)
                {
                    int cmdNum = cmds.Split(new char[] { '\'' }).Length;
                    for (int i = 0; i < cmdNum; i++)
                        esc += '\x03';
                }
                Document doc = Application.DocumentManager.MdiActiveDocument;
                doc.SendStringToExecute(esc + "_.LINE ", true, false, true);
                //设置cad窗口的焦点激活绘图区
                //acApp.MainWindow.Focus();
            }
    View Code

     

    转载于:https://www.cnblogs.com/JJBox/p/11532752.html

    展开全文
  • CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单。 下面介绍一下菜单的创建过程: 1、在项目中添加引用:AcCui.dll,这个DLL...

    从CAD2007之后,Autodesk提供了一个新的程序集AcCui.dll,使用这个程序集,我们可以方便地做一些界面方面的操作,比如创建自定义菜单。

     

    下面介绍一下菜单的创建过程:

    1、在项目中添加引用:AcCui.dll,这个DLL存放在CAD的安装目录中。但是,好像CAD2007之前的版本里没有这个DLL),我电脑上安装了CAD2004、CAD2005、CAD2008、CAD2010,其中,只有CAD2008和CAD2010中有这个DLL。

    2、在代码中添加using:

    using Autodesk.AutoCAD.Runtime;
    using Autodesk.AutoCAD.Customization;
    using System.Collections.Specialized;

    3、声明一个自定义组,在这个组中可以自定义我们的命令、菜单、工具栏等。

    //自定义的组名
    string strMyGroupName = "MyGroup";
    //保存的CUI文件名(从CAD2010开始,后缀改为了cuix)
    string strCuiFileName = "MyMenu.cui";
    
    //创建一个自定义组(这个组中将包含我们自定义的命令、菜单、工具栏、面板等)
    CustomizationSection myCSection = new CustomizationSection();
    myCSection.MenuGroupName = strMyGroupName;

    4、创建命令组,并添加菜单命令

    //创建自定义命令组
    MacroGroup mg = new MacroGroup("MyMethod", myCSection.MenuGroup);
    MenuMacro mm1 = new MenuMacro(mg, "打开文件", "OF", "");
    MenuMacro mm2 = new MenuMacro(mg, "打开模板", "OM", "");
    MenuMacro mm3 = new MenuMacro(mg, "保存", "SV", "");

    5、创建菜单,如果菜单项是单级菜单,则直接声明为PopMenuItem即可;如果菜单项下有子级,则将其子级放到一个PopMenu中,然后将这个PopMenu放到PopMenuRef中,最后将PopMenuRef放到总菜单中。按照这个原理,可以创建多级菜单。

     //声明菜单别名
    StringCollection scMyMenuAlias = new StringCollection();
    scMyMenuAlias.Add("MyPop1");
    scMyMenuAlias.Add("MyTestPop");
    
    //菜单项(将显示在项部菜单栏中)
    PopMenu pmParent = new PopMenu("我的菜单", scMyMenuAlias, "我的菜单", myCSection.MenuGroup);
    
    //子项的菜单(多级)
    PopMenu pm1 = new PopMenu("打开", new StringCollection(), "", myCSection.MenuGroup);
    PopMenuRef pmr1 = new PopMenuRef(pm1, pmParent, -1);
    PopMenuItem pmi1 = new PopMenuItem(mm1, "文件", pm1, -1);
    PopMenuItem pmi2 = new PopMenuItem(mm2, "模板", pm1, -1);
    
    //子项的菜单(单级)
    PopMenuItem pmi3 = new PopMenuItem(mm3, "保存(&S)", pmParent, -1);

    6、保存菜单文件

    // 最后保存文件
    myCSection.SaveAs(strCuiFileName);

     

    本来还想实现菜单的自动加载,但是CUI菜单必须用cuiload命令进行加载,在网上找到的方法都是向CAD发送lisp命令调用cuiload,但是我没有调用成功过。

     下面是一个测试程序的源码,开发环境是:VS2005 + CAD2008

    点击下载

    转载于:https://www.cnblogs.com/bomb12138/p/3600842.html

    展开全文
  • CAD地形图常用实用工具...由 MyCADPopWin.exe 程序的Win状态栏菜单“在CAD中增加或更新自定义按钮”功能进行加载。 注:工具按钮运行时,MyCADPopWin.exe /T 必须在状态运行,不能关闭,否则工具条不能使用
  • 一、让AutoCAD启动时自己...打开CAD安装根目录,找到Support文件夹中的acad2014.lsp(我的CAD版本是2014版,版本不同,此文件名不同),记事本打开。(我的acad2014.lsp路径为:D:\ProgramFiles\Autodesk\AutoCAD...
  • 本工具ARX+LISP编程,用于解决当前 AutoCAD 绘图中的一些不足或不便,提高绘图的效率,并将日常积累的一些程序整理成集,以方便使用。主要功能有:选择集管理、快速选择、各种刷子、批量修改块属性、断线、表格与...
  • AutoLisp学习笔记

    2019-10-27 12:01:00
    【前言】 最近发现,做CAD二次开发的,要么是计算机相关专业的,没有CAD基础;要么是工程制图出身,不会编程。所以写了这篇博客,AutoLisp学习笔记,根据我的学习经验,旨在给没有基础的你...CAD二次开发可以使用VB...
  • AuToCAD启动自定义加载程序研究(转) AuToCAD启动自定义加载程序研究...CAD文件加载顺序: acad2006.lsp (AutoCAD使用)  acad.rx (用户自定义的*.arx文件加载清单)  注:在CAD2006中,由错误提
  • CAD 系统变量参数大全

    千次阅读 2019-09-25 15:18:05
    CAD 系统变量参数大全 一、数学运算功能函数 1.1(十 数值 数值…)返回:累计实数或整数数值 1.2(一 数值 数值…)返回:差值 1.3(* 数值 数值…)返回:所有数值乘积 1.4(/ 数值 数值…)返回:第一个数值除以...
  • 4.3.1 菜单栏 4.3.2 工具栏 4.3.3 文本编辑窗口 4.3.4 跟踪窗口 4.3.5 控制台窗口 4.3.6 状态栏 4.4 加载AutoLISP程序 4.5 运行AutoLISP程序 4.6 退出Visual LISP 第5章 使用VisuaI LISP开发AutoLISP程序 ...
  • AuToCAD启动自定义加载程序研究

    千次阅读 2010-06-10 00:04:00
    在加载自定义菜单时,如果通过MENU加载,就会把acad.cui赶跑了。如果想保留acad.cui(CAD默认菜单),应该MENULOAD来加载(局部加载),这样两个菜单都在,如果不用了,也可以通过这个命令来卸载。了之后如果不...
  • 1.菜单 菜单 功能 文件  创建新的或修改已有的AutoLISP程序文件,编译或打印程序文件等 编辑  赋值和粘贴文本,匹配表达式中的括号,或赋值控制台窗口内以前的输入等 搜索  查找和...
  • Customize Menus 自定义菜单 自订功能表 Customize Menus 自定义菜单 自订功能表 Cut 剪切 剪下 cutclip 剪切 剪下截取 cylinder 圆柱体 圆柱体 cylindrical coordinate 柱坐标 圆柱体座标 dangle 不固定的 ...
  • Python 二次开发 AutoCAD 简介

    万次阅读 多人点赞 2018-12-13 18:20:21
    cad是 python是 Active X 是 pyautocad模块由俄罗斯工程师开发,因参考实例较少,工程需要,现将模块中一些基本的用法,做出简要说明,叙述力求简洁明了, 因个人水平有限,文中难免有所疏漏,还请各位大神不吝...
  • A、CAD高版本可以打开所有低版本的图纸B、CAD低版本不可以打开高版本的图纸C、高版本转成低版本的方法,直接点击另存为,将文件类型可以改成任意的低版本D、将低版本转换成高版本,就比较复杂了,需要第三方软件...
  • 复制要替换的字库为将被替换的字库名,如:打开一幅图,提示未找到字体jd,你想hztxt.shx替换它,那么你可以去找AutoCAD字体文件夹(font)把里面的hztxt.shx 复制一份,重新命名为jd.shx,然后在把XX.shx放到font...
  • 复制要替换的字库为将被替换的字库名,如:打开一幅图,提示未找到字体jd,你想hztxt.shx替换它,那么你可以去找AutoCAD字体文件夹(font)把里面的hztxt.shx 复制一份,重新命名为jd.shx,然后在把XX.shx放到font...
  • 5) 用CAD做好一幅图后,我们打开”文件(file)”菜单下的”打印(plotter…)”。在打印对话框中,在打印机类型中选择我们刚刚装好的”Independent JPEG Group JFIF”,在下面的”打印到文件(plot to file)”里添上...
  • CAD快捷键文档

    2011-12-17 19:02:10
    所谓的快捷命令,是AutoCAD为了提高绘图速度定义的快捷方式,它一个或几个简单的字母来代替常用的命令,使我们不用去记忆众多的长长的命令,也不必为了执行一个命令,在菜单和工具上寻寻匿匿。所有定义的快捷...
  • autocad命令全集

    2008-10-24 21:46:23
    292 UNDEFINE   允许用户将自定义命令覆盖AutoCAD内部命令 293 UNDO   撤消上一组操作 294 UNION UNI 布 尔求并 295 UNITS –UN 或UN 设置长度及角度的单位格式和精度等级 296 VBAIDE   VBA集成开发环境 297 ...
  • # 0. 引言 ...这是CAD2006界面,经典的菜单工具,略low 这是CAD2018的Ribbon界面 Ofiice从07版本开始采用Ribbon界面,AutoCAD跟随其后在CAD2009开始就使用Ribbon界面 来看看Ofiice2016的...
  • 5) 用CAD做好一幅图后,我们打开”文件(file)”菜单下的”打印(plotter…)”。在打印对话框中,在打印机类型中选择我们刚刚装好的”Independent JPEG Group JFIF”,在下面的”打印到文件(plot to file)”里添上...
  • CAD系统变量

    千次阅读 2018-05-11 14:34:07
    *CAD系统变量 要获取到系统变量的值,然后解析系统变量的含义,在网上找到这些资料: 3DDWFPREC 控制三维DWF发布的精度。 3DCONVERSIONMODE 用于将材质和光源定义转换为当前产品版本。 3DSELECTIONMODE 控制使用...
  • 中望cad2014 专业破解版

    千次阅读 2018-03-20 17:52:22
    中望cad2014是中望cad中的老版本,它依旧是以CAD制图功能为主要功能,另外还有释与标注、创建与编辑、输出与打印、高级工具等等功能。虽然让是老版本了,但是它相对于以前的版本来讲还是有一定的提神的,比如:新增...
  • AutoCAD常见问题及解决

    2011-11-16 21:52:00
    这时只需到工具菜单中选项里调下设置:“工具”——“选项”——“系统”,右侧有一个启动(A显示启动对话框B不显示启动对话框),选择A则新建命令有效,反则无效。 2、Ctrl键无效。 有时我们会碰到这样的问题...
  • 因为某些功能的原因,一部份VBA的用户最终选择了NET,又... 来自 一个CAD群叫 “arx-阿华”的 作为新手,作为业余,基础一般,精力有限,其实语言的选择是个不容忽视的问题。 目前我的定位是 飞思CAD,软件初...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

cad用lisp自定义菜单栏