Đến nội dung


Hình ảnh
- - - - -

[yêu cầu] lisp tính tổng số đai trong dim


  • Please log in to reply
24 replies to this topic

#1 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 27 May 2014 - 12:08 PM

Mình hay phải vẽ dầm và thống kê cốt đai dầm, theo mẫu của bên mình thì số lượng đai dầm đã nằm ngay trong dim đo khoảng cách dưới dầm (như file đính kèm), việc thống kê chỉ là cộng số lượng đai lại nhưng nếu dầm dài cũng rất mất công ngồi ấn máy tính hoặc gõ vào excel tính

Nên mình nhờ các bạn viết hộ mình 1 lisp để có thể tính tổng các đai trong các dim được lựa chọn. nội dung lisp là:

   - gõ lệnh

   - đưa ra lựa chọn những dim cần tính đai

   - tính toán và đưa ra số lượng đai trên màn hình

   - kết thúc lệnh

Mình cám ơn nhiều

http://www.cadviet.c..._khoang_dim.dwg


  • 0

#2 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 27 May 2014 - 04:55 PM

level lisp còn thấp cộng với thời gian hạn chế nên chỉ làm đc khung xương cho bạn

Phần bẫy lỗi còn kém, bạn dùng tạm, có gì thắc mắc sẽ chỉnh sửa thêm

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ old i tong ent text_dim start end n)
;;sum dim
(setq old (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq i 0
	  tong 0)
(while (setq ent (nentsel "\n Pick dung vao text Dim: "))
	(setq i (1+ i)
		  text_dim (cdr(assoc 1 (entget (car ent))))
		  start (vl-string-search "[" text_dim)
		  end (vl-string-search "%%C" text_dim)
		  n (atoi (substr text_dim (+ 2 start) (- end start 1)))
		  tong (+ n tong)
	)
)
(alert (strcat "Tong cong " (itoa i) " dim la: " (itoa tong) " dai"))
(setvar "cmdecho" old)
(princ)
)

  • 1

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


#3 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 27 May 2014 - 05:16 PM

level lisp còn thấp cộng với thời gian hạn chế nên chỉ làm đc khung xương cho bạn

Phần bẫy lỗi còn kém, bạn dùng tạm, có gì thắc mắc sẽ chỉnh sửa thêm

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ old i tong ent text_dim start end n)
;;sum dim
(setq old (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq i 0
	  tong 0)
(while (setq ent (nentsel "\n Pick dung vao text Dim: "))
	(setq i (1+ i)
		  text_dim (cdr(assoc 1 (entget (car ent))))
		  start (vl-string-search "[" text_dim)
		  end (vl-string-search "%%C" text_dim)
		  n (atoi (substr text_dim (+ 2 start) (- end start 1)))
		  tong (+ n tong)
	)
)
(alert (strcat "Tong cong " (itoa i) " dim la: " (itoa tong) " dai"))
(setvar "cmdecho" old)
(princ)
)

 

Cám ơn bạn hiepttr đã giúp đỡ

Lisp này đúng với yêu cầu của mình rồi, mình đã dùng thử nhưng vẫn còn 1 số hạn chế sau:

   - phải click đúng vào phần text của dim thì mới dùng được, click vào các đường trên dim là không dùng được

   - hiện tại đang phải click vào từng dim nên khá là lâu nếu dầm nhiều nhịp, ví dụ như mình có 1 dầm có 10 nhịp, sẽ có 30 khoảng bố trí đai như vậy phải click 30 lần mới tính được, khá mất thời gian. bạn có thể sửa lại hộ mình là có thể quét để chọn nhiều dim thay vì click vào từng dim được không

 

Mong bạn sửa giúp mình, mình cám ơn nhiều


  • 0

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 27 May 2014 - 05:28 PM

cmdecho để làm gì hiepttr ơi?


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


#5 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 28 May 2014 - 07:56 AM

cmdecho để làm gì hiepttr ơi?

Là do em save as từ 1 file khác tương tự nên quên xóa :D :D :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


#6 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 28 May 2014 - 03:08 PM

Bạn dùng tạm cái này

Chú ý: đang còn hạn chế, Khi chọn nhầm các loại Dim style không phù hợp thì lisp lỗi ko chạy :D :D :D

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ i tong ss ent info ds ds_name hs text_dim start end n)
;;sum dim
(setq i -1
	  tong 0)
