1# 封装类

  public static class CmdHelper
{
/// <summary>
/// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批量处理图纸(Net Api dll)
/// </summary>
/// <param name="cmsStr">NetApi中注册的命令(commandmethod中写的命令)</param>
/// <param name="dllPath">AutoCAD Net Api的程序集的全路径</param>
/// <param name="dwgfn">dwg文件的全路径</param>
/// <param name="AccoreconsolePath">AutoCAD 安装目录下的AccoreConsole.exe的全路径</param>
public static void ExecuteCmd(string cmsStr,string dllPath,string dwgfn)
{
var acadInstallPath = string.Empty;
for (int i = ; i < DateTime.Now.Year + ; i++)
{
if (File.Exists(@"C:\Program Files\Autodesk\AutoCAD " + i + "\\Accoreconsole.exe"))
{
acadInstallPath = @"C:\Program Files\Autodesk\AutoCAD " + i + "\\";
break;
}
}
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo()
{
FileName = "cmd.exe",
UseShellExecute=false,
CreateNoWindow=true,
RedirectStandardInput=true,
RedirectStandardOutput=true
};
Process pro = new Process() { StartInfo = psi };
pro.Start();
pro.StandardInput.WriteLine("\"" + acadInstallPath + "Accoreconsole.exe" + "\" /i " + "\"" + dwgfn + "\"");
pro.StandardInput.WriteLine("secureload");
pro.StandardInput.WriteLine("");
pro.StandardInput.WriteLine("netload");
pro.StandardInput.WriteLine("\""+ dllPath + "\"");
pro.StandardInput.WriteLine("filedia");
pro.StandardInput.WriteLine("");
pro.StandardInput.WriteLine(cmsStr);
pro.StandardInput.WriteLine("qsave");
pro.StandardInput.WriteLine("quit");
pro.StandardInput.WriteLine("exit");
}
/// <summary>
/// 调用AutoCAD 安装目录下的AccoreConsole.exe来实现批量处理图纸(scr 文件)
/// </summary>
/// <param name="scrFileName">scr 文件的全路径</param>
/// <param name="dwgfn">dwg文件的全路径</param>
/// <param name="AccoreconsolePath">AutoCAD 安装目录下的AccoreConsole.exe的全路径</param>
public static void ExecuteCmd(string scrFileName, string dwgfn)
{
var acadInstallPath = string.Empty;
for (int i = ; i < DateTime.Now.Year + ; i++)
{
if (File.Exists(@"C:\Program Files\Autodesk\AutoCAD " + i + "\\Accoreconsole.exe"))
{
acadInstallPath = @"C:\Program Files\Autodesk\AutoCAD " + i + "\\";
break;
}
}
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo()
{
FileName = acadInstallPath+"Accoreconsole.exe",
Arguments = " /i " + "\"" + dwgfn + "\" /s "+"\"" + scrFileName + "\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true,
RedirectStandardOutput = true
};
Process pro = new Process() { StartInfo = psi };
pro.Start();
pro.StandardInput.WriteLine("filedia");
pro.StandardInput.WriteLine("");
pro.StandardInput.WriteLine("exit");
} public static List<String> GetOutNetApiCmd(string dllPath)
{
List<String> strCmd = new List<string>();
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Assembly ass = Assembly.LoadFrom(dllPath);
foreach (var t in ass.GetTypes())
{
if (t.IsClass && t.IsPublic)
{
foreach (MethodInfo m in t.GetMethods())
{
if (m.IsPublic && m.GetCustomAttributes(true)!=null)
{
Attribute att = null;
foreach (var item in m.GetCustomAttributes(true))
{
if (item.GetType().Name == "CommandMethodAttribute") att = item as Attribute;
}
if (att!=null) strCmd.Add(m.CustomAttributes.ToList()[].ConstructorArguments[].Value.ToString());
}
}
}
}
return strCmd;
} private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
AssemblyName assName = new AssemblyName(args.Name);
var acadInstallPath = string.Empty;
for (int i = ; i < DateTime.Now.Year+; i++)
{
if (File.Exists(@"C:\Program Files\Autodesk\AutoCAD "+i+"\\Accoreconsole.exe"))
{
acadInstallPath = @"C:\Program Files\Autodesk\AutoCAD " + i + "\\";
break;
}
}
return Assembly.LoadFile(acadInstallPath + args.Name+".dll");
}
}

