pop3k Opublikowano 23 Lipca 2020 Zgłoś Opublikowano 23 Lipca 2020 Witam, stworzyłem kilka mniejszych programików w VBA, każdy ma swoją ikonkę, która otwiera odpowiednie makro. Wszystko działa. Przydatne byłoby jednak, aby po użyciu makro, powtórzyć je klawiszem ENTER, jak inne komendy Zwcada. Niestety poleceniem otwierającym dane makro po kliknięciu ikonki jest "-vbarun" a program pyta o nazwę makra VBA. Czytałem, że da się to zrobić jedynie przez Lisp, ale nikt nie wytłumaczył tego w prosty sposób. Łącznie z ustawieniem skrótu dla ikonki. Cytuj
perlon Opublikowano 23 Lipca 2020 Zgłoś Opublikowano 23 Lipca 2020 (edytowane) Może wystarczy command : (defun c:nazwa_makra (/) (command "-VBARUN" "nazwa_makra") ) (command "nazwa_makra") Takie coś podpiąć pod toolbarsa i będzie powtarzalne po enterze Tak na marginesie w wersji EN jest literówka Edytowane 23 Lipca 2020 przez perlon Cytuj
pop3k Opublikowano 23 Lipca 2020 Autor Zgłoś Opublikowano 23 Lipca 2020 (edytowane) OK, dzięki, a jakieś porady jak to podpiąć pod skrót? 😄 Edytowane 23 Lipca 2020 przez pop3k Cytuj
pop3k Opublikowano 23 Lipca 2020 Autor Zgłoś Opublikowano 23 Lipca 2020 OK, poradziłem sobie w ten sposób: 1. Utworzyłem plik z rozszerzeniem hot.lsp a w nim: (defun c:ZPP (/) (command "-VBARUN" "D:/Programy/vba/KonstruktorAP.zvb!ZP_plus.STR_ZP") ) (command "ZPP") 2. Wciągnąłem plik hot.lsp w ZWCAD -> Narzędzia -> Wczytaj aplikacje 3. Utworzyłem też ikonkę w ZWCAD -> Narzędzia -> Dostosuj interfejs -> i tam, gdzie wybiera się nazwę czy grafikę ikonki w polu Makro wpisałem "ZPP". Efekt jest taki, że mogę w linii poleceń wpisać ZPP lub kliknąć w ikonkę aby wywołać makro. W celu wywołania go jeszcze raz, mogę kliknąć ENTER. O to chodziło! Dzięki! Cytuj
pop3k Opublikowano 24 Lipca 2020 Autor Zgłoś Opublikowano 24 Lipca 2020 No i pojawił się problem. Program: 1. Otwiera UserForm 2. Z formularza można wyjść albo klikając button "Anluluj "lub "Rysuj" 3. W obydwu przypadkach się chowa UserForm.Hide, tylko w przypadku buttonu "Rysuj" każe użytkownikowi wybrać kilka punktów w modelu, po czym rysuje coś w modelu 4. Koniec. Program jest schowany i czeka na kolejne wywołanie. Przez to, że kazał użytkownikowi wybrać punkty, po skończeniu procedury i kliknięciu ENTER Zwcad znowu pyta o nazwę makra. Co mogę z tym zrobić? Cytuj
perlon Opublikowano 24 Lipca 2020 Zgłoś Opublikowano 24 Lipca 2020 No to może czas, żeby pokazać kod Cytuj
pop3k Opublikowano 25 Lipca 2020 Autor Zgłoś Opublikowano 25 Lipca 2020 OK, więc tak. Na początku ustawienia przycisku w ZWCAD w "Dostosuj Interfejs użytkownika" Jak już pisałem wcześniej mam utworzony skrót w poleceniu Makro: "ZPP". ZWCAD wie co otworzyć dzięki wspomnianemu już wcześniej lispowi wczytanego do programu: (defun c:ZPP (/) (command "-VBARUN" "D:/Programy/vba/KonstruktorAP.zvb!ZP_plus.STR_ZP") ) (command "ZPP") Dzięki temu procesowi, ZWCAD otwierał makro z ikonki a po wykonaniu i zakończeniu prostych czynności, mogłem te makro otworzyć jeszcze raz ENTEREM. W/w lisp otwiera mi oczywiście moduł o nazwie "ZP_plus" i procedurę "STR_ZP": Sub STR_ZP() frm_ZP.show End Sub frm_ZP jest to UserForm między innymi z buttonem o nazwie " b_draw" Problem się pojawił, gdy moje makro wymaga od użytkownika dodatkowych czynności jak np. wskazanie punktów w modelu ZWCAD. Private Sub b_draw_Click() frm_ZP.Hide Dim PIERWSZY, DRUGI, TRZECI, CZWARTY As Variant Dim Points(3) As Double Dim Dlugosc As Integer Dim FileToInsert As String Dim punktyBlok(0 To 2) As Double Dim skala, skalajednostki As Double Dim BlockRef As ZcadBlockReference Dim BlockAttributes As Variant PIERWSZY = ThisDrawing.Utility.GetPoint(, "Podaj punkt P1 (początek pręta):") DRUGI = ThisDrawing.Utility.GetPoint(PIERWSZY, "Podaj punkt P2 (koniec pręta):") TRZECI = ThisDrawing.Utility.GetPoint(, "Podaj punkt P3 (poczatek rozkładu:") CZWARTY = ThisDrawing.Utility.GetPoint(TRZECI, "Podaj punkt P4 (koniec rozkładu):") If PIERWSZY(0) < DRUGI(0) Then 'punkt P1 jest na lewo od P2 Points(0) = PIERWSZY(0) - Int(txt_zakotwienie.Value) / skalajednostki Points(1) = PIERWSZY(1) Points(2) = DRUGI(0) + Int(txt_zakotwienie.Value) / skalajednostki Dlugosc = RoundUp(Points(2) - Points(0), Int(txt_zaokr.Value) / skalajednostki) Points(2) = Points(0) + Dlugosc Points(3) = PIERWSZY(1) punktyBlok(0) = (Points(0) + Points(2)) / 2 - 30 * skala: punktyBlok(1) = Points(1): punktyBlok(2) = 0 Else Points(0) = PIERWSZY(0) + Int(txt_zakotwienie.Value) / skalajednostki Points(1) = PIERWSZY(1) Points(2) = DRUGI(0) - Int(txt_zakotwienie.Value) / skalajednostki MsgBox Points(0) - Points(2) Dlugosc = RoundUp(Points(0) - Points(2), Int(txt_zaokr.Value) / skalajednostki) Points(2) = Points(0) - Dlugosc MsgBox Points(0) - Points(2) Points(3) = PIERWSZY(1) punktyBlok(0) = (Points(0) + Points(2)) / 2 - 30 * skala: punktyBlok(1) = Points(1): punktyBlok(2) = 0 End If Set newlayer = ThisDrawing.Layers.Add("PRETY") ThisDrawing.ActiveLayer = newlayer Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(Points) ZcadPolyline.ConstantWidth = Int(cmb_srednica.Value) / WczytajSkale()(3) Call ZapiszUstawienia(frm_ZP.Controls, "ZP_plus") End Sub Po tej procedurze moje okienko UserForm "frm_ZP" jest schowane (pierwsze linijki tekstu) i po skończeniu rysowania znajduję się już w modelu ZWCAD. Klikając ENTER w celu wywołania funkcji ZWCAD nie włącza jeszcze raz procedury o nazwie "ZP_plus" a co za tym idzie mojego UserForm, tylko pyta się o nazwę makra. Dzięki za zaangażowanie, może uda się to szybko poprawić. Cytuj
perlon Opublikowano 25 Lipca 2020 Zgłoś Opublikowano 25 Lipca 2020 (edytowane) Jak na moje oko (choć nie programuję na co dzień VBA) to powinno działać. Enter powinien powtórzyć ostatnią komendę czyli ZPP. Pod ikonkę w toolbarsie powinna być podpięta komenda z lispa czyli zpp. Sprawdź taki test. U mnie działa. Musisz tylko poprawić ścieżkę do pliku Project.zvb. Konfiguracja buttona w toolbarsie: project.lsp Project.zvb Edytowane 25 Lipca 2020 przez perlon Cytuj
pop3k Opublikowano 26 Lipca 2020 Autor Zgłoś Opublikowano 26 Lipca 2020 Działa! Serdecznie dziekuję. Cytuj
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.