BAB III PERANCANGAN
3.1. Gambaran Umum Perusahaan 3.1.1. Sejarah Perusahaan
Perusahaan mebel Sumber Urip mulai berdiri dari tahun 1974, berawal dari usaha pembuatan lemari dan peralatan rumah tangga yang disalurkan ke toko-toko di daerah Jakarta dan sekitarnya dengan jumlah karyawan hanya 2 orang. Lokasi pertama dari perusahaan ini hanyalah di halaman rumah pemilik, yang pada saat itu tinggal di daerah Mangga Besar.
Setelah kurang lebih satu tahun, pemilik mengontrak sebidang tanah di daerah Klender untuk dijadikan bengkel kerja selama dua tahun. Setelah masa kontrak itu habis, pada tahun 1977 pemilik mengontrak lokasi baru di daerah Klender dengan luas tanah yang lebih besar dibanding lokasi sebelumnya untuk selama lima tahun. Pada saat ini, perusahaan sudah memiliki sejumlah 15 orang karyawan.
Kemudian pada tahun yang sama, pemilik mengontrak sebidang tanah di daerah yang sama untuk dijadikan toko yang menjual langsung barang-barang hasil produksi sendiri. Pada tahun 1978, pemilik mengontrak lagi sebuah toko di Jl. Pangeran Jayakarta selama 5 tahun untuk menjual langsung barang-barang produksi sendiri, di samping menyalurkan barang-barangnya ke toko-toko lainnya di daerah Jakarta dan sekitarnya.
Pada tahun 1980, pemilik membeli sebidang tanah dan membangun toko di Jl. Pintu Besar Selatan yang hingga kini masih digunakan untuk menjual
barang-barang produksi sendiri. Setahun kemudian, pemilik juga membeli sebidang tanah di daerah Cakung seluas 3000 m2 yang hingga kini digunakan sebagai pabrik tempat memproduksi barang-barang perabot rumah tangga.
Pada tahun 2003, perusahaan sudah memiliki sekitar 30 karyawan tetap dan sekitar 30 karyawan tidak tetap. Jumlah karyawan saat ini sekitar 30 orang untuk bagian workshop dan showroom.
3.1.2. Kegiatan Operasi Perusahaan
Perusahaan ini melakukan kegiatan produksi dan juga kegiatan penjualan. Kegiatan penjualan dibagi menjadi dua bagian, yaitu penjualan langsung ke konsumen dan penjualan ke toko-toko yang selama ini sudah menjadi langganan.
Penjualan langsung ke konsumen dilakukan melalui toko yang terletak di Jl. Pintu Besar Selatan, di mana konsumen bisa melihat-lihat dan memilih langsung barang apa yang diinginkannya. Lewat toko ini pun konsumen dapat memesan khusus apabila menginginkan barang dengan ukuran yang ditentukan sendiri.
Penjualan ke toko-toko lainnya dilakukan berdasarkan pesanan yang rutin diterima dari toko-toko yang sering memesan barang. Biasanya pesanan dilakukan beberapa kali dalam sebulan, kadang bisa beberapa kali dalam seminggu jika sedang menerima banyak pesanan.
3.2. Analisis Sistem Berjalan
Perusahaan Mebel Sumber Urip memproduksi lebih dari 30 jenis barang, dan juga dapat menerima pesanan khusus. Secara rutin perusahaan ini menerima pesanan dari toko-toko mebel lainnya untuk dijual di toko mereka, pesanan mereka
antara lain meja tulis, lemari pakaian, rak buku, dan lain-lain baik dalam partai kecil maupun besar.
Selama ini proses produksi untuk memenuhi pesanan, pemetaan potongan-potongan dilakukan dengan manual. Satu atau beberapa orang bertugas menggambar pola potong dalam tiap-tiap lembar material. Hal ini tentu saja membuat proses produksi menjadi lebih lama.
Permasalahan ini menjadi vital bagi jalannya perusahaan karena dengan optimalisasi manual yang dilakukan akan berdampak terutama pada keuntungan
dan kecepatan kerja. Dalam dunia industri, kecepatan kerja adalah salah satu faktor yang sangat penting.
3.3. Penerapan Pemodelan Dalam Perusahaan
Setelah melakukan survei awal dari perusahaan, pemodelan yang terjadi dalam Perusahaan Mebel Sumber Urip adalah:
• Material bahan baku berbentuk finite rectangle • Pola potongan-potongan berbentuk rectangle • Pemotongan menggunakan pola 3-stage
Pola 2-stage tidak mungkin dilakukan karena variasi tinggi ukuran
potongan yang diinginkan. Pola n-stage memang menghasilkan hasil yang
paling efektif. Tetapi skripsi ini tidak memakai algoritma tersebut karena dari segi pemodelan, perhitungan, dan penulisan program jauh lebih kompleks. Untuk perusahaan ini sendiri, karena pemotongan dilakukan
secara tidak terotomatisasi penuh maka pola 3-stage adalah yang paling
relevan.
• Penataan pola secara oriented karena kayu mempunyai serat khusus,
sehingga panjang setiap potongan yang disusun harus sejajar dengan panjang material bahan dasar. Contoh pola yang valid pada Gambar 3.01, sedangkan
contoh pola yang tidak valid pada Gambar 3.02.
Gambar 3.01 Bentuk Valid.
Gambar 3.02 Bentuk Tidak Valid.
3.4. Pemilihan Algoritma
Berdasarkan model permasalahan pada 3.3 maka keempat algoritma pada 2.7 bisa dipakai untuk menyelesaikan masalah ini. Keempat algoritma tersebut sama-sama mempunyai batasan: potongan-potongan rectangle, material berbentuk finite rectangle, penempatan potongan secara oriented guillotine.
Dalam skripsi ini algoritma yang dipilih adalah Finite Best-Strip (FBS),
karena menurut pengujian Berkey dan Wang (1987) algoritma FBS paling cepat
perhitungannya dan efektif seperti yang dijelaskan di 2.8.
3.5. Rancangan Output
Gambar hasil dari modul proses akan ditampilkan ke dalam layar. User
dapat memilih halaman berapa yang user ingin lihat, lalu halaman tersebut akan
ditampilkan.
Gambar 3.03 Rancangan Layar Output
3.6. Rancangan Input
User menginput besarnya panjang dan lebar papan yang akan dipotong.
Selain itu user juga menginput besarnya panjang, lebar, dan jumlah potongan yang
diinginkan. Jika ada potongan lain yang ingin ditambahkan, user dapat menekan
tombol ‘+’ untuk menambah potongan yang diinginkan. Jika user merasa
Halaman
Proses Hasil File
kelebihan potongan, user dapat menekan tombol ‘-‘ untuk mengurangi potongan
yang tidak diinginkan.
Dalam mengisi input, user tidak diijinkan untuk menginput karakter selain
angka, tidak ada input apapun (kosong), nilai 0, nilai negatif, dan nilai pecahan
atau pun koma. Input tinggi material tidak boleh melebihi input lebar potongan. Input tinggi tiap potongan tidak boleh melebihi input lebar masing-masing.
Gambar 3.04 Rancangan Layar Input
3.7. Rancangan Proses
Modul ini berjalan setelah user menekan tombol ‘proses’ dan semua input valid. Jika tidak valid, proses tidak berjalan. Jika valid maka proses dilanjutkan.
Dalam modul ini ada 4 langkah utama yang dilakukan, yaitu: sorting descending
berdasarkan inputan tinggi, memasukkan potongan ke dalam blok, memasukkan
blok ke dalam papan, lalu membuat gambarnya.
Perusahaan Mebel Sumber Urip
Proses Hasil File Material : Tinggi Lebar cm cm Potongan :
Tinggi Lebar Jumlah -
+
3.7.1. Alur Finite Best-Strip
Langkah-langkah algoritma Finite Best-Strip dapat diilustrasikan pada Gambar 3.05.
3.7.2. Pseudocode Keseluruhan
1.Input ukuran material dan potongan dari user
2.Cek input
3. Jika salah ulangi input (1)
4. Jika benar masuk ke proses (5)
5.Sorting input berdasarkan tinggi secara descending
6.Masukkan setiap potongan ke dalam blok selama masih cukup 7. Jika tidak cukup cek blok sebelumnya dari awal
8. Jika cukup masukan ke dalam blok tersebut
9. Jika tidak buat blok baru dan masukkan ke dalamnya 10.Lakukan empat langkah di atas hingga potongan habis 11.Sorting blok berdasarkan tinggi secara descending
12.Masukkan setiap blok ke dalam finite bin selama masih cukup
13. Jika tidak buat finitebin baru dan masukkan ke dalamnya
14.Lakukan langkah 12 hingga blok habis 15.Tampilkan solusi ke dalam layar
Langkah-langkah dalam pseudocode ini kemudian diaplikasikan ke dalam bentuk modul, seperti pada Gambar 3.06.
3.7.3. Diagram alur proses
Masing-masing modul dalam diagram alur proses di atas, dijelaskan lebih detail dalam 3.7.4.
3.7.4. Rancangan Proses Pseudocode :
Modul sortPotongan : parameter n sebagai integer Deklarasi I,j sebagai integer
Deklarasi temp sebagai array[0..3] of real Dari i=1 sampai n-1 lakukan
temp[0] = potongan[0][i] temp[1] = potongan[1][i] temp[2] = potongan[2][i] j = i
selama potongan[0][j-1] lebih kecil dari temp[0] lakukan potongan[0][j] = potongan[0][j-1]
potongan[1][j] = potongan[1][j-1] potongan[2][j] = potongan[2][j-1] j = j-1
jika j <= 0 maka keluar ulangi potongan[0][j] = temp[0] potongan[1][j] = temp[1] potongan[2][j] = temp[2] selanjutnya Modul susunBlok
Deklarasikan i, jenis sebagai Integer
Deklarasikan sisaWidth sebagai array of real Deklarasikan flag sebagai Boolean
Deklarasikan sisa sebagai real
Dari i=0 sampai jmlItem-1 lakukan
jmlPotongan = jmlPotongan + bulatkan potongan[2][i] jmlBlok = 0
Deklarasikan panjang tinggiBlok sebanyak jmlBlok + 1 Deklarasikan panjang blok sebanyak jmlBlok +1 Deklarasikan panjang sisaWidthsebanyal jmlBlok +1 jenis = 0
currWidht = maxWidht
tinggiBlok[jmlBlok] = potongan[0][jenis] blok[jmlBlok] = ''
selama jmlPotongan > 0 lakukan
sisa = currWidht - potongan[1][jenis] jika sisa < 0 maka
flag = false
jika sisaWidth[i] - potongan[1][jenis] >= 0 maka
blok[i] = blok[i] + IntToStr(length(IntToStr(jenis))) + IntToStr(jenis) sisaWidth[i] = sisaWidth[i] - potongan[1][jenis] flag = true keluar akhir jika berikutnya
jika flag = false maka
sisaWidth[jmlBlok] = currWidht jmlBlok = jmlBlok +1
Deklarasikan panjang tinggiBlok sebanyak jmlBlok +1 Deklarasikan panjang sisaWidth sebanyak jmlBlok +1 Deklarasikan panjang blok sebanyak jmlBlok +1 tinggiBlok[jmlBlok] = potongan[0][jenis]
blok[i] = IntToStr(length(IntToStr(jenis))) + IntToStr(jenis) currWidht = maxWidht - potongan[1][jenis]
akhir jika
potongan[2][jenis] = potongan[2][jenis]-1 lainnya
potongan[2][jenis] = potongan[2][jenis] -1
blok[i] = blok[i] + IntToStr(length(IntToStr(jenis))) + IntToStr(jenis) currWidht =
currWidht-potongan[1][jenis] akhir jika
jika potongan[2][jenis] = 0 maka jenis = jenis+1 jmlPotongan = jmlPotongan -1
ulangi
Modul blokToPapan
Deklarasikan i sebagai Integer
Deklarasikan currHeight, sisa sebagai real Deklarasikan sisaHeight sebagai array of Real Deklarasikan flag sebagai boolean
currHeight = maxHeight jmlPapan = 0
Deklarasikan panjang sisaHeight sebanyak jmlPapan +1 Deklarasikan panjang papan sebanyak jmlPapan + 1 papan[0] = ''
dari i=0 sampai jmlBlok lakukan sisa = currHeight - tinggiBlok[i] jika sisa < 0 maka
flag = false;
dari j=0 sampai jmlPapan-1 lakukan
jika sisaHeight[j]-tinggiBlok[i] >= 0 maka
papan[j] = papan[j] + IntToStr(length(IntToStr(i))) + IntToStr(i) sisaHeight[j]
= sisaHeight[j] – tinggiBlok[i] flag = true
keluar akhir jika berikutnya
jika flag = false maka
sisaHeight[jmlPapan] = currHeight jmlPapan = jmlPapan+1
Deklarasikan panjang sisaHeight sebanyak jmlPapan + 1 Deklarasikan panjang papan sebanyak jmlPapan + 1 papan[jmlPapan] = ''
papan[j] = IntToStr(length(IntToStr(i))) + IntToStr(i)currHeight = maxHeight - tinggiBlok[i]
akhir jika lainnya
papan[j] = papan[j] + IntToStr(length(IntToStr(i))) + IntToStr(i)currHeight = currHeight - tinggiBlok[i] akhir jika Modul potong sortPotongan(jmlItem) susunBlok() blokToPapan()
Modul gridDeleteRow : parameter RowNumber sebagai integer, Grid sebagai TStringGrid
Deklarasikan i sebagai Integer Grid.Row = RowNumber
jika Grid.Row = Grid.RowCount – 1 maka Grid.RowCount = Grid.RowCount - 1 lainnya
dari i = RowNumber sampai Grid.RowCount - 1 lakukan Grid.Rows[i] = Grid.Rows[i + 1]
Grid.RowCount = Grid.RowCount - 1 akhir jika
Modul isNum : parameter s sebagai String Deklarasikan Value sebagai Real
Deklarasikan Code sebagai Integer Val(s, Value, Code)
IsNum = Code
Modul drawKotak : parameter x1, y1, x2, y2 sebagai Integer, img sebagai TImage dengan img, Canvas lakukan
MoveTo(x1,y1) LineTo(x2,y1) LineTo(x2,y2)
LineTo(x1,y2) LineTo(x1,y1) akhir dengan
Modul rescale : parameter h, w sebagai Real Deklarasikan i sebagai Integer
dari i=0 sampai jmlItem-1 lakukan
p[0][i] = (potongan[0][i] * h) /maxHeight p[1][i] = (potongan[1][i] * w) /maxWidht berikutnya
Modul drawSheet : parameter page sebagai Integer Deklarasikan blk sebagai array of Integer
Deklarasikan i,j, size, jns sebagai Integer Deklarasikan h, w, currH, currW sebagai real
h = Image1.Height-1 w = Image1.Width-1 size = Length(papan[page])
Deklarasikan panjang blk sebanyak size
Deklarasikan panjang p sebanyak 2 dan jmlItem rescale(h,w)
dari i:=0 sampai size-1 lakukan
blk[i] = nilai ascii(papan[page][i+1])-48 jika blk[i] > 9 maka
blk[i] = nilai ascii(papan[page][i+1])-55 dengan Image1, Canvas lakukan
Brush.Color = clWhite fillrect(clientrect)
drawKotak(0,0,Image1.Width-1,Image1.Height-1,Image1) currH = h
dari i=0 sampai size-1 lakukan currW = 0
dari j=0 sampai Length(blok[blk[i]])-1 lakukan jns= ord(blok[blk[i]][j+1])-48
jika jns > 9 maka
jns = nilai ascii(blok[blk[i]][j+1])-55
drawKotak(Round (currW), Round (currH+0.5), Round (p[1][jns]+currW-0.5), Round (currH-p[0][jns]), Image1)
TextOut(Round (currW + (p[1][jns]/2)-10-0.5), Round (currH-13), FloatToStr(potongan[1][jns])+' cm')
TextOut(Round(currW+1.5), Round (currH - (p[0][jns]/2)-0.5), FloatToStr(potongan[0][jns])+' cm')
currW = currW + Round (p[1][jns]) berikutnya
currH = currH - Round ((tinggiBlok[blk[i]]*h)/maxHeight) akhir dengan
berikutnya
Modul tombol button2
StringGrid1.RowCount = StringGrid1.RowCount + 1 Modul tombol button1
Deklarasikan i,j sebagai Integer
Deklarasikan flag, flag2, validInput sebagai Boolean firstExec = true
flag = false flag2 = false validInput = false
jika isNum(Edit1.text) = false maka
MessageDlg('Input Tinggi Harus Berupa Angka', mtWarning, [mbOK],0 ) lainnya jika isNum(Edit2.text) = false maka
MessageDlg('Input Lebar Harus Berupa Angka', mtWarning, [mbOK],0 ) lainnya jika (StrToFloat(Edit1.Text) < 1) or (StrToFloat(Edit2.text) < 1) then
MessageDlg('Tinggi dan lebar tidak boleh kurang dari 1', mtWarning, [mbOK],0 )
lainnya jika StrToFloat(Edit1.Text) < StrToFloat(Edit2.Text) then
MessageDlg('Tinggi tidak boleh lebih besar dari lebar', mtWarning, [mbOK],0 ) lainnya
dari i = 0 sampai StringGrid1.ColCount-1 lakukan flag = true
dari j = 1 sampai StringGrid1.RowCount-1 lakukan jika isNum(StringGrid1.Cells[i,j]) = false maka
MessageDlg('Input Baris ke-'+ IntToStr(j) +' Harus Berupa Angka', mtWarning, [mbOK],0 )
flag = false keluar
akhir jika berikutnya
jika flag = false maka keluar berikutnya
jika flag = true maka flag2 = true
dari i = 1 to StringGrid1.RowCount -1 lakukan
if StrToFloat(StringGrid1.Cells[0,i]) > StrToFloat(Edit2.Text) maka MessageDlg('Baris ke-'+ IntToStr(i) +' tidak dapat masuk ke papan',
mtWarning, [mbOK], 0) flag2 = false
keluar akhir jika
jika StrToFloat(StringGrid1.Cells[1,i]) > StrToFloat(Edit1.Text) maka MessageDlg('Baris ke-'+ IntToStr(i) +' tidak dapat masuk ke papan',
mtWarning, [mbOK], 0) flag2 = false
keluar akhir jika
jika StrToInt(StringGrid1.Cells[2,i])<1 maka
MessageDlg('Jumlah Pada baris ke-'+ IntToStr(i) +' harus lebih besar dari 0', mtWarning, [mbOK], 0) flag2 = false keluar akhir jika jika StrToFloat(StringGrid1.Cells[1,i]) < 1) or(StrToFloat(StringGrid1.Cells[0,i]) < 1) maka
MessageDlg('Baris ke-'+ IntToStr(i) +' harus bernilai lebih dari 0', mtWarning, [mbOK], 0) flag2 = false keluar akhir jika berikutnya akhir jika
jika flag2 = true maka validInput = true jika validInput = true maka
maxHeight = StrToFloat(Edit2.Text) maxWidht = StrToFloat(Edit1.Text)
Deklarasikan panjang potongan sebanyak StringGrid1.ColCount dan StringGrid1.RowCount-1
dari i = 0 sampai StringGrid1.ColCount-1 lakukan dari j = 1 sampai StringGrid1.RowCount-1 lakukan
potongan[i][j-1] = StrToFloat(StringGrid1.Cells[i,j]) jmlItem := StringGrid1.RowCount-1
potong()
ScrollBar1.Max = jmlPapan jika jmlPapan = 0 maka
ScrollBar1.Enabled = false lainnya ScrollBar1.Enabled = true PageControl1.ActivePage = TabSheet2 ScrollBar1.Position = 0 drawSheet(0) akhir jika akhir jika
Modul form dibuat firstExec = false
StringGrid1.Cells[0,0] = 'Tinggi' StringGrid1.Cells[1,0] = 'Lebar' StringGrid1.Cells[2,0] = 'Jumlah'
jmlBlok = 0 jmlPapan = 0 jmlPotongan = 0 Modul tombol button3
jika StringGrid1.RowCount > 2 maka
gridDeleteRow(StringGrid1.Row, StringGrid1) Modul menu exit
Application.Terminate() Modul geser ScrollBar1
drawSheet(ScrollBar1.Position)
label7.Caption = IntToStr(ScrollBar1.Position+1) Modul menu save1
Deklarasikan save sebagai TSaveDialog Deklarasikan fileName sebagai String Deklarasikan i sebagai Integer
save = TSaveDialog.Create(self) save.Title = 'Save your picture' save.InitialDir = GetCurrentDir save.Filter = 'Bitmap|*.bmp' save.DefaultExt = 'bmp' save.FilterIndex = 1 jika save.Execute maka
jika firstExec = false maka
ShowMessage('Harus Proses terlebih dahulu') lainnya
dari i= 0 sampai ScrollBar1.Max lakukan drawSheet(i) fileName = copy(save.FileName,1,length(save.FileName)-4) + IntToStr(i+1) + '.bmp' Image1.Picture.SaveToFile(fileName) berikutnya drawSheet(ScrollBar1.Position) akhir jika save.Free akhir jika Modul menu print
Deklarasikan print sebagai TPrintDialog
Deklarasikan printresX, printresY sebagai Integer Deklarasikan RR sebagai TRect
Deklarasikan totalPages, page, endPage sebagai Integer jika firstExec = false maka
lainnya totalPages = jmlPapan + 1 print = TPrintDialog.Create(Form1) print.Options = [poPageNums] print.MinPage = 1 print.MaxPage = totalPages print.ToPage = totalPages jika print.Execute maka
jika print.FromPage >0 maka page = print.FromPage lainnya
page = 1
jika print.ToPage <> totalPages maka endPage = print.ToPage
lainnya
endPage = totalPages dengan Printer lakukan
Orientation = poLandscape Title = 'Print Papan'
Copies = print.Copies BeginDoc
selama(not Aborted) and Printing lakukan
printresX = GetDeviceCaps(Handle, LOGPIXELSX) printresY = GetDeviceCaps(Handle, LOGPIXELSY)
RR := Rect(printresX, printresY * 3 div 2, PageWidth - printresX, PageHeight - printresY * 3 div 2)
drawSheet(page-1) Canvas.Font.Size = 14
Canvas.TextOut((PageWidth - printresX) + 2, trunc(pageHeight/2), FloatToStr(maxHeight)+ ' cm')
Canvas.TextOut(trunc(PageWidth/2) - 10 , (pageHeight - (printresY * 3 div 2)) + 2, FloatToStr(maxWidht)+ ' cm')
Canvas.StretchDraw(RR, Image1.Picture.Graphic) page := page +1
jika(page <= endPage) and (not Printer.Aborted) maka NewPage lainnya keluar ulangi EndDoc akhir dengan akhir jika drawSheet(ScrollBar1.Position) akhir jika
3.8. Rancangan Save
User memilih folder dan nama yang diinginkan untuk menyimpan gambar
hasil proses di atas. Hasil simpanannya adalah gambar dengan format .bmp
sebanyak hasil dari proses dengan nama ‘namasimpanan+angka.bmp’. User dapat
mengaktifkan tombol ini dengan shortcut ctrl+S.
3.9. Rancangan Print
User dapat mencetak hasil proses ke dalam kertas dengan sebuah printer. User dapat memilih range halaman yang diinginkan ataupun semua halaman untuk