Đến nội dung


Hình ảnh
- - - - -

Lisp tính giá trị trung bình của các Text !!!!


  • Please log in to reply
60 replies to this topic

#21 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 27 September 2014 - 05:34 PM

tiện đây "xí vô" 1 tí ^^

Nếu dùng read + if + type để xét, thì ngoài cái dài dòng ra còn điều gì đáng lưu ý ko các bác nhỉ !?


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#22 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 27 September 2014 - 07:24 PM

 - nhoc mò có thằng ssdel không biết có đc ko nhỉ, chọn tập lấy mã 1 dùng kỉu gì đó dò qua các đối tượng trong tập, cái nào ko thỏa dùng ssdel loại đi, ra đc số lượng đúng để lấy tbc


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#23 hiepttr

hiepttr

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1298 Bài viết
Điểm đánh giá: 518 (tốt)

Đã gửi 27 September 2014 - 07:35 PM

@Nhoc: dùng distof thay cho atof
Đa˜ doˋ đc thiˋ đếm luôn chư´ dell giˋ nữa :D
  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#24 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 29 September 2014 - 09:17 AM

- học tới ssget mà quên mất ^^, nhoc mông má lại cái lsp tính trung bình cộng, trong trường hợp bạn đó có trục trặc khi sử dụng lsp cũ sẽ có lsp mới để test lại ^^

