MES系统通过eDrawings Pro API开发图纸批量转换工具,实现3D在线查看

声明:部分代码来源于网络,如有疑问,请联系本人删除。

通过C#结合eDrawings API提供接口,实现图纸转换为换.jpg、.tif、.bmp、.stl、.exe、.html、.zip、.edrw、.eprt 和 .eas格式工具,尤其是.html格式,可以实现3D图纸在线查看和旋转、爆炸图等操作。转换服务器或者工作站无需安装SOLIDWORKS。

需要安装软件:

1.eDrawings X64版本,注意安装完注册信息使用公司使用;

2.以及eDrawings X64匹配的SW文档管理器应用程序;

正文:

开发完成的这个应用最终生成一个命令行可执行程序,通过其它语言调用这个工具实现图纸批量转换。

此应用程序可以从命令行运行,并具有以下参数:

  • -input:要处理的输入目录或文件路径列表。这些文件可以由 eDrawings 打开(例如 SOLIDWORKS 文件、CATIA、STEP、DXF/DWG 等)。请参阅下面的完整列表:

命令行参数:

  • -filter:用于提取输入文件的过滤器(如果 -input 参数包含目录)
  • -outdir:导出结果的目录路径。如果不存在该目录,工具将自动创建。如果未指定此参数,则文件将导出到与输入文件相同的文件夹中。
  • -format:要将文件导出到的格式列表。支持的格式有:.jpg、.tif、.bmp、.png、.stl、.exe、.htm、.zip、.edrw、.eprt 和 .easm。指定 .e 以将文件导出为 eDrawings 的相应格式(例如,.sldprt 导出为 .eprt,.sldasm 导出为 .easm,.slddrw 导出为 .edrw)。如果未指定此参数,则文件将导出为 eDrawings 格式。

实际示例:

通过命令工具,先进入应用所在目录:

input指示源图纸文件所在路径,format指示导出格式。

主要代码:

EDrawingsHost.cs

using System;
using System.Windows.Forms;
using eDrawings.Interop.EModelViewControl;

namespace Export
{
public class EDrawingsHost : AxHost
{
public event Action<EModelViewControl> ControlLoaded;
private bool m_IsLoaded;

public EDrawingsHost() : base("22945A69-1191-4DCF-9E6F-409BDE94D101")
{
m_IsLoaded = false;
}

protected override void OnCreateControl()
{
base.OnCreateControl();

if (!m_IsLoaded)
{
m_IsLoaded = true;
var ctrl = GetOcx() as EModelViewControl;
ControlLoaded?.Invoke(GetOcx() as EModelViewControl);
}
}
}
}

Program.cs

