Đến nội dung


Hình ảnh
- - - - -

[yêu cầu]Sửa hộ lisp tự viết


  • Please log in to reply
3 replies to this topic

#1 lenhatanh

lenhatanh

    biết vẽ polygon

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

Đã gửi 16 October 2012 - 03:26 PM


;------------------------------------------
(defun Get_tt (/ g:tt)
(set_tile "error" "")
(setq g:tt (get_tile "tt"))
(setq tt g:tt)
)
;------------------------------------------
(defun Get_cd (/ g:cd)
(set_tile "error" "")
(setq g:cd (get_tile "cd"))
(setq cd g:cd)
)
;------------------------------------------
(defun Get_kc (/ g:kc)
(set_tile "error" "")
(setq g:kc (get_tile "kc"))
(setq kc g:kc)
)
;------------------------------------------
(defun Get_nd()
(set_tile "error" "")
(setq filename (getfiled "Write Text to File" "C:/My Documents/" "dhn" 1))
(setq tfw filename)
)
;------------------------------------------
(defun Get_li (/ ch1 ch2 ch3)
(start_list "tt")
(foreach ch1 ltt (add_list ch1))
(end_list)
(start_list "cd")
(foreach ch2 lcd (add_list (rtos ch2 2 2)))
(end_list)
(start_list "kc")
(foreach ch3 lkc (add_list (rtos ch3 2 2)))
(end_list)
(mode_tile "start" 0)
(start_dialog)
)
;------------------------------------------------------------------------------------------
;************** NHAP TEXT CAO DO + TEXT KHOANG CACH VA GHI RA FILE ************************
(defun nhaptext (/ dfile ti lti i Ca Kc E Eo Dlist Elist Elelist tso ddat total)
(setq lis nil li nil En nil dfile nil lkc nil lcd nil)
(setq dfile (open filename "w"))
(initget 128 "S G")
(if (not E) (setq E "S"))
(setq Eo (getkword "\n Select or Enter Elevation Texts (G/<S>) : "))
(if Eo (setq E Eo))
(cond
((= E "G")
(while
(setq Ca (getreal "\n Cao do...(<Retern>to end) :"))
(write-line (rtos Ca 2 2) dfile)
)
(while
(setq Kc (getreal "\n Khoang cach...(<Retern>to end) :"))
(write-line (rtos Kc 2 2) dfile)
)
(write-line (rtos tim 2 2) dfile)
)
(T
(prompt "\n Selec Elevation Texts...: ")
(setq Ele (ssget))
(setq total 0 n (sslength Ele) tso '() ddat '())
(while (< total n)
(setq Elist (entget (ssname Ele total)))
(cond
((= "TEXT" (cdr (assoc 0 Elist)))
(setq tso (cons (atof (cdr (assoc 1 Elist))) tso))
(setq ddat (cons (cadr (assoc 10 Elist)) ddat))
)
)
(setq total (+ total 1))
)
(setq lcd tso i 0 ltt '())
(while tso
(write-line (rtos (car tso) 2 3) dfile)
(setq tso (cdr tso) ltt (cons (rtos (+ i 1) 2 0) ltt))
(setq i (+ i 1))
)
(prompt "\n Selec Distance Texts...: ")
(setq Dis (ssget))
(setq i 0 tso '() ddat '())
(repeat (sslength Dis)
(setq Dlist (entget (ssname Dis i)))
(cond
((= "TEXT" (cdr (assoc 0 Dlist)))
(setq tso (cons (atof (cdr (assoc 1 Dlist))) tso))
(setq ddat (cons (cadr (assoc 10 Dlist)) ddat))
)
)
(setq i (+ i 1))
)
(setq lkc tso ltt (reverse ltt))
(while tso
(write-line (rtos (car tso) 2 3) dfile)
(setq tso (cdr tso))
)
(write-line (setq tim "10") dfile)
);*******dong ngoac T
);*******dong ngoac Cond
(close dfile)
)
;------------------------------------------------------------------------------------------
;----------------------------- Chuong trinh chinh -----------------------------------------
(defun C:Ve-MCN-03()
; (/ gii tim tfr tfw done datafile filename ltt lcd lkc)

(if (= (getvar "cmdecho") 1) (setvar "cmdecho" 0))
(setq datafile nil filename nil)
(setq gii (load_dialog "Ve_Mcn_03.dcl"))
(setq done 3)
(while (> done 1)
(if (not (new_dialog "vemcn" gii)) (exit))

(action_tile "tt" "(Get_tt)")
(action_tile "cd" "(Get_cd)")
(action_tile "kc" "(Get_kc)")

(action_tile "nd" "(Get_nd)(done_dialog 2)")
(action_tile "start" "(done_dialog 1)")

(action_tile "cancel" "(done_dialog 0)")
(setq done (start_dialog))
(cond
((= done 2) (nhaptext)(Get_li))
((= done 1) (vemcn))
)
);---dong while
(unload_dialog gii)
(command "color" "bylayer" "ortho" "on" "osmode" 33 "REDRAW")
)
Tôi có viết một đoạn Code nhập các Text cao độ và khoảng cách trên màn hình để vẽ mặt cắt ngang địa hình...
nhưng khi nhập xong thì không hiện các trị số các Text trong các list_box trên hộp thoại...
Nhờ các Bạn sửa giúp làm sao khi nhập xong các Text thì trên list_box hiện các giá trị đó...
Link file *.dcl và *.dwg đi kèm:http://www.mediafire...dad3bpmd58rdbbd
  • 1

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 16 October 2012 - 04:47 PM

Srr trước là ketxu k có CAD test, chỉ đọc code thôi.
QUa đó thấy :
- Mỗi lần nhập điểm nhập 1 lần, bạn lại làm một lần hiện hộp thoại, ghi file, mỗi lần thực hiện lệnh lại khử biến filename
- Để lại quá nhiều biến toàn cục k cần thiết
- THeo mình bạn nên nhập điểm chán chê => gán vào list cd,kc,tt. Sau khi người dùng nhập xong thì mới hiện hộp thoại lại, lúc này hàm Get_li của bạn chỉ làm một lần thôi, tránh tái tạo list nhiều lần.
Việc hiện hộp thoại giữa chừng chủ yếu phục vụ việc xóa, thêm, bơt, n ở đây chưa có, nên cũng cần gì bạn nhỉ :)
- Sau khi thoát hộp thoại thì ghi file
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 16 October 2012 - 04:47 PM

