Chuyển đến nội dung
Diễn đàn CADViet
hungpx2008

Lưu thông số giữa các lần dùng lệnh

Các bài được khuyến nghị

Mấy sư huynh cho mình hỏi.

Câu hỏi:

1. Hàm nào lưu lại thông số để khi lặp lại vòng lặp thì kô cần phải nhập lại.

vd: Giống như là nhập bán kính rồi thì khi gọi lại thông số bán kính dc lưu.

2. Có thuật nào như sau kô:

Vd: Nhập vào chuỗi cho text là: “NAME1” khi vòng lặp lập lại thông số đc lưu và đổi thành “NAME2” (chuỗi giữ nguyên lấy phần số +1 rùi ráp vào phần chuỗi để cho vào text).

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mấy sư huynh cho mình hỏi.

Câu hỏi:

1. Hàm nào lưu lại thông số để khi lặp lại vòng lặp thì kô cần phải nhập lại.

vd: Giống như là nhập bán kính rồi thì khi gọi lại thông số bán kính dc lưu.

2. Có thuật nào như sau kô:

Vd: Nhập vào chuỗi cho text là: “NAME1” khi vòng lặp lập lại thông số đc lưu và đổi thành “NAME2” (chuỗi giữ nguyên lấy phần số +1 rùi ráp vào phần chuỗi để cho vào text).

1. Khi bạn gán value cho 1 biến bằng setq, đương nhiên nó sẽ được lưu lại cho đến khi bạn gán cho nó value khác. Vấn đề là bạn dùng nó như thế nào.

2. Dùng các hàm xử lý string như substr hoặc vl-string-xxxx

Bạn mô tả kỹ hơn yêu cầu đoạn code muốn thực hiện, mình sẽ làm ví dụ để bạn tham khảo.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1. Khi bạn gán value cho 1 biến bằng setq, đương nhiên nó sẽ được lưu lại cho đến khi bạn gán cho nó value khác. Vấn đề là bạn dùng nó như thế nào.

2. Dùng các hàm xử lý string như substr hoặc vl-string-xxxx

Bạn mô tả kỹ hơn yêu cầu đoạn code muốn thực hiện, mình sẽ làm ví dụ để bạn tham khảo.

đây là code:

http://www.cadviet.com/upfiles/lisp.rar

mình muốn như sau:

Bắu đầu lệnh: input name of this plate: (nhập) G1(giá trị này vòng lặp sau là G2)

input thick plate : 10 (giá trị này giữ lại cho vòng lặp sau)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
đây là code:

http://www.cadviet.com/upfiles/lisp.rar

mình muốn như sau:

Bắu đầu lệnh: input name of this plate: (nhập) G1(giá trị này vòng lặp sau là G2)

input thick plate : 10 (giá trị này giữ lại cho vòng lặp sau)

 

Bạn xem đoạn code dưới đây, những phần tô màu đỏ là những đoạn mã lưu thông số giữa các lần sử dụng lệnh. Mỗi khi dùng lệnh, chương trình sẽ yêu cầu người sử dụng nhập vào giá trị của biến tyledong. Nếu nhấn enter, giá trị mặc định sẽ được chọn (giữ nguyên giá trị cũ). Bạn chạy thử chương trình rồi rút kinh nghiệm cho trường hợp cụ thể của mình. Cách sử dụng đoạn mã dưới đây bạn đọc thêm ở: http://www.cadviet.com/forum/index.php?sho...mp;st=260

 

(defun c:stext (/ sst lstent egoc pgoc xgoc yht zgoc linespc ee tt)
[b][color="#FF0000"](if (not tyledong) (setq tyledong 1.5))
[/color][/b](princ "\nSap xep text © CADViet.com")
(setq sst (ssget '((0 . "TEXT")))
lstent (ss2ent sst)
[b][color="#FF0000"]tmp (getreal (strcat "\nVao ty le dong khoang cach dong : " ))
tyledong (cond (tmp tmp) (t tyledong))
[/color][/b]lstent (vl-sort lstent
'(lambda (e1 e2)
(> (cadr (cdr (assoc 10 (entget e1))))
(cadr (cdr (assoc 10 (entget e2))))
)
)
)
egoc (car lstent)
lstent (cdr lstent)
pgoc (cdr (assoc 10 (entget egoc)))
xgoc (car pgoc)
yht (cadr pgoc)
zgoc (caddr pgoc)
hgoc (cdr (assoc 40 (entget egoc)))
linespc (* hgoc (+ 1.0 tyledong))

)
(foreach ee lstent
(setq tt (entget ee)
tt (subst (list 10
xgoc
(setq yht (- yht linespc))
zgoc
)
(assoc 10 tt)
tt
)
)
(entmod tt)
(entupd ee)
)
(princ)
)
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (cond
(ss (sslength ss))
(t 0)
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
(princ
"\nSTEXT - Sap xep text - free lisp from www.cadviet.com"
)
(vl-load-com)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
KỐ AI BÍT THUẬT NHƯ VẬY ÀH. :unsure:

Bạn dùng hàm strnext dưới đây để biến giá trị "G1" thành "G2"

(defun strnext (str / sgoc so)
 (vl-load-com)
 (setq sgoc (vl-string-right-trim "1234567890" str)
so   (itoa (1+ (atoi (substr str (1+ (strlen sgoc))))))	
 )
 (strcat sgoc so)
)

Hàm này trả về text tiếp theo.

Ví dụ (strnext "abc123") sẽ trả về "abc124"

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
CÒN CÂU HỎI ĐẦU TIÊN (G1-->G2) ĐÓ THÌ SAO BÁC HOÀNH CÓ TRONG CÁI LISP NÀY KÔ

Ssg đã xem balloon.lsp của bạn, có vài góp ý sau:

1) Đây là bản edit từ bangke.lsp của ssg đã post lên mấy hôm trước. Không có vấn đề gì, mã nguồn mở hoàn toàn và chúng ta lên đây là để học tập và giúp đỡ lẫn nhau.

