Add-in Sheet Cutting: Tối ưu hóa cắt nguyên liệu dạng tấm

Liên hệ QC

huuthang_bd

Chuyên gia GPE
Tham gia
10/9/08
Bài viết
8,709
Được thích
10,814
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Thợ đụng
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:
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])
Code của hàm SheetCutting
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
 

File đính kèm

  • Sheet Cutting.xlam
    40.2 KB · Đọc: 121
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom