首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solidworks保存为PDF宏

Solidworks保存为PDF宏
EN

Code Review用户
提问于 2015-01-16 00:09:16
回答 1查看 1.5K关注 0票数 2

这只会打开solidworks中的所有绘图文件,并将其保存为*.pdf文件。我只想在让它进入实际的绘图数据库(即我们的所有文件)之前,对它进行第二次观察,并希望它不会遇到任何错误。

代码语言:javascript
复制
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using System.Runtime.InteropServices;
using System;
using System.IO;

namespace PDF.csproj
{
    public partial class SolidWorksMacro
    {


        public void Main()
        {
            string pdfPath;
            string Path = "C:\\Users\\SAFEROADS201\\Desktop\\01-VMS Trailer";
            string txtPath = Path + "\\UpdatedPDFs.txt";
            string Date = DateTime.Now.ToShortDateString();
            string[] drwPaths = System.IO.Directory.GetFiles(Path, "*.slddrw", SearchOption.AllDirectories);
            foreach (string s in drwPaths)
            {
                if (!s.Contains("~$"))
                {
                    ModelDoc2 swDoc = null;
                    int longstatus = 0;
                    int longwarnings = 0;
                    pdfPath = s;
                    pdfPath = pdfPath.Replace("Drawings", "PDFs").Replace("SLDDRW", "PDF");
                    (new FileInfo(pdfPath)).Directory.Create();
                    swDoc = ((ModelDoc2)(swApp.OpenDoc6(s, 3, 0, "", ref longstatus, ref longwarnings)));
                    longstatus = swDoc.SaveAs3(pdfPath, 0, 0);
                    swDoc = null;
                    swApp.CloseAllDocuments(true);
                }
            }
            System.IO.File.WriteAllText(txtPath, Date);
         }

        /// <summary>
        ///  The SldWorks swApp variable is pre-assigned for you.
        /// </summary>
        public SldWorks swApp;
    }
}
EN

回答 1

Code Review用户

发布于 2015-01-16 07:46:07

命名

  • 另外,命名指南没有明确地提到方法的局部变量,您应该使用camelCase大小写来命名它们。
  • 以有意义的方式命名方法、属性和变量将有助于您或Mr.Maintainer更快地理解变量/方法/类的含义。
  • 应该避免缩短像foreach (string s in drwPaths)这样的名称。

General

  • 如果分配的右侧类型明显,则应该使用var,如var path =“C:\Users 201\Desktop\01-VMS拖车”;
  • 通过使用保护条件,可以节省水平间距,从而提高代码的可读性。
  • 通过将算法提取到单独类中的方法,您可以重用它。
  • 应该使用System.IO.Path.Combine()方法来组合文件。
  • 如果您正在处理大量的文件,您应该更喜欢Directory.EnumerateFiles()而不是Directory.GetFiles()。来自文档 of GetFiles():EnumerateFiles和GetFiles方法的不同之处在于:当使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组后才能访问数组。因此,当您处理许多文件和目录时,EnumerateFiles可以更高效。
  • 变量的声明应尽可能接近它们的使用。
  • 字符串,特别是表示文件的字符串,应该标记为verbatim string literal,以忽略转义序列。参见此所以回答

重构

让我们从引入一个名为SolidWorkFileConverter的新类开始,添加一个构造函数并添加一个名为ToPdf()的方法

代码语言:javascript
复制
public class SolidWorkFileConverter
{
    private SldWorks swApplication;
    public SolidWorkFileConverter(SldWorks swApp)
    {
        swApplication = swApp;
    }

    public void ToPdf(string searchPath, string logFileName)
    {
        var logFileDestionation = System.IO.Path.Combine(searchPath, logFileName);
        var currentDate = DateTime.Now;
        var drawingFiles = System.IO.Directory.EnumerateFiles(Path, "*.slddrw", SearchOption.AllDirectories)  
                                              .Where(file => !file.Contains("~$"));
        foreach (var drawingFile in drawingFiles)
        {
            ToPdf(drawingFile);
        }
        WriteToLog(logFileDestination, currentDate);
    }

    public void ToPdf(string drawingFile)
    {
        string destinationFileName = ComposeDestinationFileName(drawingFile);
        CreateDestinationDirectory(destinationFileName); 
        int state = 0;
        int warningState = 0;
        ModelDoc2 swDoc = (ModelDoc2)(swApplication.OpenDoc6(s, 3, 0, "", ref state, ref warningState));
        state = swDoc.SaveAs3(pdfPath, 0, 0);
        swDoc = null;
        swApplication.CloseAllDocuments(true);
    }

    private string ComposeDestinationFileName(string sourceFileName)
    {
        return sourceFileName.Replace("Drawings", "PDFs").Replace("SLDDRW", "PDF");
    }

    private void CreateDestinationDirectory(string destinationFileName)
    {
        string directoryName = System.IO.Path.GetDirectoryName(destinationFileName);
        System.IO.Directory.CreateDirectory(directoryName);
    }

    private void WriteToLog(string logFileDestination, DateTime currentDate)
    {
        System.IO.File.WriteAllText(logFileDestination, currentDate.ToShortDateString());
    }
}

现在,您的main()方法(或在任何地方使用)都可以调用它,例如

代码语言:javascript
复制
string searchPath = @"C:\Users\SAFEROADS201\Desktop\01-VMS Trailer";
string logFileName = System.IO.Path.Combine(searchPath , "UpdatedPDFs.txt");
SolidWorkFileConverter converter = new SolidWorkFileConverter(swApp);
converter.ToPdf(searchPath, logFileName);
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/77666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档