2) Tuy mới tiếp cận lisp (như lời tự giới thiệu của bạn) nhưng bạn chịu khó học hỏi, nghiên cứu để tạo chương trình cho riêng mình. Ssg rất hoan nghênh tinh thần này, không như một số bạn chỉ biết nêu yêu cầu một cách vội vã, thiếu cân nhắc.

3) Bạn chưa nắm được nền tảng căn bản nhất của lisp và ngôn ngữ lập trình nói chung. Ví dụ cụ thể ở đây là bạn dùng vòng lặp while không đúng. Cấu trúc chung của while là:

(while (biểu thức điều kiện) (các lệnh cần thực hiện))

Chu trình thực hiện như sau:

- Kiểm tra điều kiện.

- Nếu không thoả mãn (nil): thoát khỏi vòng lặp

- Nếu thoả mãn (true - T): thực hiện các lệnh sau đó - Quay lại đầu vòng lặp - Tiếp tục kiểm tra điều kiện....

Với cách hoạt động như trên, các lệnh thực hiện trong vòng while phải có tác động đến biểu thức điều kiện một cách chủ động hoàn toàn. Bạn viết (While (Begin_BA) (.......)) thật không ổn chút nào!

4) Mình hiểu yêu cầu của bạn và có thể viết trình lisp đáp ứng đúng và vừa đủ (ngắn gọn, súc tích hơn cái bạn đang làm). Nhưng có lẽ không nên như vậy, bạn tự làm mới hiểu sâu sắc được.

5) Lời khuyên chân tình: đừng nóng vội. Hãy bắt đầu từ những cái đơn giản và căn bản nhất. Nếu muốn tham khảo chương trình của người khác để áp dụng trong chương trình của mình, bạn phải hiểu toàn bộ các code mà người ta đã sử dụng, không được phép bỏ qua bất cứ chi tiết nhỏ nhặt nào!

Chúc bạn thành công!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Ssg đã xem balloon.lsp của bạn, có vài góp ý sau:

1) Đây là bản edit từ bangke.lsp của ssg đã post lên mấy hôm trước. Không có vấn đề gì, mã nguồn mở hoàn toàn và chúng ta lên đây là để học tập và giúp đỡ lẫn nhau.

2) Tuy mới tiếp cận lisp (như lời tự giới thiệu của bạn) nhưng bạn chịu khó học hỏi, nghiên cứu để tạo chương trình cho riêng mình. Ssg rất hoan nghênh tinh thần này, không như một số bạn chỉ biết nêu yêu cầu một cách vội vã, thiếu cân nhắc.

3) Bạn chưa nắm được nền tảng căn bản nhất của lisp và ngôn ngữ lập trình nói chung. Ví dụ cụ thể ở đây là bạn dùng vòng lặp while không đúng. Cấu trúc chung của while là:

(while (biểu thức điều kiện) (các lệnh cần thực hiện))

Chu trình thực hiện như sau:

- Kiểm tra điều kiện.

- Nếu không thoả mãn (nil): thoát khỏi vòng lặp

- Nếu thoả mãn (true - T): thực hiện các lệnh sau đó - Quay lại đầu vòng lặp - Tiếp tục kiểm tra điều kiện....

Với cách hoạt động như trên, các lệnh thực hiện trong vòng while phải có tác động đến biểu thức điều kiện một cách chủ động hoàn toàn. Bạn viết (While (Begin_BA) (.......)) thật không ổn chút nào!

4) Mình hiểu yêu cầu của bạn và có thể viết trình lisp đáp ứng đúng và vừa đủ (ngắn gọn, súc tích hơn cái bạn đang làm). Nhưng có lẽ không nên như vậy, bạn tự làm mới hiểu sâu sắc được.

5) Lời khuyên chân tình: đừng nóng vội. Hãy bắt đầu từ những cái đơn giản và căn bản nhất. Nếu muốn tham khảo chương trình của người khác để áp dụng trong chương trình của mình, bạn phải hiểu toàn bộ các code mà người ta đã sử dụng, không được phép bỏ qua bất cứ chi tiết nhỏ nhặt nào!

Chúc bạn thành công!

 

 

 

