Autor | Wypowiedź |
2017-03-06, 09:57
Pomógł 0 raz(y).
|
Dzień dobry, mam problem, a właściwie dwa. Korzystam z makra pobierającego właściwości pliku (numer rysunku, nazwę i pierwsze 3 litery z numeru rysunku). Makro przepisuje mi to do rysunku wykonawczego i tu nie ma problemu. Pojawia się on gdy za kilka dni otwieram ponownie rysunek wykonawczy i wtedy "gubi" on te właściwości. Da się zrobić tak, że zapamięta je? I druga sprawa czy da się to makro jakoś podpiąć do zapisywania pliku, żeby nie trzeba było za każdym razem je klikać? |
|
|
CSWP, CSWE, CSWI *** solid-blog.pl ***
2017-03-06, 14:42
Pomógł 406 raz(y).
|
No fajnie, ale nie załączyłeś ani pliku SW ani makra - więc jak można cokolwiek pomóc? Sprawdziłbym przede wszystkim, co się dzieje z właściwościami pliku, bo to stąd trafiają wpisy do rysunku. |
|
|
2017-03-06, 16:23
Pomógł 0 raz(y).
|
Jasne, już wrzucam makro. "Dim swApp As Object Sub main() Set swApp = Application.SldWorks Dim NazwaPliku As String Dim Spacja As Long Dim Dlugosc As Long Dim Description As String Dim PartNo As String Dim Numer As String Dim Wpis As Long Dim CusPropMgr As SldWorks.CustomPropertyManager Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel Is Nothing Then MsgBox "Brak otwartych dokumentów", swMbInformation End End If Set CusPropMgr = swModel.Extension.CustomPropertyManager("") NazwaPliku = swModel.GetTitle() Dlugosc = Len(NazwaPliku) Spacja = InStr(NazwaPliku, " ") PartNo = "" + Left(NazwaPliku, Spacja - 1) + "" Description = Mid(NazwaPliku, Spacja + 1) Numer = Left(NazwaPliku, 3) NazwaPliku = NazwaPliku + ".SLDPRT" Wpis = CusPropMgr.Delete("Description") Wpis = CusPropMgr.Delete("PartNo") Wpis = CusPropMgr.Delete("Numer") Wpis = CusPropMgr.Add2("Description", swCustomInfoText, Description) Wpis = CusPropMgr.Add2("PartNo", swCustomInfoText, PartNo) Wpis = CusPropMgr.Add2("Numer", swCustomInfoText, Numer) Wpis = CusPropMgr.Add2("Material", swCustomInfoText, Chr(34) + "SW-Material@" + NazwaPliku + Chr(34)) Wpis = CusPropMgr.Add2("Masa", swCustomInfoText, Chr(34) + "SW-Mass@" + NazwaPliku + Chr(34)) End Sub " |
|
|
.
2017-03-06, 20:30
Pomógł 52 raz(y).
|
Tak na pierwszy rzut oka wydaje mi się, że zamiast: NazwaPliku = swModel.GetTitle() powinno być: NazwaPliku = swModel.GetPathName Wiersz : NazwaPliku = NazwaPliku + ".SLDPRT" należy usunąć. Wtedy pobierana jest pełna nazwa pliku ze ścieżką. Inaczej jest pobierana nazwa z nagłówka i ścieżka jest domyślna dla SW niekonieczne zgodna ze ścieżką pliku, czyli SW zapisuje tam gdzie chce. Później otwierasz niestety stary dokument. |
2017-03-07, 09:06
Pomógł 0 raz(y).
|
Zrobiłem tak jak napisałeś, niestety moje makro się popsuło. Zamiast nazwy dokumentu i numeru rysunku pobiera teraz pełną ścieżkę i ścieżkę skróconą o nazwę części. |
|
|
.
2017-03-07, 10:53
Pomógł 52 raz(y).
|
Sorry, nie zauważyłem, że tą samą zmienną używasz do dwóch celów. Twoje makro powinno działać poprawnie. Sprawdź w rysunku powiązanie z odpowiednimi właściwościami modelu i czy na pewno rysunek odnosi się do właściwego modelu. No i najważniejsze, czy zapisujesz model i rysunek po uruchomieniu makra. Zapisywanie modelu można umieścić w makrze i wtedy będzie się to robiło automatycznie. |
2017-03-07, 12:51
Pomógł 0 raz(y).
|
Masz rację, faktycznie błąd leży w tym, że nie zapisałem modelu po kliknięciu w makro. Czy mógłbyś mi powiedzieć jaką linijkę muszę dopisać żeby od razu zapisywało z poziomu makra ? |
|
|
.
2017-03-07, 14:54
Pomógł 52 raz(y).
|
Należy dodać linię : swModel.Save przed End Sub |
2017-03-08, 07:34
Pomógł 0 raz(y).
|
Dziękuję, działa. Co do drugiej części mojego pytania, nie da się zrobić tak żeby makro samo się "wciskało" po otwarciu pliku ? Niby samo kliknięcie trwa chwilę ale czasami się zapomina. |
|
|
.
2017-03-08, 08:04
Pomógł 52 raz(y).
|
Niestety raczej się nie da. Sam szukałem takiego rozwiązania coś w stylu autoexec dla SW. |
2017-03-08, 08:29
Pomógł 0 raz(y).
|
Szkoda, może kiedyś ktoś coś takiego wymyśli. Dziękuję za pomoc. |
|
|
CSWP, CSWE, CSWI *** solid-blog.pl ***
2017-03-08, 08:52
Pomógł 406 raz(y).
|
A tutaj przykład. Jest to nieco zawiłe ale wygląda, że działa https://www.youtube.com/watch?v=zbvp1v7_bec |
|
|
.
2017-03-08, 10:41
Pomógł 52 raz(y).
|
Wygląda to strasznie i do tego w SW 2015 gdzie jest inny interface do równań nie da sie wprowadzić takiego równania. Chyba prościej jednak kliknąć na ikonę z makrem. |
CSWP, CSWE, CSWI *** solid-blog.pl ***
2017-03-08, 11:06
Pomógł 406 raz(y).
|
Zgodzę się :) Widziałem też inne rozwiązania ale nie jestem przekonany. Osobiście też wolałbym kliknąć. |
|
|
.
2017-03-08, 11:15
Pomógł 52 raz(y).
|
Problem jest w tym, że zastosowany w linku trik polegał na wpisaniu równania, które zawierało błąd składni. Poprzedni interface zapisywał takie błędne równania i zaznaczał błąd a nowy w ogóle nie pozwala na taki błędny wpis. Zdecydowanie lepiej kliknąć na ikonkę z makrem, albo napisać sobie makro do otwierania dokumentów SW , które w sobie miło by tą funkcję jaka jest Ci potrzebna przy starcie. PS. Automatyczne uruchamianie makra przy otwieraniu dokumentu może a raczej na pewno wydłuży czas otwierania złożeń bo będzie wykonywane we wszystkich częściach. |
.
2017-03-09, 09:00
Pomógł 52 raz(y).
|
Napisałem takie makro do otwierania dokumentu SW z wykonaniem operacji przy starcie: Dim swApp As SldWorks.SldWorks Option Explicit Sub main() Dim Filter As String Dim fileName As String Dim fileConfig As String Dim fileDispName As String Dim fileOptions As Long Set swApp = Application.SldWorks Filter = "Dokument SolidWorks (*.sldprt; *.sldasm; *.slddrw)|*.sldprt;*.sldasm;*.slddrw|" fileName = swApp.GetOpenFileName("Otwórz dokument . . . ", "", Filter, fileOptions, fileConfig, fileDispName) If Not fileName = "" Then Dim Rozszerzenie, TypPliku As String Dim Plik As Object Rozszerzenie = Split(fileName, ".") TypPliku = Trim(Rozszerzenie(UBound(Rozszerzenie))) Select Case Trim(UCase(TypPliku)) Case "SLDPRT" Set Plik = swApp.OpenDoc(fileName, swDocPART) Case "SLDASM" Set Plik = swApp.OpenDoc(fileName, swDocASSEMBLY) Case "SLDDRW" Set Plik = swApp.OpenDoc(fileName, swDocDRAWING) End Select If Not Plik Is Nothing Then Dim longstatus As Long swApp.ActivateDoc2 fileName, False, longstatus Autoexec End If End If End Sub ' Procedura do wykonania na starcie Sub Autoexec() Dim swModel As SldWorks.ModelDoc2 Set swModel = swApp.ActiveDoc ' ' Tutaj operacje do wykonania przy starcie dokumentu ' lub wykonanie innego makra ' swApp.RunMacro "Nazwa pliku makra","Moduł","Procedura" ' End Sub Można też prościej : http://www.pswug.info/image/forum/forum_760_20_2542_9004.swp |