using eDrawings.Interop.EModelViewControl;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace Export
{
class Program
{
private class ExportData
{
public string InputFilePath { get; private set; }
public string OutputFilePath { get; private set; }

public ExportData(string input, string output)
{
InputFilePath = input;
OutputFilePath = output;
}
}

private const string ARG_INPUT = "-input";
private const string ARG_FILTER = "-filter";
private const string ARG_OUTPUT_DIR = "-outdir";
private const string ARG_FORMAT = "-format";

private const string EDRW_FORMAT = ".e";

private static EModelViewControl m_Ctrl;

private static List<ExportData> m_Job;

private static ExportData m_CurrentExport;

[STAThread]
static void Main(string[] args)
{
try
{
ParseArguments(args);

var eDrwCtrl = new EDrawingsHost();

eDrwCtrl.ControlLoaded += OnEdrawingsControlLoaded;

var winForm = new Form();
winForm.Controls.Add(eDrwCtrl);
eDrwCtrl.Dock = DockStyle.Fill;
winForm.ShowIcon = false;
winForm.ShowInTaskbar = false;
winForm.WindowState = FormWindowState.Minimized;
winForm.ShowDialog();
}
catch (Exception ex)
{
PrintError(ex.Message);
}
}

private static void ParseArguments(string[] args)
{
var inputs = new List<string>();
var filters = new List<string>();
var outDirs = new List<string>();
var formats = new List<string>();

List<string> curList = null;

for (int i = 0; i < args.Length; i++)
{
if (args[i].Equals(ARG_INPUT, StringComparison.CurrentCultureIgnoreCase))
{
curList = inputs;
}
else if (args[i].Equals(ARG_FILTER, StringComparison.CurrentCultureIgnoreCase))
{
curList = filters;
}
else if (args[i].Equals(ARG_OUTPUT_DIR, StringComparison.CurrentCultureIgnoreCase))
{
curList = outDirs;
}
else if (args[i].Equals(ARG_FORMAT, StringComparison.CurrentCultureIgnoreCase))
{
curList = formats;
}
else
{
if (curList != null)
{
curList.Add(args[i]);
}
else
{
throw new ArgumentException("Arguments are invalid, specify the correct switch");
}
}
}

foreach (var outDir in outDirs)
{
if (!Directory.Exists(outDir))
{
Directory.CreateDirectory(outDir);
}
}

if (!outDirs.Any())
{
outDirs.Add("");
}

if (!inputs.Any())
{
throw new ArgumentException($"Inputs are not specified. Use {ARG_INPUT} switch to specify the input directory(s) or file(s)");
}

if (!formats.Any())
{
formats.Add(EDRW_FORMAT);
}

var filter = filters.Any() ? filters.First() : "*.*";

var files = new List<string>();

foreach (var input in inputs)
{
if (Directory.Exists(input))
{
files.AddRange(Directory.GetFiles(input, filter, SearchOption.AllDirectories).ToList());
}
else if (File.Exists(input))
{
files.Add(input);
}
else
{
throw new Exception("Specify input file or directory");
}
}

m_Job = new List<ExportData>();

foreach (var file in files)
{
foreach (var outDir in outDirs)
{
foreach (var format in formats)
{
var ext = format;

if (!ext.StartsWith("."))
{
ext = "." + ext;
}

if (ext.Equals(EDRW_FORMAT, StringComparison.CurrentCultureIgnoreCase))
{
switch (Path.GetExtension(file).ToLower())
{
case ".sldprt":
ext = ".eprt";
break;
case ".sldasm":
ext = ".easm";
break;
case ".slddrw":
ext = ".edrw";
break;
default:
throw new ArgumentException($"{EDRW_FORMAT} format is only applicable for SOLIDWORKS files");
}
}

var outFile = Path.Combine(!string.IsNullOrEmpty(outDir) ? outDir : Path.GetDirectoryName(file),
Path.GetFileNameWithoutExtension(file) + ext);

m_Job.Add(new ExportData(file, outFile));
}
}
}
}

public static void OnEdrawingsControlLoaded(EModelViewControl ctrl)
{
Console.WriteLine(string.Format("Starting job. Exporting {0} file(s)", m_Job.Count));

m_Ctrl = ctrl;

m_Ctrl.OnFinishedLoadingDocument += OnDocumentLoaded;
m_Ctrl.OnFailedLoadingDocument += OnDocumentLoadFailed;
m_Ctrl.OnFinishedSavingDocument += OnDocumentSaved;
m_Ctrl.OnFailedSavingDocument += OnSaveFailed;

ExportNext();
}

public static void ExportNext()
{
m_CurrentExport = null;

if (m_Job.Any())
{
m_CurrentExport = m_Job.First();
m_Job.RemoveAt(0);

if (!string.Equals(m_Ctrl.FileName, m_CurrentExport.InputFilePath, StringComparison.CurrentCultureIgnoreCase))
{
m_Ctrl.CloseActiveDoc("");
m_Ctrl.OpenDoc(m_CurrentExport.InputFilePath, false, false, false, "");
}
else
{
ExportCurrentFile();
}
}
else
{
Console.WriteLine("Completed");
Environment.Exit(0);
}
}

public static void OnDocumentLoaded(string fileName)
{
Console.WriteLine(string.Format("Opened {0}", fileName));
ExportCurrentFile();
}

private static void ExportCurrentFile()
{
Console.WriteLine($"Exporting {m_CurrentExport.InputFilePath} to {m_CurrentExport.OutputFilePath}");
m_Ctrl.Save(m_CurrentExport.OutputFilePath, false, "");
}

public static void OnDocumentLoadFailed(string fileName, int errorCode, string errorString)
{
PrintError(string.Format("Failed to load {0}: {1}", fileName, errorString));
ExportNext();
}

private static void OnDocumentSaved()
{
Console.WriteLine("Export completed");
ExportNext();
}

private static void OnSaveFailed(string FileName, int ErrorCode, string ErrorString)
{
PrintError($"Failed to export 'FileName': {ErrorString} [{ErrorCode}]");
ExportNext();
}

public static void PrintError(string msg)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(msg);
Console.ResetColor();
}
}
}

在编译或者运行中报错,可以通过以下手段进行调试:

1.修改VS编译环境为X64;

2.需要.NET Framework4.0以上,如果提示升级直接省升级即可;

3.直接添加dll应用eDrawings.Interop.EModelViewControl.dll,通常位于安装完edrawing的C:\Program Files\Common Files\eDrawings20XX文件夹中。

4.再次编译,生成可执行文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加&#xff08;插件实现&#xff09;MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中&#xff0c;word文档需要垂直合并表格&…

记一次:使用C#创建一个串口工具

前言&#xff1a;公司的上位机打不开串口&#xff0c;发送的时候设备总是关机&#xff0c;因为和这个同事关系比较好&#xff0c;编写这款软件是用C#编写的&#xff0c;于是乎帮着解决了一下&#xff08;是真解决了&#xff09;&#xff0c;然后整理了一下自己的笔记 一、开发…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

【OpenCV】模板匹配

理论 模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此&#xff0c;OpenCV 带有一个函数 cv.matchTemplate&#xff08;&#xff09; 。它只是在输入图像上滑动模板图像&#xff08;如在 2D 卷积中&#xff09;&#xff0c;并比较模板图像下的模板和输入图像的补…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway&#xff1a;一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步&#xff1a;查看源码第二步&#xff1a;启动类迁移第三步&#xff1a;引入 Gateway 依赖第四步 编写bootstrap.yaml第五步&#xff1a;替换路由配置第六步&#…