2# 准备autocad的sdk放入文件夹,这个sdk的dll不要高于你的netapi的dll的版本,最好一致

3# 在program.cs中做如下调整

提前加入netapi的dll的依赖项,此处为了到处netapi的自定义命令的名称“GetOutNetApiCmd”方法可以成功执行,否则无法执行

  static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var acadInstallPath = string.Empty;
for (int i = ; i < DateTime.Now.Year + ; i++)
{
if (File.Exists(@"C:\Program Files\Autodesk\AutoCAD " + i + "\\Accoreconsole.exe"))
{
acadInstallPath = @"C:\Program Files\Autodesk\AutoCAD " + i + "\\";
break;
}
}
if (acadInstallPath != string.Empty)
{
var location = Application.StartupPath;
Assembly.LoadFrom(location + "\\NetApiDll\\AcDbMgd.dll");
Assembly.LoadFrom(location + "\\NetApiDll\\AcCoreMgd.dll");
Application.Run(new Form1());
}
else MessageBox.Show("本机没有安装AutoCAD2013-"+DateTime.Now.Year + +"中的任意一个版本, 无法启动本程序!");
}

4# 绘制用户界面

5# 写完程序

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace MyAccoreConsole
{
public partial class Form1 : Form
{
public List<string> ListDwgFileNames { get; set; }
public string SelectedDllName { get; set; }
public string SelectedScrName { get; set; }
public string SelectedCmdName { get; set; }
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
this.listBox1.Items.Clear();
this.ListDwgFileNames = new List<string>();
OpenFileDialog ofd = new OpenFileDialog() {
Filter="AutoCAD DwgFile *.dwg|*.dwg",
Multiselect=true,
ReadOnlyChecked=true
};
if (ofd.ShowDialog()== DialogResult.OK) this.ListDwgFileNames.AddRange(ofd.FileNames);
foreach (var item in this.ListDwgFileNames) this.listBox1.Items.Add(item);
} private void button3_Click(object sender, EventArgs e)
{
this.label2.Text = string.Empty;
OpenFileDialog ofd = new OpenFileDialog()
{
Filter = "AutoCAD NetApi Dll *.dll|*.dll",
Multiselect = false
};
if (ofd.ShowDialog() == DialogResult.OK) this.SelectedDllName = ofd.FileName;
this.label2.Text = this.SelectedDllName;
} private void button2_Click(object sender, EventArgs e)
{
this.label1.Text = string.Empty;
OpenFileDialog ofd = new OpenFileDialog()
{
Filter = "AutoCAD Scr File *.scr|*.scr",
Multiselect = false
};
if (ofd.ShowDialog() == DialogResult.OK) this.SelectedScrName = ofd.FileName;
this.label1.Text = this.SelectedScrName;
}
private void comboBox1_DropDown(object sender, EventArgs e)
{
this.comboBox1.Items.Clear();
var cms = CmdHelper.GetOutNetApiCmd(this.SelectedDllName);
if (cms.Count>) this.comboBox1.Items.AddRange(cms.ToArray());
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.SelectedCmdName = this.comboBox1.Text;
}
private void button5_Click(object sender, EventArgs e)
{
foreach (var item in this.ListDwgFileNames)
{
CmdHelper.ExecuteCmd(this.SelectedCmdName, this.SelectedDllName,item);
}
MessageBox.Show("Net Api 执行完成!!!!");
} private void button4_Click(object sender, EventArgs e)
{
foreach (var item in this.ListDwgFileNames)
{
CmdHelper.ExecuteCmd(this.SelectedScrName,item);
}
MessageBox.Show("SCR 批处理文件执行完成!!!!");
}
}
}

