Autor | Wypowiedź |
SolidWorks 2015 sp.3
2017-09-20, 12:56
Pomógł 0 raz(y).
|
Witam, Czy jest możliwość zmodyfikowania tego makra aby PDF'a zapisywał pod nazwą Numeru rys z właściwości dostosowanych? Znalazłem takie makro jednak ono zapisuje jedynie części lub złożenia pod nazwą Numeru rys: Sub main() Dim swApp As SldWorks.SldWorks Dim SWmoddoc As SldWorks.ModelDoc2 Dim partnumber As String Set swApp = Application.SldWorks Set SWmoddoc = swApp.ActiveDoc 'Use this....To Get the value from the Properties in the CUSTOM tab partnumber = SWmoddoc.CustomInfo("Numer") 'Or this....To Get the value from the Configuration Specific Tab 'partnumber = SWmoddoc.GetCustomInfoValue("Default", "Numer") PathName = SWmoddoc.GetPathName 'this gets the full path of the current open document (including filename) FilePath = Left(PathName, InStrRev(PathName, "")) 'uses to full pathname to get the folder path, to be added to the save as file name If (SWmoddoc.GetType = swDocASSEMBLY) Then SWmoddoc.SaveAs (FilePath + partnumber + ".sldasm") ElseIf (SWmoddoc.GetType = swDocPART) Then SWmoddoc.SaveAs (FilePath + partnumber + ".sldprt") End If End Sub |
|
|
.
2017-09-20, 21:28
Pomógł 52 raz(y).
|
Oczywiście, że się da. Spróbuj to, rysunek zapisuje jako PDF o nazwie wprowadzonej do właściwości dostosowanych w rysunku o nazwie 'Numer': Sub main() Dim swApp As SldWorks.SldWorks Dim SWmoddoc As SldWorks.ModelDoc2 Dim partnumber As String Set swApp = Application.SldWorks Set SWmoddoc = swApp.ActiveDoc 'Use this....To Get the value from the Properties in the CUSTOM tab partnumber = SWmoddoc.CustomInfo("Numer") 'Or this....To Get the value from the Configuration Specific Tab 'partnumber = SWmoddoc.GetCustomInfoValue("Default", "Numer") PathName = SWmoddoc.GetPathName 'this gets the full path of the current open document (including filename) FilePath = Left(PathName, InStrRev(PathName, "")) 'uses to full pathname to get the folder path, to be added to the save as file name If (SWmoddoc.GetType = swDocASSEMBLY) Then SWmoddoc.SaveAs (FilePath + partnumber + ".sldasm") ElseIf (SWmoddoc.GetType = swDocPART) Then SWmoddoc.SaveAs (FilePath + partnumber + ".sldprt") ElseIf (SWmoddoc.GetType = swDocDRAWING) Then Dim Boolstatus As Boolean Dim lErrors As Long Dim lWarnings As Long Set swModelDocExt = SWmoddoc.Extension Set swExportData = swApp.GetExportFileData(swExportPdfData) Boolstatus = swExportData.SetSheets(swExportData_ExportAllSheets, 1) Boolstatus = SWmoddoc.Extension.SaveAs(FilePath + partnumber + ".pdf", 0, 0, swExportData, lErrors, lWarnings) If Boolstatus Then MsgBox "Save as :" & Chr(10) & FilePath + partnumber + ".pdf" & Chr(10) & " successful . . . :) :) :) ", vbInformation, "Eksport rysunku do PDF" Else MsgBox "Save as PDF failed, Error code:" & lErrors End If End If End Sub |
SolidWorks 2015 sp.3
2017-10-02, 11:44
Pomógł 0 raz(y).
|
Dziękuje za szybką odpowiedź, jednak ja też nie próżnowałem i w między czasie również podobną metodą zmodyfikowałem makro. Idę dalej ściągnąłem makro robiące pdf'y ze złożenia, otwiera każdy rysunek z drzewka i zapisuje go w podanej lokalizacji jako pdf. Jest jednak jeden problem, nie jestem w stanie zmodyfikować go w sposób aby po wybraniu lokalizacji właśnie go tam zapisało, a jeśli już tak zmodyfikuję to nie mogę uzyskać nazwy pliku jaką chcę. Kod: ' SAVE DRAWINGS AS PDF #If VBA7 Then Private Type BROWSEINFO hwndOwner As LongPtr pIDLRoot As Long pszDisplayName As String lpszTitle As String ulFlags As Long lpfnCallback As LongPtr lParam As LongPtr iImage As Long End Type Private Declare PtrSafe Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long Private Declare PtrSafe Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32" (ByVal hMem As Long) #Else Private Type BROWSEINFO hwndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As String ulFlags As Long lpfnCallback As Long lParam As Long iImage As Long End Type Private Declare Function SHBrowseForFolder Lib "Shell32" (lpbi As BROWSEINFO) As Long Private Declare Function SHGetPathFromIDList Lib "Shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal hMem As Long) #End If 'Keywords used in BrowseForFolder function Private Const BIF_RETURNONLYFSDIRS As Long = &H1 'Directories only Private Const BIF_DONTGOBELOWDOMAIN As Long = &H2 Private Const BIF_RETURNFSANCESTORS As Long = &H8 Private Const BIF_BROWSEFORCOMPUTER As Long = &H1000 Private Const BIF_BROWSEFORPRINTER As Long = &H2000 Private Const BIF_BROWSEINCLUDEFILES As Long = &H4000 Private Const MAX_PATH As Long = 260 Private Const BIF_NEWDIALOGSTYLE = &H40 'Windows 2000 (Shell32.dll 5.0) extended dialog Private Const BIF_EDITBOX = &H10& ' show edit box ''''''''''''''''''''''''''''''''''''''''''''''' 'Global variables Dim DocCount As Long Dim pdfFolderName As String Dim saveLog As String Option Explicit 'BrowseForFolder sub-function helps the user select the desired directory to save PDF files to Public Function BrowseForFolder() As String Dim tBI As BROWSEINFO Dim lngPIDL As Long Dim strPath As String With tBI .lpszTitle = "" .ulFlags = BIF_RETURNONLYFSDIRS Or BIF_NEWDIALOGSTYLE Or BIF_EDITBOX End With lngPIDL = SHBrowseForFolder(tBI) If (lngPIDL 0) Then ' get path from ID list strPath = Space$(MAX_PATH) SHGetPathFromIDList lngPIDL, strPath strPath = Left$(strPath, InStr(strPath, Chr$(0)) - 1) ' release list CoTaskMemFree lngPIDL End If BrowseForFolder = strPath End Function 'TraverseComponents sub-function traverses components at all levels of an assembly. 'Adapted from API help: http://help.solidworks.com/2015/english/api/sldworksapi/Traverse_Assembly_at_Component_Level_Example_VB.htm Function TraverseComponents(swComp As SldWorks.Component2, nLevel As Long) 'Local variables Dim fswApp As SldWorks.SldWorks Dim vChildComp As Variant Dim swChildComp As SldWorks.Component2 Dim swCompConfig As SldWorks.Configuration Dim i As Long Dim fOpenWarnings As Long Dim fOpenErrors As Long Dim fDwgPath As String Dim fmyDwgDoc As SldWorks.ModelDoc2 Dim AssyPart As SldWorks.ModelDoc2 Dim compNameFull As String Dim compName As String Dim saveFlag As Integer Dim findHyphen As Integer Dim findSlash As Integer Dim test As Integer 'Startup Set fswApp = Application.SldWorks 'Cycle through sub-components, calling this function each time to drop down another level in the tree vChildComp = swComp.GetChildren For i = 0 To UBound(vChildComp) Set swChildComp = vChildComp(i) TraverseComponents swChildComp, nLevel + 1 Next i 'Get name of only the current component and set flag accordingly indicating whether PDF should be saved or not findHyphen = InStrRev(swComp.Name2, "-") 'Return location of the rightmost hyphen in the component name (all instances of a component are identified with a hyphen-number, e.g. 123456-D001-1, 123456-D001-2, etc.) test = InStr(swComp.Name2, "-") 'Return location of the leftmost hyphen in the component name (typically the one in the file name i.e. 123456-A001). This is used in the next line. If findHyphen = 0 Or findHyphen = test Then 'less than two hyphens found (i.e. only one of a component was present) so the InStrRev function returned 0, OR the same hyphen was found when searching from each end of the string so only one hyphen is present i.e. the one in the file name. compNameFull = swComp.Name2 'Set compNameFull to the component name as is Else 'hyphen was found compNameFull = Left(swComp.Name2, findHyphen - 1) 'Position to cut the string at is 1 to the left of the hyphen so that the hyphen is not in the compNameFull string End If findSlash = InStrRev(compNameFull, "/") 'Return location of the rightmost slash in the component name (all components in a subassembly are identified with a slash, e.g. 123456-A001/123456-D001-1, etc.) If findSlash = 0 Then 'no slash found (i.e. current component is in top level assy) so the InStrRev function returned 0 compName = compNameFull 'Set compName to the component name as is Else 'slash was found compName = Right(compNameFull, Len(compNameFull) - findSlash) 'Keep only the string to the right of the slash so that the slash is not in the compName string End If saveFlag = InStr(saveLog, compName) 'If saveFlag = 0, the compName was not found in the save Log so the PDF should be saved 'Determine if a drawing exists for the component or sub-component that this function is currently working with fDwgPath = swComp.GetPathName If (LCase(Right(fDwgPath, 3)) "drw") And (fDwgPath "") And saveFlag = 0 Then 'the last condition checks if the drawing has already been saved (i.e. when more than one of a component is used in the assy) fDwgPath = Left(fDwgPath, Len(fDwgPath) - 3) & "drw" Set fmyDwgDoc = fswApp.OpenDoc6(fDwgPath, swDocDRAWING, swOpenDocOptions_Silent, "", fOpenErrors, fOpenWarnings) If Not fmyDwgDoc Is Nothing Then 'drawing found 'Activate drawing fswApp.ActivateDoc fmyDwgDoc.GetPathName Set AssyPart = fswApp.ActiveDoc() 'Check if PDF needs to be saved by comparing document title text to the save log text (i.e. save each drawing in the assembly only once) SavePDF AssyPart 'Quit drawing document fswApp.QuitDoc (AssyPart.GetTitle) Set fmyDwgDoc = Nothing End If End If End Function Function SavePDF(swDwg As SldWorks.ModelDoc2) 'Local variables Dim swApp As SldWorks.SldWorks Dim drwPathName As String Dim pdfPathName As String Dim shortFileName As String Dim swExportPDFData As SldWorks.ExportPdfData Dim lErrors As Long Dim lWarnings As Long Dim fso As Scripting.FileSystemObject 'moje zmienne Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swCustProp As CustomPropertyManager Dim valOut As String Dim resolvedValOut As String Dim Filepath As String Dim FileName As String Dim ConfigProperty As String Dim swView As View 'inny program Dim SWmoddoc As SldWorks.ModelDoc2 Dim partnumber As String 'Startup Set swApp = Application.SldWorks Set fso = CreateObject("Scripting.FileSystemObject") 'moje Set swDraw = swApp.ActiveDoc Set swView = swDraw.GetFirstView Set swView = swView.GetNextView Set swModel = swView.ReferencedDocument ' Set Sheet = swApp.ActiveDoc.GetCurrentSheet Set swCustProp = swDraw.Extension.CustomPropertyManager("") 'Force rebuild swDwg.Rebuild (swRebuildAll) 'Save PDF of drawing partnumber = swModel.CustomInfo("Numer") drwPathName = swDwg.GetPathName() pdfPathName = fso.BuildPath(pdfFolderName, fso.GetBaseName(drwPathName)) Set swExportPDFData = swApp.GetExportFileData(1) swExportPDFData.ViewPdfAfterSaving = False swDwg.Extension.SaveAs pdfPathName + " " + partnumber + ".pdf", 0, 0, swExportPDFData, lErrors, lWarnings 'moje linijki 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "")) 'FileName = Left(swDraw.GetTitle, Len(swDraw.GetTitle) - 10) 'swDraw.SaveAs (Filepath + partnumber + " " + FileName + ".pdf") 'Increment PDF count and update save log DocCount = DocCount + 1 shortFileName = Left(swDwg.GetTitle, InStr(swDwg.GetTitle, " ")) 'sets the shortFileName to the file name except for the " - Sheet1", " - Sheet2", etc. saveLog = saveLog & shortFileName & Chr(10) & Chr(13) End Function 'Required main function Sub main() 'Declare variables Dim FirstDoc As SldWorks.ModelDoc2 Dim swApp As SldWorks.SldWorks Dim OpenWarnings As Long Dim OpenErrors As Long Dim DwgPath As String Dim myDwgDoc As SldWorks.ModelDoc2 Dim Dwg As SldWorks.ModelDoc2 Dim swConf As SldWorks.Configuration Dim swRootComp As SldWorks.Component2 Dim decisionString As String Dim infoString As String Dim box As Long 'Define text strings infoString = "If a part file is active, this macro will save a PDF of the corresponding drawing" & Chr(13) & Chr(10) & _ "if one exists. If a drawing file is active, this macro will save a PDF of the drawing." & Chr(13) & Chr(10) & _ "If an assembly file is active, this macro will save a PDF of all drawings corresponding to models" & Chr(13) & Chr(10) & _ "in the assembly tree that have drawings, plus a PDF of the assembly drawing." decisionString = "By default, this macro will save PDFs to the current working folder." & Chr(13) & Chr(10) & _ "Click Yes to accept this or No to choose a different target folder." 'Startup Set swApp = Application.SldWorks Set FirstDoc = swApp.ActiveDoc DocCount = 0 saveLog = "" 'MsgBox infoString 'display informational message 'Quit if no document is open If FirstDoc Is Nothing Then MsgBox "Open a document and try again." Exit Sub End If 'Determine whether user wants to browse for folder to save to or save to the current folder box = MsgBox(decisionString, vbYesNo, "Where do you want to save PDF files?") If box = vbYes Then pdfFolderName = swApp.GetCurrentWorkingDirectory End If If box = vbNo Then 'select folder pdfFolderName = BrowseForFolder() If pdfFolderName = "" Then MsgBox "Please select the path and try again." Exit Sub Else pdfFolderName = pdfFolderName & "" End If End If 'Create PDF of currently open drawing (if applicable) If FirstDoc.GetType = swDocDRAWING Then 'Rebuild and save PDF SavePDF FirstDoc 'Exit GoTo MainExit: End If 'Create PDF of drawing corresponding to currently open part (if applicable) If FirstDoc.GetType = swDocPART Then 'Find drawing corresponding to currently open part DwgPath = FirstDoc.GetPathName If (LCase(Right(DwgPath, 3)) "drw") And (DwgPath "") Then DwgPath = Left(DwgPath, Len(DwgPath) - 3) & "drw" Set myDwgDoc = swApp.OpenDoc6(DwgPath, swDocDRAWING, swOpenDocOptions_Silent, "", OpenErrors, OpenWarnings) If myDwgDoc Is Nothing Then 'no drawing found MsgBox "A drawing with the same name as this part was not found." Exit Sub Else 'drawing found 'Activate drawing swApp.ActivateDoc myDwgDoc.GetPathName Set Dwg = swApp.ActiveDoc() 'Rebuild and save PDF of drawing SavePDF Dwg 'Quit drawing swApp.QuitDoc (Dwg.GetTitle) Set myDwgDoc = Nothing End If End If 'Exit GoTo MainExit: End If 'Create PDFs of all drawings corresponding to models in tree of currently open assembly (if applicable) If FirstDoc.GetType = swDocASSEMBLY Then 'Start at root of current assembly Set swConf = FirstDoc.GetActiveConfiguration Set swRootComp = swConf.GetRootComponent3(True) 'Traverse components and save PDFs of components with drawings TraverseComponents swRootComp, 1 'the number 1 indicates root component level 'Ensure that first document is activated at end of macro program swApp.ActivateDoc FirstDoc.GetPathName 'return to document that was originally open 'Exit GoTo MainExit: End If MainExit: MsgBox "Success! " & DocCount & " PDF files created in folder " & pdfFolderName & " :" & Chr(13) & Chr(10) & saveLog End Sub Modyfikuję go wyłącznie w części Function SavePDF Ta konfiguracja programu zapisuję do wybranej lokalizacji jednak przed nr rysunku dodaję jego nazwę(chcę ale odwrotnie). Jeśli odblokuję cudzysłów 'moje linijki, one zapisują pod żądaną nazwą jednak pdf'y wyrzuca do katalogów w których znajdują się docelowo rys solidowskie. Nazwa PDF'a chcę żeby się składała z numeru i nazwy. Jestem laikiem w programowaniu, może to być na prawdę coś błahego z którym nie mogę sobie poradzić więc proszę wyrozumiałość i o pomoc. |
|
|
.
2017-10-02, 16:35
Pomógł 52 raz(y).
|
Widzę, że sobie nawet radzisz ale brakuje czegoś takiego : Filepath + partnumber + " " + FileName + ".pdf" To ustala nazwę pliku PDF tak jak potrzebujesz (Numer * Nazwa) |
SolidWorks 2015 sp.3
2017-10-03, 08:04
Pomógł 0 raz(y).
|
Zgadza się, ta linijka zapisuje mi pod żądaną nazwą lecz PDF'y wrzuca mi do folderów gdzie znajdują się rysunki solidowskie, a nie w zadany folder (w przypadku kiedy złożenie składa mi się z cześci zapisanych w różnych lokalizacjach). 'Save PDF of drawing partnumber = swModel.CustomInfo("Numer") drwPathName = swDwg.GetPathName() pdfPathName = fso.BuildPath(pdfFolderName, fso.GetBaseName(drwPathName)) Set swExportPDFData = swApp.GetExportFileData(1) swExportPDFData.ViewPdfAfterSaving = False Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "")) FileName = Left(swDraw.GetTitle, Len(swDraw.GetTitle) - 10) swDraw.SaveAs (Filepath + partnumber + " " + FileName + ".pdf") Z tego co zauważyłem "Filepath" zapisuje do lokalizacji rysunku solidowskiego a linijka: swDwg.Extension.SaveAs pdfPathName + " " + partnumber + ".pdf", 0, 0, swExportPDFData, lErrors, lWarnings zapisuje do wybranego na początku folderu po uruchomieniu makra lecz nie mogę jej zmodyfikować tak aby nazwa składała się z "numer rys + nazwa pliku" Może ja coś też źle zrozumiałem więc mogę prosić o całą część tej Funkcji żebym się nie pogubił co gdzie dopisać. Z góry dziękuje za pomoc. |
|
|
.
2017-10-03, 09:07
Pomógł 52 raz(y).
|
Moim zdaniem w tym makrze jest trochę przekombinowane. Spróbuj zamiast fragmentu: 'Save PDF of drawing partnumber = swModel.CustomInfo("Numer") drwPathName = swDwg.GetPathName() pdfPathName = fso.BuildPath(pdfFolderName, fso.GetBaseName(drwPathName)) Set swExportPDFData = swApp.GetExportFileData(1) swExportPDFData.ViewPdfAfterSaving = False swDwg.Extension.SaveAs pdfPathName + " " + partnumber + ".pdf", 0, 0, swExportPDFData, lErrors, lWarnings 'moje linijki 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "")) 'FileName = Left(swDraw.GetTitle, Len(swDraw.GetTitle) - 10) 'swDraw.SaveAs (Filepath + partnumber + " " + FileName + ".pdf") wpisać: 'Save PDF of drawing partnumber = swModel.CustomInfo("Numer") Set swExportPDFData = swApp.GetExportFileData(1) swExportPDFData.ViewPdfAfterSaving = False swDwg.Extension.SaveAs pdfFolderName + "'backslash'" + Left(swDWG.GetTitle, Len(swDWG.GetTitle) - 7) + " " + partnumber + ".pdf", 0, 0, swExportPDFData, lErrors, lWarnings 'moje linijki PS. Uwaga do Forum. Zróbcie coś żeby można było wpisywać wszystkie znaki ASCII. Nie można wpisywać BackSlash, znaków mniejszości i większości i innych. To ograniczenie utrudnia a czasami uniemożliwia poprawne cytowanie tekstów źródłowych makr. |
SolidWorks 2015 sp.3
2017-10-03, 10:53
Pomógł 0 raz(y).
|
Działa świetnie, tak jak chciałem, jednak tylko kolejność zmieniłem numeru z nazwą oraz ilość znaków do usunięcia za nazwą części z 7 na 10: swDwg.Extension.SaveAs pdfFolderName + "'backslash'" + partnumber + " " + Left(swDwg.GetTitle, Len(swDwg.GetTitle) - 10) + ".pdf", 0, 0, swExportPDFData, lErrors, lWarnings Dziękuję za pomoc, pozdrawiam, |
|
|
.
2017-10-03, 11:02
Pomógł 52 raz(y).
|
A tak z ciekawości, dlaczego usuwasz 10 znaków. Rozszerzenie plików SW ma razem z kropką 7 znaków(np .SLDDRW)? |
SolidWorks 2015 sp.3
2017-10-03, 13:18
Pomógł 0 raz(y).
|
W tym przypadku usuwam nie rozszerzenie a nr arkusza, np: "Tuleja - Arkusz1" zostawiająć "Tuleja". Jeszcze jeden problem się pojawił ale znikomy, mianowicie jeśli w złożeniu mam wiele razy daną część, makro otwiera i podmienia pdf'a tyle razy ile ona jest użyta w złożeniu, jak się domyślam brakuje jakiegoś wyrażenia Jeżeli, Ale jeśli ma ktoś pomysł jestem otwarty na propozycję. |
|
|
.
2017-10-03, 14:24
Pomógł 52 raz(y).
|
To makro rekurencyjnie przeszukuje złożenie zagłębiając się aż do najniższego poziomu. Jeśli komponenty występują wiele razy to nie znalazłem w nim mechanizmu kontroli dlatego jest tak jak opisałeś. Trzeba stworzyć tablicę zawierającą dane wyeksportowanych już rysunków i przed wywołaniem funkcji SavePDF sprawdzić czy aktualny rysunek nie znajduje się już w bazie a po wykonaniu tej funkcji uzupełnić bazę ostatnim rysunkiem. Problemem jest określenie wielkości tablicy ale tu można się posłużyć funkcją: Dim Value As Variant Value = Assembly.GetComponents(False) ' Sporządzenie listy wszystkich części złożenia IlośćWszystkichCzęści = UBound(Value) ReDim TablicaEksportu (IlośćWszystkichCzęści) Zresztą ja w swoich makrach korzystam właśnie z tej tablicy 'Value' przy operacjach na złożeniach a nie z rekurencji '.GetChildren'. Wystarczy dopisać blok który usuwa powtórzenia elementów tablicy 'Value', tworzy nową . Możemy sobie posortować elementy tablicy co przydaje się przy wydruku wszystkich rysunków złożenia bo są już ładnie poukładane. Potem wykonujemy eksport kolejnych rysunków z tej nowej tablicy. Wydaje mi się to prostsze. |
.
2017-10-04, 07:38
Pomógł 52 raz(y).
|
Bil Paweł W tym przypadku usuwam nie rozszerzenie a nr arkusza, np: "Tuleja - Arkusz1" zostawiająć "Tuleja". Jeszcze jeden problem się pojawił ale znikomy, mianowicie jeśli w złożeniu mam wiele razy daną część, makro otwiera i podmienia pdf'a tyle razy ile ona jest użyta w złożeniu, jak się domyślam brakuje jakiegoś wyrażenia Jeżeli, Ale jeśli ma ktoś pomysł jestem otwarty na propozycję. Odnośnie usuwania zbędnych znaków lepiej zrobić tak: Nazwa = CreateObject("Scripting.FileSystemObject").GetBaseName(swDWG.GetPathName()) a dla uniknięcia powtórzeń: NazwaPliku = pdfFolderName + "'backslash'" + partnumber + " " + Nazwa + ".pdf" if DIR(NazwaPliku) = "" then SavePDF NazwaPliku Pozdrawiam |