Chuyển đến nội dung
Diễn đàn CADViet
khongnam

Tạo Lisp Bóc Khối Lượng Ống Gió

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

Chào mọi người, mình đang làm mảng bóc khối lượng các hệ ME.

 

161108_tinh_ong_gio.png

Trong quá trình bóc khối lượng cho ống gió khá mất thời gian vì phải làm thủ công khá nhiều, mình muốn nhờ mọi người trong diễn đàn viết giúp một lisp tính số m2 tôn để làm ống gió như sau:

Ví dụ: mình có đoạn ống kích thước hai cạnh (a x b) = (500 x 200), để tích diện tích bề mặt ống trước tiên ta đo chiều dài ống (L) sau đó cho nhập kích thước 2 cạnh của ống là a và b, sau đó tính ra diện tích bề mặt ống theo công thức: S = (Chiều dài) x (chu vi ống) = L x [(a+b)*2] (m2), với đoạn ống kích thước 500x200, giả sử chiều dài đo được L = 2m thì diện tích bề mặt ống sẽ là S = 2 x [(0,5+0,2)x2] = 2,8 m2. (Lisp có thể cho phép tính nhiều đoạn ống cùng lúc và xuất kết quả 1 lần).

 

 

Mong nhận được sự giúp đỡ của mọi người.

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

Mong nhận được sự giúp đỡ của mọi người.

