montek Opublikowano 25 Stycznia 2018 Zgłoś Udostępnij Opublikowano 25 Stycznia 2018 2 godziny temu, Parikon napisał: Teraz pytanie: PN - oznacza, że norma jest normą przyjęta w Polsce EN - że jest normą europejską - ISO że jest normą międzynarodową. Jak międzynarodowo powinna być opisana kota wysokościowa? Na początku normy jest adnotacja - Norma PN-EN ISO ..... jest polską wersją normy europejskiej EN ISO .... . Została przetłumaczona /lub jest tłumaczeniem oficjalnej wersji językowej kota wysokościowa zgodnie z normą w metrach z dokładnością do milimetra z kropką w normie PN-EN ISO 11091 - Rysunek budowlany Projekty zagospodarowania terenu (wymieniona w złączniku do warunków technicznych) jest tak samo. Chociaż moim zdaniem na PZT wszystkie wymiary powinno być w metrach zmiana separatora w wymiarach wykaz aktualnych norm dot. Zasad Sporządzania Dokumentacji Projektowej w Budownictwie https://pzn.pkn.pl/kt/info/published/9000127839 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 25 Stycznia 2018 Autor Zgłoś Udostępnij Opublikowano 25 Stycznia 2018 Dzięki za wskazanie miejsca zmiany obiektu.Tostring().Replace(".",","); Zasady sporządzania dokumentacji projektowej w budownictwie to jedno ale jeszcze jest zakres projektu budowlanego. PZT jest zakresem projektu budowlanego i obowiązek określenia tego zakresu tak aby przypilnować czytelności danych spoczywa na ministrze a nie na naszych odczuciach. Zatem odpowiednim rozporządzeniem do określenia jakie zasady obowiązują przy sporządzaniu PZT będzie: Rozporządzenie Ministra Transportu, Budownictwa i Gospodarki Morskiej w sprawie szczegółowego zakresu i formy projektu budowlanego W tymże rozporządzeniu powinny być podane szczegółowe wymagania co do zakresu projektu budowlanego jakim jest PZDlubT. T= D+D*n ---> n należy do liczb naturalnych od 1 do teren Państwa Polskiego podzielony na działki budowlane. Jak kogoś stać może przedstawić tak wielki plan. Sam projekt budowlany jest tylko zakresem opracowań sporządzanych w budownictwie. http://www.architektura.info/index.php/prawo/szczegolowy_zakres_i_forma_projektu_budowlanego/zalacznik_1_wykaz_polskich_norm_powolanych_w_rozporzadzeniu Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Martin_S Opublikowano 25 Stycznia 2018 Zgłoś Udostępnij Opublikowano 25 Stycznia 2018 Także o tym wspominałem 20-06-2013 r. po to minister infrastruktury wydaje rozporządzenia by były jasne standardy jak w Polsce projektować, liczyć i rysować .....a życie i "przyzwyczajenia" swoje ;) Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 11 Lutego 2018 Autor Zgłoś Udostępnij Opublikowano 11 Lutego 2018 PI 2018 wydanie 20180211 ZwCAD Najnowsze wydanie, które przede wszystkim poprawia błędne wygenerowanie samorozpakowującego się archiwum w poprzednim wydaniu. Przez to, po rozpakowaniu wszystkie pliki zawarte w katalogu PI 2018 rozpakowywały się do tego katalogu oraz nie były tworzone foldery podrzędne. Przez co nie działały wszystkie moduły odnoszące się do baz, w tym moduł bazy prętów żelbetowych. Bazy program tworzy w katalogu Bazy a niestety nie było go w katalogu głównym programu. Dziękuję za zgłoszenie problemu. Sam nie pobieram wysłanych na serwer plików więc nie byłem świadom problemu jaki mogą mieć osoby chcące używać lub sprawdzić PI. W tym wydaniu rozpakowywanie powinno przebiegać prawidłowo. Dodatkowo do katalogu PI 2018 dodałem nowy podkatalog Pict w którym znajdują się wszystkie grafiki przycisków oraz plik Cuix. Od teraz można w łatwy sposób (chociaż jednak wymagający trochę zaangażowania- patrz film) dodać toolbary związane z PI. Po pobraniu samorozpakowującego się archiwum z najnowszą wersję należy kliknąć na nie prawym klawiszem myszki i uruchomić jako administrator. Zalecam wcześniej przeskanować archiwum programem antywirusowym. Samorozpakowujące się archiwum jest tworzone Total - Commanderem. Po rozpakowaniu w dowolnym miejscu na dysku własnego komputera postępujemy jak na poniższym filmie. W przypadku gdyby przycisku w Toolbarach nie wyświetlały grafik należy wskazać odpowiednie poprzez moduł ustawienia interfejsu. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 21 Lutego 2018 Autor Zgłoś Udostępnij Opublikowano 21 Lutego 2018 Udało się wstawić moduł bazy zbrojenia w paletę ZwCAD. Niby nic a jednak cieszy. dmatusz3 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 10 Czerwca 2018 Autor Zgłoś Udostępnij Opublikowano 10 Czerwca 2018 Pierwsze spojrzenie na moduł do generowania zestawień stali profilowej. dmatusz3 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 24 Sierpnia 2018 Autor Zgłoś Udostępnij Opublikowano 24 Sierpnia 2018 Najnowsza kompilacja z 24.08.2018. Uzupełnione bazy profili, moduł bazy stali profilowej wraz z możliwością opisu zdefiniowanych w bazie kształtowników i tworzonych z nich elementów. Film ukazujący wykorzystanie modułu w praktyce. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 2 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 2 Grudnia 2018 Tutaj jest kod na licencji MIT modułu skala https://github.com/Parikon/skala_zw http://przybornik.parikon.pl/programy/2-skala s1016 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 3 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 3 Grudnia 2018 (edytowane) 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 Edytowane 3 Grudnia 2018 przez Parikon Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 3 Grudnia 2018 Zgłoś Udostępnij Opublikowano 3 Grudnia 2018 Tu chyba jest mała nieścisłość bo zamiast catch (System.Exception ex) { ed.WriteMessage(ex.Message); zlicz = zlicz = 1; } powinno być catch (System.Exception ex) { ed.WriteMessage(ex.Message); zlicz = 1; } lub ewentualnie jak niżej jeżeli zlicz jest licznikiem nieudanych ładowań dll'ek catch (System.Exception ex) { ed.WriteMessage(ex.Message); zlicz += 1; } Wydaje si Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 4 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 4 Grudnia 2018 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 4 Grudnia 2018 Zgłoś Udostępnij Opublikowano 4 Grudnia 2018 Może w taki deseń? public class Start : zzr.IExtensionApplication { string path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); public static zza.Document doc = zza.Application.DocumentManager.MdiActiveDocument; zze.Editor ed = doc.Editor; public void Initialize() { ed.WriteMessage("\nPI 2019 MIT Edition. Niektóre moduły PI korzystają z silnika bazy danych SQLite - www.sqlite.org."); ed.WriteMessage("\nŁadowanie modułów:"); Zaladuj("skala_zw.dll"); Zaladuj("cos_innego.dll"); Zaladuj("jeszcze_jakis_inny_modul.dll"); } public void Terminate() { } public void Zaladuj(string nazwadll) { ed.WriteMessage("\nŁadowanie " + nazwadll + new String('.',20 - nazwadll.Length)); string sciezka = path + "\\" + nazwadll; try { Assembly.LoadFrom(sciezka); ed.WriteMessage(" załadowane."); } catch (System.Exception ex) { ed.WriteMessage(" Błąd : " + ex.Message); } } } Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 4 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 4 Grudnia 2018 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 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 5 Grudnia 2018 Zgłoś Udostępnij Opublikowano 5 Grudnia 2018 Jakiś czas temu wpadła mi w ręce taka pozycja: https://helion.pl/ksiazki/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu-martin-fowler-kent-beck-john-brant-william-opdy,refukv.htm#format/d Trochę już lat od wydania ale mi osobiście zmieniła spojrzenie na sporo rzeczy jeżeli chodzi o optymalizacje kodu. W przypadku kot wysokościowych są duże fragmenty powtórzonego kodu np. tego związanego z pobieraniem od użytkownika punktów, obsługą warstw czy rysowaniem tekstu. Dla każdej z kot jest on identyczny. Może warto wydzielić go do osobnej metody tym bardziej, że jak przyjdzie pomysł na inne koty to ten kod będzie potrzebny po raz kolejny. Krótszy kod łatwiej się zarządza i ewentualne poprawki robi się w jednym miejscu a nie w wielu powtórzeniach. kruszynski 1 Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 5 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 5 Grudnia 2018 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? Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 7 Grudnia 2018 Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 (edytowane) Dnia 5.12.2018 o 10:42, Parikon napisał: 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? Popełniłem trochę kodu, głównie jako refaktoryzacja i uzyskanie podobnego efektu końcowego innymi metodami. Skupiłem się na części dot. kot wysokościowych. Chciałbym to wrzucić na githuba jako boczny branch ale coś mam chyba nie tak poustawiane, czegoś nie umiem albo repo jest zamknięte na obce commity . Jeszcze nie comittowałem do obcego repozytorium. Wklejanie całego kodu tutaj mija się z celem. Jak jakoś udostępnię cały kod to pozwolę sobie na kilka zdań objaśnienia co do mojego spojrzenia na to konkretne zagadnienie. Wszystko co udostępnię w ramach tego projektu będzie oczywiście na licencji MIT. Co do "zapętlenia" to rozwiązaniem chyba wystarczającym jest zamknięcie wywołania komendy w pętli nieskończonej + Exception. Klasę z komendami zrobiłem tak: [CommandMethod("KOTA_ARCH")] public void ArchElevationMark() { // co druga linijka z ponizszych jest niepotrzebna // konfiguracja z AppSettings IElevationMarkFactory markFactory1 = new ElevationMarkFactory(AppSettings.Instance.DrawingStandard).GetFactory(); // jak kto woli moze byc z łapy bez oglądania się na aktualne ustawienia IElevationMarkFactory markFactory2 = new ElevationMarkFactory(DrawingStandards.PN_B_01025).GetFactory(); // ustawienia defaultowe IElevationMark elevationMark1 = markFactory1.CreateElevationMark(ElevationMarkTypes.archMark); // albo wstrzykujemy konfiguracje. ElevationMarkConfig config = new ElevationMarkConfig(); config.ElevationMarkColor = Color.FromColorIndex(ColorMethod.ByAci, 5); config.ElevationMarkLayer = "OddzielnaWarstwaNaKoty"; IElevationMark elevationMark2 = markFactory1.CreateElevationMark(ElevationMarkTypes.archMark, config); try { while(true) { elevationMark1.Create(); } } catch (System.Exception ex) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message); } } [CommandMethod("KOTA_KONSTR")] public void ConstrElevationMark() { // tutaj wersja simply IElevationMarkFactory markFactory = new ElevationMarkFactory(AppSettings.Instance.DrawingStandard).GetFactory(); IElevationMark elevationMark = markFactory.CreateElevationMark(ElevationMarkTypes.constrMark); try { while(true) { elevationMark.Create(); } } catch (System.Exception ex) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message); } } Metoda w której wskazuję punkty wygląda tak: protected virtual void GetPoints() { Document acDoc = Application.DocumentManager.MdiActiveDocument; Application.SetSystemVariable("Osmode", 512); PromptPointOptions promptOptions = new PromptPointOptions("\nWskaż punkt wysokościowy: "); promptOptions.AllowNone = true; PromptPointResult pointResult = acDoc.Editor.GetPoint(promptOptions); if (pointResult.Status == PromptStatus.Cancel || pointResult.Status == PromptStatus.None) { throw new Exception("Cancel"); } elevationPoint = pointResult.Value; Application.SetSystemVariable("Osmode", 0); promptOptions.Message = "\nWskaż stronę : "; promptOptions.UseBasePoint = true; promptOptions.BasePoint = elevationPoint; pointResult = acDoc.Editor.GetPoint(promptOptions); if (pointResult.Status == PromptStatus.Cancel || pointResult.Status == PromptStatus.None) { throw new Exception("Cancel"); } side = GetSides(pointResult.Value); elevationPoint = new Point3d(Math.Round(elevationPoint.X, 3), Math.Round(elevationPoint.Y, 3), elevationPoint.Z); } Jak widać przy każdym oczekiwaniu na punkt jeżeli wciśnie się ESC lub ENTER pointResult otrzymuje status odpowiednio Cancel lub None. Wystarczy to sprawdzić i rzucić wyjątek który wywędruje aż do komendy startowej i tam dopiero zostanie obsłużony. Mój CommandMethod wygląda nieco dziwnie ale przy najbliższej okazji spróbuję wyjaśnić co się skąd wzięło. Następny ranek... Wygląda, że repozytorium https://github.com/Parikon/library1_zw jest zamknięte dla obcych commitów 😞 Edytowane 7 Grudnia 2018 przez perlon Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 7 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 7 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 7 Grudnia 2018 Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 Jakoś mi się udało zrobić forka library1_zw na swoim githubie. Jest tam stworzona gałąź wersji z moim kodem. https://github.com/Perlon001/library1_zw/tree/ForkPerlon/library1_zw Dnia 5.12.2018 o 10:42, Parikon napisał: 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. Myślałem że projekt byłby realizowany wspólnymi siłami, na zasadzie wspólnego zdobywania tzw. skill'a i trochę dla fanu, dając możliwość zwiększania funkcjonalności przy wspólnej pracy nad kodem. 1 godzinę temu, Parikon napisał: 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. Można robić osobne nie powiązane moduły do zadań konkretnych. Każdy sobie i tylko udostępniać na licencji MIT w warunkach "takie jakie jest" i jak chcesz to sobie je weź. Tylko że jak wymyślę nową super zarypistą kotę do oznaczania rzędnych na rzutach to najłatwiej byłoby ją umieścić w moule od kot. Ale żeby ją mieć to muszę sobie nową dll'kę zmajstrować. Ja tak bardzo nie jestem przywiązany do swojego kodu żebym miał się bronić przed jego poprawianiem. Tym bardziej, że git pozwala na tworzenie wielu odgałęzień wersji i ich scalaniu wedle uznania. Muszę tylko się tylko nauczyć Wracając do sedna. Korzystając z zaproszenia do współpracy postanowiłem zmodyfikować nieco podejście do tematu rysowania kot. Na forum kilkukrotnie (pozdrawiam MartinS) była dyskusja na temat stosowania norm również w oznaczeniach na rysunków. Dlatego wymyśliłem sobie, że użytkownik bezie miał możliwość wyboru systemu rysowania (wyboru dostępnej normy) i za pomocą tej samej komendy rysować różne koty. Ta filozofia zapewne może mieć zastosowanie w wielu innych aspektach. Koty to tylko przykład jak za pomocą kiedyś wymyślonych przez mądrych ludzi wzorców realizować tego typu zadania. W tym konkretnym przypadku do tworzenia koty w odpowiednim standardzie wykorzystałem wzorzec fabryka. Duża część kodu do tworzenia koty nawet nie wie jaką kotę tworzy. Klasa abstrakcyjna BaseElevationMark dostarcza implementację wspólną dla wszystkich kot wysokościowych. Klasy konkretne w kilku linijkach załatwiają tylko te rzeczy którymi koty się różnią. Na to wszystko nałożona jest fabryka która zwraca na żądanie klasę konkretną ukrytą za interfejsem. Zdaję sobie sprawę, że mój kod ani nie jest odkrywczy ani nie jest super och i ach. Dlatego wszelkie uwagi są na prawdę mile widziane. Zapewne w kodzie są błędy, których ja jako autor nie jestem w stanie dostrzec. Jest również wiele rzeczy do poprawienia i uzupełnienia których mam świadomość. Feedbek bardzo mile widziany a za zrypkę też się nie obrażę. Mam również świadomość, że ilość linijek może nie być mniejsza niż w kodzie podstawowej biblioteki library1_zw (nie sprawdzałem). Szukałem sposobu na możliwość szybkiej rozbudowy o nowe standardy, a kod żeby spełniał zasady programowania obiektowego. Kończąc ten przydługawy elaborat chciałbym dodać, że spodziewałem się współpracy na poziomie tworzenia/pisania kodu w celach edukacyjno/hobbystycznych z efektem praktycznym, ale wygląda na to że zamysł Parikona jest nieco inny. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 7 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 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ę. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 7 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 7 Grudnia 2018 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 9 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 9 Grudnia 2018 Już można aktualizować bazę z poziomu ZwCAD-a. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 10 Grudnia 2018 Zgłoś Udostępnij Opublikowano 10 Grudnia 2018 (edytowane) Pierwsze uruchomienie pi_ramki przynajmniej u mnie pokazuje pustą bazę. Można to sprawdzić usuwając fizycznie plik bazy i odpalić ponownie ramki. Można to również prosto naprawić jak poniżej. DataTable dt = baza.PobierzDaneTabeli(baza.nazwatabeli); int wierszy = dt.Rows.Count; if (wierszy == 0) { baza.GetData(); dt = baza.PobierzDaneTabeli(baza.nazwatabeli); // <- tu brakowało przypisania do dt } dataGrid.ItemsSource = dt.DefaultView; Tak na marginesie GetData() powinno się raczej nazywać InsertData(). GetData raczej sugeruje że coś pobieramy z bazy a nie że do niej coś wkładamy. Druga rzecz. W kodzie używasz kolumny Format funkcjonalnie jako klucza głównego choć formalnie kolumna takim kluczem nie jest. Po nim robisz update. Wykonaj taki eksperyment: - do istniejącej bazy dodaj nowy rekord o nazwie która już istnieje np. A0 o jakiś dziwnych wymiarach np. 200x200. Nowy rekord zostanie dopisany i będą dwa A0 o różnych wymiarach. potem jednemu z nich zmień wymiar. Zobacz co stanie się z drugim. Jeżeli kolumna format jest kluczem głównym to należałoby założyć na nią indeks typu UNIQUE. CREATE UNIQUE INDEX `ID` ON `ramki_dane` ( `Format` ASC ); nazwa ID jest zwyczajową, może być dowolna inna. Kolejność sortowania wedle uznania. Po tej operacji dodanie drugiego formatu A0 nie będzie możliwe ale operacja zakończy się błędem. Przed wywołaniem baza.DodajDaneDoTabeli(); należy sprawdzić istnienie formatu jaki chcemy dodać. Można taką kontrolę podpiąć pod właściwość Enabled przycisku tak aby przycisk OK był nieaktywny jeżeli format już występuje. Oczywiście trzeba najpierw wiedzieć czy jest to tryb dopisywania czy aktualizacji. Alternatywnie i takie rozwiązanie wydaje się najsensowniejsze z punktu widzenia odpytywania bazy danych można zamiast powyższego dodać dodatkową kolumnę z autoincrementem jako klucz główny CREATE TABLE `ramki_dane` ( `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, `Format` Varchar ( 50 ), `Wysokość` INT, `Długość` INT, `G-marg` INT, `D-marg` INT, `L-marg` INT, `P-marg` INT ); Każde dodanie nowego rekordu spowoduje ustawienie pola ID o 1 większego niż ostatni istniejący w bazie. Trzeba jednak w takim wypadku zmodyfikować nieco kwerendę INSERT. Zamiast db_cmd.CommandText = "INSERT INTO " + nazwatabeli + " VALUES ('A4','210','297','25','5','5','5')"; powinno się w insercie wskazać nazwy kolumn db_cmd.CommandText = "INSERT INTO " + nazwatabeli + "('Format', 'Wysokość', 'Długość', 'G-marg', 'D-marg', 'L-marg', 'P-marg') VALUES ('A4','210','297','25','5','5','5')"; Nie zawsze insert musi zawierać komplet kolumn. Taki insert jest również poprawny. Brakującym polom zostaną nadane wartości domyślne jeżeli w bazie zostaną zadeklarowane. db_cmd.CommandText = "INSERT INTO " + nazwatabeli + "('Format', 'Wysokość', 'Długość') VALUES ('A4','210','297')"; Jeżeli w przyszłości powstanie pomysł zbudowania w bazie relacji miedzy dwoma różnymi tabelami to PRIMARY KEY stanie się niezbędny. Wszak SQLite jest relacyjną bazą danych więc jest więcej niż pewne że tak się kiedyś stanie. Nie wiem dlaczego nie mogę debugować kodu z WPF'em w dll'ce ładowanej do ZwCAD'a. Poradziłem sobie zakładając nowy projekt okienkowy WPF z oknem głównym aplikacji okienkowej i do niej wrzuciłem kontrolkę UserControl1. Uzyskałem zwykłą aplikację okienkową którą mogę debugować bez konieczności ładowania do środowiska ZwCAD. Może komuś się przyda jeżeli zechce debugować kody pisane w tym wątku. Z kosmetycznych rzeczy to warto dla bibliotek ZwCAD'a ustawić Copy Local na false, żeby się niepotrzebnie nie kopiowały do kartoteki bin. I tak mając zainstalowanego ZwCAD'a są dostępne globalnie. I jeszcze jedna uwaga kosmetyczna. Kod lepiej wygląda jak się stosuje jednolitą konwencję językową. DodajDaneDoTabeli() OK UpdateDaneWTabeli() już wygląda źle. Powinno być AktualizujDaneWTabeli(). AddBaseIfNotExist() też jest OK ale stosowanie równolegle polskiego i angielskiego nazewnictwa jest takie sobie. Polski język słabo się nadaje do jednoznacznego określania co dana metoda ma faktycznie robić albo jaka jest odpowiedzialność danej klasy. Takie rzeczy nazwa powinna wskazywać raczej precyzyjnie a polski język ma niestety w tym zakresie swoje mankamenty. Edytowane 10 Grudnia 2018 przez perlon Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Parikon Opublikowano 10 Grudnia 2018 Autor Zgłoś Udostępnij Opublikowano 10 Grudnia 2018 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. Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
perlon Opublikowano 10 Grudnia 2018 Zgłoś Udostępnij Opublikowano 10 Grudnia 2018 (edytowane) Myślałem o debugowniu z poziomu VS i wykonywaniu aplikacji w trybie krokowym. Znalezienie braku przypisania dt = baza.PobierzDaneTabeli(baza.nazwatabeli); // <- tu brakowało przypisania do dt bez debuggera zabrałoby mnóóóóóóóóstwo czasu. A można np tak: Dla aplikacji WPF mam niestety taki zonk : Aplikacje z Windows Forms nie mają z tym problemu. Może ktoś coś wie na ten temat? Edytowane 10 Grudnia 2018 przez perlon Cytuj Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
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ą.