XIN CHÂN THÀNH CÁM ƠN SỰ ĐÓNG GÓP Ý KIẾN CỦA PÁC. TẠI VÌ NHƯ THẾ NÀY:

 

CÁI CODE NÀY THỰC SỰ LÀ MÌNH CŨNG KÔ BIẾT NÓ XUẤT PHÁT TỪ ĐÂU. TẠI CÓ THẰNG BẠN NÓ KÊU NÓ VIẾT MÌNH THẤY HAY HAY XIN NÓ VIẾT LẠI CHO PHÙ HỢP. MÀ LÚC ĐÓ CHƯA BIẾT J VỀ LISP CẢ. SAU ĐÓ MUA CẢ MẤY CUỐN SÁCH VỀ LISP NGỒI ĐỌC. CÁC THUẬT THÌ MÌNH CÓ BIẾT VỀ LẬP TRÌNH C NHƯNG HÀM VỀ LISP THÌ MÌNH KÔ NHỚ ĐC VỚI LẠI THỜI GIAN KÔ CÓ NÊN PHẢI HỎI MẤY SƯ HUYNH CHO NHANH. CÒN VIỆC CHỈNH SỬA THÌ DO CÁI LỆNH ĐÓ NÓ TRÙNG VỚI LỆNH CỦA CONGTY NÊN MÌNH PHẢI SỬA LẠI BẠN THÔNG CẢM NHÉ. RẤT CÁM ƠN SỰ GIÚP ĐỠ NHIỆT TÌNH CỦA CÁC BẠN.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn xem đoạn code dưới đây, những phần tô màu đỏ là những đoạn mã lưu thông số giữa các lần sử dụng lệnh. Mỗi khi dùng lệnh, chương trình sẽ yêu cầu người sử dụng nhập vào giá trị của biến tyledong. Nếu nhấn enter, giá trị mặc định sẽ được chọn (giữ nguyên giá trị cũ). Bạn chạy thử chương trình rồi rút kinh nghiệm cho trường hợp cụ thể của mình. Cách sử dụng đoạn mã dưới đây bạn đọc thêm ở: http://www.cadviet.com/forum/index.php?sho...mp;st=260

 

(defun c:stext (/ sst lstent egoc pgoc xgoc yht zgoc linespc ee tt)
[b][color="#FF0000"](if (not tyledong) (setq tyledong 1.5))
[/color][/b](princ "\nSap xep text © CADViet.com")
(setq sst (ssget '((0 . "TEXT")))
lstent (ss2ent sst)
[b][color="#FF0000"]tmp (getreal (strcat "\nVao ty le dong khoang cach dong <" (rtos tyledong 2 2) ">: " ))
tyledong (cond (tmp tmp) (t tyledong))
[/color][/b]lstent (vl-sort lstent
'(lambda (e1 e2)
(> (cadr (cdr (assoc 10 (entget e1))))
(cadr (cdr (assoc 10 (entget e2))))
)
)
)
egoc (car lstent)
lstent (cdr lstent)
pgoc (cdr (assoc 10 (entget egoc)))
xgoc (car pgoc)
yht (cadr pgoc)
zgoc (caddr pgoc)
hgoc (cdr (assoc 40 (entget egoc)))
linespc (* hgoc (+ 1.0 tyledong))

)
(foreach ee lstent
(setq tt (entget ee)
tt (subst (list 10
xgoc
(setq yht (- yht linespc))
zgoc
)
(assoc 10 tt)
tt
)
)
(entmod tt)
(entupd ee)
)
(princ)
)
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (cond
(ss (sslength ss))
(t 0)
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)
(princ
"\nSTEXT - Sap xep text - free lisp from www.cadviet.com"
)
(vl-load-com)

 

 

 

BÁc HOÀNH chỉ giúp em với. MẤy cái khác làm dc rùi nhưng lưu giá trị cho mỗi lần gọi lại làm wài kô dc. Khi NÀo bác rảnh bác thêm cho em cái funtion cho cái luư text vào doạn code màu đỏ dưói. để e tham khảo nhé.

 

 

;;;-------------------------------------------------------

(defun Begin_BA()

(setq

oldOs (getvar "osmode")

oldTrack ( getvar "trackpath")

oldOrth ( getvar "orthomode")

StyleBA ( getvar "textstyle")

OLD_LAYER (getvar "CLAYER")

Th (cdr (assoc 40 (tblsearch "style" StyleBA)))

n 0

TT (getstring "\nBALLOON(BA) of Pham Xuan Hung edit for ST ENGINEERING \nInput name of this plate <>:")

thik ( getstring"\nInput thick of this plate <PL...>:")

)

(if (= Th 0) (setq Ts (getvar "textsize")) (setq Ts Th))

(setvar "orthomode" 0)

(setvar "osmode" 0)

)

;;;-------------------------------------------------------