网站中的QQ在线客服接入

1. 开通QQ通讯组件 QQ通讯组件官网&#xff1a;https://shang.qq.com 默认未开通通讯组件&#xff0c;登陆上QQ之后会提示开通&#xff0c;点击开通即可 2. 唤起QQ临时会话&#xff08;对方不是自己的QQ好友也能唤起&#xff09; 复制链接地址 http://wpa.qq.com/msgrd?v3&…

赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读

随着AI工作负载的爆炸式增长&#xff0c;服务提供商和企业需要加速计算&#xff0c;以安全高效地在大规模云上交付高性能的AI应用。前段时间&#xff0c;F5公司宣布推出一项全新的创新AI应用交付和应用安全解决方案&#xff0c;即BIG-IP Next for Kubernetes。那么该方案有何性…

域内DNS信息收集

目录 一、查询域内DNS记录 1. 使用 PowerView.ps1 2. 使用 adidnsdump 二、添加域内DNS记录 1. 使用 Invoke-DNSUpdate.ps1 在默认情况下,域内所有用户 都有权限读取 Active Directory 数据库中的 DNS 信息,包括所有记录。这是因为: DNS 记录被视为公共信息,用于解析域…

Odoo :一款免费且开源的食品生鲜领域ERP管理系统

文 / 贝思纳斯 Odoo金牌合作伙伴 引言 提供业财人资税的精益化管理&#xff0c;实现研产供销的融通、食品安全的追踪与溯源&#xff0c;达成渠道的扁平化以及直面消费者的 D2C 等数字化解决方案&#xff0c;以此提升运营效率与核心竞争力&#xff0c;支撑高质量的变速扩张。…

在星闪W63/W63E开发板上运行第一个OpenHarmony程序

目录 引言 demolink示例 程序修改 修改任务堆栈的大小 修改示例程序的build.gn 修改App的build.gn 修改ohos.cmake 修改config.py 编译程序 烧写程序 程序运行 结语 引言 在前面的博文星闪WS63E开发板的OpenHarmony环境构建-CSDN博客中介绍了如何构建W63E开发板的…

Spring——@Autowired和@Configuration注解区别

摘要 本文主要介绍了Spring框架中Autowired和Configuration注解的区别。Autowired用于自动注入依赖&#xff0c;支持属性、构造器和方法注入。Configuration则用于定义配置类&#xff0c;允许在类中使用Bean注解声明Bean。文章详细解释了这两个注解的作用、使用场景和核心特性…

机器学习--张量

机器学习–张量 机器学习的数据结构–张量 张量是机器学习程序中的数字容器&#xff0c;本质上就是各种不同维度的数组&#xff0c;如下图所示。 张量的维度称为轴&#xff08;axis&#xff09;&#xff0c;轴的个数称为阶&#xff08;rank&#xff09; 标量–0D张量 impor…

标记数据集生成模型助力无数据情况下的大模型指令微调

在构建大模型应用时&#xff0c;通常有两种方式来改进效果&#xff0c;一种是构建外部知识库&#xff0c;利用RAG来完成。但RAG并不是万能的&#xff0c;对于特定领域的LLM应用&#xff0c;以及无需示例&#xff0c;就能完成特定任务等场合就需要进行微调。然而&#xff0c;微调…

nvm安装指定版本显示不存在及nvm ls-remote 列表只出现 iojs 而没有 node.js 解决办法

在使用 nvm install 18.20.3 安装 node 时会发现一直显示不存在此版本 Version 18.20.3 not found - try nvm ls-remote to browse available versions.使用 nvm ls-remote 查看可安装列表时发现&#xff0c;列表中只有 iojs 解决方法&#xff1a; 可以使用以下命令查看可安装…

5.ABAP结构体和内表

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 5.1.结构化数据对象 定义 如何引用结构化的数据对象 拷贝 实战练习 创建 拷贝 调试代码 5.2.内表 行类型 键 表种类 存取类型 表类型 如何在本地定义表类型 内表三种可能的…

C#搭建WebApi服务

1&#xff0c;OWIN的介绍 OWIN 的全称是 “Open Web Interface for .NET”&#xff0c; OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口&#xff0c; 其目的是为了实现服务器与应用之间的解耦&#xff0c;使得便携式 .NET Web 应用以及跨平台的愿望成为现实…

unity 2D像素种田游戏学习记录(自用)

一、透明度排序轴 改变sprite的排序方式&#xff0c;默认按照z轴进行排序&#xff08;离摄像机的远近&#xff09;。可以将其改变成y轴的排序方式&#xff0c;这样可以使2D人物走在草丛的下方就不被遮挡&#xff0c;走在草丛上方就被遮挡&#xff0c;如下图。 在项目设置-图形…

K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常

一、背景 程序在运行过程中&#xff0c;突然无法访问&#xff0c;发现后台接口也无法访问&#xff1b;查看kuboard&#xff0c;发现报如下异常&#xff1a;The node had condition: [DiskPressure]. 继续查看磁盘使用率&#xff0c;发现系统盘使用率已经高达93%。问题前后呼应…