-
Postów
1457 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
87
Treść opublikowana przez kruszynski
-
[C#] Detekcja środowiska
kruszynski odpowiedział(a) na perlon temat w Wsparcie programistyczne LISP i VisualLISP
Mogę się mylić, ale tak na szybko szukałbym czegoś takiego: Assembly.GetExecutingAssembly() -
[C#] Detekcja środowiska
kruszynski odpowiedział(a) na perlon temat w Wsparcie programistyczne LISP i VisualLISP
Podejrzewam że tak. W ZRX jest to możliwe. Poszukam czegoś, albo dopytam w ZWSOFT. Również postaram się czegoś dowiedzieć Tu mam najgorsze przeczucia. Raczej stworzyłbym 2 projekty , czy nawet więcej i ładowałbym te same pliki źródłowe. Problem może wynikać z dodawania różnych "References" do tego samego projektu. A może to tylko bezpodstawne moje obawy. -
Na podstawie przykładu udało mi się powtórzyć problematyczne zachowanie programu. Przekażę zgłoszenie do ZWSOFT.
-
Sprawdziłem zgłoszony przez Pana przypadek, ale u mnie działa OK. Korzystam z wersji vernum "2018.07.26(35476)_x64" być może to jest przyczyna. Być może coś robimy inaczej. W związku z tym chciałbym poprosić o szerszy przykład kodu, który wykorzystuje Pan do tworzenia tekstu. Być może na tej podstawie uda się ustalić coś więcej.
-
Własny pasek narzędzi
kruszynski odpowiedział(a) na kaminki temat w Wsparcie programistyczne LISP i VisualLISP
Mam potwierdzenie z ZWSOFT. Na chwilę obecną tworzenie wstążki z poziomu C# nie jest jeszcze obsługiwane. -
Własny pasek narzędzi
kruszynski odpowiedział(a) na kaminki temat w Wsparcie programistyczne LISP i VisualLISP
A koniecznie musi to być w C# ? Myślę że łatwiej zrobić mnu, wczytać -> powstanie cuix który można dostosować (polecenie CUI) Zapytam w ZWSOFT o możliwości w C# -
Chciałbym odświeżyć taki temat: Może Pan podać przykład? jak jest a jak powinno być ?
-
vlax-ldata-.... a wersje ZWcad
kruszynski odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Tak, oczywiście. Takie zgłoszenie już wysłałem. -
vlax-ldata-.... a wersje ZWcad
kruszynski odpowiedział(a) na 2P temat w Wsparcie programistyczne LISP i VisualLISP
Znalazłem sposób na odczytanie LData z rysunku w 2018. Niestety nie jest to jeszcze gotowe rozwiązanie, ale wrzucam to co znalazłem bo trochę mi pilno do innych zajęć. Jak znajdę chwilę to przygotuję kompleksowe rozwiązanie. (setq DictName "testDict") (setq Key "testKey") (setq dicts ( vla-get-Dictionaries (vla-get-activedocument (vlax-get-acad-object) ) ) ) (setq dict(vla-Item dicts DictName ) ) (setq val ( vla-Item dict Key) ) (entget(vlax-vla-object->ename val)) Zwraca mi taką przykładową postać: ( (-1 . <ENTITY NAME: 26c17198>) (0 . "VLO-VL") (5 . "1FE") (102 . "{ACAD_REACTORS") (330 . <ENTITY NAME: 26c17180>) (102 . "}") (330 . <ENTITY NAME: 26c17180>) (100 . "vlo_VL") (90 . -64512) (91 . 620) (92 . 5) (40 . 3.97) (40 . 94.5289) (40 . 52.43) (40 . 93.7424) (40 . 372.158) (300 . "( (\"RoomID\" \"8011D\") (\"RoomName\" \"m.studio\") (\"RoomBuilding\" \"B.\") (\"RoomLevel\" \"0\") (\"RoomLocal\" \".2\") (\"RoomNr\" \".1\") (\"RoomNrProject\" \"B.0.2.1\") (\"RoomFunction\" \"U\") (\"RoomStrefy\" ( ( (\"StrefaHeight\" (&VLO-R . 0)) (\"StrefaName\" \"Strefa_1\") (\"StrefaPosadzka\" \"\") (\"StrefaType\" \"Z\") (\"StrefaStatus\" \"Pp\") (\"StrefaKorekta\" \"100%\") (\"StrefaTynki\" \"1\") (\"StrefaID\" \"48B7F5\") (\"StrefaAreaPline\" (&VLO-R . 1)) (\"StrefaPerimeter\" (&VLO-R . 2)) (\"StrefaArea\" (&VLO-R . 3)) (\"StrefaKubatura\" (&VLO-R . 4)) ) ) ) (\"RoomAreaPP\" (&VLO-R . 3)) (\"RoomAreaPD\" 0) (\"RoomArea\" (&VLO-R . 3)) (\"RoomKubatura\" (&VLO-R . 4)) (\"RoomFloor\" \"\") )" ) ) poszczególne (&VLO-R . 0) (&VLO-R . 1) (&VLO-R . 2) ... trzeba zamienić na kolejne wartości z listy powyżej (300 ... ) (40 . 3.97) (40 . 94.5289) (40 . 52.43) (40 . 93.7424) (40 . 372.158) czyli (&VLO-R . 0) podmienić na 3.97 (&VLO-R . 1) podmienić na 94.5289 (&VLO-R . 2) podmienić na 52.43 Troche z tym roboty. Jeśli zdecyduej się Pan na przejście na inną reprezentację danych to szkoda czasu, jeśli chciałby Pan pozostać przy LData, to proszę dać znać - przygotuję gotowe rozwiązanie. Choć to może trochę potrwać. -
może tak: (ssget "_x" (list (cons -4 "<AND") (cons 0 "HATCH") (cons -4 "<AND") (cons -4 "<NOT") (cons 62 1) (cons -4 "NOT>") (cons -4 "<NOT") (cons 62 105) (cons -4 "NOT>") (cons -4 "AND>") ) )
-
W aktualnej wersji aplikacji nie ma takiej możliwości. Dodamy to w kolejnej aktualizacji. A jako rozwiązanie tymczasowe może Pan odszukać na dysku c:\Szansa\ZWTraffic\2018\Templates\Vertical traffic signs\D - Informacyjne\D-18.dwg Zapisać pod nową nazwą i dorysować strzałkę. Tak zmodyfikowany znak może Pan wstawić przez funkcje nakładki.
-
Proszę sprawdzić czy teraz jest OK przeniesopisy.lsp
-
Edycja tekstu wymiarowego
kruszynski odpowiedział(a) na Bartek1977 temat w ZWCAD Standard i Professional
-
Edycja tekstu wymiarowego
kruszynski odpowiedział(a) na Bartek1977 temat w ZWCAD Standard i Professional
Przygotowłem taki kawałek LISP: Polecenia: EdycjaWymiaru - prosi o zaznaczenie wymiaru, podanie nowej treści i zamienia kolor ZaznaczZmienione - wyszukuje w rysunku wszystkie wymiarowania, które mają nadpisany tekst Gotowy plik w załączniku (setq COLORINDEX 1 ) ; Zmień tą wartość jeśli chcesz inny kolor niż czerwony (domyślnie 1) (defun C:EdycjaWymiaru ( / element newVal *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nC:EdycjaWymiaru:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq element (SelSet:Entsel "Wybierz wymiar" (list (cons 0 "*DIMENSION" ) ) ) ) (setq newVal (String:Get "Nowa treść: " "" ) ) (vlax-put-property element 'Color COLORINDEX ) (vlax-put-property element 'TextOverride newVal ) ) (defun C:ZaznaczZmienione ( / selItems *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nC:ZazmaczZmienione:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq selItems (ssget "_X" '( ( 0 . "*DIMENSION") (-4 . "<NOT") (1 . "") (-4 . "NOT>" ) ) ) ) (sssetfirst selItems selItems) ) (defun String:Get (komunikat defVal / Wynik tekst ) (if defVal (if (not(= defVal "")) (setq komunikat (strcat komunikat "<" defVal ">:" ) )) ) (setq tekst(vl-catch-all-apply 'getstring (list T komunikat ))) (if (vl-catch-all-error-p tekst) (progn (prompt (vl-catch-all-error-message tekst)) (setq Wynik nil ) ) (progn (if (null tekst) (setq Wynik defVal ) (if (= tekst "") (setq Wynik defVal ) (if (= tekst ".") (setq Wynik "") (setq Wynik tekst) ) ) ) ) ) Wynik ) (defun SelSet:Entsel (tresc filter / OldNoMutt MSel OutVal ) (setq tresc (strcat "\n" tresc ": ") ) (prompt tresc ) (setq OldNoMutt (getvar 'NOMUTT)) (setvar 'NOMUTT 1) (setq MSel (if (null filter) (vl-catch-all-apply 'ssget (list ":S:E" )) (vl-catch-all-apply 'ssget (list ":S:E" filter )) ) ) (setvar 'NOMUTT OldNoMutt ) (if (vl-catch-all-error-p MSel) (progn (prompt (vl-catch-all-error-message MSel)) ) (progn (if MSel (progn (setq OutVal (vlax-ename->vla-object (ssname MSel 0)) ) )) ) ) OutVal ) OutVal ) EdycjaWymiaru.lsp -
Błąd: zły typ funkcji - nil, źle umiejscowiony prawy nawias
kruszynski odpowiedział(a) na kruk temat w ZWCAD Standard i Professional
Taki komunikat świadczy o problemie jaki wystąpił w jakimś LISPie. Być może jest załadowany w inny sposób niż lista startowa: Wczytane z automatu są pliki: W opcjach może być dodany katalog. Jeśli w nim jest plik ZWCADdoc.lsp zostanie wczytany przy otwieraniu plików Jeśli jest wczytane menu (plik mnu) , odpowiadający mu plik MNL zostanie wczytany %AppData%\Roaming\ZWSOFT\ZWCAD\2018\pl-PL\Support\ZWCAD2018doc.lsp c:\Program Files\ZWSOFT\ZWCAD 2018\Support\ZWCAD2018.lsp Aplikację możemy wczytać przez rejestr HKEY_CURRENT_USER\Software\ZWSOFT\ZWCAD\2018\pl-PL\Applications\MojaAplikacja choć to raczej arx niż LISP Jeśli w skrócie w użyjemy parametru /ld albo /b wczytany będzie skrypt, (scr), ale on też może ładować LISPa. Mamy jeszcze plik acad.rx , ale to też raczej do ARX niż LISP a treść komunikatu wskazuje jednak na LISP ( plik ZRX też może ładować plik LISP) Część funkcjonalności ZWCADa zwłaszcza narzędzia ExpressTools są opracowane w LISP i ładowane na starcie. Być może problem jest jakoś związany z rysunkiem a raczej z parą rysunków skoro problem występuje przy otwarciu drugiego rysunku przez 2xclick. Proszę obserwować program, ważne by udało się ustalić zasadę - powtarzalność występowania problemu, leśli to się uda być może będzie łatwiej uniknąć problemu w przyszłości. -
Aktualizacja z rozwiązaniem problemu gotowa do pobrania.
-
Problem jest nam znany. Myślę że ogarnę przy okazji najbliższej aktualizacji
-
Pierwsza wersja gotowa. przeniesopisy.lsp (defun C:przeniesopisy ( / selElement allElements SelLayer *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nC:przeniesopisy:*error*: " ) (princ msg ) (princ "\n") ) ) ) (defun AskForBlock ( label / *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nAskForBlock:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq block (SelSet:Entsel label (list (cons 0 "INSERT" ))) ) ) (defun GetCorespondingElements ( selElement / LayerName BlockName Blocks Leaders Selected *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nGetCorespondingElements:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq LayerName (vlax-get-property selElement 'Layer ) ) (setq BlockName (vlax-get-property selElement 'Name ) ) (setq Blocks (ssget "X" (list (cons 0 "INSERT") (cons 2 BlockName ) (cons 8 LayerName ) ) ) ) ( if (not (null Blocks) ) (progn (setq Selected (SelSet:ToList Blocks ) ) ) ) (setq Leaders (ssget "X" (list (cons 0 "MULTILEADER") (cons 8 LayerName ) ) ) ) ( if (not (null Leaders) ) (progn (setq Leaders (SelSet:ToList Leaders ) ) (setq Selected (append Selected Leaders ) ) ) ) Selected ) (defun AskForLayer ( msg / Options selString *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nAskForLayer:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq Options (list "Zaznacz" "Aktualna" ) ) ; "Wybierz" (setq selString (String:Get (strcat msg " lub " (UserInput:FormatOptions Options ) ":" ) "" ) ) (cond ( ( or ( null selString ) (not (= (type selString ) 'STR))) nil) ( ( or ( = ( strcase selString ) (substr ( strcase ( car Options ) ) 1 1) ) ( = ( strcase selString ) ( strcase ( car Options ) ) ) ) ( progn ; "Zaznacz" (setq elem (SelSet:Entsel "Wybierz element z warstwy na którą przenieść opisy" nil) ) (setq Layer (vlax-get-property elem 'Layer ) ) ) ) ;( ( or ( = ( strcase selString ) (substr ( strcase ( cadr Options ) ) 1 1) ) ; ( = ( strcase selString ) ( strcase ( car Options ) ) ) ; ) ( progn ; "Wybierz" ; (print "eNotImplementedYet" ) ;) ) ( ( or ( = ( strcase selString ) (substr ( strcase ( cadr Options ) ) 1 1) ) ( = ( strcase selString ) ( strcase ( car Options ) ) ) ) ( progn ; "Aktualna" ( setq Layer ( vlax-get-property ( vlax-get-property (vla-get-activedocument (vlax-get-acad-object) ) 'ActiveLayer ) 'Name ) ) ) ) ( T (setq Layer selString ) ) ) Layer ) (setq selElement ( AskForBlock "Wskaż blok" )) (setq allElements (GetCorespondingElements selElement ) ) (setq SelLayer (AskForLayer "Podaj nazwę warstwy" ) ) ( Layer:Set allElements SelLayer ) ) ; (defun ------ UserInput ------------ ( / ) (defun UserInput:FormatOptions ( Options / *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nUserInput:FormatOptions:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq Out "[" ) (if (> (length Options) 0) (setq Out (strcat "[" (car Options) ) ) ) (foreach % (cdr Options) (setq Out (strcat Out "/" % ) ) ) (setq Out (strcat Out "]") ) ) (defun String:Get (komunikat defVal / Wynik tekst *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nString:Get:*error*: " ) (princ msg ) (princ "\n") ) ) ) ; (setq komunikat "podaj tekst" ) ; (setq defVal "SLU" ) (if defVal (if (not(= defVal "")) (setq komunikat (strcat komunikat "<" defVal ">:" ) )) ) (setq tekst(vl-catch-all-apply 'getstring (list komunikat ))) (if (vl-catch-all-error-p tekst) (progn (prompt (vl-catch-all-error-message tekst)) (setq Wynik nil ) ) (progn (if (null tekst) (setq Wynik defVal ) (if (= tekst "") (setq Wynik defVal ) (if (= tekst ".") (setq Wynik "") (setq Wynik tekst) ) ) ) ) ) Wynik ) ; (defun ------ Layer ------------ ( / ) (defun Layer:Set ( Element LayerName / *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nLayer:Set:*error*: " ) (princ msg ) (princ "\n") ) ) ) (if (= ( Layer:Exist LayerName ) :vlax-false ) ( Layer:Create LayerName ) ) ( cond ( ( = (type Element ) 'LIST ) (progn (foreach % Element ( Layer:Set % LayerName ) ) ) ) ( ( = (type Element ) 'ENAME ) (progn ( Layer:Set (vlax-ename->vla-object Element ) LayerName ) ) ) ( ( = (type Element ) 'VLA-OBJECT ) (progn (setq ans(vl-catch-all-apply 'vlax-put-property (list Element 'Layer LayerName ))) ) ) ) ) (defun Layer:Exist ( Name / layers ans Out *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nLayer:Exist:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq layers (vlax-get-property (vla-get-activedocument (vlax-get-acad-object) ) 'Layers ) ) (setq ans(vl-catch-all-apply 'vlax-invoke-method (list layers 'Item Name ) ) ) (setq Out (if (vl-catch-all-error-p ans ) :vlax-false :vlax-true ) ) Out ) (defun Layer:Create ( Name / layers ans *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nLayer:Create *error*: " ) (princ msg ) (princ "\n") ) ) ) (setq layers (vlax-get-property (vla-get-activedocument (vlax-get-acad-object) ) 'Layers ) ) (setq ans (vl-catch-all-apply 'vlax-invoke-method (list layers 'Add Name ) ) ) (if (vl-catch-all-error-p ans) nil ans ) ) (defun Layer:Purge ( Name / layers ans Out *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nLayer:Purge:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq layers (vlax-get-property (vla-get-activedocument (vlax-get-acad-object) ) 'Layers ) ) (setq layer (vl-catch-all-apply 'vlax-invoke-method (list layers 'Item Name ) ) ) (if (not (vl-catch-all-error-p layer )) (vl-catch-all-apply 'vlax-invoke-method (list layer 'Erase ) ) ) nil ) ; (defun ------ SelSet ------------ ( / ) (defun SelSet:ToList (selset / Wynik ileelementow i *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nSelSet:ToList:*error*: " ) (princ msg ) (princ "\n") ) ) ) (if selset (progn (setq ileelementow(sslength selset) ) (setq i 0 ) (repeat ileelementow (setq Wynik (append Wynik (list (vlax-ename->vla-object(ssname selset i) ) ))) (setq i (1+ i )) ) )) Wynik ) (defun SelSet:Entsel (tresc filter / OldNoMutt MSel OutVal *error* ) (defun *error* ( msg / ) (if (not (null msg ) ) (progn (princ "\nSelSet:Entsel:*error*: " ) (princ msg ) (princ "\n") ) ) ) (setq tresc (strcat "\n" tresc ": ") ) (prompt tresc ) (setq OldNoMutt (getvar 'NOMUTT)) (setvar 'NOMUTT 1) (setq MSel (if (null filter) (vl-catch-all-apply 'ssget (list ":S:E" )) (vl-catch-all-apply 'ssget (list ":S:E" filter )) ) ) (setvar 'NOMUTT OldNoMutt ) (if (vl-catch-all-error-p MSel) (progn (prompt (vl-catch-all-error-message MSel)) ) (progn (if MSel (progn (setq OutVal (vlax-ename->vla-object (ssname MSel 0)) ) )) ) ) OutVal )
-
Możliwe to jest, tylko potencjalnie narażone na komplikacje. Bo jak odróżnić blok opisowy od innych? Można w programie zapisać na stałe nazwę bloku opisowego. Ale jeśli ktoś chciałby użyć tego narzędzia w innym przypadku to nie zadziała. zaznaczenie jednego bloku wzorca chyba nie jest zbyt kłopotliwe a daje nam dużą elastyczność.
-
to też uwzględnić? czy przenosić tylko ten jeden zaznaczony blok?
-
tak. Trudno powiedzieć. Nie zostało to jeszcze ujęte w przewidywalnych planach
-
tak można. tylko z mojego doświadcznia wynika że częstotliwość popełniania literówek jest denerwująca. i bedzie powstawało zbyt dużo podobnych warstw a może tylko ja szybciej piszę niż myślę 😉 wolałbym to rozwiązanie. tylko jak wskazać warstwę, można tak: - wybieramy dowolny element na warstwie docelowej - myślę, że to byłoby najłatwiejsze w użyciu, pod warukniem że coś juz na tej warstwie jest - pojawia się okno z listą wszystkich warstw do wyboru - to byłoby łatwe w użyciu jeśli mielibyśmy mało warstw przy dużej ilości wartw pewnie już nie. - wrzucamy np na aktualną warstwę - to byłoby najłatwiejsze do napisania ale czy funkcjonalne ? - może jeszcze coś? Możemy też zrobić takie combo typu Podaj nazwę warstwy lub [Zaznacz/Wybierz/Aktualna]:
-
można tak, żeby żeby zaznaczył Pan jeden blok , a program zaznaczy wszystkie inne bloki o tej samej nazwie na tej samej warstwie. Tak będzie OK?
-
W poprzednim poście w tym temacie zaproponowałem pewne rozwiązanie i zapytałem o kwestie, w których mam wątpliwości. Nie otrzymałem odowiedzi więc nie wiem czy to właśnie tak ma działać program. Dlatego nie zajołęm się przygotowaniem rozwiązania, które może działać sprzeczenie z oczekiwaniami.