perlon

Użytkownik forum
  • Postów

    434
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    36

Treść opublikowana przez perlon

  1. Budowanie bazy na potrzeby zestawień bez otwierania rysunków jest ciekawą koncepcją. Może warto przemyśleć wprowadzenie mechanizmu oznaczania elementów zatwierdzonych/skończonych czy jak tam inaczej tak żeby baza miała świadomość czy element jest w obróbce czy nie. Ponadto z całą pewnością będzie potrzebny mechanizm podziału i łączenia baz z różnych katalogów. Sprawa na pewno się skomplikuje. Może się wykluć z tego coś ciekawego. Ja jednak skłaniałbym się w kierunku nadrzędności obiektu graficznego nad wpisem w zewnętrznej bazie danych i wprowadzeniu silnego powiązania bloków opisu pręta z rekordami w bazie danych. To powiązanie może być dwukierunkowe (kierunek DB->CAD wymagałby jednak otwarcia rysunku, kierunek CAD->DB oczywiście jest zawsze aktywny). Niemniej jednak no, no. Robi się coraz ciekawiej. Co do norm, ja również nie jestem fanatykiem. Po to są nieobowiązkowe, żeby z nich móc korzystać, a nie musieć korzystać ;-)
  2. Powiem tak. Fajnie to wygląda, być może jest interesujące od strony programistycznej, ale oderwanie informacji o prętach od obiektu rysunkowego to chyba zły kierunek. Czemu miałaby służyć baza danych o prętach? Do szybkiego generowania zestawień? Jedyna chwila w której się spotyka baza z narysowanym prętem to skopiowanie do schowka długości pręta po opisaniu długości. Po co używać pośrednika od pręta do jego opisu w postaci dodatkowej w dodatku zewnętrznej w stosunku do dwg bazy danych? Ponadto powstanie opisu pręta jest wykonywane w dwóch krokach zamiast w jednym. Jeżeli jest jakiś istotny powód utrzymywania takiej bazy to proponowałbym wykonywanie wpisu do niej w momencie osadzenia opisu pręta na rysunku. Taki opis ma swój unikalny uchwyt (identyfikator), który mógłby posłużyć do automatycznej edycji opisu przy zmianie zapisów w bazie danych. Takiego efektu na filmiku nie widać. Fajnie że działa, ale zastanawiam się nad tzw. "flow" aplikacji. Jaka jest filozofia a tym samym jaki jest cel i którędy wiedzie droga do jego osiągnięcia. Nie jest to dla mnie jasne a tym samym wydaje się nie użyteczne. Dlatego może kilka słów objaśnienia?
  3. Odpowiedź (dotyczy wersji EN): 1. Wybieram arkusz LPM (jest aktywny) 2.PPM - Plot... 3. Ustawiam to co trzeba (również z podglądem efektu) 4.Apply to Layout 5.Cancel - zamknięcie z okna bez plotowania
  4. Ze strony ZwSOFT ściągany dzisiaj o godz.10:13 EN x64 VERNUM = "2017.12.05(24685)_x64" (read only)
  5. Faktycznie 3P działa. Nie zmienia to faktu, że w SP1 babola nie poprawili.
  6. VERNUM = "2017.12.05(24685)_x64" (read only) Filtrów współrzędnych .X, .Y, .Z ... dalej nie ma
  7. VERNUM = "2017.12.05(24685)_x64" (read only) Niestety listy nadal są niepotrzebnie zbyt szerokie. A można by od biedy zastosować rozwiązanie z listy warstw. Rozwinięta lista jest szersza niż pole combo w pasku ikon ale i tak zawiera dodatkową niepotrzebną pustą przestrzeń. Wygląda to taj jakby wszystkie listy dostawały zbędny margines.
  8. Co do sposobu działania taki sposób jest wg ergonomiczny. Pokazać coś co jest wstawiane i dać możliwość ostatecznego osadzenia. O to chodziło Z uwag zupełnie pobocznych jako gadżety: 1. Dodałbym jeszcze możliwość wstawiania znacznika widoku wskazując kierunek prostopadły do strzałki (pomocne np. przy wskazywaniu widoku na ścianę nie używając osnapa perpendicular ) 2. Programowo uniemożliwiłbym stosowanie oznaczenia "I".. U na w biurze jest zakaz stosowania litery "I" w oznaczeniach osi, przekrojów i widoków.
  9. Obawiam, się, że w tym przypadku jest jak z mechanikiem samochodowym. Klient mówi, ze stuka mu w podwoziu. Staje gość przed podniesioną maską i drapie się w beretkę. Następnie wymienia akumulator. Klient zdziwiony ale nic. Potem mechanik wymienia alternator. Klient pyta dlaczego. Mechanik : Najpierw wymienimy wszystkie części na A, potem na B potem na C itd. W końcu stuki muszą ustąpić.
  10. Ostatnio coś więcej rysuje w 2018 i powiem szczerze, że niedomaganie PPM jest bardzo irytujące. Nigdy nie jestem pewien czy faktycznie zwcad przyjął klik i w jakim etapie komendy jestem. Zdarza się to trochę częściej niż sporadycznie. Jak mam ciśnienie czasowe to wracam do 2015. Tu PPM jest zdeterminowany czyli działa zgodnie z przewidywaniami.
  11. Winna jest domyślna projekcja typów. Zamień (setq stap1 (/ (* 100 stat1) n)) na (setq stap1 (/ (* 100.0 stat1) n)) i w następnych wierszach a zobaczysz różnicę
  12. Tak dokładnie. W 2015 jest tak: Command: _UCS Currently in World UCS. Specify origin of UCS or [?/Face/3point/Delete/OBject/Origin/Previous/Restore/Save/View/X/Y/Z/ZAxis/World] <World>: Z Enter angle of rotation about Z axis <90>: W tym momencie można podać z łapy kąt lub wskazać punkt początkowy wektora osi X a następnie punkt końcowy tego wektora W 2018 Command: _UCS Currently in World UCS. Specify origin of UCS or [?/Face/3point/Delete/OBject/Origin/Previous/Restore/Save/View/X/Y/Z/ZAxis/World] <World>: Z Enter angle of rotation about Z axis <90>: Ale w tym momencie punkt bazowy wektora jest już wskazany i możemy podać z łapy kąt albo drugi punkt wektora osi X.
  13. VERNUM = "2017.10.09(22328)_x64_S" (read only) W dalszym ciągu przy UCS obróconym po Z o 90 stopni nie da się wymiarować.
  14. VERNUM = "2017.10.09(22328)_x64_S" (read only) W dalszym ciągu przy obrocie _ucs -> Z jest przyjmowany domyślny punkt obrotu 0,0. powinien pytać o punkt obrotu i drugi punkt wektora osi X. Od lutego bug nie usunięty.
  15. Moje rozwiązanie jest zbudowane na potrzeby innych lispów, tak aby mogły się odwoływać do warstw poprzez zmienne. Konkretne nazwy są zapisane w zewnętrznym pliku *.ini. Zaznaczam że kody pochodzą sprzed kilku(nastu) lat i dzisiaj pewnie napisałbym to trochę inaczej, ale lepsze jest wrogiem dobrego ;-). (defun SetLayers (/ temp systemEnv oHandle xName eObject IniList IniFile) (setq systemEnv (cd:ENV_SaveEnvVariable)) (setvar "cmdecho" 0) (setvar "regenmode" 0) (setq *layerKontur* "kontur" *layerOsie* "osie" *layerUkryte* "ukryte" *layerOpisy* "opisy" *layerWymiary* "wymiary" *layerStolarka* "stolarka" *layerCienkie* "cienkie" *layerHatche* "hatche" *layerPrety* "prety" *layerObok* "obok" *layerRzutnie* "rzutnie" *layer3DModel* "3D_model" IniFile (findfile "dodatki.ini") ) (setq IniList (if (not IniFile) (list) (cd:INI_Read IniFile))) (or IniFile (setq IniFile (strcat *cd-ApplicationPath* "dodatki.ini"))) (setq IniList (add_gr_ini IniList "[Layers]")) (if (setq temp (get_ini IniList "[Layers]" "kontur")) (setq *layerKontur* temp) (setq IniList (set_ini IniList "[Layers]" "kontur" *layerKontur*)) ) (if (setq temp (get_ini IniList "[Layers]" "osie")) (setq *layerOsie* temp) (setq IniList (set_ini IniList "[Layers]" "osie" *layerOsie*)) ) (if (setq temp (get_ini IniList "[Layers]" "ukryte")) (setq *layerUkryte* temp) (setq IniList (set_ini IniList "[Layers]" "ukryte" *layerUkryte*)) ) (if (setq temp (get_ini IniList "[Layers]" "opisy")) (setq *layerOpisy* temp) (setq IniList (set_ini IniList "[Layers]" "opisy" *layerOpisy*)) ) (if (setq temp (get_ini IniList "[Layers]" "wymiary")) (setq *layerWymiary* temp) (setq IniList (set_ini IniList "[Layers]" "wymiary" *layerWymiary*)) ) (if (setq temp (get_ini IniList "[Layers]" "stolarka")) (setq *layerStolarka* temp) (setq IniList (set_ini IniList "[Layers]" "stolarka" *layerStolarka*)) ) (if (setq temp (get_ini IniList "[Layers]" "cienkie")) (setq *layerCienkie* temp) (setq IniList (set_ini IniList "[Layers]" "cienkie" *layerCienkie*)) ) (if (setq temp (get_ini IniList "[Layers]" "hatche")) (setq *layerHatche* temp) (setq IniList (set_ini IniList "[Layers]" "hatche" *layerHatche*)) ) (if (setq temp (get_ini IniList "[Layers]" "prety")) (setq *layerPrety* temp) (setq IniList (set_ini IniList "[Layers]" "prety" *layerPrety*)) ) (if (setq temp (get_ini IniList "[Layers]" "obok")) (setq *layerObok* temp) (setq IniList (set_ini IniList "[Layers]" "obok" *layerObok*)) ) (if (setq temp (get_ini IniList "[Layers]" "rzutnie")) (setq *layerRzutnie* temp) (setq IniList (set_ini IniList "[Layers]" "rzutnie" *layerRzutnie*)) ) (if (setq temp (get_ini IniList "[Layers]" "3D_model")) (setq *layer3DModel* temp) (setq IniList (set_ini IniList "[Layers]" "3D_model" *layer3DModel*)) ) (cd:INI_Write IniList IniFile) (setq xName (cond ((= *cd-AppType* "ZWCAD") "zwcad.lin") (t "acad.lin") ) ) (cd:ACX_LoadLineType "dashed" xName) (cd:ACX_LoadLineType "dashdot" xName) (cd:ACX_LoadLineType "hidden2" xName) (cd:ACX_LoadLineType "center2" xName) (foreach xName (list (list *layerKontur* "continuous" 2 T) (list *layerOsie* "center2" 1 T) (list *layerUkryte* "hidden2" 1 T) (list *layerOpisy* "continuous" 7 T) (list *layerWymiary* "continuous" 1 T) (list *layerStolarka* "continuous" 3 T) (list *layerCienkie* "continuous" 1 T) (list *layerHatche* "continuous" 254 T) (list *layerPrety* "continuous" 5 T) (list *layerObok* "continuous" 9 T) (list *layerRzutnie* "continuous" 60 T) (list *layer3DModel* "continuous" 94 T) ) (setq eObject (cd:ACX_AddLayer (nth 0 xName))) (vla-put-linetype eObject (nth 1 xName)) (vla-put-color eObject (nth 2 xName)) (vla-put-plottable eObject (nth 3 xName)) ) (cd:ENV_RestEnvVariable systemEnv) ) Jak widać ja wczytuję linie z zwcad.lin ale jest to identyczny plik jak zwcadiso.lin. Nie wiem po co są dublowane. Sam plik ini jest banalny ale wydaje się, że użycie takiego sposobu jest łatwiejsze do użycia dla koleżanek i kolegów w biurze, którzy do LISPA trochę z pazurami podchodzą. [Layers] kontur=kontur osie=osie ukryte=ukryte opisy=opisy wymiary=wymiary stolarka=stolarka cienkie=cienkie hatche=hatche prety=prety obok=obok rzutnie=rzutnie 3D_model=3D_model Dzięki dmatusz3 za swoje rozwiązanie, bo chyba tym wzorem dorzucę sobie do ini również ustawienie linetype, color etc. Przy okazji, jak widać używam CADPL-Pack-v1, którego gorąco polecam. Na koniec jeszcze pokażę reaktora na komendy co zwalnia mnie z pamiętania o zmianach warstw w trakcie rysowania. Jest to z małymi poprawkami do ZwCAD'a kod Andrzeja Gumuły na co jest odpowiedni (c) w kodzie. Zdaje się, że na forum było pokazywane inne rozwiązanie chyba nieco mniej rozwlekłe, ale to mi działa i na razie tego nie zmieniam. ;;;* Funkcje ustanawia reaktor do zmiany warstwy dla wyszczególnionych komend (defun SetLayInCom (layer commandslist) (if (= (getvar "PRODUCT") "ZWCAD") (progn (vlr-remove-all :VLR-Command-Reactor) (vlr-command-reactor nil '((:vlr-commandwillstart . bylayer) (:vlr-commandended . previous) (:vlr-commandcancelled . previous) (:vlr-commandfailed . previous) ) ) ) (progn (if (not globalcommandslist) ; zabezpiecza przed ponowną deklaracją reaktora (vlr-command-reactor ; przy ponownym wczytaniu lisp'a nil '((:vlr-commandwillstart . bylayer) (:vlr-commandended . previous) (:vlr-commandcancelled . previous) (:vlr-commandfailed . previous) ) ) ) ) ) (mapcar '(lambda (x) (set x nil)) '(reactorlayer reactorcolor reactorltype reactorlweight) ) (mapcar '(lambda (x y) (set x y)) '(globalcommandslist globallayer) (list commandslist layer) ) (foreach x layer (if (not (tblsearch "LAYER" x)) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 x) '(70 . 0) '(62 . 7) '(6 . "Continuous") '(370 . -3) ) ) ) ;end if ) ;end foreach (defun bylayer (idreactor namecommand / komendy licznik) (setq licznik 0) (foreach komendy globalcommandslist (if (member (strcase (car namecommand)) (mapcar 'strcase komendy) ) (progn (if (not (and reactorlayer reactorcolor reactorltype reactorlweight ) ) (mapcar '(lambda (x y) (set x (getvar y))) '(reactorlayer reactorcolor reactorltype reactorlweight) '("clayer" "cecolor" "celtype" "celweight") ) ) ; end if (mapcar '(lambda (x y) (setvar x y)) '("clayer" "cecolor" "celtype" "celweight") (list (nth licznik globallayer) "256" "Bylayer" -1) ) ) ) ;end If (setq licznik (1+ licznik)) ) ;end foreach ) ;end ByLayer (defun previous (idreactor namecommand / komendy licznik) (setq licznik 0) (foreach komendy globalcommandslist (if (member (strcase (car namecommand)) (mapcar 'strcase komendy ) ) (progn (if (and reactorlayer reactorcolor reactorltype reactorlweight) (mapcar '(lambda (x y) (setvar x y)) (list "clayer" "cecolor" "celtype" "celweight") (list reactorlayer reactorcolor reactorltype reactorlweight ) ) ) (mapcar '(lambda (x) (set x nil)) '(reactorlayer reactorcolor reactorltype reactorlweight) ) ) ) (setq licznik (1+ licznik)) ) ;end cond ) ;end Previous t (prompt "SetLayInCom (C)2003 Andrzej Gumuła.") (princ) ) ;end file Na koniec wywołanie w kodzie startowym i mamy piękny reaktor na dowolne komendy jakie sobie dopiszemy. (setlayincom (list *layerWymiary* *layerHatche* *layerOsie* *layerCienkie* *layerOpisy*) '( ("DIMLINEAR" "DIMALIGNED" "DIMRADIUS" "DIMDIAMETER" "DIMANGULAR" "DIMORDINATE" "DIMCONTINUE" "DIMBASELINE" "QDIM" "DIMJOGGED" "DIMARC") ("BHATCH") ("DIMCENTER") ("QLEADER") ("DTEXT" "TEXT") ) )
  16. Okno wyboru kartoteki w dalszym ciągu stare i sortuje niepoprawnie :-( ZwCAD2018 VERNUM = "2017.10.09(22328)_x64_S" (read only)
  17. Ja właśnie go używam. Jest bardzo dobry. problemy z prt scr były przejściowe więc załączam zrzuty. Do porównania za jednostkę długości przyjąłem szerokość standardowej ikony w pasku. W ZwCAD2015 cały pasek zajmuje ok 23 ikon, w 2018 28 ikon. Po rozwinięciu przykładowej listy grubości linii widać wyraźnie zbędne puste pole po prawej stronie zawartości listy, jak również przykładowe linie nie muszą być takie długie. Sama lista ma w 2015+ szerokość 4 ikon, a w 2018 8 ikon. Wg mnie czyste marnotrawstwo. Rozumiem, ekrany panoramiczne 3x szersze niż wyższe lobby producentów monitorów i te sprawy ;) Może jednak da się coś z tym zrobić?
  18. W najnowszej wersji 2018 w dalszym ciągu brakuje w menu podręcznym filtrów współrzędnych .X, .Y, .Z ... Czy jest w ogóle szansa na dołączenie tej funkcjonalności do menu pod SPM
  19. Witam. Mam raczej ogólne pytanie do UI. Czy jest możliwość zmiany wymiarów list rozwijalnych umieszczonych w toolbarsach? W szczególności chodzi mi o zmniejszenie szerokości list rozwijalnych w toolbarsie Properties. W wersji 2018 są one szersze niż w 2015+ - uważam że niepotrzebnie. Chciałem załączyć zrzut ekranu, ale dziwnym trafem jak mam focusa na ZwCAD2018 to nie działa klawisz PRT SCR. Na starszej wersji jest ok. Tak jakby ZwCAD2018 przechwytywał obsługę klawisza prt scr. To tak jako drugi temat , być może do przeniesienia do osobnego wątku. VERNUM = "2017.10.09(22328)_x64_S"
  20. O i kol. dmatusz3 mnie nieco uprzedził w konkluzji.
  21. W świecie komputerów liczby rzeczywiste są ZAWSZE obarczone błędem dokładności ich zapisu. Żeby to sprawdzić wystarczy w dowolnym dostępnym języku programowania sprawdzić następującą wartość logiczną : (1/3) * 3 == 1. Oczywiście my ludzie wiemy, że jest to prawda, ale nie jest to oczywiste dla systemu komputerowego. Po wykonaniu tych obliczeń niestety 1 <> 1. Dlatego obliczenia powinno się wykonywać z większą dokładnością niż chcemy uzyskać wynik odrzucając liczby na miejscach nieznaczących. W tym konkretnym przypadku powierzchnia jest liczona jakimś algorytmem, który jak mniemam może dawać rózne wyniki w zależności od kierunku polilinii, sposobu reprezentacji czy chociażby samej lokalizacji wierzchołków. Jaki jest cel lub potrzeba oznaczania powierzchni elementu z dokładnością do 8 miejsca po przecinku? Czy jest to gdzieś używane/liczone/wyświetlane lub ma jakieś inne istotne znaczenie?
  22. Niektóre nakładki do zliczania używają bloków opisów z atrybutami. Czyli opis nie jest tekstem tylko blokiem. Dodatkowo można dorzucić do elementu rysunkowego XData ułatwiające wstawianie takich bloków opisowych. Samego pręta nie robiłbym jako bloku. Zobacz przykładowo jak robi to e-cad. Można również pójść drogą PROXY_ENTITY ale zdaje się to znacznie utrudnia wymianę rysunków między użytkownikami.
  23. Jeśli mogę coś zaproponować to rozstawy kodować z separatorami. System zanany z BOCAD'a to x1:y1,x2:y2.... np. 5:100,8:250,400,6:100 5 odcinków po 100mm, następnie 8 odcinków po 250mm, następnie odcinek 400mm i 6 odcinków po 100mm. Zapis jest nieco bardziej czytelny a przypuszczam, że wprowadzenie separatorów będzie łatwiejsze do wrapowania. Co do zliczania długości to faktycznie lepiej oprzeć się na normie bo przy większych promieniach gięcia mogą wystąpić spore różnice i zbrojarnia może sobie rościć pretensje, że im stali zabrakło. A tak jest norma i można się na nią powołać.
  24. W przypadku rysowania strzemienia "otwartego" do wymiarowania od razu podpiął bym jego przesuwanie pod procedurę rysowania. Raczej zawsze coś takiego się rysuje obok, a u ciebie trzeba wykonać dodatkową komendę _move. No i jak już jest wyrzucone na zewnątrz to powinno być od razu zwymiarowane. Może ewentualnie jakiś pstryczek w oknie dialogowym, czy wymiary mają być nanoszone czy nie. Jak widzę za chwilę będzie można poskładać z tych metod jakąś większą klasę do rysowania kompletnego przekroju żelbetowego
  25. Czy mógłbyś zdradzić jak jest to realizowane w C#? Jak przypuszczam jest ustawiany reaktor (przynajmniej ja mam to zrobione u siebie w LISP'ie) ale ciekawi mnie jak wygląda implementacja reaktorów w C#.