//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Knitting_F.h" #include "Main.h" #include "MainImage.h" #include "Palette.h" #include "YarnTable_F.h" //--------------------------------------------------------------------------- #define IDS_FCAPTION StringTable[0] #define IDS_HAIREFFECT StringTable[1] #define IDS_YARNTABLE StringTable[2] //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "TPSpin" #pragma resource "*.dfm" TKnittingForm *KnittingForm; //--------------------------------------------------------------------------- __fastcall TKnittingForm::TKnittingForm(TComponent* Owner) : TForm(Owner) { StringTable.Create(DirectoryItem, Language, "Knitting"); //================================================= Caption = IDS_FCAPTION; cbHair->Caption = IDS_HAIREFFECT; lbGap->Caption = IDS_COMMON_GAP; lbLength->Caption = IDS_COMMON_LENGTH; KnitButton->Caption = IDS_COMMON_RUN; YarnButton->Caption = IDS_YARNTABLE; //================================================= } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::FormCreate(TObject *Sender) { // SetSmallFont(Font); SetFont(); YarnGrid->ColWidths[0] = 30; YarnGrid->ColWidths[1] = 170; YarnGrid->ColWidths[2] = 80; YarnGrid->ColWidths[3] = 60; TIniFile *IniFile; IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { Left = IniFile->ReadInteger("YarnChart", "FormLeft", (Screen->Width-Width)>>1); Top = IniFile->ReadInteger("YarnChart", "FormTop", (Screen->Height-Height)>>1); delete IniFile; } PaletteForm->OnKChangeColor = ChangeColor; } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::FormDestroy(TObject *Sender) { TIniFile *IniFile; IniFile = new TIniFile(DirectoryItem + "\\Main.ini"); if (IniFile) { IniFile->WriteInteger("YarnChart", "FormLeft", Left); IniFile->WriteInteger("YarnChart", "FormTop", Top); delete IniFile; } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridDrawCell(TObject *Sender, int Col, int Row, TRect &Rect, TGridDrawState State) { AnsiString str; Tdesign_yarn *tdy; int x; TYarnData *YarnData; if (Row == 0) { switch (Col) { case 0: str = "No."; break; case 1: if (ViewMode == vmColor) { str = "Color"; break; } else if (ViewMode == vmYarn) { str = "Yarn"; break; } case 2: str = "Type"; break; case 3: str = "Number"; break; } x = (YarnGrid->ColWidths[Col] - YarnGrid->Canvas->TextWidth(str)) / 2; YarnGrid->Canvas->TextOut(Rect.Left+x, Rect.Top + 5, str); } else { if (MainImageForm == NULL) return; tdy = &MainImageForm->Arrange->Dyarn; if (Row <= tdy->cnt) { switch (Col) { case 0: str = Row; x = (YarnGrid->ColWidths[0] - YarnGrid->Canvas->TextWidth(str)) / 2; YarnGrid->Canvas->TextOut(Rect.Left+x, Rect.Top + 5, str); break; case 1: DrawColorChip(YarnGrid->Canvas, Rect, Row); break; case 2: if (tdy->data[Row].type == DYT_NORMAL) { str = "Normal"; } else if (tdy->data[Row].type == DYT_MELANGE) { str = "Melange"; } else if (tdy->data[Row].type == DYT_DESIGN) { YarnData = tdy->ydData[Row]; str = YarnData->FileName; } x = (YarnGrid->ColWidths[2] - YarnGrid->Canvas->TextWidth(str)) / 2; YarnGrid->Canvas->TextOut(Rect.Left+x, Rect.Top + 5, str); break; case 3: str = tdy->data[Row].cnt; x = (YarnGrid->ColWidths[3] - YarnGrid->Canvas->TextWidth(str)) / 2; YarnGrid->Canvas->TextOut(Rect.Left+x, Rect.Top + 5, str); break; } } } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridDblClick(TObject *Sender) { if (YarnGrid->Col == 1 && YarnGrid->Row) ExchangeColor(1, YarnGrid->Row, chipX); } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { Tdesign_yarn *tdy; int row, col; for(int i=1;iRowCount;i++) YarnGrid->Cells[3][i] = ""; YarnGrid->MouseToCell(X, Y, col, row); if (col == 1 && row == 0) { ViewMode = (ViewMode + 1)%2; YarnGrid->Repaint(); } if (MainImageForm && row) { tdy = &MainImageForm->Arrange->Dyarn; YarnGrid->EditorMode = false; if (row <= tdy->cnt) { switch (col) { case 1: chipX = X; if (Button == mbMiddle || (Shift.Contains(ssShift) && Button == mbLeft)) ChoiceColor(col, row, X); break; case 2: if (tdy->data[row].type == DYT_NORMAL) { tdy->data[row].type = DYT_MELANGE; } else if (tdy->data[row].type == DYT_MELANGE) { tdy->data[row].type = DYT_NORMAL; tdy->data[row].cnt = 1; } else if (tdy->data[row].type == DYT_DESIGN) { tdy->data[row].type = DYT_NORMAL; tdy->data[row].cnt = 1; if (tdy->ydData[row]) { delete tdy->ydData[row]; tdy->ydData[row] = NULL; } } CheckColorCount(); break; case 3: if (tdy->data[row].type == DYT_MELANGE) YarnGrid->EditorMode = true; else YarnGrid->EditorMode = false; break; } tdy->set = row; } YarnGrid->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int row, col; YarnGrid->MouseToCell(X, Y, col, row); if (MainImageForm && row) { if (row <= MainImageForm->Arrange->Dyarn.cnt && col == 1) CursorColor(col, row, X); } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridSelectCell(TObject *Sender, int Col, int Row, bool &CanSelect) { if (MainImageForm) { if (CanSelect) { if (Row && Row <= MainImageForm->Arrange->Dyarn.cnt) { switch (Col) { case 3: if (MainImageForm->Arrange->Dyarn.data[Row].type == DYT_MELANGE) YarnGrid->Options<Options>>goEditing; } } } } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnGridKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { Tdesign_yarn *tdy; int cnt; if (Key==VK_RETURN) { tdy = &MainImageForm->Arrange->Dyarn; cnt = StrToInt(YarnGrid->Cells[3][YarnGrid->Row]); YarnGrid->Cells[3][YarnGrid->Row] = ""; if (cnt < 1) cnt = 1; if (cnt > 8) cnt = 8; tdy->data[YarnGrid->Row].cnt = cnt; YarnGrid->EditorMode = false; YarnGrid->Col = 1; CheckColorCount(); YarnGrid->Repaint(); // KnitButton->SetFocus(); //lhskys ¿£ÅÍ·Î ½ÇÇàÇϱâ } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::cbHairClick(TObject *Sender) { bool check = cbHair->Checked; lbLength->Enabled = check; spLength->Enabled = check; lbGap->Enabled = check; spGap->Enabled = check; } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::KnitButtonClick(TObject *Sender) { TCursor OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; RGBQUAD rgb[256]; RECT dummy; TStatusProgress *sp = new TStatusProgress(MainForm->StatusBar, StatusBarHint); MainImageForm->Arrange->ksmlt.hair.sw = cbHair->Checked; if (MainImageForm->Arrange->ksmlt.hair.sw) { MainImageForm->Arrange->ksmlt.hair.gap = spGap->Value; MainImageForm->Arrange->ksmlt.hair.len = spLength->Value; } PaletteForm->DIB256Palette->Palette->ToRGBQUAD(rgb, 256); MainImageForm->iMainImage->ArrayBitmap[0].PutColors(0, 256, rgb); MainImageForm->iMainImage->ArrayBitmap[1].PutColors(0, 256, rgb); MainImageForm->Arrange->Simulation(MainImageForm->iMainImage->ArrayBitmap, MainImageForm->WorkArea, dummy, MainImageForm->CanvasInfor.DotsPerInch, sp); ::RepaintImage(); delete sp; Screen->Cursor = OldCursor; } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::spEditClick(TObject *Sender) { TPSpinEdit *sp = (TPSpinEdit *) Sender; sp->SetFocus(); sp->SelectAll(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Private Methods //--------------------------------------------------------------------------- void __fastcall TKnittingForm::DrawColorChip(TCanvas *grid, RECT r, int index) { int sx, sy, w, h, cnt, i; Tdesign_yarn *tdy; tdy = &MainImageForm->Arrange->Dyarn; TYarnData *YarnData; TSize vs; TPoint sp; if (ViewMode == vmColor) { cnt = tdy->data[index].cnt; w = ((r.right - r.left - 2) / cnt) - 2; h = r.bottom - r.top - 4; sx = r.left + 2; sy = r.top + 2; grid->Pen->Width = 2; for (i = 0; i < cnt; i++) { grid->Brush->Color = MainImageForm->Palette->ColorData[tdy->data[index].color[i]]->Color; grid->Rectangle(sx, sy, sx + w, sy + h); sx = sx + w + 2; } } else if (ViewMode == vmYarn) { if ( tdy->data[index].type == DYT_DESIGN ) { YarnData = tdy->ydData[index]; if (YarnData->FileName == NULL) return; vs.cx = YarnGrid->ColWidths[1] - 4; vs.cy = YarnGrid->RowHeights[0] - 4; sp.x = r.left+2; sp.y = r.top+2; YarnData->Draw(grid, sp, vs, NULL); } else { cnt = tdy->data[index].cnt; w = ((r.right - r.left - 2) / cnt) - 2; h = r.bottom - r.top - 4; sx = r.left + 2; sy = r.top + 2; grid->Pen->Width = 2; for (i = 0; i < cnt; i++) { grid->Brush->Color = MainImageForm->Palette->ColorData[tdy->data[index].color[i]]->Color; grid->Rectangle(sx, sy, sx + w, sy + h); sx = sx + w + 2; } } } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::ExchangeColor(int col, int row, int x) { TRect r; int w, index, dw, PalIndex; TColorData *cd; Tdesign_yarn *tdy; tdy = &MainImageForm->Arrange->Dyarn; if (row <= tdy->cnt) { r = YarnGrid->CellRect(col, row); w = (r.Right - r.Left - 4) / tdy->data[row].cnt; index = (x - (r.Left + 2)) / w; if (index) { tdy->data[row].color[index] = PaletteForm->DIB256Palette->ChoiceIndex; if (tdy->data[row].type == DYT_DESIGN) { PalIndex = PaletteForm->DIB256Palette->ChoiceIndex; if (PalIndex == 1) { PaletteForm->DIB256Palette->ChoiceIndex = 2; PalIndex = 2; } tdy->data[row].color[index] = PalIndex; cd = MainImageForm->Palette->ColorData[PalIndex]; tdy->ydData[row]->Color[index]->SetColor(cd, PalIndex); } CheckColorCount(); } } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::ChoiceColor(int col, int row, int x) { TRect r; int w, index, dw, kk; Tdesign_yarn *tdy; tdy = &MainImageForm->Arrange->Dyarn; if (row <= tdy->cnt) { r = YarnGrid->CellRect(1, row); w = (r.Right - r.Left - 4) / tdy->data[row].cnt; index = (x - (r.Left + 2)) / w; kk = tdy->data[row].color[index]; if (kk < 2) kk = 1; PaletteForm->DIB256Palette->ChoiceIndex = kk; } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::CursorColor(int col, int row, int x) { TRect r; int w, index, dw, kk; Tdesign_yarn *tdy; tdy = &MainImageForm->Arrange->Dyarn; if (row <= tdy->cnt) { r = YarnGrid->CellRect(1, row); w = (r.Right - r.Left - 4) / tdy->data[row].cnt; index = (x - (r.Left + 2)) / w; kk = tdy->data[row].color[index]; if (kk < 2) kk = 1; PaletteForm->DIB256Palette->CursorIndex = kk; } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::CheckColorCount() { Byte color[256]; Tdesign_yarn *tdy; int i, j, cnt; bool over = false; if (MainImageForm) { tdy = &MainImageForm->Arrange->Dyarn; memset(color, 0, 256); if (tdy->cnt <= 36) { for (i = 1; i <= tdy->cnt; i++) { if (tdy->data[i].type == DYT_NORMAL) { color[tdy->data[i].color[0]] = 1; } else { for (j = 0; j < tdy->data[i].cnt; j++) { color[tdy->data[i].color[j]] = 1; } } } for (i = 0, cnt = 0; i < 256; i++) { if (color[i]) cnt++; } if (cnt > 36) over = true; } else { over = true; } if (over) { KnitButton->Enabled = false; EXCEPTION_MESSAGE_OK(EC_NOT_KNITTING); } else { KnitButton->Enabled = true; // KnitButton->SetFocus(); //lhskys ¿£ÅÍŰ·Î ½ÇÇàÇϱâÀ§ÇØ //by jeegeo ´Ù½Ã¸·À½//KnittingForm->KnitButton->SetFocus(); //lhskys ¿£ÅÍŰ·Î ½ÇÇàÇϱâÀ§ÇØ } } } //--------------------------------------------------------------------------- // Public Methods //--------------------------------------------------------------------------- void __fastcall TKnittingForm::SetFont() { SetSmallFont(Font); SetSmallFont(YarnGrid->Font); } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnRearrange() { int x, y, i, j; Byte *IP, color[256]; Tdesign_yarn *tdy; TTexpiaBitmap *bmp; bool find; if (MainImageForm) { tdy = &MainImageForm->Arrange->Dyarn; bmp = &MainImageForm->iMainImage->ArrayBitmap[0]; memset(color, 0, 256); if (!(bmp->StartScanLine())) goto fail; for (y = 0; y < bmp->Height; y++) { IP = bmp->GetScanLine(y); for (x = 0; x < bmp->Width; x++, IP++) { color[*IP] = 1; } } bmp->StopScanLine(); j = 1; while (j <= tdy->cnt) { i = tdy->data[j].color[0]; if (color[i] == 0) { for (x = j; x < tdy->cnt; x++) { tdy->data[x].type = tdy->data[x+1].type; tdy->data[x].cnt = tdy->data[x+1].cnt; memcpy(tdy->data[x].color, tdy->data[x+1].color, 8); if (tdy->ydData[x]) delete tdy->ydData[x]; tdy->ydData[x] = tdy->ydData[x+1]; tdy->ydData[x+1] = NULL; } tdy->data[x].type = 0; tdy->data[x].cnt = 0; memset(tdy->data[x].color, 0, 8); if (tdy->ydData[x]) { delete tdy->ydData[x]; tdy->ydData[x] = NULL; } tdy->cnt--; } else { j++; } } for (i = 2; i < 256; i++) { if (color[i]) { find = false; for (j = 1; j <= tdy->cnt; j++) { if (i == tdy->data[j].color[0]) find = true; } if (tdy->cnt > 63) break; if (find == false) { tdy->cnt++; tdy->data[tdy->cnt].type = DYT_NORMAL; tdy->data[tdy->cnt].cnt = 1; memset(tdy->data[tdy->cnt].color, 0, 8); tdy->data[tdy->cnt].color[0] = i; } } } YarnGrid->Repaint(); CheckColorCount(); } return; fail: EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::ChangeColor() { TRect r; int nYarn, nColor, PalIndex; Tdesign_yarn *tdy; TColorData *cd; tdy = &MainImageForm->Arrange->Dyarn; PalIndex = PaletteForm->DIB256Palette->ChoiceIndex; for ( nYarn=1; nYarn<=tdy->cnt; nYarn++ ) { if (tdy->data[nYarn].type == DYT_DESIGN) { for ( nColor=0; nColordata[nYarn].cnt; nColor++ ) { if ( tdy->data[nYarn].color[nColor] == PalIndex ) { cd = MainImageForm->Palette->ColorData[PalIndex]; tdy->ydData[nYarn]->Color[nColor]->SetColor(cd, PalIndex); } } } } CheckColorCount(); YarnGrid->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::WMMOVE(TMessage &msg) { if (MainImageForm) { MainImageForm->iMainImageChange(); } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::spGapKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if(Key==13 && KnitButton->Enabled)KnitButtonClick(this); //lhskys ¿£ÅÍ·Î ½ÇÇàÇϱâ } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnButtonClick(TObject *Sender) { if (YarnButton->Down) { if (YarnTableForm == NULL) YarnTableForm = new TYarnTableForm(this); YarnTableForm->Parent = MainForm; YarnTableForm->Visible = true; YarnTableForm->OnYarnChange = YarnChange; YarnTableForm->OnCloseForm = CloseTableForm; YarnButton->Down = true; } else { if (YarnTableForm) YarnTableForm->Visible = false; YarnButton->Down = false; } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::YarnChange(AnsiString fn) { int index = YarnGrid->Row; Tdesign_yarn *tdy; if (MainImageForm) { tdy = &MainImageForm->Arrange->Dyarn; if (0 < index && index <= tdy->cnt) { AcceptData(fn, index); } else { Sysutils::Beep(); ShowMessage(IDS_MESSAGE_DATAFULL); } CheckColorCount(); YarnGrid->Repaint(); } } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::AcceptData(AnsiString fn, int index) { Tdesign_yarn *tdy; TPException ec = EC_NONE; int i, PalIndex; TColorData *pCd; if (MainImageForm) { tdy = &MainImageForm->Arrange->Dyarn; if (tdy->ydData[index]) delete tdy->ydData[index]; tdy->ydData[index] = new TYarnData; if ((ec = tdy->ydData[index]->LoadFromFile(fn)) != EC_NONE) goto fail; tdy->data[index].type = DYT_DESIGN; tdy->data[index].cnt = tdy->ydData[index]->Colors; PalIndex = tdy->data[index].color[0]; pCd = MainImageForm->Palette->ColorData[PalIndex]; tdy->ydData[index]->Color[0]->SetColor(pCd, PalIndex); for ( i=1; idata[index].cnt; i++ ) { tdy->data[index].color[i] = 2; pCd = MainImageForm->Palette->ColorData[2]; tdy->ydData[index]->Color[i]->SetColor(pCd, 2); } } fail: } //--------------------------------------------------------------------------- void __fastcall TKnittingForm::CloseTableForm() { YarnButton->Down = false; } //---------------------------------------------------------------------------