Lisp do opisu


Recommended Posts

Witam ma taki lisp zrobiony jeszcze kiedy pracowałem na autocadzie.

Procedura działa na ZWCAD 2012 ale nie dział na ZWCAD2012+

Już dawno nie pisałem lispów więc trudno mi znaleść błąd.

Lisp wywala się prawdopodobnie na poleceniu mtext chyba nie umie kreślić punktu wstawienia mtextu

Może koś umie pomóc?

 

;**********************************************************************************
;Opis za pomocą mtekstu ze stałą skalą raz przyjetą
;***************************************************************************************

(defun c:tt (/ pt1 pt2 e )
(setq osmode1 (getvar "osmode"))(setq osmode3 (getvar "osmode"))
(If (= sc2 nil)(setq sc2 (getvar "dimscale")))
(if (= sc3 nil)
(progn
(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")
(setq war "opis")
(if (null C:tlyr)(load "F:/a_block/lay/tlyr"))
(command "tlyr" "")
(command "layer" "m" "opis" "" "" "" "")
(command "osnap" "nea")
(setq pt1 (getpoint "\n    Start :"))
(command "osnap" "non")
(setq pt2 (getpoint "\n    To point :"))

(setq radx (angtof "0" 0))
;(setq rady (angtof "90" 0))
;(setq rad45 (angtof "45" 0))
;(setq rad60 (angtof "60" 0))
;(setq rad30 (angtof "30" 0))
;(setq rad300 (angtof "300" 0))
(setq w (* (* sc3 25) 10))
(setq pt6 (polar pt2 radx w))
(if (<= (car pt1)(car pt2))
    (progn
        (command "mtext" pt2 "H" h "J" "Bl" "W" w "")
        (setq e (entget (entlast)))
        (setq pt3 ( cadr (textbox e)))
        (setq pt4 '(0 0 ))
        (setq dl (distance pt4 pt3))
        (setq sc1 dl)
    )
    (progn
        (command "mtext" pt2 "H" h "J" "Br" "W" w "")
        (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 "" "" "" ""))
(COMMAND "change" "last" "" "p" "c" "8" "")
(command "layer" "set" warstwa "")
(command "osmode" osmode1 )
);defun
 

 

 

Link to comment
Share on other sites

Witam

Problem może być spowodowany przez dwie przyczyny

1. Plik korzysta z czegoś jeszcze: (load "F:/a_block/lay/tlyr")

Czy to jest dostępne i czy w takiej postaci bez rozszeżenia jest poprawne?

2. ZWCAD+ w polskiej wersji językowej nie posiada zdefiniowanych poleceń w języku angielskim. Można korzystać z domyślnych poleceń, które są zgodne z angielskimi, ale poprzedzone znakiem _ czyli przy każdym użyciu poleceń (command ...) nazwa polecenia i parametry powinny zaczynać się od _ co daje uniwersalność objawiającą się w możliwości uruchamiania poleceń na dowolnej platformie językowej. Przykład:

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

Powinno być

(command "_change" "_last" "" "_p" "_c" "8" "")

Pozdrawiam

Link to comment
Share on other sites

W oknie F2 pokazują sie

 

Command: TT
textstyle
Enter new value for TEXTSTYLE <"Standard">: standard
Command: ortho Enter mode [ON/OFF] <ON>: on
Command: layer
Current layer:  "opis"
Enter an option
[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:
m
Enter name for new layer (becomes the current layer) <opis>: opis Enter an
option
[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:
Command: TT Unknown command "TT".  Press F1 for help.

Command: TT Unknown command "TT".  Press F1 for help.

Command: TT Unknown command "TT".  Press F1 for help.

Command: -osnap Enter list of object snap modes: nea
Command:
    Start :-osnap
Current osnap modes: Near
Enter list of object snap modes: non
Command:
    To point :-mtext Current text style:  "Standard"  Text height:  250
Specify first corner:
Specify opposite corner or [Height/Justify/Line spacing/Rotation/Style/Width]:
_H
Specify height <250>: 250.0000000000000
Specify opposite corner or [Height/Justify/Line spacing/Rotation/Style/Width]:
_J
Enter justification [TL/TC/TR/ML/MC/MR/BL/BC/BR] <TL>: _Bl
Specify opposite corner or [Height/Justify/Line spacing/Rotation/Style/Width]: W
Specify width: 25000.00000000000
MText:

Command: ; error: bad argument type: 2D/3D point: nil
 

Wydaje mi się że jest problem z drugim pinktem okna mtextu.

próbowałem go podawać wcześnij definiją albo podając wspórzędne albo jeszcze jedno oczekiwanie na dane "" ale ni poradziłe sobie.

Pracuje na wesji angielskiej z polskim menu, ponieważ w wersji poskiej nie mogłem się przyzwyczaić do skrutu "k" w uchwytach.

Link to comment
Share on other sites

Witam

Problem nie leży w punktach wskazanych ale w  użyciu funkcji

(setq pt3 ( cadr (textbox e)))

textbox zwraca nil jeszcze niezupełnie rozumiem dlaczego. Postaram się to ustalić. Z tego co widzę w kolejnych liniach kodu, na podstawie punktów obliczonych z (textbox) obliczana jest  długość, która nigdzie dalej nie jest użyta. Może więc można to zwyczajnie usunąć? czy może coś jeszcze gdzieś korzysta z wartości tu obliczonych?

 

 

Pozdrawiam

Link to comment
Share on other sites

Im więcej to poznaję, tym mniej rozumiem. Z zamieszczonego przykładu wynika, że tworzony jest pusty tekst, bez treści, który jest mierzony. ZWCAD zwraca tutaj  ((0.0 0.0 0.0) (0.0 0.0 0.0)) ZWCAD+ nil. To powoduje dalsze komplikacje. 

Mogę się mylić, dawno tego nie używałem, ale z tego co pamiętam, to textbox powinien określać granice tekstu, ale tylko jednowierszowego. Dla tekstów wielowierszowych należałoby raczej użyć bardziej uniwersalnej funkcji: vla-getboundingbox.

Link to comment
Share on other sites

Im więcej to poznaję, tym mniej rozumiem. Z zamieszczonego przykładu wynika, że tworzony jest pusty tekst, bez treści, który jest mierzony. ZWCAD zwraca tutaj  ((0.0 0.0 0.0) (0.0 0.0 0.0)) ZWCAD+ nil. To powoduje dalsze komplikacje. 

Mogę się mylić, dawno tego nie używałem, ale z tego co pamiętam, to textbox powinien określać granice tekstu, ale tylko jednowierszowego. Dla tekstów wielowierszowych należałoby raczej użyć bardziej uniwersalnej funkcji: vla-getboundingbox.

Prawda i nie(cała)prawda. Rzeczywiście (i tu prawda) textbox ma zastosowanie tylko dla obiektów typu TEXT. Dla tekstów wielowieszowych zaś (obiekty MTEXT), vla-getboundingbox, zwraca ramkę określającą obszar samego obiektu (nie zaś obszar dla rzeczywistej treści). Przypadki gdy szerokość tekstu wielowierszowego jest wielokrotnie większa niźli szerokość jego treści, są dość powszechne.

kojacek

Link to comment
Share on other sites

Dzięki za odpowiedzi.

Procedurę przerobiłem z procedury do robienia opisów tekstem jednowierszowym z podkreśleniem i długość teksu używałem do określenia długości podkreślenia.

W tekscie wielowierszowym jest mi to nie potrzebne.

Wiele się nie zastanawiałem bo do tej pory działało.

Wykasowałem linie odpowiedzialne za mierzenie tekstu ale nadal nie działa.

Więc coś nie tak z poleceniem mtext

pokazuje się taki komunikat:

 

Command: TT
Unknown command "TT".  Press F1 for help.
Unknown command "TT".  Press F1 for help.
Unknown command "TT".  Press F1 for help.

    Start :
    To point :Current text style:  "Standard"  Text height:  62.5
 

Link to comment
Share on other sites

Witam

Problem z MTextem jest taki, że w starszej wersji ZWCADa 

(command "mtext" pt2 "H" h "J" "Bl" "W" w "")

Tworzyło tekst i prosiło Użytkownika o wpisanie treści. Wersji 2012+ MText w tej postaci kończy działanie. Jedyny sposób jaki znam, by w tej sytuacji poprosić Użytkownika o wpisanie tekstu jest użycie funkcji (getstring) Niestety nie pozwala ona na użycie wbudowanego edytora a jedynie podanie treści, która będzie użyta jako wartość tekstu.

Kolejna sprawa to funkcja:

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

gdzie "" kończy polecenie a kolejne "" powtarzają ostatnio użyte polecenia. Funkcja powinna mieć raczej postać: 

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

Całość kodu mogłaby wyglądać tak

(defun c:tt (/ pt1 pt2 e )
(setq osmode1 (getvar "osmode"))(setq osmode3 (getvar "osmode"))
(If (= sc2 nil)(setq sc2 (getvar "dimscale")))
(if (= sc3 nil)
(progn
(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")
(setq war "opis")

;(command "layer" "m" "opis" "" "" "" "")
(command "_layer" "m" "opis" "")
(command "_osnap" "nea")
(setq pt1 (getpoint "\n    Start :"))
(command "_osnap" "non")
(setq pt2 (getpoint "\n    To point :"))

(setq radx (angtof "0" 0))
;(setq rady (angtof "90" 0))
;(setq rad45 (angtof "45" 0))
;(setq rad60 (angtof "60" 0))
;(setq rad30 (angtof "30" 0))
;(setq rad300 (angtof "300" 0))
(setq w (* (* sc3 25) 10))
(setq pt6 (polar pt2 radx w))
(setq wartosc (getstring "podaj treść" ))

;(if (<= (car pt1)(car pt2))
;    (progn
;        (command "_mtext" pt2 "H" h "J" "Bl" "W" w wartosc "")
;    )
;    (progn
;        (command "_mtext" pt2 "H" h "J" "Br" "W" w wartosc "")
;    )
;)

;(if (/= e nil)
(command "_leader" pt1 pt2 "a" wartosc "")
(command "_regen")
(COMMAND "_change" "last" "" "p" "c" "8" "")
(command "_layer" "set" warstwa "")
(command "_osmode" osmode1 )
);defun 

Pozdrawiam

Link to comment
Share on other sites

Dziękuję za pomoc.

Jednak jednak opisywanie bez okna dialogowego nie jest zbyt wygodne.

Będę stosował opis tekstem jednowierszowym łątwiejsza i szybsza edycja.

Jest takie polecenie mleader.

Może za pomocą tego polecenia zamiast mtext można zrobić podobną procedurę?

Link to comment
Share on other sites

Witam

Oczywiście procedurę można przerobić na używającą mleader. Wynik będzie następujący:

(defun pt2txt (Px / )
	(strcat (rtos (car Px)) "," (rtos (cadr Px)) "," (rtos (caddr Px)))
)

(defun c:tt (/ pt1 pt2 e )
(setq osmode1 (getvar "osmode"))(setq osmode3 (getvar "osmode"))
(If (= sc2 nil)(setq sc2 (getvar "dimscale")))
(if (= sc3 nil)
(progn
(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")
(setq war "opis")

(command "_layer" "m" "opis" "" )
(command "_osnap" "nea")
(setq pt1 (getpoint "\n    Start :"))
(command "_osnap" "non")
(setq pt2 (getpoint "\n    To point :"))


(command "_mleader" (pt2txt pt1) (pt2txt pt2) pause )
;(command "_change" "last" "" "p" "c" "8" "")
(command "_layer" "set" warstwa "")
(command "_osmode" osmode1 )
);defun

Dalej treść można wpisywać jedynie w linii poleceń bez uruchomienia okna edycji mtext

Pozdrawiam

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...