Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
trantrung78

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

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

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!

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

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ả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)
)

  • Vote tăng 1

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

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

  • Vote tăng 1

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
Đăng nhập để thực hiện theo  

×