Khó thế, cho xin cái File đê, nếu muốn nhanh thì có thể không, DIM (cái dim ghi chiều dài L) làm trước (khi sử dụng LISP chỉ việc Pick chọn nó được không, hoặc Pick chọn đường LINE nào đó để lấy chiều dài ống; cũng yêu cầu như vậy với MTEXT (hoặc TEXT) 350x200 và 500x250 được không, chứ lúc đó mà nhập tay thì rườm rà quá

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

Khó thế, cho xin cái File đê, nếu muốn nhanh thì có thể không, DIM (cái dim ghi chiều dài L) làm trước (khi sử dụng LISP chỉ việc Pick chọn nó được không, hoặc Pick chọn đường LINE nào đó để lấy chiều dài ống; cũng yêu cầu như vậy với MTEXT (hoặc TEXT) 350x200 và 500x250 được không, chứ lúc đó mà nhập tay thì rườm rà quá

Chào bạn quansla, cảm ơn vì đã phản hồi. Bạn cần file bản vẽ hay sao vậy?. ý tưởng của bạn về việc Dim chiều dài ống trước sau đó pick chọn để lấy thông số cũng hay, nhưng ví dú mình muốn lisp cho phép thực hiện thao tác đo bằng cách kích 2 điểm để lấy giá trị chiều dài L trước được ko?, khi đó mình không cần phải DIM trướ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ác block có dạng AxB L=.... Bạn seclect những cái cần thống kê, kết quả sẽ sắp xếp theo trái sang phải.

http://www.cadviet.com/upfiles/7/4301_test.dwg

http://www.cadviet.com/upfiles/7/4301_test_7.lsp

Chào cuongtks, mình có tải lấy code lisp của bạn về chạy thử mà không được (sau khi load vào cad xong mình đánh lệnh "test" để thực hiện mà không được). Bạn xem lại dùm mình được không.

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

Chào bạn quansla, cảm ơn vì đã phản hồi. Bạn cần file bản vẽ hay sao vậy?. ý tưởng của bạn về việc Dim chiều dài ống trước sau đó pick chọn để lấy thông số cũng hay, nhưng ví dú mình muốn lisp cho phép thực hiện thao tác đo bằng cách kích 2 điểm để lấy giá trị chiều dài L trước được ko?, khi đó mình không cần phải DIM trước.

 

Được nhưng vẫn cần FILE bản vẽ, bạn đưa lên đây đi; chứ biết bạn có file thế nào, dữ liệu đầu vào thế nào, đầu ra cho kết quả vào đâu, giá trị chiều dài, pick điểm được kích thước mm, hay m; file thôi mà khó khăn thế?

(defun loc_thong_tin_str(str / pos str1 str2)
  ;(loc_thong_tin_str "300x200")
  (vl-load-com)
  (if (setq pos (vl-string-search "x" str)) (setq str1 (substr str 1 pos) str2 (substr str (+ 2 pos) 8)))
  (list str1 str2)
  )
 
(defun loc_tap_ss(ss lst / lst2 name r r2)
  ;(setq lst '("TEXT" "MTEXT" "DIMENSION"))
  ;(loc_tap_ss ss '("TEXT" "MTEXT" "DIMENSION"))
  ;(setq dt (car ss))
  (setq lst2 (mapcar 'list lst))
  (foreach dt ss
    (if (member (setq name (dxf 0 (entget dt))) lst)
      (progn
(setq r (assoc name lst2))
(setq r2 (append r (list dt)))
(setq lst2 (subst r2 r lst2))
)))
  lst2
  )
 
(defun dxf (n ent) (cdr(assoc n ent)))
 
(defun c:thunghiem(/ e1 e2 ent kqdientich l l1 lst r1 ss str)
  (if (and (setq ss (acet-ss-to-list (ssget '(( 0 . "*TEXT,*DIM*")))))
  (setq lst (loc_tap_ss ss '("MTEXT" "DIMENSION"))))    
    (progn
      (if (> (length (car lst)) 1)
(setq e1 (last(car lst)) str (dxf 1 (entget e1)))
(setq str ""))
      (if (> (length (last lst)) 1)
  (setq e2 (cadr(last lst))
L1 (if (= "" (dxf 1 (setq ent (entget e2)))) (dxf 42 ent) (atoi (dxf 1 ent))))
(setq L1 -100.0))
      (if (= str "") (setq str (getstring "/nNhap lai tiet dien ong dang 200x300")))
      (if (< L1 0) (setq L1 (getdist "/nNhap lai chieu dai ong L= <0.00>")))
      (if (setq L (getreal (acet-str-format "Chon chieu dai ong %1  L=<%2>" str L1)))
(setq L1 L))
      (if (>= L1 1000) (setq L1 (* L1 0.001)))
      (setq kqDientich (* 1e-6 2 (apply '+ (mapcar 'read (setq r1 (loc_thong_tin_str str)))) L1))
      (alert (acet-str-format "Gia tri tinh toan S= 2*(%1+%2)*%3m=%4 m2" (read (car r1)) (read (cadr r1)) L1 kqDientich))
      )
    )
  (princ)
  )
P/S đã sửa lại theo #8 (làm được với đầu vào là MTEXT, sửa lại công thức) Chỉnh sửa theo quansla

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 nhưng vẫn cần FILE bản vẽ, bạn đưa lên đây đi; chứ biết bạn có file thế nào, dữ liệu đầu vào thế nào, đầu ra cho kết quả vào đâu, giá trị chiều dài, pick điểm được kích thước mm, hay m; file thôi mà khó khăn thế?

(defun loc_thong_tin_str(str / pos str1 str2)
  ;(loc_thong_tin_str "300x200")
  (vl-load-com)
  (if (setq pos (vl-string-search "x" str)) (setq str1 (substr str 1 pos) str2 (substr str (+ 2 pos) 8)))
  (list str1 str2)
  )
 
(defun loc_tap_ss(ss lst / lst2 name r r2)
  ;(setq lst '("TEXT" "MTEXT" "DIMENSION"))
  ;(loc_tap_ss ss '("TEXT" "MTEXT" "DIMENSION"))
  ;(setq dt (car ss))
  (setq lst2 (mapcar 'list lst))
  (foreach dt ss
    (if (member (setq name (dxf 0 (entget dt))) lst)
      (progn
(setq r (assoc name lst2))
(setq r2 (append r (list dt)))
(setq lst2 (subst r2 r lst2))
)))
  lst2
  )
 
(defun dxf (n ent) (cdr(assoc n ent)))
 
(defun c:thunghiem(/ e1 e2 ent kqdientich l l1 lst r1 ss str)
  (if (and (setq ss (acet-ss-to-list (ssget '(( 0 . "*TEXT,*DIM*")))))
  (setq lst (loc_tap_ss ss '("TEXT" "DIMENSION"))))    
    (progn
      (if (> (length (car lst)) 1)
(setq e1 (last(car lst)) str (dxf 1 (entget e1)))
(setq str ""))
      (if (> (length (last lst)) 1)
  (setq e2 (cadr(last lst))
L1 (if (= "" (dxf 1 (setq ent (entget e2)))) (dxf 42 ent) (atoi (dxf 1 ent))))
(setq L1 -100.0))
      (if (= str "") (setq str (getstring "/nNhap lai tiet dien ong dang 200x300")))
      (if (< L1 0) (setq L1 (getdist "/nNhap lai chieu dai ong L= <0.00>")))
      (if (setq L (getreal (acet-str-format "Chon chieu dai ong %1  L=<%2>" str L1)))
(setq L1 L))
      (if (>= L1 1000) (setq L1 (* L1 0.001)))
      (setq kqDientich (* 1e-6 (apply '* (mapcar 'read (setq r1 (loc_thong_tin_str str)))) L1))
      (alert (acet-str-format "Gia tri tinh toan S= (%1*%2)*%3m=%4 m2" (read (car r1)) (read (cadr r1)) L1 kqDientich))
      )
    )
  (princ)
  )

Xin lỗi không phải mình khó khăn cái bản vẽ làm gì đâu ah, tại vì mình cho rõ bạn cần cái gì ah? gửi bạn bản Cad nhé của hệ ống gió, mong nhận được sự giúp đỡ của bạn.

http://www.cadviet.com/upfiles/7/161108_bOc_khOi_lUOng_Ong_giO.dwg

  • Vote giả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

Xin lỗi không phải mình khó khăn cái bản vẽ làm gì đâu ah, tại vì mình cho rõ bạn cần cái gì ah? gửi bạn bản Cad nhé của hệ ống gió, mong nhận được sự giúp đỡ của bạn.

http://www.cadviet.com/upfiles/7/161108_bOc_khOi_lUOng_Ong_giO.dwg

Bạn đã thử dùng LISP của mình chưa, mình thấy áp dụng được ngay mà,nếu muốn tiện hơn thì sửa (setq lst (loc_tap_ss ss '("TEXT" "DIMENSION"))) thành (setq lst (loc_tap_ss ss '("MTEXT" "DIMENSION")))

là xong (thêm "M" trước "TEXT")

Cách dùng:

1. Gõ lệnh

2. Quét chợn MTEXT/(TEXT)/DIM , lisp tự lọc: nếu có MTEXT và DIM thì lisp vào ngay tính toán, nếu chỉ có cái này k0 có cái kia, LISP sẽ yêu cầu điền lại giá trị chưa có, LISP cũng cho phép nhập lại chiều dài của đoạn ống (nếu USER thấy cần thiết). Sau đó do chẳng biết điền kết quả vào đâu lên đành dùng thông báo của CAD

3. File của bạn tắc trách quá: không chỉ rõ nội dung tập trung vào đâu, không chỉ rõ kết quả sẽ ra sao?, tại sao lại dùng DIM 100:1 (DIMLFAC=100; giá trị thực của đo = Cad giữa 2 lần PICK điểm sai khác (nhỏ hơn 100) lần giá trị nếu dùng DLI để đo)

  • 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

@khongnam:

 

Các thành viên trong CADViet không làm cùng ngành với bạn, bạn chỉ nên gửi đúng phần cần hỏi thôi. Người khác không thể hiểu được bản vẽ của bạn với quá nhiều thông tin như vậy.

Công thức bạn đưa ra chỉ mới là phần diện tích hình học, vậy còn phần diện tích tôn để ghép mí thì thế nào? có hệ số gì không?

 

@quansla: Công thức bị sai nhé: chu vi * chiều dài = diện tích (m2); Đổi /n thành \n thì mới xuống dòng?

 

Nếu có thêm xuất ra exel thì tốt hơn không? Chẳng hạn 900x400: xx (m2), 700x300: xx (m2)

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

Bổ sung: Đoạn phần hình côn, nếu tính chính xác phải có kích thước 2 mặt cắt hai đầu...Như vậy ngoài L (chiều dài) phải có thêm 4 thông số.

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

Mình không biết là mỗi ống gió khác nhau bạn bạo 1 block khác nhau?
Nhưng theo mình bạn nên tạo 1 Dynamic block  có att trong đó att là a và b bạn nhập vào, vì đây là block 2D nên không có thực. Còn L là số biến thiên theo từng bock

Mình có tạo thử 1 cái để làm VD cho bạn. Khi bạn đã có 1 block "tạm gọi là chuẩn" thì công việc lisp để thống kê tính toán rất dễ dàng :)62991_untitled_1.pnghttp://www.cadviet.com/upfiles/7/62991_test1.dwg

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


×