Pawcyk

Użytkownik forum
  • Postów

    54
  • Dołączył

  • Ostatnia wizyta

Treść opublikowana przez Pawcyk

  1. Lost In Stupid Parentheses - to moje nowe motto;) Nie mogę uwierzyć,że to o to chodziło. Co do powyższego kodu jest jeszcze jeden bug. Zmienia tylko jeden wierzchołek. Prawdopodobnie dlatego, że przy drugim punkcie odwołuję się do lstEntity (przed zmianą 1 punktu). Rozwiązałem to tak: (defun ChangeVx ( NrVx / ) (repeat (setq intCount (sslength ssSelections)) (setq intCount (1- intCount) entSelection (ssname ssSelections intCount) lstEntity (entget entSelection) ) ;Vertex (setq wierzcholek (assoc NrVx lstEntity)) (setq x1 (nth 1 wierzcholek)) (setq y1 (nth 2 wierzcholek)) (setq z1 (nth 3 wierzcholek)) ;podmiana punktu (setq nowaDef (subst (cons NrVx (list (atof (rtos x1 2 2)) (atof (rtos y1 2 2)) (atof (rtos z1 2 2)) )) (assoc 'NrVx lstEntity ) lstEntity )) (setq nowaDef (append lstEntity (list (cons NrVx (list (atof (rtos x1 2 2)) (atof (rtos y1 2 2)) (atof (rtos z1 2 2)))) ) ) ) (entmod nowaDef) );koniec repeat (print) ); (defun c:zz () (setq ssSelections (ssget (list (cons 0 "3DFACE")))) (setq NrVx 10) (repeat 4 (ChangeVx NrVx ) (setq NrVx (1+ NrVx)) );end repeat );KONIEC A zamiast: (atof (rtos x 2 2)) można tak: (/ (fix (* x 100.)) 100.0) Dziękuję za wszystkie podpowiedzi
  2. Mój poziom wiedzy o lispie jest o kilka poziomów za niski, żeby w 100% zrozumieć powyższy kod... a może strach ma wielkie oczy. Żeby ruszyć dalej z nauką muszę wiedzieć gdzie robię błędy na obecnym etapie. Tak czy siak dziękuję za pomoc PS docelowy kod ma zmieniać wsp wierzchołków z takich: W1: x1=5.12345678 y1=3.23456789 z1=7.42345678 na takie: W1: x1=5.12000000 y1=3.23000000 z1=7.42000000 Czyli niewielkie przesunięcie. Uważałem, że nie ma potrzeby pisać całego kodu, dlatego posłużyłem się przykładem (* z 10)
  3. Oczywiście zajrzę na Pańską stronę. Każda dodatkowa wiedza jest cenna. Do tej pory myślałem, że deklarowanie zmiennych to pomoc przy dużych kodach, a nie konieczność. Czy to może być powodem nie działania programu? Program działa do linijki: podmiana punktu 1 Natomiast mnożenie zmiennej "Z" to tylko przykład. Pozdrawiam
  4. Dzień dobry. Próbuję wykonać pewną operację na wielu powierzchniach 3DFACE. Dla przykładu pomnożyć współrzędną "Z" wierzchołków razy 10. Korzystając z kilku podpowiedzi: https://www.zwcad.pl/help/lisp-help/246-subst.html http://forums.augi.com/showthread.php?120834-How-to-know-name-of-Entity-by-ssget Stworzyłem coś takiego: (defun c:zz () (if (setq ssSelections (ssget (list (cons 0 "3DFACE")))) (repeat (setq intCount (sslength ssSelections)) (setq intCount (1- intCount) entSelection (ssname ssSelections intCount) lstEntity (entget entSelection) ) ;współrzędne wierzchołka 1 (setq wierzcholek1 (assoc 10 lstEntity)) (setq x1 (nth 1 wierzcholek1)) (setq y1 (nth 2 wierzcholek1)) (setq z1 (nth 3 wierzcholek1)) ;współrzędne wierzchołka 2 (setq wierzcholek2 (assoc 11 lstEntity)) (setq x2 (nth 1 wierzcholek2)) (setq y2 (nth 2 wierzcholek2)) (setq z2 (nth 3 wierzcholek2)) ;podmiana punktu 1 (setq lstEntity (subst (cons 10 (list x1 y1 (* z1 10)) (assoc '10 lstEntity ) lstEntity ) )) (entmod lstEntity) ;podmiana punktu 2 (setq lstEntity (subst (cons 11 (list x2 y2 (* z2 10)) (assoc '11 lstEntity ) lstEntity ) )) (entmod lstEntity) );koniec repeat );koniec if (print) );Koniec W powyższym kodzie pominąłem dwa ostatnie punkty. Chciałem pokazać tylko ideę. Co robię źle, że to nie działa? Pozdrawiam
  5. Wszystko się wyjaśniło. Przeoczyłem ten kod 11.
  6. OK dziękuję. Ciekawi mnie tylko dlaczego jak ręcznie stworzę taki tekst i odzyskam kody to nie pokazuje kodu 11.
  7. Dzień dobry. Być może przesadzam ostatnio z postami, ale patrząc z drugiej strony może moje problemy pomogą innym. Otóż tworze ręcznie jakiś tekst i sprawdzam jak wygląda w DXF. Potem tworzę odpowiednią listę jak w poniższym przykładzie. Problem się pojawia przy wierszu 14 i 15 odpowiedzialnym za wyrównanie. Jak wiersze są aktywne to nie wstawia tekstu. (defun WstawianyTekst (wartosc / ) ;1 (setq WstT ;2 (entmake ;3 (list ;4 '(0 . "TEXT") ;5 '(100 . "AcDbEntity") ;6 (cons 8 (getvar "CLAYER")) ;7 '(100 . "AcDbText") ;8 (cons 1 wartosc) ;9 (cons 10 (getpoint)) ;10 '(50 . 1.5708) ;11 '(40 . 0.15) ;12 '(41 . 0.75) ;13 ; '(72 . 0) ;14 ; '(73 . 2) ;15 ))) ;16 ) ;17 (setq P1 (list 750 715 0)) ;18 ;19 (defun c:qaw () ;20 (setq tral "tralalala") ;21 (WstawianyTekst tral ) ;22 ) ;23 Jak ktoś zna przyczynę takiej sytuacji to będę wdzięczny za pomoc. Pozdrawiam
  8. Dziękuję bardzo, działa idealnie.
  9. Dzień dobry. W pewnym lispie chciałbym wykorzystywać blok o nazwie znacznik. Blok ten składa się z linii prostej pionowej o długości 0.1 Ponieważ nie potrafię stworzyć czegoś takiego przy pomocy entmake...jak na poniższych przykładach: https://www.zwcad.pl/3-tworzenie-i-modyfikacja-obiektow.html skorzystałem z lispa Lee Mac'a: http://www.cadtutor.net/forum/showthread.php?45495-Block-creation-and-insertion-Lisp-Template i wygląda to tak: (defun c:zna () ;tworzenie definicji bloku "znacznik" ;ale najpierw definicja linii (setq LiniaDef (entmake (list '(0 . "LINE") '(100 . "AcDbEntity") '(100 . "AcDbLine") '(62 . 0) '(370 . -2) (cons 10 (list 0.1 0.1 0)) (cons 11 (list 0.1 0 0 )) ))) ;teraz blok z tej linii ;kod stworzony przez Lee Mac ~11.01.10 (setq P40 (list 0.1 0.1 0)) (cond ( (not (setq ss (ssget (list 0.1 0.1 0))))) ( (repeat 1 (progn (setq bNme "znacznik") (cond ( (not (snvalid bNme)) (princ "\n** Invalid Block Name **")) ( (tblsearch "BLOCK" bNme) (princ "\n** Block Already Exists **")))))) ( (not (setq i -1 pt (list 0.1 0.1 0)))) (t (entmake (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bNme) (cons 70 0))) (while (setq ent (ssname ss (setq i (1+ i)))) (entmake (entget ent)) (entdel ent)) (entmake (list (cons 0 "ENDBLK") (cons 8 "0"))) (entmake (list (cons 0 "INSERT") (cons 2 bNme) (cons 10 pt))))) (princ) ;Koniec tworzenia bloku ;usuwanie utworzonego bloku lub linii (jeżeli blok już istniał) (setq P41 (list 0 0 0)) (setq P42 (list 1 1 0)) (command "_zoom" "_w" P41 P42) (command "_erase" (ssget P40) "") ;(command "_zoom" "_p") (princ) );KONIEC Problem się pojawia w trzeciej linijce od końca. Jeżeli ta linijka jest aktywna to usuwa także definicję bloku "znacznik". Może jest lepszy sposób na kasowanie stworzonych obiektów np bez konieczności migania widokiem? Pozdrawiam i dziękuję za ewentualną pomoc
  10. ...ciągle szukam i znalazłem coś takiego: 1) zastępstwo funkcji acet-ss-zoom-extents: ; nie wiem czy potrzebna jest ta funkcja; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/zoom-to-selected-entities/td-p/917180?nobounce 2) zastępstwo funkcji acet-list-remove-adjacent-dups: ; to chyba nie problem, że będą duplikujące się elementy; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/remove-duplicates-from-a-list/td-p/2914874 3) zastępstwo funkcji acet-geom-object-point-list ; wg mnie to jest najważniejsze; http://lee-mac.com/entitytopointlist.html P.S. będę się starał zwracać większą uwagę na to co piszę, żeby "sronie" się nie powtórzyło.
  11. Może udało by się stworzyć jakiś zamiennik... Rękawica została podjęta na sronie: http://www.cadtutor.net/forum/showthread.php?99825-Problem-with-function-ACET-.......
  12. Wydaje mi się, że największym problemem jest ten fragment kodu: (defun getfencesel (en flt / fe ss) (acet-ss-zoom-extents (setq ss (ssadd en))) (setq fe (acet-list-remove-adjacent-dups (acet-geom-object-point-list en 0.05)) ss (ssget "_F" fe flt) ) (vl-cmdf "_ZOOM" "_P") ss ) Może ktoś zna jakiś sposób na zapisanie tego w zwykłym autolispie???
  13. Dzień dobry. Znalazłem pewnego lispa: https://www.theswamp.org/index.php?topic=9042.465 Żeby zachęcić do pomocy przedstawię jego działanie: 1) z punktów 3d oraz liniii nieciągłości (3DPOLY) tworzy siatkę trójkątów (3DFACE) 2) na podstawie polilinii tworzy profil wdowolnej skali pionowej Niestety działa tylko w AutoCadzie. Problem pojawia się z funkcjami: 1) pragma (z tego co się dowiedziałem pomaga przy programowaniu. Oznacza zmienne innym kolorem. Więc może nie jest potrzebna) 2) _vl-times 3) acet-ui-progress 4) ACET-SS-ZOOM-EXTENTS Punkty 2 i 3 mają związek z wyświetlaniem informacji ile czasu zajęło programowi wykonanie poszczególnych działań (tak mi się wydaje). Jak kogoś zainteresuje to zachęcam do walki o działanie w ZWCadzie lub inny_cadzie ;) Pozdrawiam TriangV0.6.7.lsp
  14. po wpisaniu komendy "ps_ow" wyświetla: Polecenie: ps_ow Wskaż polilinię 0.0 Polecenie: Moje rozumienie działania to takie, że kod wstawia tekst z wartością współrzędnej Z w wierzchołkach polilinii 3d. A niestety tego nie robi.
  15. Czy kod do opisywania wierzchołków polilinii może działać dla polilinii 3d?? Jeżeli tak to czemu taka modyfikacja nie działa: (defun c:ps_ow () (setvar "dimzin" 2) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq polilinia (cdr (member wierzchołek polilinia) ) ) (setq wierzchołek (cdr wierzchołek )) (setq z1 (nth 2 wierzchołek) ) (command "_text" wierzchołek "" "" (RTOS z1 2 2)) ) );KONIEC
  16. KOREKTA nowe ZWCady też potrafią. (sprawdzone ZWCad 2015+ i 2017) Wniosek...lisp niepotrzebny.
  17. tylko nowsze autocady potrafią wyciągać wiele powierzchni na raz.... dlatego myślałem, żeby zaznaczyć wiele obiektów, ale żeby brał po jednym do wyciągania.
  18. zmiana kodu na taki: (command "_sweep" JednaPow "" sciezka "n") powoduje działanie lispa, jednak tworzy bryły w jednym miejscu, a chodzi o wyciągnięcie do góry w miejscu, w którym ta powierzchnia się znajduje. Chyba sam powyższego wywodu bym nie zrozumiał, dlatego zachęcam do odpalenia lispa w załączonym wyżej pliku.
  19. Chodzi mi o coś takiego (rys 2 i 3): w powyższym przykładzie zrobiłem to funkcją: _extrude Dodaje także przykładowy plik. Pow3d.dwg
  20. Dziękuję za pomoc. Jeżeli można to mam jeszcze problem z funkcją "wyciągnij" tz. działa tylko na jednym elemencie (powierzchni 3d). Pomyślałem ze można wykorzystać powyższy kod...ale oczywiście nie działa. (defun c:zz () (print "\nWskaż ścieżkę wyciągania") (setq sciezka (ssget "_:S")) ;a może tak:(setq sciezka(entget (car(entsel "\nWskaż polilinię \n")))) (print "\nWskaż wszystkie powierzchnie") (setq pow3D (ssget)) (setq wszystkie nil ) (while (setq JednaPow (assoc 10 pow3D)) (setq wszystkie (append wszystkie (list (cdr JednaPow)))) (setq pow3D (cdr (member JednaPow pow3D) ) ) (setq JednPow (cdr JednaPow )) (command "_extrude" JednaPow "c" sciezka) ) );KONIEC
  21. Dzień dobry. Kombinuje z pewnym lispem, który wpisywałby współrzędną Y w wierzchołkach polilini. Na stronie ZWCada napotkałem na taki kod: https://www.zwcad.pl/help/lisp-help/270-assoc.html moja wariacja na ten temat (która nie działa): defun c:yy () (setvar "dimzin" 2) (setq PozOdn (getreal "\nPodaj poziom odniesienia \n")) (setq P1 (getpoint "\nWskaz początek ukladu wspolrzednych \n")) (setq x1 (nth 0 P1) y1 (nth 1 P1)) (setq polilinia(entget (car(entsel "\nWskaż polilinię \n")))) (setq wierzchołki nil ) (while (setq wierzchołek (assoc 10 polilinia)) (setq wierzchołki (append wierzchołki (list (cdr wierzchołek)))) (setq polilinia (cdr (member wierzchołek polilinia) ) ) (setq x2 (nth 0 wierzchołki) y2 (nth 1 wierzchołki)) (setq rzedna (+ PozOdn (/ (- y2 y1) 5))) (command "_text" wierzchołki "" "" (RTOS rzedna 2 2)) ) );KONIEC Dziękuję za pomoc i proszę o wyrozumiałość dla początkującego.
  22. Pawcyk

    Niweleta

    czekam i czekam....
  23. W pracy używam Civila 3d, więc nie ma problemu. Natomiast w domu przy drobnych robótkach (i cięciu kosztów) próbuję go zastąpić "metodą ręczną".
  24. Dzień dobry. Zacznę od początku... Dostaję od geodety plik txt z punktami. Wprowadzam te dane do cada, tz. tworze punkty 3d. Następnie korzystając z lispa: https://www.theswamp.org/index.php?topic=9042.15 tworzę powierzchnie 3d między tymi punktami. Wszystkie utworzone w ten sposób powierzchnie 3d wyciągam po ścieżce (po osi Z) "w dół". I tu zaczynają się schody. Nie wszystkie bryły można dodać do siebie. Widać to na rys 3. Bryła zielona, utworzona z kilku brył, nie chce się dodać do bryły fioletowej. Troszkę poszukałem i prawdopodobnym błędem jest to, że po przeciągnięciu spód bryły ma inne współrzędne niż góra. Chodzi, o któreś miejsce po przecinku. Zależy mi na terenie jako bryle, ponieważ w cadzie jest więcej możliwości obróbki brył w stosunku do powierzchni 3d. Zamieściłem to na tym forum ze względu na lisp do tworzenia powierzchni 3d oraz pomyślałem o wykorzystaniu VisualLISP'a, jako że bazuje na obiektach (wg mojej marnej wiedzy). Jeżeli macie jakieś inne pomysły jak to rozwiązać to będę wdzięczny. Bryły3d.dwg