AutoCAD2013 以上利用AccoreConsole+ c# NetApi Windows Froms 封装的更多相关文章

  1. AutoCAD2013 以上利用AccoreConsole+ c# NetApi 批量处理图纸

    AccoreConsole听起来有点拗口,其中文名可以叫做AutoCAD控制台或者无头AutoCAD.一句话概括,它是快速启动AutoCAD运行微环境,高效的处理图纸.你可以如同DOS命令行一样操作命 ...

  2. AUTOCAD2013 以上利用ACCORECONSOLE+ SCR后台批量清理图纸

    无意中浏览到南胜大神的博客,https://www.cnblogs.com/NanShengBlogs/p/10957489.html 受此启发,特意改装此方法用于批量清理图纸,效果极佳. 详细介绍详 ...

  3. 利用SSH协议在Windows下使用PuTTY连接Ubuntu

    利用SSH协议在Windows下使用PuTTY连接Ubuntu Ubuntu部分 首先我们要为Ubuntu配置一下环境,让它支持ssh服务,我们要做的其实也很简单,就一下两步: 安装OpenSSH软件 ...

  4. frp服务利用云主机实现Windows远程连接

    frp服务利用云主机实现Windows远程连接 1.下载所需要的安装包 https://github.com/fatedier/frp/releases 下载 frp_0.44.0_linux_amd ...

  5. Windows 7 封装篇(一)【母盘定制】[手动制作]定制合适的系统母盘

    Windows 7 封装篇(一)[母盘定制][手动制作]定制合适的系统母盘 http://www.win10u.com/article/html/10.html Windows 7 封装篇(一)[母盘 ...

  6. Windows 7 封装与定制不完全教程

    Windows 7 封装与定制不完全教程 从定制Win7母盘到封装详细教程 手把手教你定制WIN7小母盘 Windows 7 封装与定制不完全教程 [教程] Windows 7 封装与定制不完全教程( ...

  7. Windows系统封装教程

    Windows系统封装教程

  8. 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

    1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...

  9. 利用cwRsync客户端将Windows下文件同步到Linux

    这里不描述Linux服务端安装配置rsync服务的过程,有需要可以在网络上查找相关教程. 1.安装cwRsync客户端下载地址:http://itefix.no/cwrsync/下载文件cwRsync ...

随机推荐

  1. tp5 模型关联,多表联查实用方法

    1.模型中建立关联关系 public function goods(){ return $this->belongsTo('app\common\model\goods\Goods', 'goo ...

  2. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

  3. PHP-生产随机密码

    public function dd(){ error_reporting(E_ALL^E_NOTICE^E_WARNING);$arr1 = array(0,1,2,3,4,5,6,7,8,9);$ ...

  4. <JavaScript>为什么0.1+0.2=0.30000000000000004

    浮点数运算 你使用的语言并不烂,它能够做浮点数运算.计算机天生只能存储整数,因此它需要某种方法来表示小数.这种表示方式会带来某种程度的误差.这就是为什么往往 0.1 + 0.2 不等于 0.3. 为什 ...

  5. LC 722. Remove Comments

    Given a C++ program, remove comments from it. The program source is an array where source[i] is the  ...

  6. 深度学习之强化学习Q-Learning

    1.知识点 """ 1.强化学习:学习系统没有像很多其他形式的机器学习方法一样被告知应该做什么行为, 必须在尝试之后才能发现哪些行为会导致奖励的最大化,当前的行为可能不仅 ...

  7. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置

    vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置 [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/ar ...

  8. 【POJ - 1970】The Game(dfs)

    -->The Game 直接中文 Descriptions: 判断五子棋棋局是否有胜者,有的话输出胜者的棋子类型,并且输出五个棋子中最左上的棋子坐标:没有胜者输出0.棋盘是这样的,如图 Samp ...

  9. 【AMAD】django-cities -- 为Django项目提供国家,城市数据

    动机 简介 个人评分 动机 有时候看一些数据库设计,国家数据会存在一个单独的表里面.这种方式读取数据库无疑又要加上一层join,很不划算. 简介 [django-cities]1可用为你提供国家和城市 ...

  10. DP————LIS(最长上升子序列)和LCS(最长公共子序列)问题

    LIS问题 https://www.acwing.com/problem/content/898/ 思路:首先数组a中存输入的数(原本的数),开辟一个数组f用来存结果,最终数组f的长度就是最终的答案: ...