(defun So_BA()

(setvar "osmode" 4)

(setvar "trackpath" 1)

(setq

p2 (getpoint pa "\nPlace number : ")

p3 (polar p2 (* pi 1.5) (* 0.5 Ts))

g (angle pa p2)

r1 (distance pa p2)

r2 (* 1.08333 Ts)

p4 (polar pa g (- r1 r2))

)

(setvar "osmode" 0)

(command "leader" p1 pa)

(command p4 "" "" "n")

(SETVAR "CLAYER" "0")

(command "circle" p2 r2)

(if (= Th 0)

(command "text" "j" "c" p3 Ts 0 TT)

(PROGN

(SETVAR "CLAYER" "5")

(command "text" "j" "c" p3 0 TT)

))

(command "scale" (entlast) "" p3 1)

)

;;;-------------------------------------------------------

(defun End_BA()

(setvar "osmode" oldos)

(setvar "trackpath" oldTrack)

(setvar "CLAYER" OLD_LAYER)

(princ)

)

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

(Defun C:BA( / oldOs oldTrack OldOrth StyleBA Th n

TT Ts p2 pa p3 g r1 r2 p4 p5 str thik)

 

(While

(Begin_BA)

(setq str (strcat "PL" thik))

(setvar "osmode" 15359)

(setq p1 (getpoint "\nPoint to part <exit>:")

pa (getpoint p1 "\n Next point:"))

(SETVAR "ORTHOMODE" 1)

(So_BA)

(setq p5 (getpoint "\nPoint of thick plate text:")

)

(SETVAR "CLAYER" "5")

(command "text" "j" "TL" p5 0 str)

(End_BA)

))

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Nếu bạn muốn lưu thông số giữa các lần dùng lệnh và đồng thời cũng làm cho chương trình mang tính chuyên nghiệp hơn, bạn có thể làm như sau:

tạo ra một hàm INIT() trước khi thực hiện lệnh

VD bạn có biến là VAR1 cần dùng để lưu thông tin thì có thể khởi tao trong hàm INIT như sau:

 

(DEFUN INIT()

(if (= VAR1 Nil)

(setq VAR1 value)

)

)

 

Trong quá trình làm việc nếu có dòng gọi truyền giá trị cho VAR1 có thể làm như sau

 

(DEFUN DOSOMETHING(/ VARTEMP)

...

(setq VARTEMP (...))

(if (/= VARTEMP Nil)

(setq VAR1 VARTEMP)

)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Nếu bạn muốn lưu thông số giữa các lần dùng lệnh và đồng thời cũng làm cho chương trình mang tính chuyên nghiệp hơn, bạn có thể làm như sau:

tạo ra một hàm INIT() trước khi thực hiện lệnh

VD bạn có biến là VAR1 cần dùng để lưu thông tin thì có thể khởi tao trong hàm INIT như sau:

 

(DEFUN INIT()

(if (= VAR1 Nil)

(setq VAR1 value)

)

)

 

Trong quá trình làm việc nếu có dòng gọi truyền giá trị cho VAR1 có thể làm như sau

 

(DEFUN DOSOMETHING(/ VARTEMP)

...

(setq VARTEMP (...))

(if (/= VARTEMP Nil)

(setq VAR1 VARTEMP)

)

)

 

ồh cám ơn bác nhé. Mặc dù chưa có thời gian viết lại nhưng đọc vào cũng thấy hỉu hỉu. Tối nay về viế coi sao....

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
CHO MÌNH HỎI XEM FILE *.SLD NHƯ THẾ NÀO NHỈ

 

File *.sld được hiểu như là file hình ảnh để hiển thị trên hộp thọai trong các lệnh của AutoCad. FILE này có thể được tạo ra bằng cách vẽ một hình trên AutoCad sau đó dùng lệnh MSLIDE để tạo ra file *.SLD. Có thể xem trên nền CAD bằng lệnh VSLIDE.

Còn trong khi viết LISP+DCL, người ta thường dùng SILDE để hiện thị những hình ảnh hay chi tiết trên hộp thọai DCL

 

Trong file DCL bạn có thể khai báo một khung hình ảnh như sau

:image_button {
key="IMAGE_key";
width=14;
height=7; 
color=dialog_background;
}

 

Sau đó trong file LSP có thể viết code hiển thi SLIDE như sau:

(DEFUN IMAGE_SLIDE(/ sld_name)
(setq sld_name (...))
(start_image "IMAGE_key")
(fill_image 0 0 (dimx_tile "IMAGE_key") (dimy_tile "IMAGE_key") -15)
(slide_image 5 0 (dimx_tile "IMAGE_key") (dimy_tile "IMAGE_key") sld_name)
(end_image)
)

 

Để sử dụng SLIDE có tính linh họat hơn ( vd: thay đổi SLIDE hiển thị trong hộp thọai DCL+LSP) bạn có thể tham khảo Code http://www.cadviet.com/forum/index.php?showtopic=855

Chúc thành công

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Để sử dụng SLIDE có tính linh họat hơn ( vd: thay đổi SLIDE hiển thị trong hộp thọai DCL+LSP) bạn có thể tham khảo Code http://www.cadviet.com/forum/index.php?showtopic=855

Chúc thành công

 

Ừh thì sau khi xem chưong trình tính diện tích của pác thì mới hỏi như vậy. Cũng đang tính EDIT :unsure: để cho CTY tính khối lưọng cho chi tiết. Nhưng mà trứoc khi chuyển wa chưong trình mới thì cái code hom wa pác cho vẫn làm chưa dựoc :unsure: Cái Value j đó là sao kô hỉu mấy pác ơi. các pác dwn code về xem giúp em với.

 

http://www.cadviet.com/upfiles/BALLOON.lsp

;;;-------------------------------------------------------

(defun Begin_BA()

(setq

oldOs (getvar "osmode")

oldTrack ( getvar "trackpath")

oldOrth ( getvar "orthomode")

StyleBA ( getvar "textstyle")

OLD_LAYER (getvar "CLAYER")

Th (cdr (assoc 40 (tblsearch "style" StyleBA)))

TT (getstring "\nBALLOON(BA) of Pham Xuan Hung write for ST ENGINEERING \nInput name of this plate <>:")

)

(if (= Th 0) (setq Ts (getvar "textsize")) (setq Ts Th))

(setvar "orthomode" 0)

(setvar "osmode" 0)

)

;;;-------------------------------------------------------

(defun So_BA()

(setvar "osmode" 4)

(setvar "trackpath" 0)

(setq

p2 (getpoint pa "\nPlace number : ")

p3 (polar p2 (* pi 1.5) (* 0.5 Ts))

g (angle pa p2)

r1 (distance pa p2)

r2 (* 1.08333 Ts)

p4 (polar pa g (- r1 r2))

)

(setvar "osmode" 0)

(command "leader" p1 pa p4 "" "" "n")

(SETVAR "CLAYER" "0")

(command "circle" p2 r2)

(if (= Th 0)

(command "text" "j" "c" p3 Ts 0 TT)

(PROGN

(SETVAR "CLAYER" "5")

(command "text" "j" "c" p3 0 TT)

))

(command "scale" (entlast) "" p3 1)

)

;;;-------------------------------------------------------

DEFUN INIT()

(if (= VAR1 Nil)

(setq VAR1 VALUE)

)

)

