Đến nội dung


Hình ảnh
- - - - -

Lisp cộng và nhân giá trị text


  • Please log in to reply
4 replies to this topic

#1 trantrung78

trantrung78

    biết zoom

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

Đã gửi 17 March 2007 - 12:59 PM

cám ơn bác Nguyễn Hoành nhiều, nhưng có list nào sum hay mul một số đối tượng text dạng số thành một số không bác, ví dụ tôi có năm số 1, 2,3,4,5 lần luợt bấm vào từng số từ 1 đến 4 xong bấm enter và bấm vào số 5 thì số năm trở thành số 10 tức = 1+2+3+4 hay thành 24 tức = 1*2*3*4 không bác!
  • 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 17 March 2007 - 03:32 PM

...có list nào sum hay mul một số đối tượng text dạng số thành một số không bác, ví dụ tôi có năm số 1, 2,3,4,5 lần luợt bấm vào từng số từ 1 đến 4 xong bấm enter và bấm vào số 5 thì số năm trở thành số 10 tức = 1+2+3+4 hay thành 24 tức = 1*2*3*4 không bác!


Bạn dùng thử cái này:


(defun OKtext(e)
;;;Kiem tra doi tuong co phai la text?
(equal (cdr (assoc 0 (entget e))) "TEXT")
)
;;;-----------------------------------------
(defun C:MUL( / OK j ss m i data)
(setq OK nil j 0)
(while (= j 0)
(prompt "\tChon cac text nhan tu:")
(setq ss (ssget) m 1.0 i 0)
(repeat (sslength ss)
(setq ent (ssname ss i) i (1+ i))
(if (OKtext ent) (setq m (* m (atof (cdr (assoc 1 (entget ent))))) j (1+ j)))
)
(if (= j 0) (princ "\nKhong co nhan tu nao duoc chon!"))
)
(while (not OK)
(setq r (car (entsel "\nChon text ghi ket qua:")))
(if (OKtext r) (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
(entmod (subst (cons 1 (rtos m)) (assoc 1 (setq data (entget r))) data))
(princ)
)


Ghi chú:
- Gõ mul - ENTER để chạy
- Các text nhân tử có thể pick từng đối tượng hoặc chọn window bao quanh
- Chương trình tự động kiểm tra và lọc ra các đối tượng không phải text
  • 0

#3 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 17 March 2007 - 04:36 PM

Cảm ơn ssg đã chia sẻ một đoạn code về lisp nhân.
Từ hàm mul của ssg, chúng ta có thể phát triển thêm được hàm sum một cách tương tự:


(defun OKtext (e)
;;;Kiem tra doi tuong co phai la text?
(equal (cdr (assoc 0 (entget e))) "TEXT")
)
;;;-----------------------------------------
(defun C:sum (/ OK j ss s i data)
(setq OK nil
j 0
)
(while (= j 0)
(prompt "\tChon cac text so hang:")
(setq ss (ssget)
s 0.0
i 0
)
(repeat (sslength ss)
(setq ent (ssname ss i)
i (1+ i)
)
(if (OKtext ent)
(setq s (+ s (atof (cdr (assoc 1 (entget ent)))))
j (1+ j)
)
)
)
(if (= j 0)
(princ "\nKhong co so hang nao duoc chon!")
)
)
(while (not OK)
(setq r (car (entsel "\nChon text ghi ket qua:")))
(if (OKtext r)
(setq OK T)
(princ "\nDoi tuong chon khong phai text")
)
)

(entmod (subst (cons 1 (rtos s))
(assoc 1 (setq data (entget r)))
data
)
)
(princ)
)

  • 1

#4 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 19 March 2007 - 07:50 AM

Đây là đoạn code bao gồm cả 2 hàm MUL và SUM.


;;;-----------------------------------------
(defun CheckObj(e MyType) (equal (cdr (assoc 0 (entget e))) MyType))
;;;-----------------------------------------
(defun FilObj(ss1 MyType / ss2 i e)
(setq ss2 (ssadd) i 0)
(repeat (sslength ss1)
(setq e (ssname ss1 i) i (1+ i))
(if (CheckObj e MyType) (ssadd e ss2) )
)
(eval ss2)
)
;;;-----------------------------------------
(defun SelData( / OK)
(setq OK nil)
(while (not OK)
(prompt "\tChon cac text can tinh:")
(setq ss (FilObj (ssget) "TEXT"))
(if (> (sslength ss) 0) (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
)
;;;-----------------------------------------
(defun WriteRes(kq / OK e data)
(setq OK nil)
(while (not OK)
(setq e (car (entsel "\tChon text ghi ket qua:")))
(if (CheckObj e "TEXT") (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
(entmod (subst (cons 1 (rtos kq)) (assoc 1 (setq data (entget e))) data))
(princ)
)
;;;-----------------------------------------
(defun C:MUL( / i m e ss)
(SelData) (setq i 0 m 1.0)
(repeat (sslength ss) (setq e (ssname ss i) i (1+ i) m (* m (atof (cdr (assoc 1 (entget e)))))))
(WriteRes m)
)
;;;-----------------------------------------
(defun C:SUM( / i s e ss)
(SelData) (setq i 0 s 0.0)
(repeat (sslength ss) (setq e (ssname ss i) i (1+ i) s (+ s (atof (cdr (assoc 1 (entget e)))))))
(WriteRes s)
)
;;;-----------------------------------------


Với người sử dụng, chẳng có gì khác hơn 2 đoạn mà ssg và bác Hoanh đã viết trên. Nhưng với lập trình viên lsp thì khác rất nhiều.
Hai điểm khác cơ bản là:
1) Tính cấu trúc của chương trình tốt hơn, dễ kiểm tra, sửa lỗi, phát triển thêm...
2) CheckObj, FilObj trở thành các defun dùng chung, có thể dùng cho các chương trình khác sau này, tiết kiệm khá nhiều công sức.
Đó cũng là một trong những lý do để ssg đề xuất với các bạn xây dựng CadViet Utility. Viết một đoạn code đáp ứng một yêu cầu cụ thể nào đó dễ hơn nhiều so với việc xây dựng một hệ thống. Nhưng các bạn thử hình dung, khi số lượng các chương trình lsp tương tự như trên tăng lên khá nhiều thì điều gì sẽ xảy ra? Chúng sẽ "đá" nhau, cái này sẽ vô hiệu hoá cái kia, có khi chẳng có cái nào dùng được, gây nên những lỗi không thể kiểm soát...
Rất mong được các bạn góp ý thêm.
  • 0

#5 4582

4582

    Chưa sử dụng CAD

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

Đã gửi 10 January 2008 - 01:24 PM

Đây là đoạn code bao gồm cả 2 hàm MUL và SUM.


;;;-----------------------------------------
(defun CheckObj(e MyType) (equal (cdr (assoc 0 (entget e))) MyType))
;;;-----------------------------------------
(defun FilObj(ss1 MyType / ss2 i e)
(setq ss2 (ssadd) i 0)
(repeat (sslength ss1)
(setq e (ssname ss1 i) i (1+ i))
(if (CheckObj e MyType) (ssadd e ss2) )
)
(eval ss2)
)
;;;-----------------------------------------
(defun SelData( / OK)
(setq OK nil)
(while (not OK)
(prompt "\tChon cac text can tinh:")
(setq ss (FilObj (ssget) "TEXT"))
(if (> (sslength ss) 0) (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
)
;;;-----------------------------------------
(defun WriteRes(kq / OK e data)
(setq OK nil)
(while (not OK)
(setq e (car (entsel "\tChon text ghi ket qua:")))
(if (CheckObj e "TEXT") (setq OK T) (princ "\nDoi tuong chon khong phai text"))
)
(entmod (subst (cons 1 (rtos kq)) (assoc 1 (setq data (entget e))) data))
(princ)
)
;;;-----------------------------------------
(defun C:MUL( / i m e ss)
(SelData) (setq i 0 m 1.0)
(repeat (sslength ss) (setq e (ssname ss i) i (1+ i) m (* m (atof (cdr (assoc 1 (entget e)))))))
(WriteRes m)
)
;;;-----------------------------------------
(defun C:SUM( / i s e ss)
(SelData) (setq i 0 s 0.0)
(repeat (sslength ss) (setq e (ssname ss i) i (1+ i) s (+ s (atof (cdr (assoc 1 (entget e)))))))
(WriteRes s)
)
;;;-----------------------------------------


Với người sử dụng, chẳng có gì khác hơn 2 đoạn mà ssg và bác Hoanh đã viết trên. Nhưng với lập trình viên lsp thì khác rất nhiều.
Hai điểm khác cơ bản là:
1) Tính cấu trúc của chương trình tốt hơn, dễ kiểm tra, sửa lỗi, phát triển thêm...
2) CheckObj, FilObj trở thành các defun dùng chung, có thể dùng cho các chương trình khác sau này, tiết kiệm khá nhiều công sức.
Đó cũng là một trong những lý do để ssg đề xuất với các bạn xây dựng CadViet Utility. Viết một đoạn code đáp ứng một yêu cầu cụ thể nào đó dễ hơn nhiều so với việc xây dựng một hệ thống. Nhưng các bạn thử hình dung, khi số lượng các chương trình lsp tương tự như trên tăng lên khá nhiều thì điều gì sẽ xảy ra? Chúng sẽ "đá" nhau, cái này sẽ vô hiệu hoá cái kia, có khi chẳng có cái nào dùng được, gây nên những lỗi không thể kiểm soát...
Rất mong được các bạn góp ý thêm.

Mình vừa bắt đầu làm quen với việc ứng dụng lisp. Đúng là rất tiện lợi. Cảm ơn mọi người đã chia sẻ kinh nghiệm.
  • 1