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

Xin lisp tính chiều dài trung bình và DL của thanh thép biến thiên

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

Trình bày hơi phức tạp nên em đã trình bày chi tiết trong file đính kèm.

Với các mặt bằng có cùng một dạng biến thiên, để tiện cho thiết kế và thi công, bọn em thường gộp các thanh thép vào cùng một loại, sau đó thống kê chiều dài trung bình để tính khối lượng; tính ra DL để cắt thép. Sau khi có DL thì chiều dài thanh số 1=Lmin, thanh số 2=Lmin+DL, thanh số 3=Lmin+2DL... cứ như thế cho đến hết các thanh.

Hiện bọn em thống kê phải nhập vào Excel và tính ra Ltb, tính ra DL rồi copy dán vào trong Cad, rất mất thời gian.

Em xin cảm ơn!http://www.cadviet.com/upfiles/3/64018_tinh_chieu_dai_thanh_thep_trung_binh.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

- hi hi lâu lâu nhóc thử tự viết lsp theo y/c ko chỉnh sửa lsp cũ xem thế nào, bạn dùng thử cho nhoc ý kiến hen ^^

(defun c:TTL (/ old lmax lmin ename1 ename2 info1 info2 dai1 dai2 ltb ldelta e1 e2) ;
(setq old (getvar "osmode"))
(setvar "osmode" 0)
(prompt "Chon thanh co chieu dai be nhat:")
(setq lmin (ssget "+.:E:S" '((0 . "LINE"))))
(if lmin
 (progn
    (setq ename1 (ssname lmin 0)
	      info1 (entget ename1)
		  dai1 (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1)))
	 )
  )
)  
 ;=========================================================
(prompt "Chon thanh co chieu dai lon nhat:")
(setq lmax (ssget "+.:E:S" '((0 . "LINE"))))
(if lmax
 (progn
    (setq ename2 (ssname lmax 0)
	      info2 (entget ename2)
		  dai2 (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2)))
	 )
  )
)  
;===========================================================
(setq sl (getint "\nSo luong thanh mun tinh:"))
(setq ltb (* (/ (+ dai1 dai2) 2.0) 1000))
(setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000))
(setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:"))))
(entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))
;===============================================================
(setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:"))))
(entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2))
(setvar "osmode" old)
(princ "\n")
(princ)
)
  • 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

 

- hi hi lâu lâu nhóc thử tự viết lsp theo y/c ko chỉnh sửa lsp cũ xem thế nào, bạn dùng thử cho nhoc ý kiến hen ^^

(defun c:TTL (/ old lmax lmin ename1 ename2 info1 info2 dai1 dai2 ltb ldelta e1 e2) ;
(setq old (getvar "osmode"))
(setvar "osmode" 0)
(prompt "Chon thanh co chieu dai be nhat:")
(setq lmin (ssget "+.:E:S" '((0 . "LINE"))))
(if lmin
 (progn
    (setq ename1 (ssname lmin 0)
	      info1 (entget ename1)
		  dai1 (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1)))
	 )
  )
)  
 ;=========================================================
(prompt "Chon thanh co chieu dai lon nhat:")
(setq lmax (ssget "+.:E:S" '((0 . "LINE"))))
(if lmax
 (progn
    (setq ename2 (ssname lmax 0)
	      info2 (entget ename2)
		  dai2 (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2)))
	 )
  )
)  
;===========================================================
(setq sl (getint "\nSo luong thanh mun tinh:"))
(setq ltb (* (/ (+ dai1 dai2) 2.0) 1000))
(setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000))
(setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:"))))
(entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))
;===============================================================
(setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:"))))
(entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2))
(setvar "osmode" old)
(princ "\n")
(princ)
)

Bạn ơi Lsp bạn viết cho mình tính đủ hết rồi, nhưng mình muốn sửa dòng ghi giá trị trung bình là: Số thanh rồi đến dấu ` rồi mới là 14,L=chiều dài trung bình. Hiện Lsp viết ra thiếu tiền tố Số thanh`. Bạn thêm tiền tố đó vào giúp mình được không?

Cảm ơn bạn!

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

-thanks bạn đã ok lsp nhoc ^^, thêm tiền tố đó ko khó, nhưng giờ nhoc đang đi thực địa hẹn bạn chiều tối nhoc sẽ sửa giúp bạn, bạn có mún thêm gì ko nhoc xem nếu đc nhoc sua lun 1 lan

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

-thanks bạn đã ok lsp nhoc ^^, thêm tiền tố đó ko khó, nhưng giờ nhoc đang đi thực địa hẹn bạn chiều tối nhoc sẽ sửa giúp bạn, bạn có mún thêm gì ko nhoc xem nếu đc nhoc sua lun 1 lan

