tworzenie zbioru w Lisp


KBR

Rekomendowane odpowiedzi

Mam taki problem. W acadzie działała taka funkcja

(if (/= e nil)(command "_leader" pt1 pt2 "" "" "b" name_bl pt6 sc1 "" ""))

(COMMAND "change" "last" "" "p" "c" "m" "")

To jest tylko fragment procedury (mogę zamieścić całą - służyła do opisywania rysunków z podkreśleniem za pomocą bloku). Zmieniany był kolor bloku name_bl na "m".

W ZWCAD to nie działa, wg mnie nie działa "last".

Czy ktoś może pomóc?

Odnośnik do komentarza
Udostępnij na innych stronach

Witam

Moim zdaniem problem nie leży w zbiorze wskazań, sprawdzałem tą procedurę na ZWCAD 2009i i tam przypisało we właściwościach, ale nie zmieniło koloru wyświetlanego elementu. więc raczej problem tkwi w odświeżaniu, a nie w zbiorze.

Mam też dobrą wiadomość, sprawdziłem to też w najnowszej wersji ZWCAD 2010 (vernum 2010.05.31). W tym przypadku procedura działa bez zarzutu. Wersję tą można pobrać z adresu www.zwcad.pl

Odnośnik do komentarza
Udostępnij na innych stronach

Last wybiera tylko jeden - ostatnio utworzony element, a nie wszystkie utworzone w ostatniej funkcji. Więc jeśli zmienia odnośnik to chyba jest poprawnie.

Przyznam, że nie bardzo rozumiem o co chodzi ze zmianą tekstu a bloku.

Jeśli ma być zmienione wszystko, to może lepiej zmienić aktualny kolor, wywołać polecenie (command), a potem przywrócić stary bieżący kolor.

Odnośnik do komentarza
Udostępnij na innych stronach

cała procedura wygląda tak

;*****************************************************

;* *

;* wstawianie opisu z leaderem, podkreślonego blokiem,

;* z ustawieniem skali *

;* *

;*****************************************************

;