;;;-------------------------------------------------------

(defun NEXT_PL()

(SETQ TT1 (ITOA (+ 1 (ATOI ( SUBSTR TT 2))))

TT2 (SUBSTR TT 1 1)

TT (STRCAT TT2 TT1 )

)

)

;;;-------------------------------------------------------

(defun End_BA()

(setvar "orthomode" oldOrth)

(setvar "osmode" oldos)

(setvar "trackpath" oldTrack)

(setvar "CLAYER" OLD_LAYER)

(princ)

)

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

(Defun C:BA( / oldOs oldTrack OldOrth StyleBA Th n

TT TT1 TT2 VAR1 Ts p2 pa p3 g r1 r2 p4 p5 str thik)

(Begin_BA)

(While

(setvar "osmode" 15359)

(setq p1 (getpoint "\nPoint to part <exit>:")

pa (getpoint p1 "\n Next point:"))

(SETVAR "ORTHOMODE" 1)

(So_BA)

(NEXT_PL)

(SETVAR "ORTHOMODE" 0)

(setq

thik ( getstring"\nInput thick of this plate <PL...>:")

(init)

(if (/= thik Nil)

(setq VAR1 thik)

)(setq str (strcat "PL" thik))

(setq p5 (getpoint "\nPoint of thick plate text:")

)

(SETVAR "CLAYER" "5")

(command "text" "j" "TL" p5 0 str)

)

(End_BA)

)

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có thể làm bạn phật lòng, nhưng mình vẫn góp ý thẳng thắn:

1) Bạn vẫn chưa hiểu vòng lặp while ở dạng cơ bản nhất, làm sao có thể xử lý những cái phức tạp hơn?!

Cụ thể, bạn viết:

(While

(setvar "osmode" 15359)

....................................

)

sẽ làm cho vòng while không có hồi kết!!!

2) Vndesperados đã gợi ý phương pháp ở dạng khái quát hoá (các tài liệu và help cũng thường viết như vậy). Bạn copy nguyên xi vào làm sao chương trình hiểu được?! Chỗ này xin lưu ý thêm, thủ thuật của vndesperados đúng với các kiểu dữ liệu khác nhưng không đúng với kiểu STRING. Khi gán (setq MyVar (getstring)), nếu người dùng không nhập gì mà chỉ bấm Enter, MyVar không nhận giá trị nil mà nhận giá trị ""

3) Xin nhắc lại lời góp ý lần trước: không có con đường tắt cho kiến thức!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Để sử dụng SLIDE có tính linh họat hơn ( vd: thay đổi SLIDE hiển thị trong hộp thọai DCL+LSP) bạn có thể tham khảo Code http://www.cadviet.com/forum/index.php?showtopic=855

Chúc thành công

Ừh thì sau khi xem chưong trình tính diện tích của pác thì mới hỏi như vậy. Cũng đang tính EDIT :unsure: để cho CTY tính khối lưọng cho chi tiết. Nhưng mà trứoc khi chuyển wa chưong trình mới thì cái code hom wa pác cho vẫn làm chưa dựoc :unsure: Cái Value j đó là sao kô hỉu mấy pác ơi. các pác dwn code về xem giúp em với.

 

http://www.cadviet.com/upfiles/BALLOON.lsp

