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

AccoreConsole听起来有点拗口,其中文名能够叫作AutoCAD控制台或者无头AutoCAD。一句话归纳,它是快速启动AutoCAD运行微环境,高效的处理图纸。你能够如同DOS命令行同样操做命令,处理图纸,而不须要打开AutoCAD。这在批处理大量图纸时很是有用。另外启动是无论有无license均可以正常操做,不占当前autoCAD的资源c#

安装AutoCAD后,在安装路径根目录下就能够看到这个可执行程序 AccoreConsole.exeide



 

直入正题,Accoreconsole+scr+bat 纯命令只能单一机械的执行处理命令,今天笔者就结合C# AutoCAD NetApi 来探究下Accoreconsole的强大功能。。。。。。测试

1# 先写个cmd脚本调用AccoreConsolespa

%~dp0 表明当前脚本文件的文件夹路径,
/i 打开的图纸的全路径
/s 执行的scr文件的全路径
1 set acadPath="C:\Program Files\Autodesk\AutoCAD 2019\" 2 
3 %acadPath%accoreconsole.exe /i %~dp0Drawing1.dwg /s %~dp0NetCmd.scr 4 
5 @pause

多个dwg文件执行须要改为以下,请根据AutoCAD的安装路径更改为对应的版本命令行

1 set acadPath="C:\Program Files\Autodesk\AutoCAD 2019\"
2 for %%i in (%~dp0*.dwg) do %acadPath%accoreconsole.exe /i %%i /s %~dp0NetCmd.scr

3 @pause

2# 写个scr文件,命名为NetCmd.scr3d

netload "D:/MyProgrammingData/ShopDrawing/ShopDrawing/bin/Debug/ShopDrawing.dll"
(command "myNetcmd")
qsave
(setvar filedia 0)调试


secureload 0
cmdecho 0
netload "C:\Users\nslov\Desktop\Test\ShopDrawing.dll"
filedia 0
(if (= (getvar "WRITESTAT") 0) (Command "close"))
mySSsetTest
qsavecode

 


 

解释部分:secureload 0, 关闭dll加载提示
cmdecho 0 关闭回显blog

(if (= (getvar "WRITESTAT") 0) (Command "close"))ip

只读的话就执行退出,非只读才执行后面对应的命令

3# 编写c#代码,生成的dll为ShopDrawing.dll,注册cad命令“myNetcmd“

skd的dll只能引用这2个dll,AcDbMgd.dll,AcCoreMgd.dll

这2个dll均可以用,选择集经测试能够使用


 

 1 using Autodesk.AutoCAD.Runtime;  2 using System;  3 using System.Collections.Generic;  4 using System.Linq;  5 using System.Text;  6 using System.Threading.Tasks;  7 using Autodesk.AutoCAD.DatabaseServices;  8 using Autodesk.AutoCAD.ApplicationServices;  9 using Autodesk.AutoCAD.Geometry; 10 using Autodesk.AutoCAD.EditorInput; 11 using Autodesk.AutoCAD.ApplicationServices.Core; 12 
13 namespace ShopDrawing 14 { 15     public class AccoreCmd 16  { 17         [CommandMethod("mySSsetTest")] 18         public void MyPlotModelSpace() 19  { 20             var doc = Application.DocumentManager.MdiActiveDocument; 21             var db = HostApplicationServices.WorkingDatabase; 22             var ed = doc.Editor; 23             //转化成世界坐标系
24             if (ed.CurrentUserCoordinateSystem != Matrix3d.Identity) ed.CurrentUserCoordinateSystem = Matrix3d.Identity; 25             using (Transaction trans = db.TransactionManager.StartTransaction()) 26  { 27                 BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; 28                 BlockTableRecord ms = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; 29                 //获取块的边界范围
30                 var psr = ed.SelectCrossingWindow(Point3d.Origin, new Point3d(350, 650, 0), 31                     new Autodesk.AutoCAD.EditorInput.SelectionFilter(new TypedValue[] { 32                         new TypedValue((int)DxfCode.Start, RXClass.GetClass(typeof(BlockReference)).DxfName) 33  })); 34                 if (psr.Status == Autodesk.AutoCAD.EditorInput.PromptStatus.OK) 35  { 36                     foreach (SelectedObject item in psr.Value) 37  { 38                         Entity ent = trans.GetObject(item.ObjectId, OpenMode.ForRead) as Entity; 39                         if (ent != null) 40  { 41                             BlockReference blkRef = ent as BlockReference; 42                             if (blkRef.Name == "123") 43  { 44                                 Polyline pline = new Polyline(); 45                                 pline.AddVertexAt(0, new Point2d(blkRef.GeometricExtents.MaxPoint.X, blkRef.GeometricExtents.MaxPoint.Y), 0, 0, 0); 46                                 pline.AddVertexAt(0, new Point2d(blkRef.GeometricExtents.MinPoint.X, blkRef.GeometricExtents.MaxPoint.Y), 0, 0, 0); 47                                 pline.AddVertexAt(0, new Point2d(blkRef.GeometricExtents.MinPoint.X, blkRef.GeometricExtents.MinPoint.Y), 0, 0, 0); 48                                 pline.AddVertexAt(0, new Point2d(blkRef.GeometricExtents.MaxPoint.X, blkRef.GeometricExtents.MinPoint.Y), 0, 0, 0); 49                                 pline.AddVertexAt(0, new Point2d(blkRef.GeometricExtents.MaxPoint.X, blkRef.GeometricExtents.MaxPoint.Y), 0, 0, 0); 50  ms.AppendEntity(pline); 51                                 trans.AddNewlyCreatedDBObject(pline, true); 52  } 53  } 54  } 55  trans.Commit(); 56  } 57                 else ed.WriteMessage("Can't Find Any Block"); 58  } 59  } 60  } 61 }
View Code

 4# 执行结果以下,双击bat文件执行以下,bat 文件和scr都要仔细调试,一步错步步错!!!

 5# AutoCAD script脚本语法简介

  与cad命令行操做同样,命令行怎么输入,代码就怎写。。。

  1. 脚本文件空格做为命令或数据结束符来处理
  2. 脚本命令不要简写,以避免歧义。
  3. 注释语法以分号表示。
  4. 最后一行必须为空行。
  5. 嵌入空格的长文件名用双引号括起来。 如open “my house”; 打开my house.dwg文件
相关文章
相关标签/搜索