atrybuty w blokach


Recommended Posts

Dzień dobry,

problem przekracza moje zdolności programistyczne. Nawet nie wiem, czy to gruby temat czy łatwy.

Mianowicie potrzebuję lispa, który pozamienia atrybuty w blokach: powpisuje w nich pikietaż drogi. W załączeniu przesyłam rysunek przyklad.dwg, na którym jest wyjaśniony problem.

Link to comment
Share on other sites

W ZWTraffic mamy funkcje opisywania pikietażem punktów wzdłuż trasy.

Tutaj temat podobny. Jednak potrzeba doprecyzować kilka rzeczy.
- Czy te bloki są już wstawione w rysunku i trzeba wstawiać kilometraż jako wartość atrybutu ?
- Może potrzebne byłoby wstawianie opisu na podstawie istniejących barier w rysunku. We wstawianym opisie można uzupełniać też inne atrybuty np nazwa znaku
- Czy szablon opisu np wielkość, dostępne atrybuty jest narzucony? Możemy zrobić tak, żeby pozwolić wybrać szablon opisu jaki będzie wstawiany.

Kilometrapunktw.thumb.gif.0963bf42740c3e0783f8f68666b004db.gif

Link to comment
Share on other sites

Bardzo dziękuję z odpowiedź. Tak, mniej więcej tak to robię, tylko, że w gaznakach. Jednak jest to robota ręczna. Zastanawiałem się nad lispem, który automatycznie opisze pikietaż wskazanych bloków.

W odpowiedzi na pytania:

1. załóżmy, że bloki są już wstawione na rysunku, ponieważ często pikietażosi przybywa za późno lub trzeba ją zmienić. zazwyczaj trzeba ją zmienić 😉

2. niestety, formę opisu barier narzucił klient. Natomiast taki lisp byłby uzyteczny przy opisie kilomeraża zjazdów, skrzyzowań, pkp, pkl i innych, które są już ściśle graficznym przedstawieniem

3. szablon opisu jest poniekąd narzucony w stylu "tak jak robi to ekkom" ;). Ale jeżeli ZWTraffic jest elastyczny na tyle, że można go wykorzystać do opisywania innych elementów rysunku to natychmiast się przesiadam.

 

"A co dokładnie jest problemem?
Wstawienie bloku? Zmiana atrybutu? Odczytanie pikietażu?
Jest to jak najbardziej do zrobienia Lisp-em. "

Nie ma problemu z definicją atrybutu, wstawieniem bloku, zmianą atrybutu ani odczytaniem pikietażu. Problem jest w ilości tych opisów. Kilka tysięcy zmian atrybutu zajmuje dwa dni idiotycznej pracy. Chodzi o zautomatyzowanie tej pracy. Tak jak wspomniałem, dochodzi element elastyczności, w sytuacji, kiedy trzeba przekilometrować od nowa odcinek drogi.

Link to comment
Share on other sites

Zastanawiam się na jakiej podstawie rozróżnić te bloki, którym trzeba zmienić kilometraż.
Czy chce Pan zaznaczyć jeden przykładowy blok i mają sie zaktualizować wszystkie wstawione tego samego typu? to rozwiązałoby kwestie różnych szablonów od różnych "wymagaczy" Ale wszystkie to wydaje się zbyt dużo. skąd wiedzieć które pominąć?
Jak powiązać je z konkretną osią drogi? Wyobrażam sobie że kiedy projektujemy skrzyżowanie, mamy przynajmniej 2 osie, zmieniamy jedną oś, jakie kryteria zastosować do wyboru i odrzucenia poszczególnych opisów?

Link to comment
Share on other sites

  • 3 weeks later...

Cześć,

Napisałem program PIKIETAZ.lsp w LISPie który zdecydowanie skróci twoją pracę.

Działanie jest bardzo proste

  1. W Pasku poleceń wpisujesz PIKIETAZ
  2. Wybierasz oś drogi (która musi być polilinią)
  3. Wpisujesz początkową wartość kilometrów i metrów na pikietażu
  4. Na koniec klikasz po kolei na bloki w których chcesz zmienić wartość
  5. Ż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!

image.thumb.gif.4de7880a19b96b0fb71df7470d6e1d63.gif

(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)
)

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...