;;;-------------------------------------------------------

(defun Begin_BA()

(setq

oldOs (getvar "osmode")

oldTrack ( getvar "trackpath")

oldOrth ( getvar "orthomode")

StyleBA ( getvar "textstyle")

OLD_LAYER (getvar "CLAYER")

Th (cdr (assoc 40 (tblsearch "style" StyleBA)))

TT (getstring "\nBALLOON(BA) of Pham Xuan Hung write for ST ENGINEERING \nInput name of this plate <>:")

)

(if (= Th 0) (setq Ts (getvar "textsize")) (setq Ts Th))

(setvar "orthomode" 0)

(setvar "osmode" 0)

)

;;;-------------------------------------------------------

(defun So_BA()

(setvar "osmode" 4)

(setvar "trackpath" 0)

(setq

p2 (getpoint pa "\nPlace number : ")

p3 (polar p2 (* pi 1.5) (* 0.5 Ts))

g (angle pa p2)

r1 (distance pa p2)

r2 (* 1.08333 Ts)

p4 (polar pa g (- r1 r2))

)

(setvar "osmode" 0)

(command "leader" p1 pa p4 "" "" "n")

(SETVAR "CLAYER" "0")

(command "circle" p2 r2)

(if (= Th 0)

(command "text" "j" "c" p3 Ts 0 TT)

(PROGN

(SETVAR "CLAYER" "5")

(command "text" "j" "c" p3 0 TT)

))

(command "scale" (entlast) "" p3 1)

)

;;;-------------------------------------------------------

DEFUN INIT()

(if (= VAR1 Nil)

(setq VAR1 VALUE)

)

)

;;;-------------------------------------------------------

(defun NEXT_PL()

(SETQ TT1 (ITOA (+ 1 (ATOI ( SUBSTR TT 2))))

TT2 (SUBSTR TT 1 1)

TT (STRCAT TT2 TT1 )

)

)

;;;-------------------------------------------------------

(defun End_BA()

(setvar "orthomode" oldOrth)

(setvar "osmode" oldos)

(setvar "trackpath" oldTrack)

(setvar "CLAYER" OLD_LAYER)

(princ)

)

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

