2017-02-15 16 views
1

문제점 : 내 Windows 파일 서버에서메타 데이터 내보내기

나는 정의에 따라 파일 속성에 메타 데이터가 약 100 SolidWorks 파일을 탭 (아래 이미지 참조)에서 하나의 CSV 파일로 내보낼 수 있습니다.

Custom Tab image

이 파일은 폴더의 하위 트리에있는 다른 파일 형식과 혼합된다.

는 해결 방법 : 스크립트에 필요한

은 폴더의 하위 트리에서 특정 파일 형식 (확장자) 대상, 즉 어디에서 할 수있는 CSV 파일로 사용자 정의 탭에서 메타 데이터를 수출 그런 다음 데이터를 정리하고 SQL 데이터베이스로 가져옵니다.

나는 PowerShell의 라인을 따라 생각하고있는 가장 좋은 방법이 무엇인지 확신하지 못한다. 도움을 얻으려면 도움이 될 것입니다.

답변

2

C# 또는 Visual Basic과 같은 .NET 언어를 사용하는 경우 SolidWorks API 및 문서 관리자 라이브러리 (고객 포털에서 가입하여 무료로 라이센스를 받아야 함)를 사용하여 압축을 풀 수 있습니다 파일을 열지 않고도 꽤 빠릅니다. 특정 파일을 보는 것만으로도 .NET IO.Path.GetExtension을 사용할 수 있습니다.

다음은 내가 생각하는 바를 보여주는 예입니다.

설치 미디어에 포함 된 SolidWorks API SDK에있는 문서 관리자 dll이 필요합니다. 그런 다음 SolidWorks.Interop.swdocumentmgr.dll을 참조 할 수 있습니다.

또한 SolidWorks 고객 포털을 통해 SolidWorks Subscription에 무료로 요청할 수있는 문서 관리자 일련 번호가 필요합니다. 해당 번호가 있으면 아래의 lic 문자열 값을 따옴표로 묶은 전체 일련 번호로 대체하십시오.

SolidWorks 파일에서 읽을 사용자 정의 특성을 정의하려면 검색해야하는 값을 포함하도록 목록 특성을 변경하십시오. 대소 문자를 구분하지 않습니다.

이것을 실행하면 디렉토리 경로를 입력하라는 메시지가 표시됩니다. 또한 Output.csv 파일을 만들 위치입니다.

하단에 샘플 결과의 스크린 샷이 있습니다. 여기

using SolidWorks.Interop.swdocumentmgr; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace WriteProperties 
{ 
    class Program 
    { 
     static ISwDMApplication4 docManager; 
     static List<string> propertiesToRead = new List<string>() { "Number", "Description", "Revision", "Material", "Finish", "Weight" }; 
     const string lic = "YOU CAN GET THIS NUMBER FROM THE CUSTOMER PORTAL WITH YOUR SOLIDWORKS SUBSCRIPTION AT NO COST"; 

     static char[] charactersToQuote = { ',', '"', '\n' }; 
     const string QUOTE = "\""; 
     const string QUOTEFORMATTED = "\"\""; 


     static void Main(string[] args) 
     { 
      string directoryPath = GetDirectory(args); 

      if (string.IsNullOrEmpty(directoryPath)) return; 

      if (!LoadDocManager()) return; 

      string outputPath = Path.Combine(directoryPath, "Output.csv"); 

      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine("File Name," + string.Join(",", propertiesToRead)); 

      int counter = 0; 

      foreach (string filePath in Directory.EnumerateFiles(directoryPath, "*.sld*", SearchOption.AllDirectories)) 
      { 
       SwDMDocument21 dmDocument = GetDocument(filePath); 
       if (dmDocument == null) continue; 

       WriteProperties(sb, dmDocument, filePath); 
       counter++; 
      } 

      File.WriteAllText(outputPath, sb.ToString()); 

      Console.WriteLine("{0} files read and saved to {1}", counter, outputPath); 
      Console.ReadLine(); 
     } 

     static string GetDirectory(string[] args) 
     { 
      if (args != null && args.Count() > 0 && Directory.Exists(args[0])) return args[0]; 

      Console.WriteLine("Directory to read:"); 
      string filePath = Console.ReadLine(); 

      if (Directory.Exists(filePath)) return filePath; 

      Console.WriteLine("Directory does not exists: {0}", filePath); 
      return string.Empty; 
     } 

     static bool LoadDocManager() 
     { 
      if (docManager != null) return true; 

      try 
      { 
       SwDMClassFactory factory = new SwDMClassFactory(); 
       if (factory == null) throw new NullReferenceException(nameof(SwDMClassFactory)); 

       docManager = (SwDMApplication4)factory.GetApplication(lic); 
       if (docManager == null) throw new NullReferenceException(nameof(SwDMApplication4)); 

       return true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Document Manager failed to load: {0}", ex.Message); 
       Console.ReadLine(); 
       return false; 
      } 
     } 

     static SwDMDocument21 GetDocument(string filePath) 
     { 
      SwDmDocumentType documentType = GetDocType(filePath); 
      if (documentType == SwDmDocumentType.swDmDocumentUnknown) return null; 

      SwDmDocumentOpenError result = SwDmDocumentOpenError.swDmDocumentOpenErrorNone; 
      SwDMDocument21 dmDocument = (SwDMDocument21)docManager.GetDocument(filePath, documentType, true, out result); 

      if (result == SwDmDocumentOpenError.swDmDocumentOpenErrorNone || result == SwDmDocumentOpenError.swDmDocumentOpenErrorFileReadOnly) return dmDocument; 

      if (dmDocument != null) dmDocument.CloseDoc(); 

      return null; 
     } 

     static SwDmDocumentType GetDocType(string filePath) 
     { 
      if (filePath.Contains("~$")) return SwDmDocumentType.swDmDocumentUnknown; 

      switch (Path.GetExtension(filePath).ToLower()) 
      { 
       case ".sldprt": return SwDmDocumentType.swDmDocumentPart; 
       case ".sldasm": return SwDmDocumentType.swDmDocumentAssembly; 
       case ".slddrw": return SwDmDocumentType.swDmDocumentDrawing; 
       default: return SwDmDocumentType.swDmDocumentUnknown; 
      } 
     } 

     static void WriteProperties(StringBuilder sb, SwDMDocument21 dmDocument, string filePath) 
     { 
      Console.WriteLine("Reading {0}", filePath); 

      List<string> propertiesInFile = new List<string>(); 

      if (dmDocument.GetCustomPropertyCount() > 0) propertiesInFile.AddRange(dmDocument.GetCustomPropertyNames()); 

      string csvLine = filePath; 

      foreach (string property in propertiesToRead) 
      { 
       string propertyValue = ""; 

       if (propertiesInFile.Any(s => string.Compare(s, property, true) == 0)) 
       { 
        SwDmCustomInfoType propertyType = SwDmCustomInfoType.swDmCustomInfoText; 

        string resolvedValue; 

        propertyValue = dmDocument.GetCustomPropertyValues(property, out propertyType, out resolvedValue); 
       } 

       csvLine = csvLine + "," + FixChars(propertyValue); 
      } 

      sb.AppendLine(csvLine); 

      dmDocument.CloseDoc(); 
     } 

     static string FixChars(string s) 
     { 
      if (s.Contains(QUOTE)) s = s.Replace(QUOTE, QUOTEFORMATTED); 

      if (s.IndexOfAny(charactersToQuote) > -1) s = QUOTE + s + QUOTE; 

      return s; 
     } 

    } 
} 

대답하는 샘플 출력 enter image description here

+0

플러스 하나이다 –