trantrung78 0 Báo cáo bài đăng Đã đăng Tháng 3 17, 2007 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
ssg 1104 Báo cáo bài đăng Đã đăng Tháng 3 17, 2007 ...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
Nguyen Hoanh 4669 Báo cáo bài đăng Đã đăng Tháng 3 17, 2007 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 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 1104 Báo cáo bài đăng Đã đăng Tháng 3 19, 2007 Đâ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
4582 0 Báo cáo bài đăng Đã đăng Tháng 1 10, 2008 Đâ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 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