Cała aktywność

Kanał aktualizowany automatycznie     

  1. Ostatni tydzień
  2. oops.. moja przeglądarka nie wyświetlaiła całosci zawartości pliku nie wnikam dlaczego. Lisp działa i robi co należy, przepraszam za zamieszanie. Dla zainteresowanych to lisp do wygenetowania pliku, który służy do własciwego podczytania exportowanego wmf-a, tj we właściwych współrzędnych i właściwej skali. Ten wmf służy mi potem do podczytania do programu SWMM (EPAnet też).
  3. kruszynski

    export do wmf_pytanie za 5 punktów

    Musimy robić coś inaczej, bo u mnie lisp działa. To co wkleiła Pani w treści to tylko początek lispa. cały dodałem w załączniku. Po jego uruchomieniu powstał plik mfw. Załączam też plik wynikowy. Co tutaj jest inaczej niż powinno być? WMF_World.lsp Droga_full.mfw
  4. Witam! Przepraszam,że się nie odzywałem ale byłem trochę zajęty. w załączeniu przesyłam to co znajduję się w wspomnianym przez Pana pliku.
  5. Tiaaaa.... proszę admina o wywalenie wątku w niebyt. Jeżeli nie to sam sobie odpowiem. Ślepota własna. Nie odblokowałem tablicy do zapisu. TTable symbolTable = (TTable)transaction.GetObject(GetObjectId(acDatabase, typeof(TTable)), mode: OpenMode.ForRead); // <- tylko do odczytu if (!symbolTable.Has(symbol.Name)) { symbolTable.UpgradeOpen(); // <- togo brakowało symbolTable.Add(symbol); transaction.AddNewlyCreatedDBObject(symbol, true); transaction.Commit(); }
  6. Witam. Zderzyłem się z programistycznym problemem niekoniecznie związanym ściśle z ZwCAD'em ale wyszedł akurat przy programie na tą platformę. Prawdopodobnie jest to problem bardziej ogólny. Mam klasę generyczną która ma za zadanie sprawdzić czy w tablicy symboli istnieje przekazany symbol. Jeżeli nie to powinna ten symbol w tej tablicy utworzyć. public abstract class SymbolGenerator<TTable> : ISymbolGenerator where TTable : SymbolTable { public abstract void Generate(); public void Generate<TSymbol>(TSymbol symbol) where TSymbol : SymbolTableRecord { Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acDatabase = acDoc.Database; using (Transaction transaction = acDoc.TransactionManager.StartTransaction()) { TTable symbolTable = (TTable)transaction.GetObject(GetObjectId(acDatabase, typeof(TTable)), mode: OpenMode.ForRead); if (!symbolTable.Has(symbol.Name)) { symbolTable.Add(symbol); // <- tu się wywala transaction.AddNewlyCreatedDBObject(symbol, true); transaction.Commit(); } } } private ObjectId GetObjectId(Database db, Type type) { switch(type.Name) { case "LayerTable": return db.LayerTableId; case "TextStyleTable": return db.TextStyleTableId; default: throw new NotSupportedException(); } } } Jak widać klasa powinna sobie poradzić z każdą tablicą symboli. Mnie w szczególności interesują LayerTable i TextStyleTable. Po przekazaniu innej ma rzucić wyjątek. Klasa jest abstrakcyjna więc potrzebuję klasy konkretnej. Przykładowa klasa do obsługi jakiegoś stylu tekstu. Klasa dziedziczy po SymbolGenerator<TextStyleTable> jak widać oczekuje typu TextStyleTable public class ElevationMarkTextStyleGenerator : SymbolGenerator<TextStyleTable>, IElevationMarkTextStyleGenerator { public override void Generate() { TextStyleTableRecord style = new TextStyleTableRecord(); style.Name = "ck_koty"; style.FileName = "simplex.shx"; style.XScale = 0.65; style.ObliquingAngle = 0; Generate(style); } } Wywołanie proste: var generator = new ElevationMarkTextStyleGenerator(); generator.Generate(); Application does not support just-in-time (JIT) debugging. See the end of this message for details. ************** Exception Text ************** System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception. at ZcDbSymbolTable.add(ZcDbSymbolTable* , ZcDbObjectId* , ZcDbSymbolTableRecord* ) at ZwSoft.ZwCAD.DatabaseServices.SymbolTable.Add(SymbolTableRecord value) at CADKitCore.Contract.SymbolGenerator`1.Generate[TSymbol](TSymbol symbol) in D:\dev\CSharp\Workspace\CADKit\CADKit\Contract\SymbolGenerator.cs:line 21 at CADKitElevationMarks.Model.ElevationMarkTextStyleGenerator.Generate() in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ElevationMarkTextStyleGenerator.cs:line 17 at CADKitElevationMarks.Contract.BaseElevationMark..ctor(IElevationMarkConfig _config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Contract\BaseElevationMark.cs:line 44 at CADKitElevationMarks.Model.ArchtecturalElevationMarkPNB01025..ctor(IElevationMarkConfig config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ArchtecturalElevationMarkPNB01025.cs:line 16 at CADKitElevationMarks.Model.ElevationMarkFactoryPNB01025.GetElevationMark(ElevationMarkType type, IElevationMarkConfig config) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Model\ElevationMarkFactoryPNB01025.cs:line 15 at CADKitElevationMarks.Contract.ElevationMarkFactory.GetElevationMark(ElevationMarkType type) in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Contract\ElevationMarkFactory.cs:line 15 at CADKitElevationMarks.Commands.ElevationMarkArch() in D:\dev\CSharp\Workspace\CADKit\CADKitElevationMarks\Commands.cs:line 17 at ZwSoft.ZwCAD.Runtime.CommandClass.InvokeHelper(MethodInfo mi, Object commandObject, Boolean bLispFunction) at ZwSoft.ZwCAD.Runtime.CommandClass.InvokeHelperWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction) Prawdę mówiąc nie wiem co robię nie tak. Może znajdzie się ktoś bieglejszy, kto mi to wyjaśni?
  7. Bartek1977

    tryb orto 2017

    ZWCAD 2019, SP1 To ja już nie wiem o co chodzi 😕 Sprawdzałem dokładnie na dwóch komputerach, jeden z windowsem 7, drugi z 10. Jedna myszka, to ta co podałem powyżej, druga A4TECH EVO XGame Laser Oscar X740. Na obydwu to samo. Etykieta znika, linia odniesienia dalej jest widoczna. A czy ktoś z forumowiczów zauważył u siebie ten problem?
  8. Parikon

    Przybornik PARIKON

    Moduł można dalej dopieszczać. Jednakże najważniejsze jest to, aby rysował ramki. Wstawiłem resztę kodu, który narysuje ramki.
  9. ale to nadal nie jest obiekt "siedzący" we współrzędnych. ew może coś takiego jak plik odniesienie do współczędnych, rozwiązanie takie jak tu : https://www.openswmm.org/Topic/4532/importing-data-from-autocad lisp podany tam w zw nie działa więc nie mam jak sprawdzić czy da się procedurę podana tam zastosować (defun C:WMF_World ( / MyScreenSize ScreenX ScreenY MyAspectRatio ViewHeight HalfView) ; KJMcRae - UMA Engineering Ltd. - July 2005 ; Write world file for use with Windows Meta File (or .tiff, .jpg, etc) (setvar "cmdecho" 0) ; Screen size in pixels (setq MyScreenSize (getvar "screensize")) (setq ScreenX (float (car MyScreenSize))) (setq ScreenY (float (cadr MyScreenSize))) a tu akapit z help-a swmm dotycz składni pliku "coord file": World Coordinates File If a "world" file exists for the image, enter its name here, or click the button to search for it. A world file contains geo-referencing information for the image and can be created from the software that produced the image file or by using a text editor. It contains six lines with the following information: Line 1:real world width of a pixel in the horizontal direction. Line 2:X rotation parameter (not used). Line 3:Y rotation parameter (not used). Line 4:negative of the real world height of a pixel in the vertical direction. Line 5:real world X coordinate of the upper left corner of the image. Line 6:real world Y coordinate of the upper left corner of the image. If no world file is specified, then the backdrop will be scaled to fit into the center of the map display window.
  10. Bartek1977

    tryb orto 2017

    A4tech evolution oscar x710
  11. pawmal

    tryb orto 2017

    Jaki posiada Pan model myszy? Testowaliśmy to na trzech stanowiskach z różnymi dpi myszy i ani razu nie udało się uchwycić takiego przypadku.
  12. Parikon

    Przybornik PARIKON

    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.
  13. perlon

    Przybornik PARIKON

    Nawiasy kwadratowe są potrzebne tylko w kolumnach które maja minus bo baza próbuje wykonać operację G minus marg. W klamerkach przyjmuje całość jako identyfikator. Jak widać poniżej w innych przypadkach nawiasy nie są potrzebne. Jak widzisz w kontrolkach musiałeś już użyć podkreślenia bo minus jest niedopuszczalny. Nazwy kolumn w bazach z polskimi literami nie wyglądają dobrze. Nagłówki w gridzie możesz ustawić osobno już z śćźł jak tam chcesz ale w bazie lepiej trzymać kolumny bez polskich liter. Masz wersję kwerendy która robi update w jednym kroku. U mnie bez nawiasów działa. public void ZmienDaneWTabeli() { this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "update " + nazwatabeli + " set " + "Format='" + UserControl2.nazwaformatki + "'," + "Wysokość='" + UserControl2.wysokosc + "'," + "Długość='" + UserControl2.dlugosc + "'," + "[G-marg]='" + UserControl2.G_marg + "'," + "[D-marg]='" + UserControl2.D_marg + "'," + "[L-marg]='" + UserControl2.L_marg + "'," + "[P-marg]='" + UserControl2.P_marg + "' " + "where Format='" + UserControl1.formatka + "'"; db_cmd.ExecuteNonQuery(); db_con.Close(); }
  14. Parikon

    Przybornik PARIKON

    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";
  15. perlon

    Przybornik PARIKON

    W uzupełnieniu: https://pl.wikipedia.org/wiki/SQL_injection https://www.plukasiewicz.net/Artykuly/SQLInjection_dla_poczatkujacych Ale dla tego typu zastosowań może nie warto za bardzo się ścierać. Moje propozycja : public bool CzyPowtorka(string nazwa) { this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "select count() from " + nazwatabeli + " where [Format] = '" + nazwa + "'"; var result = (long)db_cmd.ExecuteScalar(); db_con.Close(); return result > 0; } a dla pobierania danych z tabeli ramki_dane db_cmd.CommandText = "select * from " + nazwa_tabeli + " order by format desc"; Ponadto jeszcze jedna uwaga. DataTable dt = baza.PobierzDaneTabeli(baza.nazwatabeli); Skoro wywołujesz metodę PobierzDaneTabeli() klasy Base to instancja baza zna pole nazwatabeli. Nie ma sensu pobieranie z instancji jakiegoś pola po to żeby przekazać je z powrotem jako argument metody tej samej instancji. powinno być : DataTable dt = baza.PobierzDaneTabeli(); public DataTable PobierzDaneTabeli1() { var dt = new DataTable(); this.db_con.Open(); SQLiteCommand db_cmd = db_con.CreateCommand(); db_cmd.CommandType = CommandType.Text; db_cmd.CommandText = "select * from " + this.nazwatabeli + " order by format desc"; db_cmd.ExecuteNonQuery(); SQLiteDataAdapter da = new SQLiteDataAdapter(db_cmd); da.Fill(dt); this.db_con.Close(); return dt; } a nazwa tabeli skoro jest zmienną publiczną powinna być ustawiana w konstruktorze klasy. Są dwa konstruktory żeby działało po staremu w reszcie kodu. public Base(string _path) : this(_path, "ramki_dane") { } public Base(string _path, string _table) { this.nazwatabeli = _table; this.path = _path + "\\Bazy"; string sciezkaBaza = this.path + "\\pi.sqlite"; this.db_con = new SQLiteConnection($"Data Source = {sciezkaBaza}; Version = 3"); }
  16. Bartek1977

    tryb orto 2017

    Też trochę potestowałem i zauważyłem, że im większe DPI myszki, tym łatwiej uzyskać "efekt" znikającej etykiety. DPI = 600 lub 800 - kilka razy się zdarzyło, 1200-1600 - dużo częściej, 3200 - prawie non-stop. Większe DPI to większy kąt. Na załączonym screenie DPI=3200
  17. perlon

    Przybornik PARIKON

    W bazach relacyjnych zakłada się, że kolejność rekordów jest taka jak kolejność dodawania. Odpowiednie sortowanie załatwia się klauzulą ORDER BY na etapie wyciągania danych z bazy a nie w momencie wstawiania. ORDER BY załatwia że zanim baza zwróci wynik zapytania to go najpierw posortuje. SELECT * FROM ramki_dane WHERE `jakis_filtr` ORDDER BY `Format` Oczywiście WHERE nie będzie jak chcesz wyciągnąć wszystkie rekordy. Żeby było bazie lżej zakłada się na kolumny indeksy. Są one aktualizowane przy każdym INSERT, DELETE i UPDATE. Indeksów może być wiele. Baza jest inteligentna i jeżeli uzna, że przy sortowaniu warto użyć jakiegoś indeksu to go użyje. Jeżeli nie znajdzie dobrego indeksu zastosuje ogólne metody sortowania. ORDER BY może zawierać łączenia pól np. ORDER BY `jakies_pole`+`inne_pole` Uwaga. Zapytania realizują również operacje matematyczne więc wartości liczbowe zostaną dodane i należy kontrolować typy. Może być np wymagana konwersja pola w samej kwerendzie. Ogólna uwaga ExecuteNonQuery() stosuje się do INSERT, UPDATE i DELETE. Do SELECT powinno się użyć ExecuteReader() dla zestawów i ExecuteScalar() gdy kwerenda zwraca dokładnie jedną daną. Taką kwerendą jest np SELECT COUNT() ... Zapuść sobie takie zapytanie w DB Browser SQLita to zobaczysz że danych z bazy można wyciągać mniej i osiągnąć ten sam rezultat. Generalnie wiele rzeczy da się zrobić po stronie bazy a w programie już tylko durne wyświetlanie gotowych zestawów posortowanych, pofiltrowanych, pogrupowanych i co tam jeszcze.
  18. dmatusz3

    export do wmf_pytanie za 5 punktów

    W wersji 2018 została dodana wektorowa systemowa drukarka SVG, które to pliki czyta Word. W wersji 2019 SP1 została dodana drukarka EMF, która (mówiąc w zaokrągleniu) jest następcą WMF. Drukuje się na nich tak jak na zwykłą drukarkę. Wydruk SVG po czytaniu do Worda możemy przekształcić na obiekty rysunkowe. Oto plik po wydruku przekształcony na obiekty rysunkowe Worda drukarka-svg.docx
  19. Parikon

    Przybornik PARIKON

    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"
  20. jak sie robi export dwga do wmf-a w zw2018 tak by "siedział" we współrzędnych (word) i był we własciwej skali (w zasadzie ucieszyła by mnie choć właściwa skala). jak na razie export wychodzi mi tak jak sie ekran wyskaluje..
  21. perlon

    Przybornik PARIKON

    Warunek if(wierszy > 0) i for(int = 0; i < wiersz; i++ ) są tożsame. if jest niepotrzebny, bo jeżeli wierszy == 0 to 0 < 0 = false i pętla for się nie wykona ani razu. Na razie baza jest mikro i czas wykonania będzie nie mierzalny, ale co do zasady tego tak nie wolno robić !!! Co się stanie jak rekordów będzie 1000 000? To powinno się załatwić : SELECT COUNT() FROM ramki_dane WHERE format='jakis_format_z_pola_tekstowego' Jeżeli zwróci 0 to nie ma rekordu w przeciwnym razie wiadomo. Niech się baza męczy a nie twoja aplikacja. Generalnie SELECT * FROM ... bez WHERE to bardzo zła metoda. Zgadza się, ale lepiej żeby baza broniła się sama niż ma ją bronić zewnętrzna aplikacja. Wewnętrzne mechanizmy i algorytmy bazy będą zawsze lepsze niż iterowanie rekordów w aplikacji. Polecam indeks UNIQUE albo PRIMARY KEY
  22. Parikon

    Przybornik PARIKON

    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.
  23. pawmal

    tryb orto 2017

    Testowaliśmy to przy wyłączonym wprowadzaniu dynamicznym.
  24. Bartek1977

    tryb orto 2017

    A mieliście włączone wprowadzanie dynamiczne? Jeżeli jest włączone, to etykieta nie znika.
  25. perlon

    Przybornik PARIKON

    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?
  26. pawmal

    tryb orto 2017

    Sprawdzaliśmy to przez 15 min na dwóch komputerach i nie udało się powtórzyć takiego stanu, aby była wyświetlona sama linia śledzenia bez etykiety.
  1. Pokaż więcej elementów aktywności