(prompt "\n Chon Dim can tinh tong: ")
(setq ss (ssget '((0 . "DIMENSION"))))
(while (and ss (< i (1- (sslength ss))))
	(setq ent (ssname ss (setq i (1+ i)))
		  info (entget ent)
		  ds (cdr (assoc 3 info))
		  ds_name (tblobjname "dimstyle" ds)
		  hs (cdr (assoc 143 (entget ds_name)))
	)
	(cond ((= (cdr(assoc 1 info)) "") (setq n (fix (+ 0.5 (* (cdr(assoc 42 info)) hs)))))
		  (t (setq text_dim  (cdr(assoc 1 info))
				   start (vl-string-search "[" text_dim)
				   end (vl-string-search "%%C" text_dim)
				   n (atoi (substr text_dim (+ 2 start) (- end start 1)))
				   )
			)
	)
	(setq tong (+ n tong))
)
(alert (strcat "Tong cong " (itoa (1+ i)) " dim la: " (itoa tong) " dai"))
(princ)
)

  • 1

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


#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 May 2014 - 03:21 PM

Cám ơn bạn hiepttr đã giúp đỡ

Lisp này đúng với yêu cầu của mình rồi, mình đã dùng thử nhưng vẫn còn 1 số hạn chế sau:

   - phải click đúng vào phần text của dim thì mới dùng được, click vào các đường trên dim là không dùng được

   - hiện tại đang phải click vào từng dim nên khá là lâu nếu dầm nhiều nhịp, ví dụ như mình có 1 dầm có 10 nhịp, sẽ có 30 khoảng bố trí đai như vậy phải click 30 lần mới tính được, khá mất thời gian. bạn có thể sửa lại hộ mình là có thể quét để chọn nhiều dim thay vì click vào từng dim được không

 

Mong bạn sửa giúp mình, mình cám ơn nhiều

Hề hề hề,

Dùng thử cái này xem có ngứa ngáy hay nổi mụn chỗ nào không nhé.

 

(defun c:tida (/ ssd sd ed kt ts n b )
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension") (cons 3 "*00)"))))
          sd 0 )
(foreach d ssd
      (setq ed (entget d)
                kt (cdr (assoc 42 ed))
                ts (cdr (assoc 3 ed))
                n (strlen ts)
                b (atoi (substr ts (- n 3) 3))
                sd (+ sd (fix (/ kt b)) 1)
      )
)
(alert (strcat "\n Tong so dai can dung la: " (rtos sd 2 0) " dai " (chr 216) " 6"))
(princ)
)
 

  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 28 May 2014 - 03:32 PM

Bạn dùng tạm cái này

Chú ý: đang còn hạn chế, Khi chọn nhầm các loại Dim style không phù hợp thì lisp lỗi ko chạy :D :D :D

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ i tong ss ent info ds ds_name hs text_dim start end n)
;;sum dim
(setq i -1
	  tong 0)
(prompt "\n Chon Dim can tinh tong: ")
(setq ss (ssget '((0 . "DIMENSION"))))
(while (and ss (< i (1- (sslength ss))))
	(setq ent (ssname ss (setq i (1+ i)))
		  info (entget ent)
		  ds (cdr (assoc 3 info))
		  ds_name (tblobjname "dimstyle" ds)
		  hs (cdr (assoc 143 (entget ds_name)))
	)
	(cond ((= (cdr(assoc 1 info)) "") (setq n (fix (+ 0.5 (* (cdr(assoc 42 info)) hs)))))
		  (t (setq text_dim  (cdr(assoc 1 info))
				   start (vl-string-search "[" text_dim)
				   end (vl-string-search "%%C" text_dim)
				   n (atoi (substr text_dim (+ 2 start) (- end start 1)))
				   )
			)
	)
	(setq tong (+ n tong))
)
(alert (strcat "Tong cong " (itoa (1+ i)) " dim la: " (itoa tong) " dai"))
(princ)
)

Đúng là khi chọn nhầm dim khác bị lỗi, ko chạy được nhưng cám ơn bạn đã nhiệt tình giúp mình nhé


  • 0

#9 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 28 May 2014 - 03:37 PM

Hề hề hề,

Dùng thử cái này xem có ngứa ngáy hay nổi mụn chỗ nào không nhé.

 

 

(defun c:tida (/ ssd sd ed kt ts n b )
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension") (cons 3 "*00)"))))
          sd 0 )
