Export part to Parasolid via Document Manager API (without SOLIDWORKS)
This PowerShell script allows exporting the SOLIDWORKS part file into the parasolid format (.xmp_bin) from the command line using SOLIDWORKS Document Manager API
This file can be opened in any compatible CAD application (SOLIDWORKS, Solid Edge, etc.)
This script doesn't require SOLIDWORKS to be installed and doesn't consume SOLIDWORKS license.
Configuration and usage instructions
- Create two files and paste the code from the below snippets
export-parasolid.ps1
$inputFilePath=$args[0] $outDirPath=$args[1] $ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path $Assem = ( $ScriptDir + "\SolidWorks.Interop.swdocumentmgr.dll" ) $Source = @" Imports System Imports System.IO Imports SolidWorks.Interop.swdocumentmgr Public Class Exporter Const LICENSE_KEY As String = "Your license key" Shared Sub New() AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf OnAssemblyResolve End Sub Public Shared Sub LoadLibrary(ParamArray libs As Object()) For Each [lib] As String In libs Console.WriteLine(String.Format("Loading library: {0}", [lib])) Dim assm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom([lib]) Console.WriteLine(assm.GetName().ToString()) Next End Sub Private Shared Function OnAssemblyResolve(ByVal sender As Object, ByVal args As ResolveEventArgs) As System.Reflection.Assembly For Each assm As System.Reflection.Assembly In AppDomain.CurrentDomain.GetAssemblies() If assm.GetName().ToString() = args.Name Then Return assm End If Next Return Nothing End Function Public Shared Sub ExportParasolid(filePath As String, outDirPath As String) Try Dim classFact As SwDMClassFactory = New SwDMClassFactory() Dim app As ISwDMApplication = classFact.GetApplication(LICENSE_KEY) Dim docType As SwDmDocumentType Dim doc As ISwDMDocument = OpenDocument(app, filePath, True, docType) If docType <> SwDmDocumentType.swDmDocumentPart Then Throw New InvalidCastException("Only part documents are supported") End If Dim confNames As String() = CType(doc.ConfigurationManager.GetConfigurationNames(), String()) If confNames Is Nothing OrElse confNames.Length = 0 Then Throw New NullReferenceException("No configurations found") End If If Not Directory.Exists(outDirPath) Then Directory.CreateDirectory(outDirPath) End If For Each confName As String In confNames Console.WriteLine(String.Format("Extracting parasolid bodies from the '{0}'", confName)) Dim conf As ISwDMConfiguration2 = doc.ConfigurationManager.GetConfigurationByName(confName) Dim outFilePath As String = Path.Combine(outDirPath, String.Format("{0}_{1}.xmp_bin", Path.GetFileNameWithoutExtension(filePath), confName)) Dim err As SwDmBodyError = conf.GetPartitionStream(outFilePath) If err <> SwDmBodyError.swDmBodyErrorNone Then PrintError(String.Format("Failed to export parasolid body of '{1}' in '{2}'", confName, filePath), True) End If Next Catch ex As Exception PrintError(ex.Message, False) End Try End Sub Private Shared Function OpenDocument(app As ISwDMApplication, filePath As String, [readOnly] As Boolean, Optional ByRef docType As SwDmDocumentType = SwDmDocumentType.swDmDocumentUnknown) As ISwDMDocument docType = SwDmDocumentType.swDmDocumentUnknown Select Case Path.GetExtension(filePath).ToLower() Case ".sldprt" docType = SwDmDocumentType.swDmDocumentPart Case ".sldasm" docType = SwDmDocumentType.swDmDocumentAssembly Case ".slddrw" docType = SwDmDocumentType.swDmDocumentDrawing End Select Dim err As SwDmDocumentOpenError Dim doc As ISwDMDocument = app.GetDocument(filePath, SwDmDocumentType.swDmDocumentPart, [readOnly], err) If doc Is Nothing Then Throw New NullReferenceException(String.Format("Failed to open document: {0}", err)) End If Return doc End Function Private Shared Sub PrintError(msg As String, isWarning As Boolean) Dim color As ConsoleColor If isWarning Then color = ConsoleColor.DarkYellow Else color = ConsoleColor.DarkRed End If Console.WriteLine(msg) Console.ResetColor() End Sub End Class "@ Add-Type -TypeDefinition $Source -ReferencedAssemblies $Assem -Language VisualBasic [Exporter]::LoadLibrary($Assem) [Exporter]::ExportParasolid($inputFilePath, $outDirPath)
export-parasolid.cmd
SET inputFilePath=%1 SET outDirPath=%2 PowerShell -NoProfile -ExecutionPolicy Bypass -File "%~dp0export-parasolid.ps1" %inputFilePath% %outDirPath%
- Copy the SolidWorks.Interop.swdocumentmgr.dll into the folder where the above scripts are created. PowerShell script is based on .NET Framework 2.0 so the SOLIDWORKS Document Manager interop must target this framework. The dll can be found at: SOLIDWORKS Installation Folder\api\redist\CLR2\SolidWorks.Interop.swdocumentmgr.dll
Alternatively full path to interop can be specified as shown below. In this case it is not required to copy this dll into the folder with script files.
$Assem = ( "Full path to SolidWorks.Interop.swdocumentmgr.dll" )
- Start the command line and execute the following command
> [Full Path To export-parasolid.cmd] [Full Path To Input SOLIDWORKS file] [Full Path to output directory]
As the result all bodies from all configurations of the file are exported to the specified directory (directory is automatically created if not exist). Output files are named as following: [original file name]_[configuration name].xmp_bin The process log is displayed directly in the console: