Đến nội dung


Hình ảnh
- - - - -

[Yêu Cầu] Cộng Tất Cả Các Demension Trong Một Layer


  • Please log in to reply
13 replies to this topic

#1 phạm sơn

phạm sơn

    Chưa sử dụng CAD

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

Đã gửi 08 November 2016 - 09:54 PM

Chào mọi người trong diễn đàn! Chả là e đang bốc khối lượng tường xây. Để giải trình với chủ đầu tư thì em phải dim tất cả kích thước ra rồi trừ cho phần lỗ mở của cửa xong nhập vào file tính. Em muốn kiểm tra chiều dài e nhập và chiều dài trong file cad. Có bác nào có autolisp tính tổng tất cả các demension trong cùng một layer ra tổng chiều dài không ạ!


  • 0

#2 Bee

Bee

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 64 (tàm tạm)

Đã gửi 09 November 2016 - 06:39 AM

Chào mọi người trong diễn đàn! Chả là e đang bốc khối lượng tường xây. Để giải trình với chủ đầu tư thì em phải dim tất cả kích thước ra rồi trừ cho phần lỗ mở của cửa xong nhập vào file tính. Em muốn kiểm tra chiều dài e nhập và chiều dài trong file cad. Có bác nào có autolisp tính tổng tất cả các demension trong cùng một layer ra tổng chiều dài không ạ!

Thử cái này xem nhé ^_^

(defun c:sumdim	(/ ss layer)

  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
	   (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
	   );and
    (progn
      (setq ss (ssget "_X"
		      (list (cons 0 "DIMENSION")
			    (setq layer (assoc 8 (entget ss)))
		      )
	       )
      );setq
      (alert
	(strcat	"Total Dim layer <" (cdr layer) ">: "
		(vl-princ-to-string
		  (apply '+
			 (mapcar 'vla-get-measurement
				 (mapcar 'vlax-ename->vla-object
					 (vl-remove-if
					   'listp
					   (mapcar 'cadr (ssnamex ss))
					 )
				 )
			 )
		  )
		)
	)
      )
    );progn then
    (princ "\nBan da khong chon dim.!")
  )
  (princ)
)
(vl-load-com)

 


  • 0

#3 phạm sơn

phạm sơn

    Chưa sử dụng CAD

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

Đã gửi 09 November 2016 - 08:29 AM

hic, bác sửa lại code cho e với, em công nó ra không đúng 


  • 0

#4 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 09 November 2016 - 09:09 AM

hic, bác sửa lại code cho e với, em công nó ra không đúng 

 

:D  :D  :D Muốn đúng, thì trước tiên người đặt ra câu hỏi phải nêu rõ mục đích, yêu cầu, kết quả.... thì mới đúng được.

sơ sơ vài ý như: 

+ Dimention có trường hợp sửa số như bác @Ha nói thì sao?

+ Sơ suất do người dùng ko dim hết kích thước.

+ Sơ suất do người dùng dim thừa kích thước.

+ Kết quả có tính đến trường hợp làm tròn số hay ko?

 

..... Thêm cái nữa, yêu cầu tính tổng dimetion theo layer của bạn hơi tù túng.... Việc dim kích thước có thể sảy ra bất cứ lúc nào, nó sẽ theo layer hiện tại mà ra. Ko kiểm soát được layer chứa dim thì kết quả ko đúng là điều đương nhiên.

 

Lisp ko sai, thì phải xem lại người dùng sử dụng như thế nào  B)  B)  B)


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 09 November 2016 - 09:37 AM

Sửa số, làm tròn số, tiền tố hậu tố,ký hiệu đặc biệt, <> [] kèm chữ , alternate dimention ... là một số trường hợp cần phải lưu ý khi thực hiện các phép tính liên quan đến Dimension. Nếu dim thực và không có thiết đặt gì đặc biệt đối với đối tượng dim thì bài toán sẽ dễ hơn rất nhiều
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 Bee

Bee

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 64 (tàm tạm)

Đã gửi 09 November 2016 - 09:40 AM

hic, bác sửa lại code cho e với, em công nó ra không đúng 

Đã thêm trường hợp Dim sửa số và đã test.

Còn dim mà thêm các hậu tố tiền tố linh cu tinh thì trong trường hợp  này chắc không dùng. ^_^ Nếu cần dùng thì post chi tiết bản vẽ để mọi người check cho nhé.

(defun c:sumdim1  (/ ss layer)
  (vl-load-com)
  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
           (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
           ) ;and
    (progn
      (setq ss (ssget "_X"
                      (list (cons 0 "DIMENSION")
                            (setq layer (assoc 8 (entget ss)))
                            )
                      )
            ) ;setq
      (alert
        (strcat "Total Dim layer <"
                (cdr layer)
                ">: "
                (vl-princ-to-string
                  (apply '+
                         (mapcar '(lambda (vla)
                                    (if (= "" (vlax-get vla 'TextOverride))
                                      (vlax-get vla 'Measurement)
                                      (distof (vlax-get vla 'TextOverride))
                                      )
                                    )
                                 (mapcar 'vlax-ename->vla-object
                                         (vl-remove-if
                                           'listp
                                           (mapcar 'cadr (ssnamex ss))
                                           )
                                         )
                                 )
                         )
                  )
                )
        )
      ) ;progn then
    (princ "\nBan da khong chon dim.!")
    )
  (princ)
  )
(princ)

  • 0

#7 phạm sơn

phạm sơn

    Chưa sử dụng CAD

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

Đã gửi 09 November 2016 - 02:17 PM

em tạo ra dim riêng và chỉ cần tính những dim e đã làm thôi! chứ không phải cộng các dim mà người vẽ đã sử dụng trong đó vì thực chất e cũng không dùng tới nó. :) Cảm ơn các bác ạ! để e kiểm tra lại autolisp xem sao! Vẫn sai thì sẽ đưa bản vẽ lên để mọi người sửa luôn !


  • -2

#8 hoquangvinh

hoquangvinh

    biết lệnh mirror

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

Đã gửi 09 November 2016 - 03:22 PM

 

Đã thêm trường hợp Dim sửa số và đã test.

Còn dim mà thêm các hậu tố tiền tố linh cu tinh thì trong trường hợp  này chắc không dùng. ^_^ Nếu cần dùng thì post chi tiết bản vẽ để mọi người check cho nhé.

(defun c:sumdim1  (/ ss layer)
  (vl-load-com)
  (if (and (setq ss (car (entsel "\nChon 1 dim dien hinh layer: ")))
           (eq (cdr (assoc 0 (entget ss))) "DIMENSION")
           ) ;and
    (progn
      (setq ss (ssget "_X"
                      (list (cons 0 "DIMENSION")
                            (setq layer (assoc 8 (entget ss)))
                            )
                      )
            ) ;setq
      (alert
        (strcat "Total Dim layer <"
                (cdr layer)
                ">: "
                (vl-princ-to-string
                  (apply '+
                         (mapcar '(lambda (vla)
                                    (if (= "" (vlax-get vla 'TextOverride))
                                      (vlax-get vla 'Measurement)
                                      (distof (vlax-get vla 'TextOverride))
                                      )
                                    )
                                 (mapcar 'vlax-ename->vla-object
                                         (vl-remove-if
                                           'listp
                                           (mapcar 'cadr (ssnamex ss))
                                           )
                                         )
                                 )
                         )
                  )
                )
        )
      ) ;progn then
    (princ "\nBan da khong chon dim.!")
    )
  (princ)
  )
(princ)

Mình check thấy lisp chạy tốt rồi nhưng nếu thêm lựa chọn một chút nữa sẽ hay hơn

-1.  Tên lệnh

-2. Chọn dim mẫu

-3. Quét chọn các dim cần tính

-4. Thực hiện lệnh ra kết quả

Vậy là thêm lựa chọn thứ 3 nữa thì lisp sẽ thuận lợi khi sử dụng hơn

Ps: bạn @Bee là lisper mới nối nhé, rất hot đây


  • -1

#9 Bee

Bee

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 64 (tàm tạm)

Đã gửi 09 November 2016 - 04:09 PM

em tạo ra dim riêng và chỉ cần tính những dim e đã làm thôi! chứ không phải cộng các dim mà người vẽ đã sử dụng trong đó vì thực chất e cũng không dùng tới nó. :) Cảm ơn các bác ạ! để e kiểm tra lại autolisp xem sao! Vẫn sai thì sẽ đưa bản vẽ lên để mọi người sửa luôn !

Muốn select cái của mình dim thì bỏ đoạn "_X" đi là select bằng tay dc :D


  • 0

#10 Bee

Bee

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 64 (tàm tạm)

Đã gửi 09 November 2016 - 04:18 PM

 

Mình check thấy lisp chạy tốt rồi nhưng nếu thêm lựa chọn một chút nữa sẽ hay hơn

-1.  Tên lệnh

-2. Chọn dim mẫu

-3. Quét chọn các dim cần tính

-4. Thực hiện lệnh ra kết quả

Vậy là thêm lựa chọn thứ 3 nữa thì lisp sẽ thuận lợi khi sử dụng hơn

Ps: bạn @Bee là lisper mới nối nhé, rất hot đây

Uhm, bỏ cái "_X" là select tay đc mà.

 

==>PS; cám ơn bác đã cho nhận xét. ^_^ Thời gian rảnh rỗi vào đây sinh hoạt trí óc tí chút cho đỡ buồn thôi mà. Đồng thời xem học mót được gì thì mót thôi :)

 


  • 0

#11 phạm sơn

phạm sơn

    Chưa sử dụng CAD

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

Đã gửi 10 November 2016 - 08:53 AM

Bác Bee ơi! cho e hỏi thêm một xíu nữa là: lệnh công dim theo layer này có thể viết thêm code chọn vùng cộng dim được không bác.

VD: em chọn một vùng nào đó để kiểm tra tổng chiều dài của các dim đã dim thì e quét vùng đó và chọn loại dim để cộng thôi, như thế sẽ tránh cộng tất cả các dim cùng layer trong bản vẽ ở những vùng không cần, sẽ tiện kiểm tra hơn. Chứ trường hợp e coppy nó ra nhiều lần trong cùng một bản vẽ khi sử dụng lệnh nó cộng hết như thế khó kiểm tra lắm! Cảm ơn bác ạ !!


  • -1

#12 Danh Cong

Danh Cong

    biết lệnh linetype

  • Members
  • PipPipPipPip
  • 242 Bài viết
Điểm đánh giá: 40 (tàm tạm)

Đã gửi 10 November 2016 - 09:00 AM

Người bình luận trước đã trả lời rồi, bạn ko chịu khó đọc vài dòng ah.

 

 

Bác Bee ơi! cho e hỏi thêm một xíu nữa là: lệnh công dim theo layer này có thể viết thêm code chọn vùng cộng dim được không bác.

VD: em chọn một vùng nào đó để kiểm tra tổng chiều dài của các dim đã dim thì e quét vùng đó và chọn loại dim để cộng thôi, như thế sẽ tránh cộng tất cả các dim cùng layer trong bản vẽ ở những vùng không cần, sẽ tiện kiểm tra hơn. Chứ trường hợp e coppy nó ra nhiều lần trong cùng một bản vẽ khi sử dụng lệnh nó cộng hết như thế khó kiểm tra lắm! Cảm ơn bác ạ !!

 

Muốn select cái của mình dim thì bỏ đoạn "_X" đi là select bằng tay dc :D


  • 0

             ***  Vô lo - Vô nghĩ - Vô sầu hận  ***

***  Chẳng thương - Chẳng giận - Chẳng đau lòng  ***


#13 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1431 Bài viết
Điểm đánh giá: 1425 (rất tốt)

Đã gửi 10 November 2016 - 10:53 AM

Một cách tiếp cận khác: tổng các dim sắp xếp theo Layer.

(defun c:sumDimByLayer  (/ asoc lst lay msg tOver)
  (vl-load-com)
  (if (ssget (list (cons 0 "DIMENSION")  )  )
    (progn		
      (vlax-for e (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	(setq lay (vla-get-Layer e)
	      len (if (= "" (setq tOver (vla-get-TextOverride e)))(vla-get-Measurement e)(distof tOver)))
	(if (setq asoc (assoc lay lst))
	    (setq lst (subst (cons lay (+ len (cdr asoc))) asoc lst))	    
	    (setq lst (append lst (list (cons lay len))) ))	)
      (setq msg "Total Dim by Layer :\n")
      (alert
	(foreach x lst (setq msg (strcat msg "\n" (car x) " = " (rtos (cdr x) 2 1)) ))  ) )
    (princ "\nBan da khong chon dim.!")    )
  (princ)  )

  • 0

#14 Bee

Bee

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 64 (tàm tạm)

Đã gửi 10 November 2016 - 06:52 PM

 

Một cách tiếp cận khác: tổng các dim sắp xếp theo Layer.

(defun c:sumDimByLayer  (/ asoc lst lay msg tOver)
  (vl-load-com)
  (if (ssget (list (cons 0 "DIMENSION")  )  )
    (progn		
      (vlax-for e (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	(setq lay (vla-get-Layer e)
	      len (if (= "" (setq tOver (vla-get-TextOverride e)))(vla-get-Measurement e)(distof tOver)))
	(if (setq asoc (assoc lay lst))
	    (setq lst (subst (cons lay (+ len (cdr asoc))) asoc lst))	    
	    (setq lst (append lst (list (cons lay len))) ))	)
      (setq msg "Total Dim by Layer :\n")
      (alert
	(foreach x lst (setq msg (strcat msg "\n" (car x) " = " (rtos (cdr x) 2 1)) ))  ) )
    (princ "\nBan da khong chon dim.!")    )
  (princ)  )

Like :)


  • 0