(foreach d ssd
      (setq ed (entget d)
                kt (cdr (assoc 42 ed))
                ts (cdr (assoc 3 ed))
                n (strlen ts)
                b (atoi (substr ts (- n 3) 3))
                sd (+ sd (fix (/ kt b)) 1)
      )
)
(alert (strcat "\n Tong so dai can dung la: " (rtos sd 2 0) " dai " (chr 216) " 6"))
(princ)
)
 

 

Lisp của bạn Phamthanhbinh không bị lỗi khi chọn cả dim không ghi đai tuy nhiên lại mặc định là đai phi6

Một dầm có nhiều nhịp có khi có nhiều loại đai đường kính khác nhau mà như file đính kèm của mình có 2 loại đai phi6 và phi10, bạn giúp mình chỉnh lại là đưa ra tổng số lượng đai của từng loại nhé

Cám ơn bạn nhiều

http://www.cadviet.c...hoang_dim_1.dwg


  • 0

#10 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 28 May 2014 - 03:39 PM

Bạn dùng tạm cái này

Chú ý: đang còn hạn chế, Khi chọn nhầm các loại Dim style không phù hợp thì lisp lỗi ko chạy :D :D :D

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ i tong ss ent info ds ds_name hs text_dim start end n)
;;sum dim
(setq i -1
	  tong 0)