(Defun C:BA( / oldOs oldTrack OldOrth StyleBA Th n

TT TT1 TT2 VAR1 Ts p2 pa p3 g r1 r2 p4 p5 str thik)

(Begin_BA)

(While

(setvar "osmode" 15359)

(setq p1 (getpoint "\nPoint to part <exit>:")

pa (getpoint p1 "\n Next point:"))

(SETVAR "ORTHOMODE" 1)

(So_BA)

(NEXT_PL)

(SETVAR "ORTHOMODE" 0)

(setq

thik ( getstring"\nInput thick of this plate <PL...>:")

(init)

(if (/= thik Nil)

(setq VAR1 thik)

)(setq str (strcat "PL" thik))

(setq p5 (getpoint "\nPoint of thick plate text:")

)

(SETVAR "CLAYER" "5")

(command "text" "j" "TL" p5 0 str)

)

(End_BA)

)

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

 

 

 

(setq thik ( getstring"\nInput thick of this plate <PL...>:")

(init)

(if (/= thik Nil)

(setq VAR1 thik)

)

(setq str (strcat "PL" thik))

(setq p5 (getpoint "\nPoint of thick plate text:") )

 

Không hiểu đọan code của bạn làm gì nhưng sửa lại như sau:

 

...
(INIT)
(setq thik (getstring "\nInput thick of plate text [or Press Enter for use old value] :"))
(if (/= thik "")
 (setq VAR1 thick)
)
(setq str (strcat "PL" VAR1))
(setq p5 (getpoint "\nPoint of thick plate text:"))
...

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chỗ này xin lưu ý thêm, thủ thuật của vndesperados đúng với các kiểu dữ liệu khác nhưng không đúng với kiểu STRING. kaka bác thank bác ssg đã wan tâm. pác đã góp ý đến đây rùi mà kô cho em thêm vài dòng nữa về trưòng hợp của em. ok tối nay em về sửa lại vòng lặp while cho pác. :unsure: Nhưng còn việc bê nguyen si tại vì ở nhà thay tùm lum biến vào mà nó kô hỉu thì post lại nguyên si mới hỏi lại dc pác vndesparados chứ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Deeeeee. đựoc rùi cám ơn pác desperaddor nhìu nhìu :unsure: . vậy là các yêu cầu đã dc đáp ứng. tối nay về tút lại code chứ kô pác ssg chê wài. :unsure: .

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bản code hoàn chỉnh cho cty. Vòng lặp đặt như vậy đươc chưa bác ssg :unsure::unsure: . TIỆN THỂ BÁC CHO HỎI LUN CÁI DÒNG CODE CỦA PÁC VNDESPERADOS

(if (/= thik "")

(setq VAR1 thik)

)

 

cáI forward slash (/) có ý nghĩa j vậy.

 

 

 

;;;-------------------------------------------------------

(defun Begin_BA()

(setq

oldOs (getvar "osmode")

oldTrack ( getvar "trackpath")

oldOrth ( getvar "orthomode")

StyleBA ( getvar "textstyle")

Old_Layer (getvar "Clayer")

Th (cdr (assoc 40 (tblsearch "style" StyleBA)))

TT (getstring "\nBALLOON(BA) of Pham Xuan Hung write for ST ENGINEERING \nInput name of this plate <>:")

)

(if (= Th 0) (setq Ts (getvar "textsize")) (setq Ts Th))

(setvar "orthomode" 0)

)

;;;-------------------------------------------------------

(defun So_BA()

(setvar "trackpath" 0)

(setq

p2 (getpoint pa "\nPlace number : ")

p3 (polar p2 (* pi 1.5) (* 0.5 Ts))

g (angle pa p2)

r1 (distance pa p2)

r2 (* 1.08333 Ts)

p4 (polar pa g (- r1 r2))

)

(setvar "osmode" 0)

(command "leader" p1 pa p4 "" "" "n")

(Setvar "Clayer" "0")

(command "circle" p2 r2)

(if (= Th 0)

(command "text" "j" "c" p3 Ts 0 TT)

(Progn

(Setvar "Clayer" "2")

(command "text" "j" "c" p3 0 TT)

))

(command "scale" (entlast) "" p3 1)

(setvar "osmode" 15359)

)

;;;-------------------------------------------------------

(defun Next_Pl()

(Setq TT1 (itoa (+ 1 (atoi ( substr TT 2))))

TT2 (substr TT 1 1)

TT (strcat TT2 TT1 )

)

)

;;;-------------------------------------------------------

(defun End_BA()

(setvar "orthomode" oldOrth)

(setvar "osmode" oldos)

(setvar "trackpath" oldTrack)

(setvar "Clayer" Old_Layer)

(princ)

)

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

(Defun C:BA( / oldOs oldTrack OldOrth StyleBA Th n

TT TT1 TT2 VAR1 Ts p2 pa p3 g r1 r2 p4 p5 str thik)

(Begin_BA)

(While

(setq thik ( getstring"\nInput thick of this plate <PL...>:")

p1 (getpoint "\nPoint to part <exit>:")

)

(setq pa (getpoint p1 "\n Next point:")

)

(SETVAR "ORTHOMODE" 1)

(So_BA)

(SETVAR "ORTHOMODE" 0)

(Next_Pl)

(if (/= thik "")

(setq VAR1 thik)

)(setq str (strcat "PL" VAR1)

p5 (getpoint "\nPoint of thick plate text:")

)

(SETVAR "CLAYER" "2")

(command "text" "j" "TL" p5 0 str)

)

(End_BA)

)

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1) Tất nhiên là chưa được vì khi chạy vẫn lỗi. Toàn bộ thông báo test trên máy mình như sau:

 

Command: ba

BALLOON(BA) of Pham Xuan Hung write for ST ENGINEERING

Input name of this plate <>:ab1

 

Input thick of this plate :12

 

Point to part :

Next point:

Place number : leader

Specify leader start point:

Specify next point:

Specify next point or [Annotation/Format/Undo] :

Specify next point or [Annotation/Format/Undo] :

Enter first line of annotation text or : Enter an annotation option

[Tolerance/Copy/Block/None/Mtext] : n

Command: circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:

Specify radius of circle or [Diameter]: 2.708325000000000

Command: text

Current text style: "Standard" Text height: 2.5000

Specify start point of text or [Justify/Style]: j Enter an option

[Align/Fit/Center/Middle/Right/TL/TC/TR/ML/MC/MR/BL/BC/BR]: c

Specify center point of text:

Specify height <2.5000>: 2.500000000000000

Specify rotation angle of text <0>: 0

Enter text: ab1

Command: scale

Select objects: 1 found

 

Select objects:

Specify base point:

Specify scale factor or [Reference]: 1

Command:

Point of thick plate text:; error: AutoCAD variable setting rejected: "CLAYER"

"2"

 

Chưa cần biết error tại cái gì, nhưng không thể gọi là chương trình hoàn chỉnh!

 

2) /= có nghĩa là "khác" hoặc "không bằng"

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1) Tất nhiên là chưa được vì khi chạy vẫn lỗi. Toàn bộ thông báo test trên máy mình như sau:

 

Command: ba

BALLOON(BA) of Pham Xuan Hung write for ST ENGINEERING

Input name of this plate <>:ab1

 

Input thick of this plate <PL...>:12

 

Point to part <exit>:

Next point:

Place number : leader

Specify leader start point:

Specify next point:

Specify next point or [Annotation/Format/Undo] <Annotation>:

Specify next point or [Annotation/Format/Undo] <Annotation>:

Enter first line of annotation text or <options>: Enter an annotation option

[Tolerance/Copy/Block/None/Mtext] <Mtext>: n

Command: circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:

Specify radius of circle or [Diameter]: 2.708325000000000

Command: text

Current text style: "Standard" Text height: 2.5000

Specify start point of text or [Justify/Style]: j Enter an option

[Align/Fit/Center/Middle/Right/TL/TC/TR/ML/MC/MR/BL/BC/BR]: c

