RobS

Użytkownik forum
  • Postów

    3
  • Dołączył

  • Ostatnia wizyta

  • Wygrane w rankingu

    1

Ostatnia wygrana RobS w dniu 15 Marca

Użytkownicy przyznają RobS punkty reputacji!

Osiągnięcia RobS

Początkujący

Początkujący (1/6)

2

Reputacja

  1. Cześć, Napisałem program PIKIETAZ.lsp w LISPie który zdecydowanie skróci twoją pracę. Działanie jest bardzo proste W Pasku poleceń wpisujesz PIKIETAZ Wybierasz oś drogi (która musi być polilinią) Wpisujesz początkową wartość kilometrów i metrów na pikietażu Na koniec klikasz po kolei na bloki w których chcesz zmienić wartość Żeby wyjść z programu klikasz ESC Drobne różnice w wartościach w stosunku do twojego przykładu wynikają ze sposobu wstawiania bloków. Program rzutuje punkt bazowy bloku prostopadle na oś drogi. Warto zwrócić na to uwagę przy wstawianiu bloków lub zmienić ich punkt bazowy. Nagranie z działania i kod poniżej. Miłej pracy! (princ (strcat " Copyright © 2000 — 2024 Uslugi Informatyczne Szansa www.zwcad.pl Dostepne polecenia: PIKIETAZ - uruchamia funkcje automatycznego pomiaru odleglosci do pikietazu i zapisanie wartosci w atrybucie bloku ") ) (defun C:PIKIETAZ (/ roadAxis startDistKm startDistM blk blkName blkBasePnt polyPnt distToPnt meters kilometers attValue) (while (not (and (setq roadAxis (car (entsel "\nWybierz os drogi: "))) (eq (cdr (assoc 0 (entget roadAxis)))"LWPOLYLINE") )) (prompt "\nProsze wybrac polilinie!") ) (setq startDistKm (atoi (getstring "\nOkresl wartosc kilometrow na poczatku drogi: ")) startDistM (atoi (getstring "\nOkresl wartosc metrow na poczatku drogi: ")) kilometers 0 ) (while t (setq blk (entsel "\nWybierz blok: ") blkName (car blk) blkBasePnt (cadr blk) polyPnt (vlax-curve-getClosestPointTo roadAxis blkBasePnt) distToPnt (atoi (rtos (vlax-curve-getDistAtPoint roadAxis polyPnt) 2 0)) meters (+ startDistM distToPnt) ) (if (>= meters 1000) (setq kilometers (/ meters 1000) meters (- meters (* 1000 kilometers)) ) ) (setq attValue (strcat (itoa (+ startDistKm kilometers)) "+" (itoa meters))) (foreach Att (vlax-invoke (vlax-ename->vla-object blkName) 'GetAttributes ) (if (= (strcase (vla-get-TagString Att)) "KM") (progn (vla-put-textstring Att attValue) attValue) ) ) ) (princ) )
  2. Kolejny skrypt, "delikatne" rozwinięcie poprzedniego programu. Tym razem rysowanie okręgów w środku każdego segmentu polilinii. Średnica okręgu to 1/10 długości danego segmentu. Kod i nagranie działania poniżej (defun C:CIRCATMID (/ poly polyName polyAtt polyLen segLen circCenDist circCord circDia vertexLst pp pt) (setq poly (entsel "\nWskaz polilinie: ") ;Wybór polilinii polyName (car poly) ;Identyfikator polilinii polyAtt (entget (car poly)) ;Zapisanie atrybutów w zmiennej polyprop polyLen (vla-get-length (vlax-ename->vla-object polyName)) ;Pomiar długości polilinii ) (foreach pp polyAtt (if (= (car pp) 10) ;Warunek sprawdza czy atrybut zawiera współrzędne (zaczyna się od kodu 10) (setq vertexLst (cons (cdr pp) vertexLst)) ;Dodawanie współrzędnych do listy vertexLst ) ) (foreach pt vertexLst (setq segLen (- polyLen (vlax-curve-getDistAtPoint polyName pt)) ;Obliczanie długości segmentów polilinii circCenDist (+ (vlax-curve-getDistAtPoint polyName pt) (/ segLen 2.0)) ;Dystans do środka okręgu polyLen (vlax-curve-getDistAtPoint polyName pt) ;Nadpisanie długości do obliczenia kolejnego segmentu circCord (vlax-curve-getPointAtDist polyName circCenDist) ;Współrzędne środka segmentu polilinii circDia (/ segLen 10.0) ;Obliczenie średnicy okręgu ) (if (> circDia 0) ;Warunek sprawdza czy średnica jest większa od 0 w przypadku polilinii otwartych (command "_.CIRCLE" circCord "_D" circDia) ;Rysowanie okręgu ) ) )
  3. Cześć, Chciałem się pochwalić swoim programem w języku LISP. Zadaniem programu jest automatyczne wstawienie trójkątów o określonym przez siebie rozmiarze w każdy wierzchołek dowolnej polilinii. (defun C:TRIATVERTEX () (setq trirad (getstring "Okresl wielkosc trojkatow w wierzcholkach: ") ;Podanie średnicy okregu na którym bedą opisane trójkąty vertexlst nil ;Czyszczenie listy współrzędnych poly (entget (car (entsel "\nWskaz polilinie: "))) ;Wybór polilinii i zapisanie jej atrybutów w zmiennej poly ) (foreach pp poly (if (= (car pp) 10) ;Sprawdzenie czy atrybut zawiera współrzędne (zaczyna się od kodu 10) (setq vertexlst (cons (cdr pp) vertexlst)) ;Dodawanie współrzędnych do listy vertexlst ) ) ;Pętla która tworzy listę współrzędnych wierzchołków (foreach pt vertexlst (command "_.POLYGON" "3" pt "O" trirad) ) ;Pętla wstawiania trójkąty we wszystkich wierzchołkach polilinii ) Nie pisałem nic wcześniej w tym języku, ale myślę że jest całkiem schludnie. Wiedzę czerpałem z książki "AutoLISP czyli programowanie AutoCADa" wydawnictwa HELION, polecam nie tylko początkującym.