Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
27 replies to this topic

#1 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 24 August 2007 - 10:19 AM

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).
  • 0

#2 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 August 2007 - 10:29 AM

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

#3 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 24 August 2007 - 11:26 AM

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)
  • 0

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 24 August 2007 - 11:42 AM

đâ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 <" (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)

  • 0

#5 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 24 August 2007 - 01:23 PM

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Ô
  • 0

#6 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 24 August 2007 - 03:28 PM

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Ô

KỐ AI BÍT THUẬT NHƯ VẬY ÀH. :unsure:
  • 0

#7 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 24 August 2007 - 03:30 PM

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"
  • 0

#8 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 24 August 2007 - 03:33 PM

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!
  • 0

#9 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 24 August 2007 - 05:45 PM

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

#10 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 27 August 2007 - 10:38 AM

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)
))
;;;*************************************************
  • 0

#11 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 27 August 2007 - 10:59 AM

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)
)
)
  • 0

#12 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 27 August 2007 - 12:54 PM

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

#13 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 27 August 2007 - 06:03 PM

CHO MÌNH HỎI XEM FILE *.SLD NHƯ THẾ NÀO NHỈ
  • 0

#14 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 28 August 2007 - 07:20 AM

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
  • 0

#15 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 28 August 2007 - 08:05 AM

Để 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
[/quote]

Ừ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)
)
;;;*************************************************
  • 0

#16 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 28 August 2007 - 08:56 AM

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!
  • 0

#17 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 28 August 2007 - 09:25 AM

Để 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:"))
...

  • 0

#18 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 28 August 2007 - 09:29 AM

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ứ.
  • 0

#19 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 28 August 2007 - 10:38 AM

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: .
  • 0

#20 hungpx2008

hungpx2008

    biết vẽ line

  • Members
  • PipPip
  • 28 Bài viết
Điểm đánh giá: 2 (bình thường)

Đã gửi 30 August 2007 - 02:44 PM

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)
)
;;;*************************************************
  • 0