Specify center point of text:

Specify height <2.5000>: 2.500000000000000

Specify rotation angle of text <0>: 0

Enter text: ab1

Command: scale

Select objects: 1 found

 

Select objects:

Specify base point:

Specify scale factor or [Reference]: 1

Command:

Point of thick plate text:; error: AutoCAD variable setting rejected: "CLAYER"

"2"

 

Chưa cần biết error tại cái gì, nhưng không thể gọi là chương trình hoàn chỉnh!

 

2) /= có nghĩa là "khác" hoặc "không bằng"

ÚI GIÙI EM VIẾT CHO CTY MÀ PÁC LẤY PÁC CHẠY TRÊN AUTOCAD THƯÒNG SAO NÓ HỈU CLAYER 2 LÀ J KAKA. TRÊN CÔNG TY CCÓ LỆNH TẠO LAYER KHI CHỌN ĐỐI TƯọNG CHỈ CẦN NHẤN 1,2,3,4 LÀ RA CÁI LAYER ĐÓ BÁC ÀH. THANK PÁC NHÉ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ÚI GIÙI EM VIẾT CHO CTY MÀ PÁC LẤY PÁC CHẠY TRÊN AUTOCAD THƯÒNG SAO NÓ HỈU CLAYER 2 LÀ J KAKA. TRÊN CÔNG TY CCÓ LỆNH TẠO LAYER KHI CHỌN ĐỐI TƯọNG CHỈ CẦN NHẤN 1,2,3,4 LÀ RA CÁI LAYER ĐÓ BÁC ÀH. THANK PÁC NHÉ

Với vai trò tester, mình không cần biết đến điều đó. Điều kiện trước tiên khi test là chương trình phải chạy được trong mọi tình huống, sau đó mới xem xét đến cái hay cái dở.

Nếu bạn cảm thấy hài lòng thì thôi, mình không có ý kiến nữa.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Với vai trò tester, mình không cần biết đến điều đó. Điều kiện trước tiên khi test là chương trình phải chạy được trong mọi tình huống, sau đó mới xem xét đến cái hay cái dở.

Nếu bạn cảm thấy hài lòng thì thôi, mình không có ý kiến nữa.

Bác là pro tester chứ đâu có phải là user mấy cái này dễ hiểu đối với pác mừ. Bác xoá cho em mấy dòng (Setvar "Clayer" "number") trong code là nó thành tổng wát ah.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn xem đoạn code dưới đây, những phần tô màu đỏ là những đoạn mã lưu thông số giữa các lần sử dụng lệnh. Mỗi khi dùng lệnh, chương trình sẽ yêu cầu người sử dụng nhập vào giá trị của biến tyledong. Nếu nhấn enter, giá trị mặc định sẽ được chọn (giữ nguyên giá trị cũ). Bạn chạy thử chương trình rồi rút kinh nghiệm cho trường hợp cụ thể của mình. Cách sử dụng đoạn mã dưới đây bạn đọc thêm ở: http://www.cadviet.com/forum/index.php?sho...mp;st=260

Em không dành về lisp lắm lên ko hiểu và sửa được mong các bác sửa hộ em lisp sau với tỷ lệ nhập lưu lại từ lần nhập trước.

(defun c:maaa()
(setvar "cmdecho" 0)
(setq p1 nil p2 nil gmd nil)
(command "style" "Dientich" "Vntime.shx,vn1.shx" 0 "0.8" 0.0 "" "" "")
(command "layer" "make" "Text" "c" "3" "" "")
 (setq p1 (getpoint"\Diem dau cua mai doc: "))
 (setq p2 (getpoint"\Diem thu 2 cua mai doc: "))
(setvar "OSMODE" 0)
 (setq gmd (angle p1 p2))
 (setq sm (sin gmd))
 (setq cm (cos gmd))
 (setq hsm (abs (/ cm sm)))
(initget 1 "Yes No")
(if (= "Yes" (getkword "\nCo ghi mai doc khong? : "))
(progn
(setq tl (getreal"\nNhap ty le <1>: "))
(if tl null (setq tl 1))
(setq diem (list (- (car p1) (* 2 tl sm)) (+ (cadr p1) (* 2 tl cm))))
(setq ch (* 2 tl))
(setq nghieng (* gmd 57.29577951))
(cond 
((> hsm 1)
(setq inm (strcat "m=" (rtos hsm 2 2) ""))
(command "text" "j" "MC" diem ch nghieng inm "")  
)
((< hsm 1)
(setq inm (strcat "m=" (rtos hsm 2 2) ""))
(command "text" "j" "MC" diem ch nghieng inm "")
)
)
)
(progn
(cond 
((> hsm 1)
(setq inm (strcat "m=" (rtos hsm 2 4) ""))
(princ "\nHe so mai doc la: ")(princ inm)
)
((< hsm 1)
(setq inm (strcat "m=" (rtos hsm 2 4) ""))
(princ "\nHe so mai doc la: ")(princ inm)
)
)
)
)
(command "-osnap" "end,mid,nod,int,per,app,nea")
(command "ucs" "w" "")
(command "-layer" "s" "0" "")
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×