;;ham tao text
(defun mktext (point height string justify layer textstyle mau / lst)
(setq lst (list '(0 . "TEXT")
                              (cons 10 point)
							  (cons 40 height)
							  (cons 1 string)
							  (cons 8 layer)
							  (cons 7 textstyle)
							  (cons 62 mau)
			)
			justify (strcase justify))
		(cond   ((= justify "L") (setq Lst (append Lst (list (cons 72 0) (cons 11 point)))))
		        ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
				((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
				((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
				)
	(entmakex Lst)
  )	;end mktext
;;;;
(defun C:tbcc(/ c tong oldob oldos txtstr realk mastyle malayer xtext num gstyle glayer tam tong tbc p ss)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
  (setq ss (ssget '((0 . "TEXT") (1 . "~*@*"))))
  (setq c 0 tong 0)
  (if (/= ss nil)
    (while (< c (sslength ss))
      (setq oldob (entget (ssname ss c)))
      (setq txtstr (assoc 1 oldob))
	  (setq realk (assoc 40 oldob))
	  (setq mastyle (assoc 7 oldob))
	  (setq malayer (assoc 8 oldob))
	(if (/= txtstr nil)
        (progn
		  (setq ctext (cdr realk))
          (setq num (cdr txtstr))
		  (setq gstyle (cdr mastyle))
		  (setq glayer (cdr malayer))
          (setq tam (atof num))
          (setq tong (+ tong tam))
		  (setq tbc (/ tong (sslength ss)))
        );progn
      );if
      (setq c (1+ c))
    );while
  );if
    (setq p (getpoint "\nNhap vi tri xuat ket qua: "))
	(if (= tbc 0)
    (mktext p ctext (rtos tbc 2 0) "L" glayer gstyle 1)
	(mktext p ctext (rtos tbc 2 3) "L" glayer gstyle 1)
	)
(setvar "cmdecho" 1)
(setvar "osmode" oldos)
(princ)	   
)
(prompt "ten lenh : tbcc")


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#25 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 September 2014 - 03:31 PM

- học tới ssget mà quên mất ^^, nhoc mông má lại cái lsp tính trung bình cộng, trong trường hợp bạn đó có trục trặc khi sử dụng lsp cũ sẽ có lsp mới để test lại ^^

;;ham tao text
(defun mktext (point height string justify layer textstyle mau / lst)
(setq lst (list '(0 . "TEXT")
                              (cons 10 point)
							  (cons 40 height)
							  (cons 1 string)
							  (cons 8 layer)
							  (cons 7 textstyle)
							  (cons 62 mau)
			)
			justify (strcase justify))
		(cond   ((= justify "L") (setq Lst (append Lst (list (cons 72 0) (cons 11 point)))))
		        ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
				((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
				((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
				)
	(entmakex Lst)
  )	;end mktext
;;;;
(defun C:tbcc(/ c tong oldob oldos txtstr realk mastyle malayer xtext num gstyle glayer tam tong tbc p ss)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
  (setq ss (ssget '((0 . "TEXT") (1 . "~*@*"))))
  (setq c 0 tong 0)
  (if (/= ss nil)
    (while (< c (sslength ss))
      (setq oldob (entget (ssname ss c)))
      (setq txtstr (assoc 1 oldob))
	  (setq realk (assoc 40 oldob))
	  (setq mastyle (assoc 7 oldob))
	  (setq malayer (assoc 8 oldob))
	(if (/= txtstr nil)
        (progn
		  (setq ctext (cdr realk))
          (setq num (cdr txtstr))
		  (setq gstyle (cdr mastyle))
		  (setq glayer (cdr malayer))
          (setq tam (atof num))
          (setq tong (+ tong tam))
		  (setq tbc (/ tong (sslength ss)))
        );progn
      );if
      (setq c (1+ c))
    );while
  );if
    (setq p (getpoint "\nNhap vi tri xuat ket qua: "))
	(if (= tbc 0)
    (mktext p ctext (rtos tbc 2 0) "L" glayer gstyle 1)
	(mktext p ctext (rtos tbc 2 3) "L" glayer gstyle 1)
	)
(setvar "cmdecho" 1)
(setvar "osmode" oldos)
(princ)	   
)
(prompt "ten lenh : tbcc")

 

Cách tốt nhất là sử dụng hàm distof để lọc số, tránh dùng hàm (setq ss (ssget '((0 . "TEXT") (1 . "~*@*")))) để lọc số, bởi nó không lường hết các trường hợp Text không phải là số 


  • 0

#26 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 29 September 2014 - 03:36 PM

Hàm distof cũng có cái hạn chế, thí dụ (distof "1,234.145")


  • 0

#27 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 September 2014 - 03:54 PM

Hàm distof cũng có cái hạn chế, thí dụ (distof "1,234.145")

Hạn chế gì cơ? 1,234.145 đâu phải là 1 số trong cad?


  • 0

* 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.


#28 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 29 September 2014 - 04:02 PM

- hihi nhoc nghe mấy anh dò bằng distof nhưng ko nghĩ ra nỗi đưa nó vào kiểu nào ^^, nhoc thử thay atof = distof quét qua cái nào có text chữ lsp đơ rùi, ko pit lọc kiểu nào để trừ bớt cái thằng sslength, anh nào tốt viết lại lsp cho nhoc học mót với :)


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#29 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 September 2014 - 04:10 PM

Ví dụ (code nhanh nên chưa kiểm tra kỹ)

(defun C:tbcc()
 (setq ss (ssget '((0 . "TEXT"))))
 (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
 (setq lst (mapcar '(lambda(ent) (distof (cdr (assoc 1 (entget ent))))) lst))
 (setq lst (vl-remove-if '(lambda(x) (= x nil)) lst))
 (/ (apply '+ lst) (length lst)))
 


  • 1

* 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.


#30 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 29 September 2014 - 04:11 PM

Hạn chế gì cơ? 1,234.145 đâu phải là 1 số trong cad?

 Trong exel thì nó là số, trong cad cũng chẳng quy định cái nào là số hay chữ, vì cad dùng trên toàn thế giới mà. Cũng có nơi họ cho đó là số. Qui định là do con người và hàm distof qui định thôi.


  • -1

#31 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 September 2014 - 04:20 PM

 Trong exel thì nó là số, trong cad cũng chẳng quy định cái nào là số hay chữ, vì cad dùng trên toàn thế giới mà. Cũng có nơi họ cho đó là số. Qui định là do con người và hàm distof qui định thôi.

1). Trong Excel thì nó là số hay không còn tùy thuộc cách format, chứ không hẳn nó luôn là số.

2). Cad có "định nghĩa" thế nào là số hay không thì không biết, nhưng nhập gia thì phải tùy tục. Chúng ta đang "nhập gia" Autodesk thì "tục" của nó là không thể có dấu phẩy (,) và đành chấp nhận vậy. Đây không phải là do hàm distof quy định, mà đây là do Cad quy định. Thử (+ 1,2 1.2) nó cũng thế thôi, đâu cần đến distof. 


  • 0

* 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.


#32 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 September 2014 - 04:45 PM

- hihi nhoc nghe mấy anh dò bằng distof nhưng ko nghĩ ra nỗi đưa nó vào kiểu nào ^^, nhoc thử thay atof = distof quét qua cái nào có text chữ lsp đơ rùi, ko pit lọc kiểu nào để trừ bớt cái thằng sslength, anh nào tốt viết lại lsp cho nhoc học mót với :)

 

Nhoc kiểm tra biến num có phải là số không? Nếu num đúng là số thì thực hiện các hàm tính trung bình cộng

 

(if (distof num)

(progn

(setq tam (atof num))

(setq tong (+ tong tam))

(setq tbc (/ tong (sslength ss)))

)

)


  • 1

#33 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 29 September 2014 - 04:48 PM

- @@ VD của anh Ha dùng distof gọn lẹ quá, nhoc cứ tưởng như Hiệp nói nó phải dài thòng chứ, nhoc chỉ hiểu đc chút xíu lsp a viết ^^, mà công nhận mấy hàm vl kinh thật :)


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#34 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 September 2014 - 04:49 PM

@Tue_NV: Không thể chia cho (sslength ss) được nếu trong ss có một/vài text không phải là số.


  • 0

* 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.


#35 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 September 2014 - 04:57 PM

@Tue_NV: Không thể chia cho (sslength ss) được nếu trong ss có một/vài text không phải là số.

 

Đúng rồi bác! Chắc Nhóc phải tính được cái "length" của mẫu số của số trung bình cộng bằng việc đếm các text số (distof num)

Có tổng, có "length" của mẫu số của số trung bình cộng -> Tính Trung bình cộng 

Chắc Nhóc làm được! 


  • 0

#36 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 29 September 2014 - 06:08 PM

^^ cách của a Ha nhanh hơn, cách thủ công chắc nhoc phải mò tiếp lang thang đây đó mót xem ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#37 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 September 2014 - 09:27 PM

Code cho Nhóc đây!. Nhóc tham khảo nhé! code gọn lẹ ^_^

 

(defun C:tbcc(/ c tong mstbc num ss)
  (setq c -1 tong 0 mstbc 0)
  (if (setq ss (ssget '((0 . "TEXT"))))
    (while (setq ename (ssname ss (setq c (1+ c))))
      (if (setq num (distof (cdr (assoc 1 (entget ename)))))
          (setq tong (+ tong num) mstbc (1+ mstbc))
      );if
    );while
  );if    
(if (null (zerop mstbc)) (/ tong mstbc))
)

  • 1

#38 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 29 September 2014 - 09:39 PM

- hihi nhoc cũng mới mò ra, code của anh Tue gọn ngang a Ha, cách nhoc mò cũng hao hao cách của anh Tue nhưng dài hơn, vì có mấy hàm nhoc chưa học tới ^^

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.c...cac-text/page-2
;;ham tao text
(defun mktext (point height string justify layer textstyle mau / lst)
(setq lst (list '(0 . "TEXT")
                              (cons 10 point)
							  (cons 40 height)
							  (cons 1 string)
							  (cons 8 layer)
							  (cons 7 textstyle)
							  (cons 62 mau)
			)
			justify (strcase justify))
		(cond   ((= justify "L") (setq Lst (append Lst (list (cons 72 0) (cons 11 point)))))
		        ((= justify "C") (setq Lst (append Lst (list (cons 72 1) (cons 11 point)))))
				((= justify "R") (setq Lst (append Lst (list (cons 72 2) (cons 11 point)))))
				((= justify "M") (setq Lst (append Lst (list (cons 72 4) (cons 11 point)))))
				)
	(entmakex Lst)
  )	;end mktext
;;;;
(defun C:tbcc(/ c tong oldob oldos txtstr realk mastyle malayer xtext num gstyle glayer tam tong tbc p ss dem)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(princ "\n")
(prompt "cho cac text so:")
(setq ss (ssget '((0 . "TEXT"))))
  
  (if (/= ss nil)
  (progn
  (setq c 0 tong 0.0 dem 0)
    (while (< c (sslength ss))
      (setq oldob (entget (ssname ss c)))
      (setq txtstr (assoc 1 oldob))
	  (setq realk (assoc 40 oldob))
	  (setq mastyle (assoc 7 oldob))
	  (setq malayer (assoc 8 oldob))
	
		  (setq ctext (cdr realk))
          (setq num (cdr txtstr))
		  (setq gstyle (cdr mastyle))
		  (setq glayer (cdr malayer))
          (setq tam (distof num))
		  (if tam
		  (progn
          (setq tong (+ tong tam))
		  (setq dem (1+ dem))
		  ))
		  (setq c (1+ c))
        );while
		(setq tbc (/ tong dem))
      );progn
      
    );if
    (setq p (getpoint "\nNhap vi tri xuat ket qua: "))
	(if (= tbc 0)
    (mktext p ctext (rtos tbc 2 0) "L" glayer gstyle 1)
	(mktext p ctext (rtos tbc 2 3) "L" glayer gstyle 1)
	)
(setvar "cmdecho" 1)
(setvar "osmode" oldos)
(princ)	   
)
(prompt "ten lenh : tbcc")


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#39 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 29 September 2014 - 09:49 PM

Nhóc cần code gọn gọn lại tí ^_^

Trong code của mình, có hàm nào Nhóc chưa học tới à? Hàm nào vậy? Mình nghĩ các hàm mình viết hầu hết Nhóc đã học tới, vì mình viết dựa trên các hàm nhoc đã viết

 

- Biến dem là mẫu số của phân số Trung bình cộng, cần kiểm tra biến dem có khác 0, kẻo không chọn toàn text chữ không thì sẽ báo là : ; error: divide by zero -> Lỗi phép chia không thể chia cho số 0

 

- Nhóc không chọn text nào cả mà command  xuất ra dòng Nhap vi tri xuat ket qua: là không được nhé -> cần sửa lại


  • 0

#40 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 September 2014 - 10:09 PM

Đùa tí: bác Tue_NV kiểm tra biến đếm khác 0 hơi bị điệu nghệ: (null (zero mstbc)), trong khi chỉ cần (> mstbc 0).


  • 0

* 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.