NXOpen入口
class Program
{
static void Main(string[] args)
{
try
{
//Console.ReadKey(true);
Console.BackgroundColor = ConsoleColor.DarkGray;
Console.ForegroundColor = ConsoleColor.DarkMagenta;
Console.Clear();
Console.Title = "导出CAD图纸";
string filePath = "";
foreach (string arg in args)
{
filePath = filePath + arg + " ";
}
filePath = filePath.Trim();
CombineSheetManager manager = string.IsNullOrWhiteSpace(filePath)
? new CombineSheetManager()
: new CombineSheetManager(filePath);
manager.Commit();
}
catch (System.Exception ex)
{
if (!string.IsNullOrWhiteSpace(ex.Source))
{
Console.WriteLine(ex.Source);
}
Console.WriteLine(ex);
}
Console.ReadKey();
}
}
主要类:导出 合并
public class CombineSheetManager : BaseCombineManager, IEnumerable
{
private readonly List mList;
public CombineSheetManager(string filePath)
{
var lines = ReadAllLines(filePath).ToList();
if (lines.Count < 3)
{
throw new System.Exception($"工作包文件格式错误。\r\n{filePath}");
}
this.BaseDirectory = lines[0];
this.InputPart = lines[1];
this.OutputFile = lines[2];
this.mList = lines.Skip(3).Select(p => new CombineSheet(this, p)).ToList();
if (this.mList.Count == 0)
{
throw new System.Exception($"工作包文件没有指定导出图纸。\r\n{filePath}");
}
//赋序号
int i = 0;
foreach (var combineSheet in this.mList)
{
combineSheet.Id = ++i;
}
//查找Root目录
var rootDir = this.BaseDirectory.GetSubFolder("NXBIN");
if (rootDir == null || !rootDir.Exists)
{
rootDir = this.BaseDirectory.GetSubFolder("UGII");
if (rootDir == null || !rootDir.Exists)
{
throw new System.Exception($"当前{this.BaseDirectory}程序安装不完整。");
}
}
this.RootDirectory = rootDir;
//配置表
var ugTo2dDef = this.CurrentDirectory.GetFile("ugto2d.def");
this.SettingTable = new SettingTable(ugTo2dDef);
}
public CombineSheetManager():this(OpenPackage())
{
}
private static string OpenPackage()
{
Console.WriteLine("请输入工作包文件路径:");
return Console.ReadLine();
//var openFile = new System.Windows.Forms.OpenFileDialog();
//openFile.Multiselect = false;
//openFile.Filter = "Package Files(*.package)|*.package|All Files(*.*)|*.*";
//openFile.CheckPathExists = true;
//var result = openFile.ShowDialog();
//string fileName = "";
//if (result == System.Windows.Forms.DialogResult.OK)
//{
// fileName = openFile.FileName;
//}
//openFile.Dispose();
//return fileName;
}
public FolderPathInfo BaseDirectory { get; }
public FilePathInfo InputPart { get; set; }
public FilePathInfo OutputFile { get; set; }
public FolderPathInfo RootDirectory { get; }
public SettingTable SettingTable { get; }
private IEnumerable ReadAllLines(string filePath)
{
bool isDeleteFile = true;
if (string.IsNullOrWhiteSpace(filePath))
{
filePath = $"{base.Name}.package";
isDeleteFile = false;
}
if (filePath.IndexOf('\\') < 0)
{
filePath = base.CurrentDirectory.GetFile(filePath);
isDeleteFile = false;
}
if (!System.IO.File.Exists(filePath))
{
yield break;
}
var lines = System.IO.File.ReadAllLines(filePath);
if (isDeleteFile)
{
System.IO.File.Delete(filePath);
}
foreach (var line in lines)
{
if (string.IsNullOrWhiteSpace(line)) continue;
if (line.StartsWith("!")||
line.StartsWith("#"))
{
continue;
}
yield return line;
}
}
public FilePathInfo GetOutputTempFile(string fileName, bool deleteFile = true)
{
var filePathInfo = this.OutputFile.Directory.GetFile(fileName);
if (filePathInfo?.Exists == true)
{
if (!deleteFile)
{
filePathInfo.CopyToBak();
}
filePathInfo.Delete();
}
return filePathInfo;
}
public FilePathInfo GetFrameFile(CombineSheet sheet)
{
if (sheet == null) return null;
var folder = this.UserDirectory.GetSubFolder(@"Config\DrawingTemplate");
if (!string.IsNullOrWhiteSpace(sheet.FrameCategory))
{
folder = folder.GetSubFolder(sheet.FrameCategory);
}
if (!string.IsNullOrWhiteSpace(sheet.FrameName))
{
return folder.GetFile(sheet.FrameName + ".dwg");
}
return null;
}
public void Commit()
{
try
{
this.PrintMessage("----------------------------------------------------");
this.PrintMessage("图纸导出开始:");
this.OnExport();
this.PrintMessage("图纸导出完成。");
this.PrintMessage("");
this.PrintMessage("----------------------------------------------------");
this.PrintMessage("图纸合并开始:");
this.OnCombine();
this.PrintMessage("图纸合并完成。");
this.PrintMessage("");
}
finally
{
OnClearFile();
}
}
private void OnExport()
{
var ugTo2dExe = this.BaseDirectory.GetFile(@"UGTO2D\ugto2d.exe");
var dxfDwgExe = this.BaseDirectory.GetFile(@"DXFDWG\dxfdwg.exe");
var dxfDwgDefine = this.CurrentDirectory.GetFile("dxfdwg.def");
if (!dxfDwgDefine.Exists)
{
dxfDwgDefine = this.BaseDirectory.GetFile(@"DXFDWG\dxfdwg.def");
}
if (!ugTo2dExe.Exists ||
!dxfDwgExe.Exists ||
!dxfDwgDefine.Exists)
{
throw new System.Exception($"当前{this.BaseDirectory}程序安装不完整。");
}
if (this.OutputFile?.Directory?.Exists != true)
{
throw new System.Exception($"输出路径不正确。\r\n{this.OutputFile}");
}
var logFile = this.OutputFile.ChangeExtension(".log");
this.SettingTable.InputPartsList = this.InputPart;
this.SettingTable.LogFile = logFile;
foreach (CombineSheet combineSheet in this)
{
this.PrintMessage($"{combineSheet.PartLayer}->{combineSheet.Name}");
string name = $"{combineSheet.Id}_2d";
var tempPart = this.GetOutputTempFile(name + ".prt");
var defineFile = this.GetOutputTempFile(name + ".def");
var dwgFile = this.GetOutputTempFile(name + ".dwg");
combineSheet.DwgPath = dwgFile;
this.SettingTable.OutputPartsList = tempPart;
this.SettingTable.DrawingNames = combineSheet.Name;
this.SettingTable.SaveAs(defineFile);
var sb = new System.Text.StringBuilder();
//初始化
sb.AppendLine($"set UGII_BASE_DIR=\"{this.BaseDirectory}\"");
sb.AppendLine($"set UGII_ROOT_DIR=\"{this.RootDirectory}\"");
sb.AppendLine($"pushd \"{this.BaseDirectory}\"");
sb.AppendLine($"cd \"{this.RootDirectory}\"");
//转换成2D
sb.AppendLine($"call \"{ugTo2dExe}\" d=\"{defineFile}\"");
sb.AppendLine($"del \"{defineFile}\"");
//转换成dwg
sb.AppendLine($"call \"{dxfDwgExe}\" i=\"{tempPart}\" o=\"{dwgFile}\" d=\"{dxfDwgDefine}\" l=\"{logFile}\"");
sb.AppendLine($"del \"{tempPart}\"");
sb.AppendLine($"del \"{logFile}\"");
//sb.AppendLine($"del %0");
sb.AppendLine($"exit");
//System.IO.File.WriteAllText(this.GetOutputTempFile($"{name}.bat"),sb.ToString());
try
{
RunCommand(sb.ToString());
}
catch (System.Exception ex)
{
this.PrintMessage($"导出图纸遇到异常,----{ex.Message}");
}
}
}
private void OnCombine()
{
//Check AutoCAD
Type cadType = Type.GetTypeFromProgID("AutoCAD.Application");
if (cadType == null)
{
throw new System.Exception($"没有安装任何AutoCAD软件,图纸无法合并!");
}
//用COM创建
object app = Activator.CreateInstance(cadType);
//提供5秒的时间用于等待app
for (int i = 0; i < 50; i++)
{
if (app == null)
System.Threading.Thread.Sleep(100);
}
try
{
//new a document
object document = app.GetProperty("Documents").InvokeMethod("Add");
document.InvokeMethod("SaveAs", new object[] { this.OutputFile.FullPath });
object modelSpace = document.GetProperty("ModelSpace");
double x = 0;
foreach (CombineSheet sheet in this)
{
double[] origin = new double[] { x, 0, 0 };
x += (sheet.Length + 10);
this.PrintMessage($"->{sheet.Name}");
try
{
if (sheet.DwgPath?.Exists == true)
{
object blockReference = modelSpace.InvokeMethod("InsertBlock", new object[] { origin, sheet.DwgPath.FullPath, 1, 1, 1, 0 });
object objects = blockReference.InvokeMethod("Explode");
blockReference.InvokeMethod("Delete", new object[0]);
sheet.DwgPath.Delete();
}
else
{
this.PrintMessage($"没有找到相应图纸,程序跳过。");
}
var framePath = this.GetFrameFile(sheet);
if (framePath?.Exists == true)
{
object blockReference = modelSpace.InvokeMethod("InsertBlock", new object[] { origin, framePath.FullPath, sheet.FrameScale, sheet.FrameScale, 1, 0 });
try
{
object objects = blockReference.InvokeMethod("Explode");
blockReference.InvokeMethod("Delete", new object[0]);
}
catch (Exception ex)
{
//ex.ToString().WriteToLog();
ex.Data.Clear();
}
}
else
{
this.PrintMessage($"没有找到相应CAD图框 {sheet.FrameCategory}\\{sheet.FrameName}");
}
}
catch (System.Exception ex)
{
this.PrintMessage(ex.ToString());
}
}
document?.InvokeMethod("Save");
document?.InvokeMethod("Close");
}
finally
{
app.InvokeMethod("Quit");
}
}
private void OnClearFile()
{
foreach (CombineSheet sheet in this)
{
if (sheet?.DwgPath?.Exists == true)
{
sheet.DwgPath.Delete();
}
}
}
private void PrintMessage(string msg)
{
Console.WriteLine($"{msg}");
}
private void RunCommand(string args)
{
var process = new Process();
try
{
process.StartInfo.FileName = "cmd.exe "; //打开DOS控制平台
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true; //是否显示DOS窗口,true代表隐藏;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
var input = process.StandardInput;//标准输入流
var output = process.StandardOutput;//标准输入流
var error = process.StandardError;//标准错误流
input.AutoFlush = true;
foreach (var s1 in args.Split(new string[] { System.Environment.NewLine },
System.StringSplitOptions.RemoveEmptyEntries))
{
input.WriteLine(s1);
}
string s = output.ReadToEnd();//读取执行DOS命令后输出信息
string er = error.ReadToEnd().Trim();//读取执行DOS命令后错误信息
if (process.HasExited == false)
{
process.Kill();
//MessageBox.Show(er);
}
else
{
//MessageBox.Show(s);
}
input.Close();
output.Close();
error.Close();
if (!string.IsNullOrWhiteSpace(er))
{
throw new System.Exception(er);
}
}
finally
{
process.Close();
}
}
public IEnumerator GetEnumerator()
{
foreach (var combineSheet in this.mList)
{
yield return combineSheet;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
读写配置表
public class SettingTable:IEnumerable
{
private readonly List mList;
public SettingTable(string filePath)
{
this.mList = GetSettingVariables(filePath).ToList();
}
public int Count => this.mList.Count;
public string this[string name]
{
get
{
foreach (SettingVariable settingVariable in this)
{
if (string.Compare(settingVariable.Name, name,System.StringComparison.OrdinalIgnoreCase) == 0)
{
return settingVariable.Value;
}
}
return null;
}
set
{
foreach (SettingVariable settingVariable in this)
{
if (string.Compare(settingVariable.Name, name, System.StringComparison.OrdinalIgnoreCase) == 0)
{
settingVariable.Value = value;
return;
}
}
this.mList.Add(new SettingVariable(name,value));
}
}
///
/// 输入part文件路径
///
public string InputPartsList
{
get => this["INPUT_PARTS_LIST"];
set => this["INPUT_PARTS_LIST"] = value;
}
///
/// 输出Part文件路径
///
public string OutputPartsList
{
get => this["OUTPUT_PARTS_LIST"];
set => this["OUTPUT_PARTS_LIST"] = value;
}
///
/// 图纸名称
///
public string DrawingNames
{
get => this["UGI_DRAWING_NAMES"];
set => this["UGI_DRAWING_NAMES"] = value;
}
///
/// 日志文件路径
///
public string LogFile
{
get => this["LOG_FILE"];
set => this["LOG_FILE"] = value;
}
private IEnumerable GetSettingVariables(string filePath)
{
if (!System.IO.File.Exists(filePath))
{
yield break;
}
foreach (var line in System.IO.File.ReadAllLines(filePath))
{
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
if (line.StartsWith("!") ||
line.StartsWith("#"))
{
continue;
}
yield return new SettingVariable(line);
}
}
public void SaveAs(string filePath)
{
System.IO.File.Exists(filePath);
var lines = this.Select(p => $"{p}").ToArray();
System.IO.File.WriteAllLines(filePath,lines);
}
public IEnumerator GetEnumerator()
{
foreach (var settingVariable in this.mList)
{
yield return settingVariable;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class SettingVariable
{
public SettingVariable(string name, string value)
{
this.Name = name;
this.Value = value;
}
public SettingVariable(string nameAndValue)
{
int index = nameAndValue.IndexOf('=');
if (index < 0)
{
this.Name = nameAndValue.Trim();
}
else
{
this.Name = nameAndValue.Substring(0, index).Trim();
this.Value = nameAndValue.Substring(index + 1).Trim();
}
}
public string Name { get; }
public string Value { get; set; }
public override string ToString()
{
var value = $"{this.Value}".Trim();
//if (value.IndexOf(' ') > 0)
//{
// if (value.StartsWith("\"") && value.EndsWith("\""))
// {
// }
// else
// {
// value = $"\"{value}\"";
// }
//}
return $"{this.Name}={value}";
}
}