Bọn mình chờ vậy. Mình chỉ cần thêm tiền tố đó là có một Lsp theo đúng yêu cầu của mình.

Cảm ơn bạn!

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ột ý kiến nhỏ:

Có thể lấy Lmin, Lmax từ dim (hoặc text, hoặc nhập từ bàn phím ...) thì hay hơn.

Vì với những chi tiết có chiều dài rất rất lớn so với chiều rộng (và cả 2 bề đều biến thiên) thì bản vẽ thường đc biểu diễn có nét cắt dích dắc >>> thanh thép có chiều dài ko đúng kích thước thật.

Hoặc với bản vẽ in trên model, có scale tỉ lệ cũng vậy ...

Có nhiều lúc mình phải sửa bản vẽ của người khác nữa mà bạn !!!

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ột ý kiến nhỏ:

Có thể lấy Lmin, Lmax từ dim (hoặc text, hoặc nhập từ bàn phím ...) thì hay hơn.

Vì với những chi tiết có chiều dài rất rất lớn so với chiều rộng (và cả 2 bề đều biến thiên) thì bản vẽ thường đc biểu diễn có nét cắt dích dắc >>> thanh thép có chiều dài ko đúng kích thước thật.

Hoặc với bản vẽ in trên model, có scale tỉ lệ cũng vậy ...

Có nhiều lúc mình phải sửa bản vẽ của người khác nữa mà bạn !!!

Bản vẽ của bọn mình chỉ đúng như file đính kèm thôi. Bên mình không có chi tiết phức tạp, chỉ vẽ thép cho tấm BT thôi nên chiều dài thanh thép vẽ trên hình là chuẩn luôn, pick trực tiếp vào chiều dài thanh trên bản vẽ là phù hợp nhất và tiết kiệm thời gian nhất.Nét vẽ mặt cắt zigzag phải là dân cầu hoặc cơ khí, bên mình không cần.

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

-thanks bạn đã ok lsp nhoc ^^, thêm tiền tố đó ko khó, nhưng giờ nhoc đang đi thực địa hẹn bạn chiều tối nhoc sẽ sửa giúp bạn, bạn có mún thêm gì ko nhoc xem nếu đc nhoc sua lun 1 lan

Mình xin thêm 1 Lsp dành cho thanh có chiều dài không đổi. File mình đính kèm theo. Cảm ơn bạn!

 

http://www.cadviet.com/upfiles/3/64018_tinh_chieu_dai_thanh_thep_trung_binh_1.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

Bạn Nhóc bận nên mình phỏng tay trên: 

 

Bọn mình chờ vậy. Mình chỉ cần thêm tiền tố đó là có một Lsp theo đúng yêu cầu của mình.

Cảm ơn bạn!

Bạn thay (entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))

