-
Postów
355 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
19
Odpowiedzi opublikowane przez Parikon
-
-
Zapewne tak. Proponuję jednak robić to poprzez częściowe pliki ustawień. Nie wiem jak wygenerować taki częściowy plik ustawień. Być może ktoś na tym forum pomoże. Ale jak już mamy taki częściowy plik ustawień, to możemy zrobić toolbary, wstążki i menu, niezależne od głównego cuix-a.
Niestety nie mam aktualnie wersji 2017.ale powinno być podobnie jak na filmiku poniżej.
-
Dzięki. Jest pole we właściwościach.
-
Mam taki problem. Skompilował dll-kę z tego kodu https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2016/ENU/AutoCAD-NET/files/GUID-01A47A4F-9FC5-4DB6-8C3E-B72D75688965-htm.html
Po załadowaniu komendą addhatch Zwcad tworzy okrąg ale pusty. VERNUM = "2018.07.26(35476)_x64". Gdy rozciągnę okrąg wypełnia się hatch-em. Gdy zaznaczę hatch i sprawdzę jego właściwości, pod hasłem geometria jest tylko właściwość wzniesienie - brak właściwości pole. Kopiuje sam okrąg i hatch robię pod Zwcad. Tutaj we właściwościach hatcha mamy podane pole.
Jak usprawnić kod, aby:
- kreskowanie wyświetlało się od razu, a nie po zmianie geometrii okręgu
- możliwy był odczyt pola kreskowania
W kodzie użyłem kreskowania solid.
-
-
Moduł można dalej dopieszczać. Jednakże najważniejsze jest to, aby rysował ramki. Wstawiłem resztę kodu, który narysuje ramki.
-
Racja.
private string[] kolumny = { "Format","Wysokość","Długość","G-marg","D-marg","L-marg","P-marg"}; public void ZmienDaneWTabeli() { this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "update " + nazwatabeli + " set " + "[" + kolumny[0] + "]='" + UserControl2.nazwaformatki + "'," + "[" + kolumny[1] + "]='" + UserControl2.wysokosc + "'," + "[" + kolumny[2] + "]='" + UserControl2.dlugosc + "'," + "[" + kolumny[3] + "]='" + UserControl2.G_marg + "'," + "[" + kolumny[4] + "]='" + UserControl2.D_marg + "'," + "[" + kolumny[5] + "]='" + UserControl2.L_marg + "'," + "[" + kolumny[6] + "]='" + UserControl2.P_marg + "' " + "where [" + kolumny[0] + "]='" + UserControl1.formatka + "'"; db_cmd.ExecuteNonQuery(); db_con.Close(); }
Pozostawiłem nawiasy kwadratowe z racji tego, że są bardziej elastyczne. Mogę zrobić tak, że:
kolumny[0] = "Formatka arkusza"
i już by się program wysypał, gdyby nie nawiasy.
-
Myślę, że nie ma co paranoidalnie podchodzić do naszej bazy, gdyż użytkownik prędzej wykasuje bazę z katalogu bazy niż zastosuje odpowiednią nazwę formatki aby kwerenda zadziałała inaczej. Ale dzięki za artykuły, zawsze warto wiedzieć więcej niż mniej. Jeśli chodzi o metodę PobierzDane... to napisałem ją tak, abym mógł ją wykorzystywać w przyszłości odpytując różne tabelę. A jak tak tę metodę napisałem, to muszę podać nazwę tabeli. A ponieważ nie chciało mi się kopiować nazwy, to ją upubliczniłem i wybrałem jako już gotową do wyboru. Nie zastosowałem count() bo nie wiedziałem jak sprawdzić to zapytanie. Zrobiłem więc tak jak potrafię, czyli inaczej niż ty być zrobił. Teraz podałeś jak byś postąpił dalej, więc zaraz wypróbuje.
Trzeba inaczej zadać zapytanie, gdyż podane nie działa tak jak chcielibyśmy. Działa dopiero gdy tak sformułuje zapytanie.
db_cmd.CommandText = "select * from " + nazwa_tabeli + " order by [Format] desc";
-
Masz rację, powinno być o wiele szybciej. Zmieniłem metodę.
public bool CzyPowtorka(string nazwa) { bool bull = false; this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "select * from " + nazwatabeli + " where [Format] = '" + nazwa + "'"; db_cmd.ExecuteNonQuery(); var dt = new DataTable(); SQLiteDataAdapter da = new SQLiteDataAdapter(db_cmd); da.Fill(dt); db_con.Close(); int wierszy = dt.Rows.Count; if (wierszy > 0) bull = true; return bull; }
Czy istnieje w SQL taka komenda, która wstawi rekord po rekordzie, który wskażemy, a nie na końcu tabeli? Przykładowo, chcemy dodać nową formatkę A1+. Wybieramy z DataGrid wiersz i odczytujemy jego dane. Następnie wstawiamy do bazy rekord jako następny po tym zaznaczonym. Po mojemu byłoby to tak 😉 "insert po from nazwatabeli where [Format] = wybrananazwa"
-
Niestety ja nic tu nie pomogę.
Natomiast wracając do ramek - do klasy Base dodałem taką metodę:
public bool CzyPowtorka(string nazwa, int numerkolumny) { bool buul = false; DataTable dt = PobierzDaneTabeli(nazwatabeli); int wierszy = dt.Rows.Count; DataRow dtr; string pobor; int wynik = 0; if (wierszy > 0) { for (int i = 0; i < wierszy; i++) { dtr = dt.Rows[i]; pobor = dtr[numerkolumny].ToString(); if (pobor == nazwa) wynik = wynik+1; } } if (wynik != 0) buul = true; return buul; }
Z poziomu ZwCAD-a, dodanie dwóch rekordów o tej samej nazwie formatki powinno być niemożliwe.
-
Wszystkie uwagi uważam za słuszne. Jeśli chodzi o powtarzające się nazwy formatki, to w tej akurat dll-ce chciałbym zastosować metodę, która porówna nową nazwę z nazwami już występującymi i nie zezwoli nam jej dodać, zarówno gdy będziemy korzystać z przycisku dodaj lub zmień. Dodanie nowej kolumny z ID pozostawmy, gdy będziemy chcieli zrobić nową wersję tabeli. No chyba, że znajdziemy sposób, aby wykorzystać id, które i tak musi tworzyć SQLite i zapewne w DataTable też jest zapisane. Problem tylko jak się do niego dobrać.
Debugowanie:
Stworzyłem folder PI 2019 MIT EDITION i w nim mam aktualnie taki jak powyżej układ. Następne zmodyfikowałem lispa startowego. Dodałem go do autostartu w ZwCAD oraz wskazałem w ZwCAD nową ścieżkę do folderów przeszukiwania.
; LISP: pi_start.lsp ; Lisp startowy projektu Przybornik Inżyniera MIT EDITION ; Autor: WaGaCAD; ; Wydanie 201812 ; Opis działania: Ustawia środowisko pracy Przybornik Inżyniera MIT EDITION. (defun znajdzplik (nazwapliku / file_name) (setq file_name nazwapliku) (setq plik (findfile file_name)) (if plik (progn (setq file_name plik) (command "netload" plik )) (progn ;else (princ (strcat "\nNie znaleziono pliku " file_name "."))))) (znajdzplik "start_zw.dll")
Dzięki temu tylko podmieniać ramki_zw.dll po każdej kompilacji w tym folderze i uruchamiam ZwCAD, sprawdzając jak program się zachowuje, po wprowadzonych zmianach.
Eksplorator windows ma ciekawą funkcję szybki dostęp w drzewie folderów, gdzie można sobie dodać folder, w którym VS tworzy naszą dll-kę oraz folder z plikami, gdzie będzie się rozwijało PI MIT EDITION.
-
Już można aktualizować bazę z poziomu ZwCAD-a.
-
https://github.com/Parikon/ramki_zw
Aktualnie wypchnięty kod po skompilowaniu powinien dać taki efekt. Wcześniej powtarzająca się w pętli kota.
-
Spoko czekam na efekty. Z chęcią skorzystam z nowych kot jeśli pozwolisz oraz być może po przestudiowaniu kodu znów się czegoś ciekawego nauczę.
-
https://github.com/Parikon/ramki_zw
To co opracowaliśmy przy projekt forum wykorzystałem do programu, który w założeniu ma rysować ramki. Jest tu więc w zasadzie to samo, ale przystosowane do uruchomienia w ZwCAD oraz tworzy tabelę wypełnioną danymi potrzebnymi do narysowania ramek. Poprawiłem też nazwę metody, która w moje ocenie źle została sklasyfikowana. My nie sprawdzamy wersji bazy tylko wersję tabeli w tej bazie utworzonej. Wersja bazy to wersja 3. Nas interesuje wersja tabeli i jej ewentualne rozszerzenie lub skrócenie w przyszłości o nowe kolumny.
-
Sam też nie wiem jak się wspólnie pracuje na git czy przystosowanym do jego obsługi githubie. Ale myślę, że spokojnie możesz założyć własne repo i udostępniać tam kod. Przecież nie chodzi o to, aby poprawiać mój kod, tylko aby udostępniać swoje programy aby inni mogli korzystać z pewnych rozwiązań i tworzyć coś nowego, a nie to samo, tylko inaczej oprogramowane. Załóżmy, że mamy dll startową, do której możemy sobie podpinać inne dll, w których mamy konkretne programy lub ich grupy uruchamiane konkretnymi poleceniami. Przy czym proponuje w katalogu Bazy założyć bazę sqlite o nazwie pi.sqlite i w niej tworzyć tabele do obsługi różnych programów, a także do zapisu głównych ustawień. Oczywiście możemy tych baz tworzyć wiele w katalogu bazy. itd. np. profile.sqlite ustawienia.sqlite itp.
Poprawiłem trochę moją dll-kę library1.dll. Wydzieliłem dwie metody oraz rozwiązałem sposób wykonywania programu do czasu wciśnięcia escape. Teraz wstawianie koty konstrukcyjnej i wykończeniowej, a nawet zigzaga izolacji odbywa siew pętli do czasu anulowania escape.
-
W przypadku kot wysokościowych tak jest. Akurat gdy zaczynałem przygodę z programowaniem zależało mi na efekcie, a nie jakości. Poszukiwałem rozwiązań problemów, które napotykałem. Takich jak wysypywanie się programu, gdy byłem w przestrzeni papieru itp. Efektem opracowania kodu koty wykonawczej jest jego skopiowanie i w zakresie zapytań i samego rysowania opracowanie koty konstrukcyjnej. Przy czym w tym wypadku doszedł problem hatch-owania itp. Cały czas zdaje sobie sprawę, że ilość linii kodu, a raczej jego objętość można zmniejszyć wydzielając fragmenty się powtarzające. Dlatego zapraszam do współpracy. Same rady typu, może warto, niczego dobrego nie przyniosą. Odpowiedź jest jedna, zawsze warto. Mając plik wyjściowy wystarczy dobrze wszystko poukładać w danej przestrzeni - w tym wypadku klasie. Zatem myślę, że jak masz ochotę dołączyć do tworzenia, jako współtwórca, a nie sprawdzający , to mając większe w tym doświadczenie, szybko ograniczysz ilość linii kodu w tej bibliotece i sprawisz aby była czytelniejsza i ułatwiała prostsze dodawanie nowych rodzajów kot wysokościowych. Mam kilka rzeczy, które bym chciał dodać do komend rysujących koty. Przykładowo, wykonywanie kodu w pętli do czasu, aż nie wciśniemy enter lub esc. Pytanie, czy swoją pracę udostępnisz i na jakiej licencji?
-
Można i tak jak proponujesz. Kod jest dostępny, można sobie przerobić. Ja nie potrzebuje wiedzieć, że coś się ładuje. Wystarczy mi komunikat końcowy. Ewentualnie gdy coś się nie załaduje i tak otrzymam komunikat co to jest? Ale może informacja o ładowaniu, będzie ciekawie wyglądać.
Wrzuciłem trochę nowego kodu.
https://github.com/Parikon/library1_zw
-
Ogólnie chodzi o to, że jak się nie załaduje to zwraca zawsze jedynkę. Natomiast zlicz = zlicz =1 już poprawiłem. Co prawda nic to w wykonaniu kodu nie zmienia, ale zawsze poprawniej.
-
PI 2019 MIT Edition składa się już z dwóch plików dll. Drugi to dll-ka startowa, której uruchomienie, ładuje także plik skala_zw.dll. Wykorzystałem tutaj wiedzę zdobytą na tym forum.
Kod dll-ki startowej https://github.com/Parikon/start_zw/blob/master/start_zw/Start.cs
-
Tutaj jest kod na licencji MIT modułu skala https://github.com/Parikon/skala_zw
-
-
@perlon przetestowałem trochę kod i zasadniczo tak jak mówiłeś catch (Exception ex) pozostawiłem tylko w klasie MainWindow.
Teraz utworzyłem taka metodę w klasie Base
public DataTable PobierzDaneTabeli(string nazwa_tabeli) { var dt = new DataTable(); this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "select * from "+ nazwa_tabeli +""; db_cmd.ExecuteNonQuery(); SQLiteDataAdapter da = new SQLiteDataAdapter(db_cmd); da.Fill(dt); this.db_con.Close(); return dt; }
W klasie MainWindow dodałem
public MainWindow() { InitializeComponent(); //zamykamy pewne funkcjonalności, gdyż musielibyśmy inaczej oprogramować obiekt DataGrid, a tego nie potrafię datagrid_projekt_lista.CanUserAddRows = false; datagrid_projekt_lista.CanUserDeleteRows = false; datagrid_projekt_lista.IsReadOnly = true; }
oraz
private void Window_Loaded(object sender, RoutedEventArgs e) { try { //path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location)); var baza = new Base(path); baza.AddBaseIfNotExist(); if (baza.GetBaseVersion() != 1) { // tutaj dałbym konwerter na starej bazy na nową, ale narazie nie mamy takiego konwertera więc program tego nie zrobi MessageBox.Show("Nieprawidłowa wersja bazy. Konwersja niemożliwa w tej wersji programu.Nastąpi zamknięcie programu", "Projekty-info"); this.Close(); } DataTable tablicaprojektow = baza.PobierzDaneTabeli("projekt_lista"); datagrid_projekt_lista.ItemsSource = tablicaprojektow.DefaultView; } catch (Exception ex) { MessageBox.Show(ex.Message + ". Program zostanie zamknięty.", "Projekty-info"); this.Close(); } }
Jak widać AddBaseIfNotexist() nie zwraca tak jak proponowałeś żadnej wartości
-
13 minut temu, PiotrNowak napisał:
Zaktualizowałem poprzez deinstalacje aktualnej wersji i instalacje wersji SP1, z ciekawostek to instalacja przeszła nadspodziewanie gładko, zapamiętanie plików użytkownika zadziałało, konfiguracja programu zajęła około 15min. Nakładka BeStCAD z której korzystam nawet nie zorientowała się że zwcad został tymczasowo odinstalowany. Więc jestem pozytywnie zaskoczony
Mój PI tak samo się zachował. Zatem moduł sztucznej inteligencji w PI i BeStCAD działa na podobnym poziomie. 😉
-
public partial class MainWindow : Window { string path;
jeśli skasujesz to string path
Dostosuj interfejs użytkownika.
w ZWCAD Standard i Professional
Opublikowano
Tutaj można pobrać pusty "częściowy plik ustawień" (ang. partial cuix) i wypełnić w oknie "Dostosuj interfejs użytkownika". Wcześniej zalecam zmienić nazwę.