Nói chung, sửa LSP+DCL để dialoge của 1 người khác viết, cho nó hoạt động trơn tru là hơi bị khổ.
Tôi chỉ sửa để hiện list cho bạn thôi. Còn mọi thứ bạn cứ tiếp tục:

;------------------------------------------
(defun Get_tt (/ g:tt)
(set_tile "error" "")
(setq g:tt (get_tile "tt"))
(setq tt g:tt)
)
;------------------------------------------
(defun Get_cd (/ g:cd)
(set_tile "error" "")
(setq g:cd (get_tile "cd"))
(setq cd g:cd)
)
;------------------------------------------
(defun Get_kc (/ g:kc)
(set_tile "error" "")
(setq g:kc (get_tile "kc"))
(setq kc g:kc)
)
;------------------------------------------
(defun Get_nd()
(set_tile "error" "")
(setq filename (getfiled "Write Text to File" "C:/My Documents/" "dhn" 1))
(setq tfw filename)
)
;------------------------------------------
(defun Get_li (/ ch1 ch2 ch3)
(start_list "tt")
(foreach ch1 ltt (add_list ch1))
(end_list)
(start_list "cd")
(foreach ch2 lcd (add_list (rtos ch2 2 2)))
(end_list)
(start_list "kc")
(foreach ch3 lkc (add_list (rtos ch3 2 2)))
(end_list)
(mode_tile "start" 0)
; (start_dialog)
)
;------------------------------------------------------------------------------------------
;************** NHAP TEXT CAO DO + TEXT KHOANG CACH VA GHI RA FILE ************************
(defun nhaptext (/ dfile ti lti i Ca Kc E Eo Dlist Elist Elelist tso ddat total)
(setq lis nil li nil En nil dfile nil lkc nil lcd nil)
(setq dfile (open filename "w"))
(initget 128 "S G")
(if (not E) (setq E "S"))
(setq Eo (getkword "\n Select or Enter Elevation Texts (G/<S>) : "))
(if Eo (setq E Eo))
(cond
((= E "G")
(while
(setq Ca (getreal "\n Cao do...(<Retern>to end) :"))
(write-line (rtos Ca 2 2) dfile)
)
(while
(setq Kc (getreal "\n Khoang cach...(<Retern>to end) :"))
(write-line (rtos Kc 2 2) dfile)
)
(write-line (rtos tim 2 2) dfile)
)
(T
(prompt "\n Selec Elevation Texts...: ")
(setq Ele (ssget))
(setq total 0 n (sslength Ele) tso '() ddat '())
(while (< total n)
(setq Elist (entget (ssname Ele total)))
(cond
((= "TEXT" (cdr (assoc 0 Elist)))
(setq tso (cons (atof (cdr (assoc 1 Elist))) tso))
(setq ddat (cons (cadr (assoc 10 Elist)) ddat))
)
)
(setq total (+ total 1))
)
(setq lcd tso i 0 ltt '())
(while tso
(write-line (rtos (car tso) 2 3) dfile)
(setq tso (cdr tso) ltt (cons (rtos (+ i 1) 2 0) ltt))
(setq i (+ i 1))
)
(prompt "\n Selec Distance Texts...: ")
(setq Dis (ssget))
(setq i 0 tso '() ddat '())
(repeat (sslength Dis)
(setq Dlist (entget (ssname Dis i)))
(cond
((= "TEXT" (cdr (assoc 0 Dlist)))
(setq tso (cons (atof (cdr (assoc 1 Dlist))) tso))
(setq ddat (cons (cadr (assoc 10 Dlist)) ddat))
)
)
(setq i (+ i 1))
)
(setq lkc tso ltt (reverse ltt))
(while tso
(write-line (rtos (car tso) 2 3) dfile)
(setq tso (cdr tso))
)
(write-line (setq tim "10") dfile)
);*******dong ngoac T
);*******dong ngoac Cond
(close dfile)
)
;------------------------------------------------------------------------------------------
;----------------------------- Chuong trinh chinh -----------------------------------------
(defun C:Ve-MCN-03()
; (/ gii tim tfr tfw done datafile filename ltt lcd lkc)

(if (= (getvar "cmdecho") 1) (setvar "cmdecho" 0))
(setq datafile nil filename nil)
(setq gii (load_dialog "Ve_Mcn_03.dcl"))
(setq done 3)
(while (> done 1)
(if (not (new_dialog "vemcn" gii)) (exit))
(Get_li)
(action_tile "tt" "(Get_tt)")
(action_tile "cd" "(Get_cd)")
(action_tile "kc" "(Get_kc)")

(action_tile "nd" "(Get_nd)(done_dialog 2)(Get_li)")
(action_tile "start" "(done_dialog 1)")

(action_tile "cancel" "(done_dialog 0)")
(setq done (start_dialog))
(cond
((= done 2) (nhaptext)(Get_li))
((= done 1) (vemcn))
)
);---dong while
(unload_dialog gii)
(command "color" "bylayer" "ortho" "on" "osmode" 33 "REDRAW")
)

  • 3

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#4 lenhatanh

lenhatanh

    biết vẽ polygon

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

Đã gửi 16 October 2012 - 08:07 PM

Srr trước là ketxu k có CAD test, chỉ đọc code thôi. QUa đó thấy : - Mỗi lần nhập điểm nhập 1 lần, bạn lại làm một lần hiện hộp thoại, ghi file, mỗi lần thực hiện lệnh lại khử biến filename - Để lại quá nhiều biến toàn cục k cần thiết - THeo mình bạn nên nhập điểm chán chê => gán vào list cd,kc,tt. Sau khi người dùng nhập xong thì mới hiện hộp thoại lại, lúc này hàm Get_li của bạn chỉ làm một lần thôi, tránh tái tạo list nhiều lần. Việc hiện hộp thoại giữa chừng chủ yếu phục vụ việc xóa, thêm, bơt, n ở đây chưa có, nên cũng cần gì bạn nhỉ :) - Sau khi thoát hộp thoại thì ghi file

Nói chung, sửa LSP+DCL để dialoge của 1 người khác viết, cho nó hoạt động trơn tru là hơi bị khổ. Tôi chỉ sửa để hiện list cho bạn thôi. Còn mọi thứ bạn cứ tiếp tục:

Cám ơn các bạn nhiều !
  • 0