
Pawcyk
Użytkownik forum-
Postów
54 -
Dołączył
-
Ostatnia wizyta
Treść opublikowana przez Pawcyk
-
Przecięcie linii z powierzchnią 3D
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
W AutoCADzie nie sprawdzałem przecinania linii z krawędzią powierzchni, ale w sumie krawędź mi wystarczy. Dziękuję. -
Przecięcie linii z powierzchnią 3D
Pawcyk opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
Dzień dobry. Chciałbym odgrzać starego kotleta i podzielić się tym co się dowiedziałem. Dla jednych będzie to wiedza już znana, a reszcie może pomóc. Chodzi o znalezienie punktu przecięcia linii z powierzchnią 3D. Funkcja: (vlax-invoke-method powierzchnia 'IntersectWith oś acExtendNone ) nie działa (przynajmniej mi). Większość lispów tego typu korzysta z funkcji kalkulatora graficznego wbudowanego w cada. (Dla zainteresowanych: CAL [enter] ->F1) Jedną z funkcji tego kalkulatora jest: ilp (p1,p2,t1,t2,t3), gdzie p1 i p2 to punkty tworzące linię, a t1, t2, t3 to punkty płaszczyzny. Pozdrawiam -
[LISP] "Odklejenie" hatch'u od polilinii
Pawcyk odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
Kreskowanie ma możliwość zespolenia z polilinią tworzącą obwiednie. Jeżeli przesunę jeden wierzchołek takiej polilini to kreskowanie automatycznie dostosuje się do nowej obwiedni. Skojarzyło mi się to z opisywanym problemem. -
Dokumentacja fotograficzna
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
...jak nie nawias to cudzysłów. Dziękuję. PS z układu WGS 84 na 2000 przechodzę za pomocą: kalkulator zadorskiego 1_1.xls -
[LISP] "Odklejenie" hatch'u od polilinii
Pawcyk odpowiedział(a) na swazy temat w Wsparcie programistyczne LISP i VisualLISP
A czy te kreskowania, które się nie odklejają, nie są zespolone z poliliniami? -
Dokumentacja fotograficzna
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Dziękuję za tą podpowiedź kojacek. Analizując lisp Lee-Mac'a doszedłem do wniosku, że nie muszę tworzyć list. W każdym razie zrobiłem takiego lispa jak załączony. Pozostał mi jeden problem z dodaniem do ostatniego utworzonego bloku hiperłącza. Tak wygląda fragment mojego kodu: (setq last_ent (entlast)) (command "_-hyperlink" _i _o last_ent "" path "" "" "" ) ..można powiedzieć., że mam problem ze skryptem ;) Exif - v7.lsp -
Dokumentacja fotograficzna
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
...może na przykładzie: Plik csv wygląda tak: aa;ab;ac;ad ba;bb;bc;bd ca;cb;cc;cd ..... a potrzebuje zrobić z niego listy: Lista_1 (aa ba ca ....) Lista_2 (ab bb cb ....) Lista_3 (ac bc cc ...) Lista_4 (ad bd bc ...) W exelu to się nazywa transpozycja (nie wiem czy to pomoże) -
Dzień dobry. Chciałbym wykorzystać exif'y z jpg'ów, a dokładnie współrzędne zrobienia zdjęcia. Przy pomocy programu BR's EXIFextracter tworzę plik csv z takimi danymi: ścieżka ; GPS x; GPS y; kąt Tworzę blok i wstawiam go we współrzędnych z GPS'a wraz z określonym kątem obrotu. Do ostatniego utworzonego elementu dodaję hiperłącze o określonej ścieżce. Mój tok myślenia idzie w tym kierunku: 1) z pliku csv tworzę listy: lst_path, lst_x, lst_y, lst_angle 2) z każdej listy biorę pierwszy element i wykorzystuję go do stworzenia bloku i przypisania do niego hiperłącza 3) usuwam pierwszy element z każdej listy 4) powtarzam krok 2 i 3 aż listy będą puste Ból sprawia mi już pierwszy krok. Niby znalazłem coś takiego: http://www.lee-mac.com/readcsv.html ale jak zrobić z tego poszczególne listy. PS w załączeniu przykładowy CSV GPS.csv
-
Zapamiętywanie ostatniej wprowadzonej wartości
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
No i wszystko się wyjaśniło. A co do (something) to chodzi o taki efekt: podaj poziom odniesienia: <domyślna wartość> ; jak nic nie wpiszę i kliknę enter to wstawia wartość domyślną Słowo "something" to moja własna inwencja - nic lepszego mi nie przyszło do głowy ;) Może właściwsze powinno być war1. Tak czy siak dziękuję za wszystkie odpowiedzi. -
Zapamiętywanie ostatniej wprowadzonej wartości
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Z tymi wieloma plikami to prawda -nie brałem tego pod uwagę. Postaram się zgłębić temat USERRn. Chociaż mam obawy przed grzebaniem się przy zmiennych. Może rozwiązaniem byłoby tworzenie pliku txt o nazwie takiej jak dwg. -
Zapamiętywanie ostatniej wprowadzonej wartości
Pawcyk odpowiedział(a) na Pawcyk temat w Wsparcie programistyczne LISP i VisualLISP
Etapy programu: 1) Najpierw program sprawdza czy istnieje plik OstWprRzedna.txt. Jeżeli nie, to ustawia domyślną wartość 190, jeżeli tak, to pobiera wartość z pliku. 2) Program prosi o podanie wartości (w nawiasie podając wartość domyślną/ostatnią wprowadzoną). 3) Jeżeli wprowadziłem wartość ręcznie, to zapisuje ją do pliku OstWprRzedna.txt Na obecnym etapie program tworzy plik OstWprRzedna.txt z wprowadzoną wartością, ale przy ponownym uruchomieniu wyświetla błąd: ; błąd: zły typ argumentu: FILE "D:\.......\OstWprRzedna.txt" Podejrzewam, że błąd jest w formule odczytu z pliku, który już istnieje. PS program tworzy plik txt o ścieżce takiej jak plik dwg, więc plik dwg musi być zapisany. -
Zapamiętywanie ostatniej wprowadzonej wartości
Pawcyk opublikował(a) temat w Wsparcie programistyczne LISP i VisualLISP
Dzień dobry. Wymyśliłem rozwiązanie tytułowego problemu przy użyciu funkcji write-line i tworzeniu pliku txt. (defun c:test () ;odczyt rzednej z pliku (setq f (findfile (strcat (getvar 'dwgprefix) "OstWprRzedna.txt"))) (if (not f) (setq something 190) (progn (open (strcat (getvar 'dwgprefix) "OstWprRzedna.txt") "r") (setq something (atof(read-line f))) (close f) ) ) ; koniec odczytu rzednej z pliku (setq PozOdn (cond ((getreal (strcat "\nPodaj poziom odniesienia <"(rtos something 2 2)"> \n"))) (something) );koniec cond ); koniec steq ; zapis wprowadzonej rzendej do pliku txt (setq file (open (strcat (getvar 'dwgprefix) "OstWprRzedna.txt") "w")) (write-line (rtos PozOdn) file) (close file) ;koniec zapisu wprowadzonej rzednej do pliku );end Oczywiście coś mi nie działa i proszę o pomoc. PS żeby sprawdzić czy działa trzeba uruchomić dwa razy. Paweł -
Przechowywanie informacji w pliku rysunku AutoCAD/ZWCAD C#
Pawcyk odpowiedział(a) na kaminki temat w Wsparcie programistyczne LISP i VisualLISP
A mi jeszcze jeden pomysł wpadł do głowy. Wg mnie to co nam potrzeba to: średnica, długość i nr pręta. średnica - szerokość globalna polilini długość - długość polilini nr pręta - przypisany do odpowiedniego koloru (nr1 - czerwony, nr2 - zielony itd) -
Znalazłem to: ale niestety musimy poczekać na uzupełnienie paru funkcji...
-
Już go kiedyś testowałem i jest problem z nowszymi windowsami. Montek, a u Ciebie działa na jakim windowsie??
-
...z dziennika pokładowego: nie mam już siły do kodu "ilt". Coś z nim jest nie tak, albo ja czegoś nie ogarniam. Raz działa ok, a raz wyrzuca nil. Chyba będę musiał się przyjrzeć propozycji: (vlax-invoke-method powierzchnia 'IntersectWith oś acExtendNone )
-
OK dziękuję.
-
Próbuję coś tam pisać, ale ze względu na ograniczony wolny czas idzie mi to powoli. Natrafiłem na problem. Poniższy kod raz rzutuje punkt, a raz wyrzuca błąd. ;; ;;PONIEWAŻ 3DFACE POSIADA 4 WIERZCHOLKI (2 TAKIE SAME) NALEŻY USUNĄĆ DUPLIKUJĄCE SIĘ ELEMENTY ;; ;; Unique - Lee Mac ;; Returns a list with duplicate elements removed. ;; (defun remove_doubles (lst /) (vl-load-com) (if lst (cons (car lst) (remove_doubles (vl-remove (car lst) lst))))) ;; ;; (defun c:bum () (print "wskaż powierzchnie") (setq ssSelections (ssget)) (print "wskaż punkt") (setq Point (getpoint)) (setq Point2 (list (nth 0 Point) ; Point i Point2 tworzy linię pionową o wys 500 (nth 1 Point) 500)) (repeat (setq intCount (sslength ssSelections)) (setq intCount (1- intCount) entSelection (ssname ssSelections intCount) lstEntity (entget entSelection)) ;Wierzchołki 3DFACE (setq P10 (list (nth 1 (assoc 10 lstEntity)) (nth 2 (assoc 10 lstEntity)) (nth 3 (assoc 10 lstEntity)) ) P11 (list (nth 1 (assoc 11 lstEntity)) (nth 2 (assoc 11 lstEntity)) (nth 3 (assoc 11 lstEntity)) ) P12 (list (nth 1 (assoc 12 lstEntity)) (nth 2 (assoc 12 lstEntity)) (nth 3 (assoc 12 lstEntity)) ) P13 (list (nth 1 (assoc 13 lstEntity)) (nth 2 (assoc 13 lstEntity)) (nth 3 (assoc 13 lstEntity)) )) ;Lista wierzchołków z jednym (zdublowanym) usuniętym (setq ListVtx (remove_doubles (list P10 P11 P12 P13) )) ;Pozostałe 3 wierzchołki trójkąta (setq P100 (nth 0 ListVtx) P101 (nth 1 ListVtx) P102 (nth 2 ListVtx)) ;tworzenie punktu przecięcia linii (point, Point2) i trójkąta (P100 P101 P102) (entmake (list '(0 . "POINT") (cons 10 (_ilt Point Point2 P100 P101 P102)) )) );end repeat );koniec bum UWAGA: kod funkcji _ilt jest zamieszczony wyżej. ...a i jeszcze jeden problem. jeżeli punkt 2D (który rzutujemy) trafia na krawędź 2 trójkątów to program tworzy 2 punkty. Jak to obejść? Pozdrawiam
-
Jeżeli można to wróciłbym do punktu 3 i 4. Otóż zastanawiam się na koniecznością tworzenia zrzutowanych 3DFACE do poziomu zero. Może w kodzie ze str. http://www.lee-mac.com/intersectionfunctions.htm (zaproponowanym kilka postów wyżej) linijkę: (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) wystarczy zamienić na: (setq rtn (cons (list (car lst) (cadr lst) 0) rtn) Oczywiście nie wystarczy ..bo nie tworzy w ten sposób "wirtualnych" punktów przecięcia. Idea jest taka aby program brał współrzędne powierzchni x, y, a za "z" podstawiał 0. W ten sposób odpadnie konieczność tworzenia płaskich 3DFACE.
-
Zdaje się, że wyważamy otwarte drzwi... https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/to-get-intersection-between-a-line-and-a-3dface/td-p/2745633/page/3 ;lisp by Marko_Ribar (defun _ilt ( p1 p2 t1 t2 t3 / v^v unit Coplanar-p ptinsidetriangle-p ptontriangle-p ptonline-p _ilp nor o ) (defun v^v ( u v ) (list (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u))) (- (* (car v) (caddr u)) (* (car u) (caddr v))) (- (* (car u) (cadr v)) (* (car v) (cadr u))) ) ) (defun unit ( v ) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) (defun Coplanar-p ( p1 p2 p3 p4 ) ( (lambda ( n1 n2 ) (equal (v^v n1 n2) '(0.0 0.0 0.0) 1e-8) ) (v^v (mapcar '- p1 p2) (mapcar '- p1 p3)) (v^v (mapcar '- p1 p2) (mapcar '- p1 p4)) ) ) (defun ptinsidetriangle-p ( pt p1 p2 p3 ) (if (and (Coplanar-p pt p1 p2 p3) (not (or (inters pt p1 p2 p3) (inters pt p2 p1 p3) (inters pt p3 p1 p2) ) ) (not (or (> (+ (distance pt p1) (distance pt p2)) (+ (distance p3 p1) (distance p3 p2))) (> (+ (distance pt p2) (distance pt p3)) (+ (distance p1 p2) (distance p1 p3))) (> (+ (distance pt p3) (distance pt p1)) (+ (distance p2 p3) (distance p2 p1))) ) ) ) T nil ) ) (defun ptontriangle-p ( pt p1 p2 p3 ) (if (or (equal (distance p1 p2) (+ (distance pt p1) (distance pt p2)) 1e-7) (equal (distance p2 p3) (+ (distance pt p2) (distance pt p3)) 1e-7) (equal (distance p1 p3) (+ (distance pt p1) (distance pt p3)) 1e-7) ) T nil ) ) (defun ptonline-p ( pt p1 p2 ) (equal (distance p1 p2) (+ (distance pt p1) (distance pt p2)) 1e-7) ) (defun _ilp ( p1 p2 o nor / p1p p2p op tp pp p ) (if (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7)) (progn (setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1)))) p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1)))) op (trans o 0 (v^v nor (unit (mapcar '- p2 p1)))) op (list (car op) (cadr op) (caddr p1p)) tp (polar op (+ (* 0.5 pi) (angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))) 1.0) ) (if (inters p1p p2p op tp nil) (progn (setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0)) p ) nil ) ) (progn (setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor)))) (setq p (trans pp nor 0)) p ) ) ) (setq nor (unit (v^v (mapcar '- t3 t1) (mapcar '- t2 t1)))) (setq o t1) (if (_ilp p1 p2 o nor) (if (and (or (ptinsidetriangle-p (_ilp p1 p2 o nor) t1 t2 t3) (ptontriangle-p (_ilp p1 p2 o nor) t1 t2 t3) ) (ptonline-p (_ilp p1 p2 o nor) p1 p2) ) (_ilp p1 p2 o nor) nil ) nil ) ) (defun c:bum () (setq P100 (getpoint)) (setq P101 (getpoint)) (setq T100 (getpoint)) (setq T101 (getpoint)) (setq T102 (getpoint)) (_ilt P100 P101 T100 T101 T102) );Koniec test
-
Punkt 4 odhaczony. Punkt 5 również da radę zrobić. Czas na 6, czyli z listy wszystkich 3DFACE wybrać tę powierzchnię, która spełnia warunek: https://4programmers.net/Forum/Newbie/187154-program_sprawdzajacy_czy_punkt_nalezy_do_trojkata_ Wcześniej pisałem, że trzeba "spłaszczyć" 3DFace, ale wystarczy do sprawdzenia brać tylko współrzędne x i y wierzchołków. Pozdrawiam
-
Ad 1. Pojawia się problem z łukami. Po drugie jak narysować polilinię 3d idealnie prostą w płaszczyźnie 2D? Ad 2. Przyznam się że nie zastanawiałem się nad zastosowaniem innych rzeczy niż 3DFACE. Można również narysować zwykłe trójkąty z 3DPOLY (program do triangulacji tworzy 3DFACE) A co do tworzenia punktów wygrzebałem coś takiego: http://www.lee-mac.com/intersectionfunctions.html co daje taki efekt: ;; Intersections - Lee Mac ;; Returns a list of all points of intersection between two objects ;; for the given intersection mode. ;; ob1,ob2 - [vla] VLA-Objects ;; mod - [int] acextendoption enum of intersectwith method (defun LM:intersections ( ob1 ob2 mod / lst rtn ) (if (and (vlax-method-applicable-p ob1 'intersectwith) (vlax-method-applicable-p ob2 'intersectwith) (setq lst (vlax-invoke ob1 'intersectwith ob2 mod)) ) (repeat (/ (length lst) 3) (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) lst (cdddr lst) ) ) ) (reverse rtn) ) ;; Intersections Between Sets - Lee Mac ;; Returns a list of all points of intersection between objects in two selection sets. ;; ss1,ss2 - [sel] Selection sets (defun LM:intersectionsbetweensets ( ss1 ss2 / id1 id2 ob1 ob2 rtn ) (repeat (setq id1 (sslength ss1)) (setq ob1 (vlax-ename->vla-object (ssname ss1 (setq id1 (1- id1))))) (repeat (setq id2 (sslength ss2)) (setq ob2 (vlax-ename->vla-object (ssname ss2 (setq id2 (1- id2)))) rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn) ) ) ) (apply 'append (reverse rtn)) ) (defun c:intersets ( / ss1 ss2 ) (if (and (setq ss1 (ssget)) (setq ss2 (ssget)) ) (foreach pnt (LM:intersectionsbetweensets ss1 ss2) (entmake (list '(0 . "POINT") (cons 10 pnt))) ) ) (princ) ) (vl-load-com) (princ) ...i działa. Chociaż wolałbym jedną linijkę kodu...
-
Wydaje mi się, że pierwszym krokiem byłoby (punkt 4) stworzenie listy punktów utworzonych w miejscach przecięć osi i krawędzi powierzchni o z=0. Poprzednie kroki już są zrobione.
-
-
Dzień dobry. Mam pewien pomysł na lispa. Niestety nie potrafię go samemu napisać. Otóż: 1- tworzę z punktów 3D siatkę powierzchni 3DFACE (http://paulbourke.net/papers/triangulate/Triangulator.LSP) 2- rysuję trasę (np. wodociągu, kanalizacji, drogi...) jako polilinię 2D (z=0) ;tu zaczyna się proponowany lisp 3- tymczasowo tworzę powierzchnie 3DFACE o z=0 (https://forum.cad.info.pl/topic/1873-entmod-na-wielu-obiektach/) 4- znajduję punkty przecięcia z krawędziami powierzchni 3DFACE (punkty 2D) Nie wiem czy to pomoże, ale znalazłem coś takiego: (http://www.cadstudio.cz/freeware Chodzi o plik: INTLINES - draws points in all intersections of selected objects, lines, incl. self-intersections (cdnc5-02.LSP by B.Kramer)) 5- tworzę listę z długością polilinii 2D do tych punktów Np. tak: (vl-load-com) (if (and (progn (prompt "\n Select Polyline :") (setq e (ssget "_:s" '((0 . "*POLYLINE")))) ) (setq p (getpoint "\n Specify point on the previous selected polyline :")) ) (print (vlax-curve-getdistatpoint (ssname e 0) (vlax-curve-getclosestpointto (ssname e 0) p))) ) 6- rzutuję punkty 2D na powierzchnie 3DFACE. Pojawia się kilka pytań: na którą powierzchnię? odp: na powierzchnię, w której po spłaszczeniu (z=0) taki punkt się znajdzie (punkt wewnątrz trojkąta,a dokładnie na krawędzi): (https://4programmers.net/Forum/Newbie/187154-program_sprawdzajacy_czy_punkt_nalezy_do_trojkata_) jak taki punkt zrzutować? odp: (https://forums.autodesk.com/t5/net/getting-the-point-of-intersection-between-plane-and-spline-3d/td-p/5812328) 7 - odczytuję współrzędne Z utworzonych punktów 3D Mając odległości (pkt 5) i rzędne (pkt 7) można narysować profil po terenie istniejącym Pozdrawiam