(prompt "\n Chon Dim can tinh tong: ")
(setq ss (ssget '((0 . "DIMENSION"))))
(while (and ss (< i (1- (sslength ss))))
	(setq ent (ssname ss (setq i (1+ i)))
		  info (entget ent)
		  ds (cdr (assoc 3 info))
		  ds_name (tblobjname "dimstyle" ds)
		  hs (cdr (assoc 143 (entget ds_name)))
	)
	(cond ((= (cdr(assoc 1 info)) "") (setq n (fix (+ 0.5 (* (cdr(assoc 42 info)) hs)))))
		  (t (setq text_dim  (cdr(assoc 1 info))
				   start (vl-string-search "[" text_dim)
				   end (vl-string-search "%%C" text_dim)
				   n (atoi (substr text_dim (+ 2 start) (- end start 1)))
				   )
			)
	)
	(setq tong (+ n tong))
)
(alert (strcat "Tong cong " (itoa (1+ i)) " dim la: " (itoa tong) " dai"))
(princ)
)

Đúng là khi chọn nhầm dim khác bị lỗi, ko chạy được nhưng cám ơn bạn đã nhiệt tình giúp mình nhé

Mình "cố tình" làm thế vì BV mẫu bạn đưa ra & những thông tin bạn cấp ko đủ để mình lọc Dim style

Nếu muốn chạy trơn tru nữa thì bạn cần cung cấp thông tin đầy đủ từ đầu :D

Nếu chấp nhận bỏ qua dim style ko phù hợp (ko có hs chuyển đổi đơn vị) thì dùng cái này

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.c...-dai-trong-dim/
(defun c:SD (/ i tong ss ent info ds ds_name hs text_dim start end n)
;;sum dim
(setq i -1
	  j 0
	  tong 0)
(prompt "\n Chon Dim can tinh tong: ")
(setq ss (ssget '((0 . "DIMENSION"))))
(while (and ss (< i (1- (sslength ss))))
	(setq ent (ssname ss (setq i (1+ i)))
		  info (entget ent)
		  ds (cdr (assoc 3 info))
		  ds_name (tblobjname "dimstyle" ds)
		  hs (cdr (assoc 143 (entget ds_name)))
	)
	(cond ((null hs) (setq n 0 j (1+ j)))
		  ((= (cdr(assoc 1 info)) "") (setq n (fix (+ 0.5 (* (cdr(assoc 42 info)) hs)))))
		  (t (setq text_dim  (cdr(assoc 1 info))
				   start (vl-string-search "[" text_dim)
				   end (vl-string-search "%%C" text_dim)
				   n (atoi (substr text_dim (+ 2 start) (- end start 1)))
				   )
			)
	)
	(setq tong (+ n tong))
)
(alert (strcat "Tong cong " (itoa (1+ (- i j))) " dim la: " (itoa tong) " dai"))
(princ)
)

  • 1

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


#11 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 28 May 2014 - 07:04 PM

Mình "cố tình" làm thế vì BV mẫu bạn đưa ra & những thông tin bạn cấp ko đủ để mình lọc Dim style

Nếu muốn chạy trơn tru nữa thì bạn cần cung cấp thông tin đầy đủ từ đầu :D

Nếu chấp nhận bỏ qua dim style ko phù hợp (ko có hs chuyển đổi đơn vị) thì dùng cái này

;; Lisp cong gia tri Dim, phuc vu tinh tong so cot dai theo y/c:
;;http://www.cadviet.com/forum/topic/102605-yeu-cau-lisp-tinh-tong-so-dai-trong-dim/
(defun c:SD (/ i tong ss ent info ds ds_name hs text_dim start end n)
;;sum dim
(setq i -1
	  j 0
	  tong 0)
(prompt "\n Chon Dim can tinh tong: ")
(setq ss (ssget '((0 . "DIMENSION"))))
(while (and ss (< i (1- (sslength ss))))
	(setq ent (ssname ss (setq i (1+ i)))
		  info (entget ent)
		  ds (cdr (assoc 3 info))
		  ds_name (tblobjname "dimstyle" ds)
		  hs (cdr (assoc 143 (entget ds_name)))
	)
	(cond ((null hs) (setq n 0 j (1+ j)))
		  ((= (cdr(assoc 1 info)) "") (setq n (fix (+ 0.5 (* (cdr(assoc 42 info)) hs)))))
		  (t (setq text_dim  (cdr(assoc 1 info))
				   start (vl-string-search "[" text_dim)
				   end (vl-string-search "%%C" text_dim)
				   n (atoi (substr text_dim (+ 2 start) (- end start 1)))
				   )
			)
	)
	(setq tong (+ n tong))
)
(alert (strcat "Tong cong " (itoa (1+ (- i j))) " dim la: " (itoa tong) " dai"))
(princ)
)

 

Lisp này hết bị lỗi khi chọn dim không có đai rồi nhưng bạn sửa thêm cho mình là nếu có nhiều loại đai khác nhau (ví dụ trong file đính kèm có 2 loại đai phi6 và phi10) thì tính tổng từng loại đường kính và đưa ra bảng thông báo

Mình cám ơn nhiều

http://www.cadviet.c...hoang_dim_2.dwg


  • 0

#12 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 May 2014 - 12:40 AM

Lisp này hết bị lỗi khi chọn dim không có đai rồi nhưng bạn sửa thêm cho mình là nếu có nhiều loại đai khác nhau (ví dụ trong file đính kèm có 2 loại đai phi6 và phi10) thì tính tổng từng loại đường kính và đưa ra bảng thông báo

Mình cám ơn nhiều

http://www.cadviet.c...hoang_dim_2.dwg

Hề hề hề,

Bạn nên rút kinh nghiệm khi đặt yêu cầu viết lisp. nên suy nghĩ thấu đáo về cái mình cần và đưa ra đầy đủ các bản vẽ thể hiện đúng cái mình cần. Đừng làm theo kiểu mỗi lúc lại són ra một yêu cầu thêm mới. Bản vẽ lần trước bạn gửi chỉ có duy nhất một loai đường kinh đai thôi, hoàn toàn không có loại đai thứ hai nào. Bởi vậy mình mới để mặc định trong thông báo là đai phi 6. (bằng chứng vẫn còn đó)

Đây là lisp đã sửa theo yêu cầu mới và hy vọng bạn không đẻ thêm yêu cầu mới cho cái lisp này. Nếu vẫn còn thì bạn sẽ phải đợi lâu đấy, bởi mình hết hứng bổ sung rồi.

(defun c:tida (/ ssd sd ed kt ts n b m sdl dkl ld)
(vl-load-com)
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension") (cons 3 "*00)"))))
          dkl (list)
          sd 0 )
(foreach d ssd
      (setq ed (entget d)
                kt (cdr (assoc 42 ed))
                ts (cdr (assoc 3 ed))
                n (vl-string-search "d" ts)
                m (vl-string-search "a" ts)
                b (atoi (substr ts (+ 2 m) 3))
                dk (substr ts (+ 2 n) (- m n 1))
                sdl (if (>= (- (/ kt b) (fix (/ kt b))) 0.5) (1+ (fix (/ kt b))) (fix (/ kt b)))
                dkl (append dkl (list (list  dk sdl)))
      )
)
(setq dkl (vl-sort dkl  '(lambda (x y) (<= (atoi (car x)) (atoi (car y))))))
(while dkl
      (setq sd 0
                ld (caar dkl))
      (foreach lis dkl
             (if (= (car lis) ld)
                 (progn 
                      (setq sd (+ sd (cadr lis))
                                dkl (vl-remove lis dkl)  )
                 )
             )
        )
        (alert (strcat "\n Tong so dai " (chr 216) ld " can dung la: " (rtos sd 2 0) " dai " ))
)
(princ)
)
 

  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#13 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 29 May 2014 - 01:40 PM

Hề hề hề,

Bạn nên rút kinh nghiệm khi đặt yêu cầu viết lisp. nên suy nghĩ thấu đáo về cái mình cần và đưa ra đầy đủ các bản vẽ thể hiện đúng cái mình cần. Đừng làm theo kiểu mỗi lúc lại són ra một yêu cầu thêm mới. Bản vẽ lần trước bạn gửi chỉ có duy nhất một loai đường kinh đai thôi, hoàn toàn không có loại đai thứ hai nào. Bởi vậy mình mới để mặc định trong thông báo là đai phi 6. (bằng chứng vẫn còn đó)

Đây là lisp đã sửa theo yêu cầu mới và hy vọng bạn không đẻ thêm yêu cầu mới cho cái lisp này. Nếu vẫn còn thì bạn sẽ phải đợi lâu đấy, bởi mình hết hứng bổ sung rồi.

 

(defun c:tida (/ ssd sd ed kt ts n b m sdl dkl ld)
(vl-load-com)
(setq ssd (acet-ss-to-list (ssget (list (cons 0 "dimension") (cons 3 "*00)"))))
          dkl (list)
          sd 0 )
(foreach d ssd
      (setq ed (entget d)
                kt (cdr (assoc 42 ed))
                ts (cdr (assoc 3 ed))
                n (vl-string-search "d" ts)
                m (vl-string-search "a" ts)
                b (atoi (substr ts (+ 2 m) 3))
                dk (substr ts (+ 2 n) (- m n 1))
                sdl (if (>= (- (/ kt b) (fix (/ kt b))) 0.5) (1+ (fix (/ kt b))) (fix (/ kt b)))
                dkl (append dkl (list (list  dk sdl)))
      )
)
(setq dkl (vl-sort dkl  '(lambda (x y) (<= (atoi (car x)) (atoi (car y))))))
(while dkl
      (setq sd 0
                ld (caar dkl))
      (foreach lis dkl
             (if (= (car lis) ld)
                 (progn 
                      (setq sd (+ sd (cadr lis))
                                dkl (vl-remove lis dkl)  )
                 )
             )
        )
        (alert (strcat "\n Tong so dai " (chr 216) ld " can dung la: " (rtos sd 2 0) " dai " ))
)
(princ)
)
 

 

Xin lỗi bạn nhé vì lúc đầu mình cũng chưa nghĩ đc hết, khi làm rồi mới biết dc và nảy sinh ra, lần sau mình sẽ rút kinh nghiệm. Lisp này là ngon rồi, mình cám ơn nhiều nha


  • 0

#14 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 08 June 2014 - 11:55 AM

@phamthanhbinh

Xin lỗi bạn trước nhé, giờ làm lại phát sinh thêm loại a150,a250 nữa, lisp trên lại không dùng được với loai này, bạn có thể sửa lại giúp mình cái được không. Mình cám ơn nhiều

Tính số lượng đai thì mình dùng hệ số Multipliner for alt unit trong thẻ Alternate units trong định nghĩa dim. Số đai sẽ bằng chiều dài dim nhân với hệ số Multipliner for alt unit

nên mình nghĩ bạn viết lisp với công thức trên thì có thế áp dụng được cho mọi kiểu dim bất kì luôn

Bạn cho ý kiến nhé.

Chân thành cám ơn

 

http://www.cadviet.c...hoang_dim_4.dwg


  • 0

#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 08 June 2014 - 02:00 PM

@phamthanhbinh

Xin lỗi bạn trước nhé, giờ làm lại phát sinh thêm loại a150,a250 nữa, lisp trên lại không dùng được với loai này, bạn có thể sửa lại giúp mình cái được không. Mình cám ơn nhiều

Tính số lượng đai thì mình dùng hệ số Multipliner for alt unit trong thẻ Alternate units trong định nghĩa dim. Số đai sẽ bằng chiều dài dim nhân với hệ số Multipliner for alt unit

nên mình nghĩ bạn viết lisp với công thức trên thì có thế áp dụng được cho mọi kiểu dim bất kì luôn

Bạn cho ý kiến nhé.

Chân thành cám ơn

 

http://www.cadviet.c...hoang_dim_4.dwg

 

Góp ý cho bạn đây:

- Có quá nhiều kiểu dimstyle. Mỗi loại khoảng cách đai là 1 kiểu dimstyle là không chuyên nghiệp và có thể gây ra sự nhầm lẫn cho chính bạn và người sử dụng bản vẽ của bạn. Trong bản vẽ Nên sử dụng kiểu dimstyle thường dung mà thôi


  • 0

#16 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 08 June 2014 - 03:03 PM

Bạn thử dùng cái này, nó chẳng phân biệt kiểu dim, chỉ phân biệt tẽt dim thôi.

(defun c:tmp()
  (defun GeD(v / l en)
    (setq l nil)
    (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (cdr (assoc 2 (entget v))))
      (if (= "MTEXT" (cdr (assoc 0 (entget (setq en (vlax-vla-object->ename item))))))
(setq l en))
    ) l
  )
  (Prompt "\nChon Dim:")
  (setq l nil)
  (foreach x (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    (setq txt  (cdr (assoc 1 (entget (Ged x))))
 sl (atoi (substr txt (+ 2 (vl-string-search "[" txt))
  (- (vl-string-search "%" txt) (vl-string-search "[" txt) 1)))
 fi (atoi (substr txt (+ 4 (vl-string-search "%" txt))
  (- (vl-string-search "a" txt) (vl-string-search "%" txt) 3)))
 l (if (not (assoc fi l))
     (cons (cons fi sl) l)
     (subst (cons fi (+ sl (cdr (assoc fi l)))) (assoc fi l) l)))
  )
  (foreach x l (princ (strcat "\n" (itoa (cdr x)) (chr 216) (itoa (car x)))))
  (princ)
)

  • 1

#17 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 08 June 2014 - 03:18 PM

Bạn thử dùng cái này, nó chẳng phân biệt kiểu dim, chỉ phân biệt tẽt dim thôi.

 

(defun c:tmp()
  (defun GeD(v / l en)
    (setq l nil)
    (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (cdr (assoc 2 (entget v))))
      (if (= "MTEXT" (cdr (assoc 0 (entget (setq en (vlax-vla-object->ename item))))))
(setq l en))
    ) l
  )
  (Prompt "\nChon Dim:")
  (setq l nil)
  (foreach x (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    (setq txt  (cdr (assoc 1 (entget (Ged x))))
 sl (atoi (substr txt (+ 2 (vl-string-search "[" txt))
  (- (vl-string-search "%" txt) (vl-string-search "[" txt) 1)))
 fi (atoi (substr txt (+ 4 (vl-string-search "%" txt))
  (- (vl-string-search "a" txt) (vl-string-search "%" txt) 3)))
 l (if (not (assoc fi l))
     (cons (cons fi sl) l)
     (subst (cons fi (+ sl (cdr (assoc fi l)))) (assoc fi l) l)))
  )
  (foreach x l (princ (strcat "\n" (itoa (cdr x)) (chr 216) (itoa (car x)))))
  (princ)
)

 

Lisp này rất tốt đó,đúng ý mình rồi tuy nhiên có 1 điều là nó đưa ra số đai ở dòng command, mà dòng này thì mình hay để nó bé nhất có thể để cho màn hình vẽ được lớn hơn. Bạn Tot77 có thể sửa giúp mình lại là đưa ra bảng thông báo trên màn hình như lisp của bạn phamthanhbinh được không. Lisp của bạn phamthanhbinh có bao nhiêu loại đường kính đai thì xuất hiện bấy nhiêu bảng, bạn sửa lại chỉ xuất hiện 1 bảng cho tất cả các loại đai chọn nhé (như thông báo trong dòng command của bạn đó nhưng là bảng hiện trên màn hình)

Mình cám ơn nhiều  :)


  • 0

#18 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 08 June 2014 - 03:22 PM

Sửa thêm:

(defun c:tmp()
  (defun GeD(v / l en)
    (setq l nil)
    (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (cdr (assoc 2 (entget v))))
      (if (= "MTEXT" (cdr (assoc 0 (entget (setq en (vlax-vla-object->ename item))))))
(setq l en))
    ) l
  )
  (Prompt "\nChon Dim:")
  (setq l nil)
  (foreach x (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    (setq txt  (cdr (assoc 1 (entget (Ged x))))
 sl (atoi (substr txt (+ 2 (vl-string-search "[" txt))
  (- (vl-string-search "%" txt) (vl-string-search "[" txt) 1)))
 fi (atoi (substr txt (+ 4 (vl-string-search "%" txt))
  (- (vl-string-search "a" txt) (vl-string-search "%" txt) 3)))
 l (if (not (assoc fi l))
     (cons (cons fi sl) l)
     (subst (cons fi (+ sl (cdr (assoc fi l)))) (assoc fi l) l)))
  )
  (setq st "")
  (foreach x l (setq st (strcat st "\n" (itoa (cdr x)) (chr 216) (itoa (car x)))))
  (alert st)
  (princ)
)
 

  • 1

#19 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 08 June 2014 - 03:30 PM

Sửa thêm:

 

(defun c:tmp()
  (defun GeD(v / l en)
    (setq l nil)
    (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (cdr (assoc 2 (entget v))))
      (if (= "MTEXT" (cdr (assoc 0 (entget (setq en (vlax-vla-object->ename item))))))
(setq l en))
    ) l
  )
  (Prompt "\nChon Dim:")
  (setq l nil)
  (foreach x (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    (setq txt  (cdr (assoc 1 (entget (Ged x))))
 sl (atoi (substr txt (+ 2 (vl-string-search "[" txt))
  (- (vl-string-search "%" txt) (vl-string-search "[" txt) 1)))
 fi (atoi (substr txt (+ 4 (vl-string-search "%" txt))
  (- (vl-string-search "a" txt) (vl-string-search "%" txt) 3)))
 l (if (not (assoc fi l))
     (cons (cons fi sl) l)
     (subst (cons fi (+ sl (cdr (assoc fi l)))) (assoc fi l) l)))
  )
  (setq st "")
  (foreach x l (setq st (strcat st "\n" (itoa (cdr x)) (chr 216) (itoa (car x)))))
  (alert st)
  (princ)
)
 

 

Lisp này là chuẩn rồi. Cám ơn bạn Tot77 nhiều nhé  :)  :)  :)


  • 0

#20 proconeng86

proconeng86

    biết lệnh break

  • Members
  • PipPipPipPip
  • 221 Bài viết
Điểm đánh giá: -9 (bình thường)

Đã gửi 08 June 2014 - 03:58 PM

Sửa thêm:

 

(defun c:tmp()
  (defun GeD(v / l en)
    (setq l nil)
    (vlax-for item (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)))
    (cdr (assoc 2 (entget v))))
      (if (= "MTEXT" (cdr (assoc 0 (entget (setq en (vlax-vla-object->ename item))))))
(setq l en))
    ) l
  )
  (Prompt "\nChon Dim:")
  (setq l nil)
  (foreach x (acet-ss-to-list (ssget '((0 . "DIMENSION"))))
    (setq txt  (cdr (assoc 1 (entget (Ged x))))
 sl (atoi (substr txt (+ 2 (vl-string-search "[" txt))
  (- (vl-string-search "%" txt) (vl-string-search "[" txt) 1)))
 fi (atoi (substr txt (+ 4 (vl-string-search "%" txt))
  (- (vl-string-search "a" txt) (vl-string-search "%" txt) 3)))
 l (if (not (assoc fi l))
     (cons (cons fi sl) l)
     (subst (cons fi (+ sl (cdr (assoc fi l)))) (assoc fi l) l)))
  )
  (setq st "")
  (foreach x l (setq st (strcat st "\n" (itoa (cdr x)) (chr 216) (itoa (car x)))))
  (alert st)
  (princ)
)
 

 

Lisp của bạn trước mình chỉ thử với dim bố trí đai rất là ok, tuy nhiên mình vừa dùng lisp của bạn để làm việc, khi chọn lẫn cả những dim thường (dim không bố trí đai) thì lisp của bạn lại bị lỗi gì đó, không tính đai được. Lỗi này trong lisp của bạn phamthanhbinh đã sửa được rồi đó.

Bạn sửa lại giúp mình nốt lần này nhé. 

Mình cám ơn nhiều

9928_loi_lisp_tinh_dai_dam.jpg


  • 0