bằng (entmod (subst (cons 1 (strcat "So thanh' " (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))

  • 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

Bạn Nhóc bận nên mình phỏng tay trên: 

 

Bạn thay (entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))

bằng (entmod (subst (cons 1 (strcat "So thanh' " (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))

Cảm ơn bạn, mình sửa được rồi.

 

@Nhoclangbat: Có 1 vấn đề nhỏ nhỏ ở Lsp này. Đó là chiều dài trung bình chưa làm tròn mà chỉ lấy phần nguyên. Ví dụ: Lmin=2197, Lmax=2776 thì Ltb tính ra là 2486 - Mình muốn giá trị tính ra được làm tròn như thông thường, tức là nếu nó là 2486.5 sẽ làm tròn lên là 2487 để không thiếu khối lượng cho nhà thầu có đượ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

- hì chắc tối nhoc mới về tới nhà ^^, cái phần làm tròn thêm đk là đc, bạn Nam còn onl giúp bạn ấy lun hen, nhoc nghĩ bạn Nam xử đ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

@Nhoclangbat: Có 1 vấn đề nhỏ nhỏ ở Lsp này. Đó là chiều dài trung bình chưa làm tròn mà chỉ lấy phần nguyên. Ví dụ: Lmin=2197, Lmax=2776 thì Ltb tính ra là 2486 - Mình muốn giá trị tính ra được làm tròn như thông thường, tức là nếu nó là 2486.5 sẽ làm tròn lên là 2487 để không thiếu khối lượng cho nhà thầu có được không?

 

Thấy bạn thương nhà thầu như thế ai nỡ nào không giúp :) , bạn sữa chỗ:

(rtos ltb 2 0) thành (rtos (fix(+ ltb 1)) 2 0)

 

>>>>> Mình nghĩ về mặt khối lượng thì ko có gì đáng nói, song , về mặt giải thuật thì như Nhóc là đủ rồi đó chứ !

Con số 0 chình ình trong (rtos ltb 2 0) sẽ đảm bảo việc làm tròn đó mà !!!

Nếu mà (rtos (fix(+ ltb 1)) 2 0) có khi lại "làm lời" cho nhà thầu đó chứ !

:D :D :D

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

Khi đã dùng hàm fix rồi thi hai thông số: 2  0  là thừa, tôi viết vậy cho dễ sửa thoi mà.

Làm tròn chỉ 1 mm mà bạn hieptr đã la toáng lên rồi :D

  • 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

Hiepttr la làng là do bạn sai về bản chất. Dù bỏ hay không bỏ số 2 và số 0 thì đều sai, vì (fix (+ 2.0 1))=3, trong khi thực tế nó bằng 2.

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

Thấy bạn thương nhà thầu như thế ai nỡ nào không giúp :) , bạn sữa chỗ:

(rtos ltb 2 0) thành (rtos (fix(+ ltb 1)) 2 0)

Không phải thương nhà thầu mà là làm chưa đúng. Các bác ấy lấy máy tính tay tính ra, phải làm tròn lên chứ không làm tròn xuống được, sai mình lại phải sửa hồ sơ.

Hiện tại với lsp của Nhoclangbat thì thiếu 1 đơn vị, không đáng bao nhiêu với thực tế nhưng không đúng với con số tính ra.

Các bác sửa giúp em một Lsp hoàn chỉnh ạ!

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

- he đc về sớm, sao nhoc test thử vd bạn ấy đưa lsp vẫn trả về đúng 2487 mà ta @@, vậy là sao nhỉ,lúc đầu nhoc ko nhớ nên nghĩ 0.5 trở xuống thì rtos nó ko làm tròn ^^, mà kết quả trùng bình 2 số, 1 là tròn 2 là lẽ 0.5

- nhoc thêm đk phụ có thể dư, bạn cứ thử xem sao, thêm cái đk nếu đối tượng bạn chọn để ghi LTB ko phải text sẽ bắt bạn chọn đúng mới thui, L delta củng vậy ^^

(defun c:TTL (/ old lmax lmin ename1 ename2 info1 info2 dai1 dai2 ltb ldelta e1 e2) ;
(setq old (getvar "osmode"))
(setvar "osmode" 0)
(prompt "Chon thanh co chieu dai be nhat:")
(setq lmin (ssget "+.:E:S" '((0 . "LINE"))))
(if lmin
 (progn
    (setq ename1 (ssname lmin 0)
	      info1 (entget ename1)
		  dai1 (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1)))
	 )
  )
)  
 ;=========================================================
(prompt "Chon thanh co chieu dai lon nhat:")
(setq lmax (ssget "+.:E:S" '((0 . "LINE"))))
(if lmax
 (progn
    (setq ename2 (ssname lmax 0)
	      info2 (entget ename2)
		  dai2 (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2)))
	 )
  )
)  
;===========================================================
(setq sl (getint "\nSo luong thanh mun tinh:"))
(setq ltb (* (/ (+ dai1 dai2) 2.0) 1000))
(if (= (- ltb (fix ltb)) 0.5)
(setq ltb (+ ltb 0.5))
ltb
)
(setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000))
;==============================================================
(setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:"))))
(princ "\n")
(while (/= (cdr (assoc 0 e1)) "TEXT")
(prompt "Ban chon ko phai la text, ban chon lai hen!!!")
(setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:"))))
(princ "\n")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(entmod (subst (cons 1 (strcat "Thanh'" (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))
;===============================================================
(setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:"))))
(princ "\n")
(while (/= (cdr (assoc 0 e2)) "DIMENSION")
(prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!")
(setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:"))))
(princ "\n")
)
(entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2))
;======================================================================
(setvar "osmode" old)
(princ "\n")
(princ)
)
  • 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

114276_klkjhg.png

Nếu đơn vị tính là container thì lisp.ttl của anh Nhóc sai số sẽ tính bằng đơn vị xe cải tiến 2 bánh, một người kéo hai người đẩy! :) :) :)

Không hiểu bên Xây dựng dư nào, bên Cơ khí, khi cắt thép để đảm bảo kết cấu thì phải cắt thép theo chiều dài trung bình của đoạn thép và cắt vát 23°mới đảm bảo tiết kiệm thép mà không ảnh hưởng đến kết cấu.

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

- hi mấy cái ni nhoc có biết mô răng tê rứa ^^, trong file bạn đó hướng dẫn cụ thể có công thức, nhoc thấy có thể làm đc nên thử viết giúp bạn đó ấy 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

Ở lisp này thấy nhoc ko thể  hiện được kí hiệu fi gai (chỉ có ở bigfont) nhỉ? :)

Nếu số luong thanh muốn tính là 100 thì chẳng lẻ có fi gai = 99 :wacko:

  • 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

Vài góp ý:

1.  dai1, dai2 phải làm tròn trước khi tính ltb

Tốt nhất là lưu dai1, dai2 dưới dạng số nguyên, dùng hàm sau để làm tròn:

 

(fix (+ (* dai 1000) 0.5))

 

2.  Kết quả xuất ra là sl, trong đó 14 là đường kính, không phải số thanh -1

(strcat (itoa sl) "`14,L = " (rtos ltb 2 0)))

 

3. Nên dùng hàm con để lấy dai1, dai2

 

4. Để nhập nhanh hơn, đổi thuật toán thành chọn tất cả các thanh, chương trình sẽ đếm số thanh, tìm dai1, dai2 thay vì phải pick 2 lần và nhập số thanh.

Dùng filter (8 . "Cot thep")

  • 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

^^ thanhks anh ndtnv góp ý, ngành này nhoc cũng ko rành lắm nên chỗ thanh'14 nhoc ko pit là gì cứ nghĩ nó là (- sl 1) kaka, lúc xem file bạn đó trình bày nhoc cũng có ý tưởng như anh vậy, quét chọn rùi tính lun 1 lần, nhưng lại ko nghĩ ra giải thuật để làm vậy ^^, chọn thanh thuộc layer nào đó, lấy đc chiều dài từng line nhưng ko biết lọc min max = cách nào ^^, nên đành viết theo ý chang bạn đó trình bày thấy nó đơn giản hơn :)

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

114276_klkjhg.png

Nếu đơn vị tính là container thì lisp.ttl của anh Nhóc sai số sẽ tính bằng đơn vị xe cải tiến 2 bánh, một người kéo hai người đẩy! :) :) :)

Không hiểu bên Xây dựng dư nào, bên Cơ khí, khi cắt thép để đảm bảo kết cấu thì phải cắt thép theo chiều dài trung bình của đoạn thép và cắt vát 23°mới đảm bảo tiết kiệm thép mà không ảnh hưởng đến kết cấu.

 Bọn mình thiết kế tấm BTXM. Tại vị trí khúc cua sẽ có những tấm có hình thù cực kỳ kì dị, không cố định góc vát đâu bạn.

 

Ở lisp này thấy nhoc ko thể  hiện được kí hiệu fi gai (chỉ có ở bigfont) nhỉ? :)

Nếu số luong thanh muốn tính là 100 thì chẳng lẻ có fi gai = 99 :wacko:

Fi gai đã thể hiện ở dấu "`" rồi, khi để font chữ shx sẽ thành dấu hiệu fi 2 gạch là fi gai. Bạn xem trong file đính kèm của mình là thấy.

 

@Nhoc: Giá trị tính ra lúc làm tròn lên, lúc làm tròn xuống. Hình như do chiều dài thanh "nhìn thấy là Lmin=1026 nhưng thật ra vẫn còn một ít sau dấu phảy. Bạn có cách nào để khử giá trị Lmin, Lmax, chỉ lấy đúng 3 số sau dấu phảy đượ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

^^ thanhks anh ndtnv góp ý, ngành này nhoc cũng ko rành lắm nên chỗ thanh'14 nhoc ko pit là gì cứ nghĩ nó là (- sl 1) kaka, lúc xem file bạn đó trình bày nhoc cũng có ý tưởng như anh vậy, quét chọn rùi tính lun 1 lần, nhưng lại ko nghĩ ra giải thuật để làm vậy ^^, chọn thanh thuộc layer nào đó, lấy đc chiều dài từng line nhưng ko biết lọc min max = cách nào ^^, nên đành viết theo ý chang bạn đó trình bày thấy nó đơn giản hơn :)

Mình không cần quét thanh đâu, mình cần pick thanh nên bạn cứ để như lsp đang viết là tốt cho mình rồi.

Cảm ơn bạn!

Giải thích thêm tại sao mình không dùng quét thanh. Vì trên bản vẽ, đôi khi có nhiều thanh trùng 1 vị trí mà người vẽ không kiểm soát được, sẽ dẫn đến sai sót. Thường bọn mình đếm thanh dựa vào Dim, như trong bản vẽ của mình dùng số khoảng cách x khoảng cách giữa 2 thanh cạnh nhau. Vì thế số thanh nhập tay sẽ chuẩn hơn là số thanh quét ra tự độ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

Muốn luôn làm tròn lên bạn sữa :

(if (= (- ltb (fix ltb)) 0.5) thành (if (> (- ltb (fix ltb)) 0.0)

Giá trị Lmin, Lmax, chỉ lấy đúng 3 số sau dấu phảy :

(entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) thành

(entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 3) "~" (rtos (* dai2 1000) 2 3) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2))

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


×