huuthang_bd
Chuyên gia GPE

Nhân có bạn hỏi về tính toán tối ưu cắt 1 tấm nguyên liệu lớn (hình chữ nhật) ra thành các tấm nhỏ hơn (cũng hình chữ nhật) nên tôi mở topic này.
Thật ra code này tôi đã viết từ lâu và hôm nay chỉ chuyển nó thành dạng add-in mà thôi. Các bạn có thể xem thuật toán ở topic Tiện ích tính toán để tiết kiệm khi cắt tấm, cắt thanh.
Add-in có 1 hàm dùng để tính số lượng tấm nhỏ có thể cắt và 1 công cụ để vẽ sơ đồ cắt.
Cú pháp hàm như sau:
Code của hàm SheetCutting
Thật ra code này tôi đã viết từ lâu và hôm nay chỉ chuyển nó thành dạng add-in mà thôi. Các bạn có thể xem thuật toán ở topic Tiện ích tính toán để tiết kiệm khi cắt tấm, cắt thanh.
Add-in có 1 hàm dùng để tính số lượng tấm nhỏ có thể cắt và 1 công cụ để vẽ sơ đồ cắt.
Cú pháp hàm như sau:
Mã:
=SheetCutting([Rộng nguyên liệu],[Dài nguyên liệu],[Rộng cần cắt],[Dài cần cắt], [Rộng đường cắt])
Mã:
Function SheetCutting(ByVal R As Long, ByVal D As Long, ByVal iR As Long, ByVal iD As Long, ByVal KC As Long)
SheetCutting = DoCut(R, D, iR, iD, KC)
End Function
Mã:
Private Function DoCut(ByRef R As Long, ByRef D As Long, ByRef iR As Long, ByRef iD As Long, ByVal KC As Long, Optional ByRef HowCut As String, Optional ByRef rR As Long, Optional ByRef dR As Long, Optional ByRef rD As Long, Optional ByRef dD As Long)
Dim i As Long, j As Long, rR1 As Long, dR1 As Long, rD1 As Long, dD1 As Long, SL As Long
If R > D Then
SL = R: R = D: D = SL
End If
If iR > iD Then
SL = iR: iR = iD: iD = SL
End If
SL = 0
If Int((R + KC) / (iD + KC)) * Int((D + KC) / (iR + KC)) > SL Then
SL = Int((R + KC) / (iD + KC)) * Int((D + KC) / (iR + KC))
HowCut = "H"
End If
If Int((R + KC) / (iR + KC)) * Int((D + KC) / (iD + KC)) > SL Then
SL = Int((R + KC) / (iR + KC)) * Int((D + KC) / (iD + KC))
HowCut = "V"
End If
For i = 0 To Int((R + KC) / (iD + KC))
dR1 = i
rR1 = Int((R + KC - i * (iD + KC)) / (iR + KC))
If dR1 * Int((D + KC) / (iR + KC)) + rR1 * Int((D + KC) / (iD + KC)) + Int((R - dR1 * (iD + KC) + KC) / (iD + KC)) * Int((D - Int((D + KC) / (iD + KC)) * (iD + KC) + KC) / (iR + KC)) > SL Then
dR = dR1: rR = rR1
SL = dR1 * Int((D + KC) / (iR + KC)) + rR1 * Int((D + KC) / (iD + KC)) + Int((R - dR1 * (iD + KC) + KC) / (iD + KC)) * Int((D - Int((D + KC) / (iD + KC)) * (iD + KC) + KC) / (iR + KC))
HowCut = "Vf"
End If
Next
For i = 0 To Int((D + KC) / (iD + KC))
dD1 = i
rD1 = Int((D + KC - i * (iD + KC)) / (iR + KC))
If dD1 * Int((R + KC) / (iR + KC)) + rD1 * Int((R + KC) / (iD + KC)) + Int((R - Int((R + KC) / (iD + KC)) * (iD + KC) + KC) / (iR + KC)) * Int((D - dD1 * (iD + KC) + KC) / (iD + KC)) > SL Then
dD = dD1: rD = rD1
SL = dD1 * Int((R + KC) / (iR + KC)) + rD1 * Int((R + KC) / (iD + KC)) + Int((R - Int((R + KC) / (iD + KC)) * (iD + KC) + KC) / (iR + KC)) * Int((D - dD1 * (iD + KC) + KC) / (iD + KC))
HowCut = "Hf"
End If
Next
DoCut = SL
End Function