
pop3k
Użytkownik forum-
Postów
71 -
Dołączył
-
Ostatnia wizyta
Treść opublikowana przez pop3k
-
[VBA] zaznacz bloki z modelu
pop3k opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
Witam, poszukuję informacji jak napisać kod w VBA, który zaznaczy mi bloki (zaznaczy tak, jakbym jeździł po modelu i klikał LPM dany blok) o określonej nazwie, które dodatkowo w swoim pierwszym atrybucie mają nazwę "pozycja". Da się coś takiego w ogóle zrobić? Czytałem gdzieś, że w ogóle nie ma możliwości zwykłego zaznaczenia obiektów poprzez VBA -
[VBA] Pręt zbrojeniowy
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Funkcja przeliczPunkty(NAROZNIK As Variant) nie ma sensu, bo każdy pręt będzie miał swoje współrzędne. Ogólnie pomyślę o tym co napisałeś, dzięki za porady. Temat jeszcze nie jest zakończony, więc jeszcze się odezwę Jeżeli chodzi o moj przykład z kolekcją... zamiana ZcadPolyline na ZcadLWPolyline nie pomogła 😞 -
[VBA] Pręt zbrojeniowy
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Spróbowałem swoich sił na przykładzie kodu w Internecie. Najpierw dodałem Klasę w module o nazwie "Punkt" z kodem: Public X As Double Public Y As Double A swój kod zmodyfikowałem: Private Sub cmdTest_Click() frm_testmoj.Hide Dim NAROZNIK As Variant Dim p() As Double NAROZNIK = ThisDrawing.Utility.GetPoint(, "Podaj punkt początkowy:") Dim kolekcjaPunktow As Collection Set kolekcjaPunktow = New Collection Dim pretPunkt As Punkt Set pretPunkt = New Punkt pretPunkt.X = NAROZNIK(0) pretPunkt.Y = NAROZNIK(1) kolekcjaPunktow.Add pretPunkt Set pretPunkt = Nothing Set pretPunkt = New Punkt pretPunkt.X = NAROZNIK(0) + 50 pretPunkt.Y = NAROZNIK(1) + 30 kolekcjaPunktow.Add pretPunkt Set pretPunkt = Nothing Set pretPunkt = New Punkt pretPunkt.X = NAROZNIK(0) + 100 pretPunkt.Y = NAROZNIK(1) + 30 kolekcjaPunktow.Add pretPunkt Set pretPunkt = Nothing Set pretPunkt = New Punkt pretPunkt.X = NAROZNIK(0) + 100 pretPunkt.Y = NAROZNIK(1) kolekcjaPunktow.Add pretPunkt Set pretPunkt = Nothing Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(KolekcjaDoTablicy(kolekcjaPunktow)) ZcadPolyline.ConstantWidth = 1 'Zwalniamy zmienną obiektową Set kolekcjaPunktow = Nothing End Sub w międzyczasie zauważyłem, że nie ma jak użyć kolekcji do rysowania polilinii, więc przygotowałem funkcję KolekcjaDoTablicy Function KolekcjaDoTablicy(Punkty As Collection) As Variant Dim i, j, ilosc As Integer Dim Tablica() As Double ilosc = Punkty.count * 2 ReDim Tablica(ilosc) j = 0 For i = 0 To Punkty.count - 1 Tablica(j) = Punkty(i + 1).X Tablica(j + 1) = Punkty(i + 1).Y j = j + 2 Next i KolekcjaDoTablicy = Tablica End Function Ale nie działa 😞 Run-time error '-2145320943 (80210011)'. przy kodzie: Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(KolekcjaDoTablicy(kolekcjaPunktow)) Można jakąś podpowiedź? -
[VBA] Pręt zbrojeniowy
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Tak, poprzez tablice i spaghetti kod już to tworzę, jednak chciałem podnieść poprzeczkę, uporządkować kod i robić część rzeczy poprzez funkcje. -
Witam serdecznie, po moich pytaniach zostało mi wypomniany kod spaghetti. Chciałbym go poprawić. Prosiłbym o wsparcie przy napisaniu kodu, który będzie tworzył pręt zbrojeniowy. W kolejnych postach (po rozwiązaniu aktualnego problemu) będę dopytywać o kolejne operacje, jak opisywanie długości odcinków, zaokrąglanie. Przykład aktualnie użytego kodu: Private Sub cmdTest_Click() frm_test.Hide Dim NAROZNIK As Variant Dim p() As Double NAROZNIK = ThisDrawing.Utility.GetPoint(, "Podaj punkt początkowy:") ReDim p(7) As Double p(0) = NAROZNIK(0): p(1) = NAROZNIK(1) p(2) = NAROZNIK(0) + 50: p(3) = NAROZNIK(1) + 30 p(4) = NAROZNIK(0) + 100: p(5) = NAROZNIK(1) + 30 p(6) = NAROZNIK(0) + 100: p(7) = NAROZNIK(1) Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(p) ZcadPolyline.ConstantWidth = 1 End Sub Coś tam czytałem o kolekcjach, chciałbym przerobić ten kod tworząc kolekcję, a punkty kolejne p(0), p(1)... dodawać kolejno jako kolekcja.Add, chodzi mi o coś takiego: Private Sub cmdTest_Click() frm_test.Hide Dim NAROZNIK As Variant Dim p(1) As Double NAROZNIK = ThisDrawing.Utility.GetPoint(, "Podaj punkt początkowy:") Stwórz nową kolekcję o nazwie pret p(0) = NAROZNIK(0): p(1) = NAROZNIK(1) pret.Add (p(0) i p(1)) //tutaj jakiś kod z obliczeniami kolejnych punktów oraz podmienieniem punktów p(0) i p(1) pret.Add (p(0) i p(1)) //tutaj kolejny kod z obliczeniami kolejnych punktów oraz podmienieniem punktów p(0) i p(1) pret.Add (p(0) i p(1)) //finalnie mam kolekcje punktów zapisany w pret(0), pret(1), pret(2) itd.. Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(kolekcja pret) ZcadPolyline.ConstantWidth = 1 wyczyść kolekcję pret aby móc jej użyć ponownie dla innego pręta End Sub Zmiana tablic na kolekcję mam mi ułatwić dodawanie kolejnych punktów, a także operację na nich o czym napiszę w kolejnych postach. Przy operacjach na nich będę dokładał w środek kolekcji kolejne punkty (tak to sobie wymyśliłem, czy poprawnie, to się okaże) Pozdrawiam
-
[VBA] Szkic w UserForm
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Dzięki za porady. Nie czuję się obyty z programowaniem, więc takie wyjaśnianie jest w punkt. -
[VBA] Szkic w UserForm
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Bomba, domyśliłem się, że nie zrobię tego w VBA. Choć miałem nadzieję, że istnieje jakaś dodatkowa biblioteka. Kupiłem 2 kursy na Udemy dla vb.net. Będzie trochę czasu (hehe, dobre), to usiądę do nauki. Podpowiedzcie tylko, która biblioteka (pod czym szukać w przyszłości) byłaby odpowiedzialna za samo rysowanie/szkicowanie w WPF (okienkach jak to perlon wykonał). Wiem, że w JavaScript jest Canvas. PS. projekt_forum.dll już raz przerabiałem. Szkoda, że temat nie jest kontynuowany. Na pewno wrócę jeszcze do niego przy nauce. -
[VBA] Szkic w UserForm
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Myślałem o tym, żeby zrobić takie aplikacje w czym innym. Znacie jakiś ciekawy kurs .Net VB dedykowany pod Autocada? A najlepiej pod Zwcada? -
Witam, robię aplikację VBA w ZWCad. Zastanawia mnie, czy jest możliwość szkicowania prostych obiektów podczas obsługi UserForm przez użytkownika. Dla przykładu otwieramy UserForm i do wpisania mamy 2 pola tekstowe: szerokość i wysokość prostokąta. Powyżej tych pól tekstowych mamy mały obszar ze szkicem, który pokazuje nam, jak ten prostokąt będzie wyglądał. Po każdorazowej zmianie jednego z pól zmieniają się proporcje prostokąta. Taki efekt osiągnąłem podczas pracy w JavaScript - Canvas.
-
Ha! Trzeba było zobaczyć mój kod na początku. Staram się dzielić kod na mniejsze funkcje, zazwyczaj jednak przy rewizjach poprawiam strukturę kodu. Mało to profesjonalne, ale ja jestem amator. Do tego zachowuje też porządek w deklaracji zmiennych - wszystkie są na początku i czasem nawet uporządkowuję je alfabetycznie! Kod działa! Dziękuję bardzo! perlon jesteś Mistrzem!
-
[VBA] Powtórz makro za pomocą ENTER
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Działa! Serdecznie dziekuję. -
Witam, kolejny problem, który bardzo ciężko wygooglować to tworzenie grup. Ogólnie używam podczas rysowania w ZWCad funkcji _GROUPUNNAME, który ma za zadanie ułatwić mi przesuwanie obiektów. Nie zależy mi więc na nazywaniu grup. Jak to zrobić w VBA? Domyślam się, że trzeba by było zaznaczyć moje obiekty i wtedy wklepać funkcje grupowania. Mam taki przykładowy kod: 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 pt1(0 To 2) As Double, pt2(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):") Set newlayer = ThisDrawing.Layers.Add("OPISY") ThisDrawing.ActiveLayer = newlayer 'TWORZĘ LINIĘ PIONOWĄ Points(0) = TRZECI(0) Points(1) = Maximum(TRZECI(1), CZWARTY(1)) + Int(txt_xPyP.Value) / skalajednostki Points(2) = Points(0) Points(3) = Minimum(TRZECI(1), CZWARTY(1)) - Int(txt_xLyL.Value) / skalajednostki Set ZcadPolyline = ThisDrawing.ModelSpace.AddLightWeightPolyline(Points) 'WSTAWIAM ZNACZNIK STRZAŁKI JAKO BLOK I PRZEKRĘCAM GO O 90st punktyBlok(0) = Points(0): punktyBlok(1) = Points(1): punktyBlok(2) = 0 '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FileToInsert = "C:\BLOKI\STRZALKA.dwg" pt1(0) = Points(0): pt1(1) = Points(1): pt1(2) = 0 pt2(0) = Points(2): pt2(1) = Points(3): pt1(2) = 0 Set BlockRef = ThisDrawing.ModelSpace.InsertBlock(punktyBlok, FileToInsert, skala * 0.5, skala * 0.5, skala * 0.5, ThisDrawing.Utility.AngleFromXAxis(pt1, pt2)) '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'WSTAWIAM DRUGI ZNACZNIK STRZAŁKI JAKO BLOK I PRZEKRĘCAM GO O 90st punktyBlok(0) = Points(2): punktyBlok(1) = Points(3): punktyBlok(2) = 0 '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FileToInsert = "C:\BLOKI\STRZALKA.dwg" Set BlockRef = ThisDrawing.ModelSpace.InsertBlock(punktyBlok, FileToInsert, skala * 0.5, skala * 0.5, skala * 0.5, ThisDrawing.Utility.AngleFromXAxis(pt2, pt1)) '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'CHCIAŁBYM ABY MOJA LINIA, I 2 BLOKI STRZAŁKI BYŁY TUTAJ ZGRUPOWANE Call ZapiszUstawienia(frm_ZP.Controls, "ZP_plus") End Sub
-
[VBA] Powtórz makro za pomocą ENTER
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
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ć. -
[VBA] Powtórz makro za pomocą ENTER
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
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ć? -
[VBA] Powtórz makro za pomocą ENTER
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
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! -
[VBA] Powtórz makro za pomocą ENTER
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
OK, dzięki, a jakieś porady jak to podpiąć pod skrót? 😄 -
[VBA] Powtórz makro za pomocą ENTER
pop3k opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
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. -
[C#] Komunikacja z aplikacją Zwcad
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
Jednak napotkałem problemy. Zaczynając od tego, że nie mam do wyboru biblioteki ZWCAD 2020 Type Library, tylko ZWCAD Type Library Nie można zdefiniować using Zwcad -> tylko using Zwsoft.Zwcad Te wszystkie drobne zmiany nie dają mi dostępu do klasy IZcadApplication Proszę również o wyrozumiałość za mój pierwszy program 😄 -
[VBA] Utwórz i odczytaj XDATA
pop3k opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
Witam, poczytałem troszkę na forum o XDATA, lecz nie znalazłem do końca odpowiedzi. Chciałbym użyć XDATA w mojej aplikacji. Tak jak ktoś kiedyś napisał przy tworzeniu pojedynczego, prostego pręta - chciałbym przechować informację poza długością i średnicą (co można uzyskać po samej geometrii) - np. klasę stali, ciężar, cenę takiego pręta. Pytanie jak mogę zainfekować moją kreskę, zespół kresek informacją XDATA? No i w jaki sposób tę informację odzyskać w kolejnej aplikacji? -
[C#] Komunikacja z aplikacją Zwcad
pop3k odpowiedział(a) na pop3k temat w Wsparcie programistyczne LISP i VisualLISP
O, dzięki za przykład. O to chodziło! 😄 -
[C#] Komunikacja z aplikacją Zwcad
pop3k opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
Witam, chciałbym za pomocą aplikacji zewnętrznej w C# i xaml po kliknięciu w button narysować linię/okrąg w aktywnym oknie i rysunku ZWCad (bez uruchamiania go poprzez netload). Widziałem kiedyś taką apkę w AutoCadzie. Jest to w ogóle możliwe w Zwcad?