(defun c:dtt (/ pt1 pt2 e )

(setq osmode1 (getvar "osmode"))(setq osmode3 (getvar "osmode"))

(If (= sc2 nil)(setq sc2 (getvar "dimscale")))

(setq sc3 (getreal (strcat "\nPodaj skalę rysunku <" (rtos sc2 2 0) ">: ") ))

(if (= sc3 nil)(setq sc3 sc2))

(setq sc2 sc3)

(command "textstyle" "standard")

(setq h (/ (* sc3 25) 10))

(setq h1 (* sc3 0.5))

(setq warstwa (getvar "clayer"))

(command "ortho" "on")

(command "layer" "m" "opis" "" "" "" "")

(command "osnap" "nea")

(setq pt1 (getpoint "\n Start :"))

(command "osnap" "non")

(setq pt2 (getpoint "\n To point :"))

(setq rad (angtof "90" 0))

(setq pt6 pt2)

(setq name_bl "F:/A_block/b/podkreska.dwg")

(if (<= (car pt1)(car pt2))

(progn

(command "dtext" "_j" "_Bl" pt6 h 0)

(setq e (entget (entlast)))

(setq pt3 ( cadr (textbox e)))

(setq pt4 '(0 0 ))

(setq dl (distance pt4 pt3))

(setq sc1 dl)

)

(progn

(command "dtext" "_j" "_Br" pt6 h 0)

(setq e (entget (entlast)))

(setq pt3 ( cadr (textbox e)))

(setq pt4 '(0 0 ))

(setq dl (distance pt4 pt3))

(setq sc1 (- 0 dl))

)

)

(if (/= e nil)(command "_leader" pt1 pt2 "" "" "b" name_bl pt6 sc1 "" ""))

(COMMAND "change" "last" "" "p" "c" "8" "")

(command "layer" "set" warstwa "")

(command "osmode" osmode1 )

);defun

blok to po prostu linia o jednostkowej długości.

Odnośnik do komentarza
Udostępnij na innych stronach

Zainstalowałem najnowszą wersję i pewne lispy przestały prawidłowo chodzić

np.:

Wstawiania numeru elementu

(defun c:nr (/ numerek pnt1 pnt2 sc name_bl)

(setq sc (getvar "dimscale"))(setq osmode1 (getvar "osmode"))

(command "osnap" "nea")

(setq pnt1 (getpoint "\n Start :"))

(command "osnap" "non")

(setq pnt2 (getpoint "\n To point :"))

(if (< (car pnt2)(car pnt1))(setq name_bl "F:/A_block/b/nrelem_l.dwg")(setq name_bl "F:/A_block/b/nrelem"))

(if (not cl)(setq cl 1))

(initget 6)

(setq numerek (getint (strcat "\nNumer <" (rtos cl 2 0) ">: ")))

(if (= numerek nil)(setq numerek cl))

(setq cl (1+ numerek))

(setq warstwa (getvar "clayer"))

(command "layer" "M" "opis" "" "" "" "")

(command "_leader" pnt1 pnt2 "" "" "b" name_bl pnt2 sc "" "" numerek)

(command "layer" "set" warstwa "")(command "osmode" osmode1 )

);defun

atrybut "nr" występujący w bloku nrelem którego wartość jest wstawiona za pomocą zmiennej "numerek" do tej pory był wstawiany z kolorem jaki miał w bloku (niebieski) teraz wstawiany jest z Bylayer.

Zauważałem że w innych procedurach jest tak samo.

Ale tam gdzie wstawiany jest sam blok bez leadera to kolor pozostaje jak w bloku oryginalnym.

nrelem.zip

Odnośnik do komentarza
Udostępnij na innych stronach

Dziękuję.

W powyższym przypadku można sobie poradzić przez zmianę aktualnego koloru, gorzej jeżeli w jednym bloku jest więcej atrybutów o różnych kolorach.

Za każdym razem trzeba zmieniać ręcznie.

Może trzeba przejść na rysowanie za pomocą grubości linii, ale to wiele zmian i nie wiem czy wszystko będzie ok.

Odnośnik do komentarza
Udostępnij na innych stronach

Myślałem, że zrobię sobie szybką procedurę na zmianę koloru, ponieważ inny kolor dotyczy tylko numerów elementów. Założyłem, że pręty będą miały nazwę atrybutu nr, elementy stalowe - nre, a drewniane nrd.

napisałem

(DEFUN c:cn (/ )

(command "ATTEDIT" "" "" "nre" "" pause "" "c" "5" "Q")

)

ale to nie działa ponieważ zmienia się zamiast atrybut "nre", atrybut pierwszy na liście w bloku.

jeżeli w danym bloku nie ma atrybutu o nazwie "nre" to nic się nie zmienia.

OpisBl.zip

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...
  • 2 miesiące temu...
cała procedura wygląda tak

;*****************************************************

;* *

;* wstawianie opisu z leaderem, podkreślonego blokiem,

;* z ustawieniem skali *

;* *

;*****************************************************

;

(defun c:dtt (/ pt1 pt2 e )

(setq osmode1 (getvar "osmode"))(setq osmode3 (getvar "osmode"))

(If (= sc2 nil)(setq sc2 (getvar "dimscale")))

(setq sc3 (getreal (strcat "\nPodaj skalę rysunku <" (rtos sc2 2 0) ">: ") ))

(if (= sc3 nil)(setq sc3 sc2))

(setq sc2 sc3)

(command "textstyle" "standard")

(setq h (/ (* sc3 25) 10))

(setq h1 (* sc3 0.5))

(setq warstwa (getvar "clayer"))

(command "ortho" "on")

(command "layer" "m" "opis" "" "" "" "")

(command "osnap" "nea")

(setq pt1 (getpoint "\n Start :"))

(command "osnap" "non")

(setq pt2 (getpoint "\n To point :"))

(setq rad (angtof "90" 0))

(setq pt6 pt2)

(setq name_bl "F:/A_block/b/podkreska.dwg")

(if (<= (car pt1)(car pt2))

(progn

(command "dtext" "_j" "_Bl" pt6 h 0)

(COMMAND "change" "last" "" "p" "c" "8" "")

;lub

(command "_.chprop" (entlast) "" "_la" warstwa "_c" 1 "")

(setq e (entget (entlast)))

(setq pt3 ( cadr (textbox e)))

(setq pt4 '(0 0 ))

(setq dl (distance pt4 pt3))

(setq sc1 dl)

)

(progn

(command "dtext" "_j" "_Br" pt6 h 0)

(COMMAND "change" "last" "" "p" "c" "8" "")

;lub

(command "_.chprop" (entlast) "" "_la" warstwa "_c" 1 "")

(setq e (entget (entlast)))

(setq pt3 ( cadr (textbox e)))

(setq pt4 '(0 0 ))

(setq dl (distance pt4 pt3))

(setq sc1 (- 0 dl))

)

)

(if (/= e nil)(command "_leader" pt1 pt2 "" "" "b" name_bl pt6 sc1 "" ""))

(COMMAND "change" "last" "" "p" "c" "8" "")

(command "layer" "set" warstwa "")

(command "osmode" osmode1 )

);defun

blok to po prostu linia o jednostkowej długości.

Biorąc pod uwagę powyższą postać kodu, aby uzyskać kolor dla atrybutu bloku, należałoby umieścić w odpowiednim miejscu właściwy kod (zaznaczyłem kolorem czerwonym).

Można również użyć innej funkcji:

(command "_.chprop" (entlast) "" "_la" warstwa "_c" 1 "")

W ten sposób każdy z atrybutów jednego bloku, może mieć nadany inny kolor.

Można też pobawić się zmienną systemową "CECOLOR" i zmieniać jej wartość tuż przed wywołaniem polecenia tworzącego obiekt np. atrybut czy blok, a potem przywracać do postaci wejściowej.

Aby natomiast móc zmienić kolor samego bloku, blok powinien być utworzony na warstwie "ByLayer", w przeciwnym przypadku zmiana kolorów bloku może być niemożliwa (to samo dotyczy wersji na AutoCAD).

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Aby natomiast móc zmienić kolor samego bloku, blok powinien być utworzony na warstwie "ByLayer", w przeciwnym przypadku zmiana kolorów bloku może być niemożliwa (to samo dotyczy wersji na AutoCAD).

Witam! Rozumiem, że autorowi chodziło o utworzenie bloku z kolorem ByLayer, a nie "na warstwie ByLayer".

Sugerowałbym jednak utworzenie bloku o kolorze ByBlock, a nie ByLayer. Wydaje mi się to bardziej użyteczne.

***

I odbiegnę trochę od tematu.

Wg mnie definiowanie kolorów w bloku to bardzo zła praktyka (dotyczy to również kolorów atrybutów). Podobnie jak ustawianie elementów bloku na jakiejś konkretnej warstwie (zamiast na "0"). Bardzo to utrudnia życie innym osobom które muszą wykorzystać rysunek z takimi blokami.

Padła już wyżej przez autora Lispa deklaracja o możliwości (próbie?) przejścia na definiowanie grubości linii nie za pomocą kolorów. Polecam - pora to uczynić, to przyszłość :)

Odnośnik do komentarza
Udostępnij na innych stronach

Witam! Rozumiem, że autorowi chodziło o utworzenie bloku z kolorem ByLayer, a nie "na warstwie ByLayer".

Sugerowałbym jednak utworzenie bloku o kolorze ByBlock, a nie ByLayer. Wydaje mi się to bardziej użyteczne.

W takim przypadku odsyłam do tematu:

http://forum.projektuje.net/zmienna-cecolor-vt303.htm

Co do kolorowania atrybutów w bloku, to może i nie jest to najlepsze dla programów obsługujących takie bloki, ale na pewno dla użytkowników, którym to wręcz pomaga.

Co do wydruku, to kwestia właściwego przypisania grubości do warstw i kolorów - zaawansowany użytkownik nie ma z tym najmniejszego problemu i zazwyczaj działa zawsze na, przez siebie stworzonym, szablonie, gdzie wszystko ma zdefiniowane.

pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.