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. JS基础_数组的方法

    常用的方法 1.push:向数组的末尾添加一个或更多元素,并返回新的长度. 将要添加的元素作为方法的参数传递,这些元素将会自动添加到数组的末尾 var a=[1,2,3]; var r = a.pus ...

  2. LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)

    题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...

  3. ubuntu 17.04 添加用户到sudo组

    最近在系统中安装了KVM和docker,用KVM的时候好好的,可以直接使用virsh等命令.但是安装了docker,使用docker命令时需要在前面加上sudo,这个用起来就挺麻烦的,于是想到dock ...

  4. HDU3549:Flow Problem(最大流入门EK)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> ...

  5. LC 974. Subarray Sums Divisible by K

    Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...

  6. ubuntu更换源的方法

    1.查看ubuntu版本的方法: 使用命令 sudo lsb_release -a 输出如下: root@localhost:/etc/apt# sudo lsb_release -aNo LSB m ...

  7. driver.implicitly_wait不起作用的排错方法

    环境是python3.6+selenium 3.4.3+chrome64 在编写前端自动化脚本时使用implicitly_wait时不起作用 1.确认自己是否正确使用,可用简单的例子来测试,比如: 此 ...

  8. Python 常用模块(2) 序列化(pickle,shelve,json,configpaser)

    主要内容: 一. 序列化概述 二. pickle模块 三. shelve模块 四. json模块(重点!) 五. configpaser模块 一. 序列化概述1. 序列化: 将字典,列表等内容转换成一 ...

  9. Python 内置函数 -- zip(), sorted(), filter()和map()

    内置函数1. zip() 打包(木桶效应)描述: zip() 函数用于将可迭代的对象作为参数, 将对象中对应的元素打包成一个个元组, 然后返回由这些元组组成的列表语法: zip([iterable, ...

  10. Spark在Windows上调试

    1. 背景 (1) spark的一般开发与运行流程是在本地Idea或Eclipse中写好对应的spark代码,然后打包部署至驱动节点,然后运行spark-submit.然而,当运行时异常,如空指针或数 ...