//--------------------------------------------------------------------------- #include #include #include #include "Common.h" #pragma hdrstop #include "Menu3D_F.h" #include "FileManager_F.h" #include "FullView.h" #include "Main.h" #include "Palette.h" #include "StatusProgress.h" #include "TestPattern.h" #include "MainMenu.h" #include "ColorPicker_F.h" #include "define.h" #include "LogData.h" //--------------------------------------------------------------------------- #pragma link "RzEdit" #pragma link "RzSpnEdt" #pragma link "RzBorder" #pragma link "RzCmboBx" #pragma link "TNumEdit" #pragma link "RzBckgnd" #pragma link "RzButton" #pragma link "RzPanel" #pragma link "RzRadChk" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_MAKINGGRID StringTable[0] #define IDS_COPY StringTable[1] #define IDS_FABRIC StringTable[2] #define IDS_BASEFORM StringTable[3] #define IDS_FUNCTION StringTable[4] #define IDS_GRIDMODIFY StringTable[5] #define IDS_SETTING StringTable[6] #define IDS_DEFINE StringTable[7] #define IDS_INSERTLINE StringTable[8] #define IDS_NORMALCOPY StringTable[9] #define IDS_MIRRORCOPY StringTable[10] #define IDS_CREATEGRID StringTable[11] #define IDS_DELETEGRID StringTable[12] #define IDS_NEXTGRID StringTable[13] #define IDS_PREVIOUSGRID StringTable[14] #define IDS_VERTICALLINE StringTable[15] #define IDS_HORIZONTALLINE StringTable[16] #define IDS_NEXTLINE StringTable[17] #define IDS_MODIFYLINE StringTable[18] #define IDS_FINISH StringTable[19] #define IDS_DELETEPOINT StringTable[20] #define IDS_DELETELINE StringTable[21] #define IDS_SETBLOCK StringTable[22] #define IDS_MOVE StringTable[23] #define IDS_FIXPOINT StringTable[24] #define IDS_DELETEBLOCK StringTable[25] #define IDS_LASTRESTORE StringTable[26] #define IDS_ALLRESTORE StringTable[27] #define IDS_TOMAKEGRID StringTable[28] #define IDS_CURRENTGRID StringTable[29] #define IDS_GROUP StringTable[30] #define IDS_GRIDLINE StringTable[31] #define IDS_BLOCKMARK StringTable[32] #define IDS_NEWBLOCK StringTable[33] #define IDS_OTHERGRID StringTable[34] #define IDS_NORMALPOINT StringTable[35] #define IDS_FIXEDPOINT StringTable[36] #define IDS_SELECTPOINT StringTable[37] #define IDS_AUTOCOPY StringTable[38] #define IDS_SELECTIONCOPY StringTable[39] #define IDS_DELETEALL StringTable[40] #define IDS_DELETESELECTION StringTable[41] #define IDS_COUNT StringTable[42] #define IDS_ANGLE StringTable[43] #define IDS_ROTATE StringTable[44] #define IDS_GRIDUNDO StringTable[45] #define IDS_New3D StringTable[46] #define IDS_Old3D StringTable[47] #define IDS_sbGMBlockFix StringTable[48] //--------------------------------------------------------------------------- TMenu3DForm *Menu3DForm; int SET3DCOLOR[7] = { 14, 2, 6, 3, 10, 0, 13 }; //--------------------------------------------------------------------------- // T3DGridBlock //--------------------------------------------------------------------------- __fastcall T3DGridBlock::T3DGridBlock() { BEGIN_LOG("::"); Exist = false; END_LOG; } //--------------------------------------------------------------------------- // T3Drstr //--------------------------------------------------------------------------- __fastcall T3Drstr::T3Drstr() { BEGIN_LOG("::"); cnt = max = 0; pt = NULL; END_LOG; } //--------------------------------------------------------------------------- __fastcall T3Drstr::~T3Drstr() { BEGIN_LOG("::"); if (pt) { HeapFree(GetProcessHeap(), 0, pt); pt = NULL; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall T3Drstr::Initial(int n) { BEGIN_LOG("::"); cnt = 0; GridBlock.Exist = false; if (pt) { HeapFree(GetProcessHeap(), 0, pt); pt = NULL; } if (n>0) { max = n; pt = (TPoint *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TPoint) * max); #ifdef TPDEBUG if (pt==NULL) SHOWDEBUG; #endif } else { max = 0; } END_LOG; } //--------------------------------------------------------------------------- bool __fastcall T3Drstr::Add(int col, int row) { BEGIN_LOG("::"); if (pt==NULL || cnt>=max) { END_LOG; return false; } pt[cnt].x = col; pt[cnt].y = row; cnt++; END_LOG; return true; } //--------------------------------------------------------------------------- // T3DUndo //--------------------------------------------------------------------------- __fastcall T3DUndo::T3DUndo() { BEGIN_LOG("::"); cnt = 0; for (int i=0; iGridCount > cnt ? dp->GridCount : cnt); i++) { if (i < dp->GridCount) { if (!g[i].Copy(dp->GridData[i])) goto fail; } else if (i < cnt) { g[i].Initial(); } } cnt = dp->GridCount; n = pn; GridBlock = gb; for (i = 0; i < T3DF_CNT; i++) { fn[i].cnt = dp->fn[i].cnt; memcpy(fn[i].sn, dp->fn[i].sn, T3D_MAX_GRID); } END_LOG; return true; fail: for (i = 0; i < T3D_MAX_GRID; i++) g[i].Initial(); cnt = 0; END_LOG; return false; } //--------------------------------------------------------------------------- void __fastcall T3DUndo::Read(TData3D *dp, int &pn, T3DGridBlock &gb) { BEGIN_LOG("::"); int i, j, x, y, t; TGridData gd; if (cnt==0) { END_LOG; return; } for (i = 0; i < (dp->GridCount > cnt ? dp->GridCount : cnt); i++) { if (i < dp->GridCount && i < cnt) { if (dp->GridData[i].cx != g[i].cx || dp->GridData[i].cy != g[i].cy) { gd.Copy(dp->GridData[i], true); dp->GridData[i].Copy(g[i], true); g[i].Copy(gd, true); } else { for (y = 0; y < dp->GridData[i].cy; y++) { for (x = 0; x < dp->GridData[i].cx; x++) { Swap(*dp->GridData[i].d->pointer(x, y), *g[i].d->pointer(x, y)); } } Swap(dp->GridData[i].lx, g[i].lx); Swap(dp->GridData[i].ly, g[i].ly); } } else if (i < dp->GridCount) g[i].Copy(dp->GridData[i], true); else if (i < cnt) dp->GridData[i].Copy(g[i], true); } Swap(gb, GridBlock); Swap(dp->GridCount, cnt); Swap(pn, n); for (i = 0; i < T3DF_CNT; i++) { Swap(dp->fn[i].cnt, fn[i].cnt); for (j = 0; j < T3D_MAX_GRID; j++) { Swap(dp->fn[i].sn[j], fn[i].sn[j]); } } END_LOG; } //--------------------------------------------------------------------------- // TMenu3DForm //--------------------------------------------------------------------------- __fastcall TMenu3DForm::TMenu3DForm(TComponent* Owner) : TForm(Owner) { Fabric3DForm = NULL; //==================================================================== StringTable.Create(DirectoryItem, Language, "Menu3D"); SetSmallFont(Font); SetSmallFont(lbNewGrid->Font); SetSmallFont(lbCurrentGrid->Font); SetSmallFont(lbCount->Font); sbMGrid->Hint = IDS_MAKINGGRID; sbMFile->Hint = IDS_COMMON_FILE; sbMCopy->Hint = IDS_COPY; sbMFabric->Hint = IDS_FABRIC; sbGUndo->Hint = IDS_COMMON_UNDO; sbGFInsert->Hint = IDS_INSERTLINE; sbGFNormal->Hint = IDS_NORMALCOPY; sbGFMirror->Hint = IDS_MIRRORCOPY; sbGDCreate->Hint = IDS_CREATEGRID; sbGDDelete->Hint = IDS_DELETEGRID; sbGDNext->Hint = IDS_NEXTGRID; sbGDPrevious->Hint = IDS_PREVIOUSGRID; sbGBVertical->Hint = IDS_VERTICALLINE; sbGBHorizontal->Hint = IDS_HORIZONTALLINE; sbGBNextLine->Hint = IDS_NEXTLINE; sbGBModify->Hint = IDS_MODIFYLINE; sbGBFinish->Hint = IDS_FINISH; sbGBDeleteP->Hint = IDS_DELETEPOINT; sbGBDeleteL->Hint = IDS_DELETELINE; sbGBNextGrid->Hint = IDS_CREATEGRID; sbGMSet->Hint = IDS_SETBLOCK; sbGMMove->Hint = IDS_MOVE; sbGMFix->Hint = IDS_FIXPOINT; sbGMDeletePoint->Hint = IDS_DELETEPOINT; sbGMDeleteBlock->Hint = IDS_DELETEBLOCK; sbGridUndo->Hint = IDS_GRIDUNDO; sbRotate->Hint = IDS_ROTATE; sbGMLast->Hint = IDS_LASTRESTORE; sbGMAll->Hint = IDS_ALLRESTORE; lbNewGrid->Caption = IDS_TOMAKEGRID; lbCurrentGrid->Caption = IDS_CURRENTGRID; sbNormal->Hint = IDS_NORMALCOPY; sbAuto->Hint = IDS_AUTOCOPY; sbSelection->Hint = IDS_SELECTIONCOPY; sbDeleteAll->Hint = IDS_DELETEALL; sbDeleteSelection->Hint = IDS_DELETESELECTION; sbCopyWindow->Hint = IDS_COMMON_WINDOW; lbCount->Caption = IDS_COUNT; rbCopy->Caption = IDS_COMMON_COPY; rbMove->Caption = IDS_COMMON_MOVE; lbAngle->Caption = IDS_ANGLE; sbGMBlockFix->Hint = IDS_sbGMBlockFix; sbGSetting->Hint = IDS_SETTING; //==================================================================== } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::FormCreate(TObject *Sender) { RECT rc; COLORREF VC[15] = { clRed, clLime, clYellow, clMaroon, clGreen, clOlive, clAqua, clNavy, clBlue, clPurple, clFuchsia, clTeal, clBlack, clGray, clWhite }; Item = -1; hOldRgn = MainImageForm->iMainImage->uBitmap->RgnBitmap->GetRegion(true); // convert by celberus if (MainImageForm->Data3D==NULL) MainImageForm->Data3D = new TData3D; if (MainImageForm->Data3D==NULL) { return; } if (!MainImageForm->Data3D->CopyCount>0) { if (MainImageForm->Data3D->bWorkArea) { rc.left = MainImageForm->Data3D->waStart.x; rc.top = MainImageForm->Data3D->waStart.y; rc.right = MainImageForm->Data3D->waStart.x+MainImageForm->Data3D->waSize.x; rc.bottom = MainImageForm->Data3D->waStart.y+MainImageForm->Data3D->waSize.y; MainImageForm->iMainImage->uBitmap->RgnBitmap->PutRegion(rc); // convert by celberus } } for (int i=0; i<15; i++) { GridColorSet[i].Color = VC[i]; } MainImageForm->iMainImage->Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::FormDestroy(TObject *Sender) { ExitItem(); RemoveData(); if (hOldRgn) { MainImageForm->iMainImage->uBitmap->RgnBitmap->PutRegion(hOldRgn); // convert by celberus DeleteObject(hOldRgn); // by celberus } } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGridButtonClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; isRotate = false; t_3d_menu_free(); if (sbGUndo == s) { sbGUndo->Down = false; ClientHeight = MainPanel->Height; T3d.type = T3D_PRE; } t_3d_menu_setting(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGDefineClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; TData3D *dp = MainImageForm->Data3D; int i; if (T3d.type != T3D_DEF) { T3d.type = T3D_DEF; InitializeButton(); } T3d.def = T3D_DNEW; undoSW = false; t3d_define_view_menu(); T3d.step = 0; T3d.col = T3d.row = 0; if (isRotate) isRotate = false; if (isMove) isMove = false; if (sbGDCreate == s) { T3d.def = T3D_DNEW; } else if (sbGDNext == s) { sbGDCreate->Down = false; T3d.def = T3D_DNEXT; clear_block(); T3d.n++; if (T3d.n >= dp->GridCount) T3d.n = 0; MainImageForm->iMainImage->Invalidate(); T3d.def = T3D_OFF; t3d_define_view_menu(); } else if (sbGDDelete == s) { sbGDCreate->Down = false; T3d.def = T3D_DDEL; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } clear_block(); t3d_grid_f_s(); // delete fn[], sn[] dp->GridCount--; for (i = T3d.n; i < dp->GridCount; i++) { dp->GridData[i].Copy(dp->GridData[i + 1], true); } if (dp->GridCount == 0) T3d.n = 0; else if (T3d.n >= dp->GridCount) T3d.n = dp->GridCount - 1; MainImageForm->iMainImage->Invalidate(); T3d.def = T3D_OFF; t_3d_view_menu(); } else if (sbGDPrevious == s) { sbGDCreate->Down = false; T3d.def = T3D_DPRE; clear_block(); if (T3d.n == 0) T3d.n = dp->GridCount-1; else T3d.n--; MainImageForm->iMainImage->Invalidate(); T3d.def = T3D_OFF; t3d_define_view_menu(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbMainClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; MainImageForm->ResetDraw(); //lhskys Á÷¼± ÀÜ»ó Á¦°Å¸¦ À§Çؼ­ MainImageForm->iMainImage->Repaint(); if (Item==3 && sbMFabric == s) { ClientHeight = MainPanel->Height; ExitItem(); } else { ExitItem(); if (sbMGrid == s) { InitItem(0); CopyPanel->Visible = false; ptAngle->Visible = false; ClientHeight = MainPanel->Height + GBasePanel->Height + pnNewGrid->Height - ptAngle->Height; } else if (sbMFile == s) { FileManagerForm = new TFileManagerForm(this); FileManagerForm->Extension = 3; // 3D File FileManagerForm->OnRead = T3DRead; FileManagerForm->OnSave = T3DSave; FileManagerForm->OnFileName = T3DFileName; FileManagerForm->CompressCheckBox->Checked = (MainForm->CompressMethod == cmNone) ? false: true; // FileManagerForm->FilterComboBox->Filter = "Texpia Textile 256 Colors File (*.tex)|*.tex|Texpia Textile Full Colors File (*.tfc)|*.tfc|Texpro 3D File (*.t3d)|*.t3d"; #ifdef TRIAL FileManagerForm->FilterComboBox->Filter = "Texpro Trial 3D File (*.tt3d)|*.tt3d|Texpro 3D File (*.t3d)|*.t3d"; FileManagerForm->FilterComboBox->Enabled = true; #else FileManagerForm->FilterComboBox->Filter = "Texpro 3D File (*.t3d)|*.t3d|" "Texpro 3D File -V10.0 (*.t3d)|*.t3d"; FileManagerForm->FilterComboBox->Enabled = true; #endif ClientHeight = MainPanel->Height; FileManagerForm->ShowModal(); delete FileManagerForm; sbMFile->Down = false; } else if (sbMCopy == s) { CopyPanel->Top = MainPanel->Height; CopyPanel->Visible = true; GBasePanel->Visible = false; CopyPanel->BringToFront(); InitItem(2); ClientHeight = MainPanel->Height + CopyPanel->Height; } else if (sbMFabric == s) { InitItem(3); ClientHeight = MainPanel->Height; } } InitializeButton(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGFunctionClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; int i, j, ex, ey; ExitGFunction(); if (T3d.type != T3D_FUNC) { T3d.type = T3D_FUNC; InitializeButton(); } if (sbGFInsert == s) { T3d.func.item = T3D_FINSL; t3d_function_view_menu(); t3d_insert_line(); T3d.func.item = T3D_OFF; t3d_function_view_menu(); } else { if (sbGFNormal == s) { T3d.func.item = T3D_FCPY_N; } else if (sbGFMirror == s) { T3d.func.item = T3D_FCPY_M; } t3d_function_view_menu(); T3d.func.wsx = MainImageForm->iMainImage->uBitmap->Width; ex = 0; T3d.func.wsy = MainImageForm->iMainImage->uBitmap->Height; ey = 0; for (i = 0; i < MainImageForm->Data3D->GridData[T3d.n].cy; i++) { for (j = 0; j < MainImageForm->Data3D->GridData[T3d.n].cx; j++) { TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(j, i); if (d->s) { if (d->x < T3d.func.wsx) T3d.func.wsx = d->x; if (d->x > ex) ex = d->x; if (d->y < T3d.func.wsy) T3d.func.wsy = d->y; if (d->y > ey) ey = d->y; } } } tWindow.size.x = ex - T3d.func.wsx; tWindow.size.y = ey - T3d.func.wsy; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::BaseClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; int i; ExitGFunction(); if (T3d.type != T3D_BASE) { T3d.type = T3D_BASE; InitializeButton(); } T3d.base.mod.sw = 0; T3d.base.draw = 0; if (sbGBVertical == s) { T3d.base.item = T3D_B_V; for (int sx = 0; sx < 2; sx++) { for (int sy = 0; sy < 5; sy++) T3d.base.vhd[sx].d[sy].cnt = 0; T3d.base.vhd[sx].cnt = 1; } T3d.base.finish = 0; } else if (sbGBHorizontal == s) { T3d.base.item = T3D_B_H; } else if (sbGBModify == s) { if (T3d.base.finish == 1) t3d_base_form(); T3d.base.item = T3D_B_MOD; } else if (sbGBFinish == s) { t3d_base_form(); T3d.base.mod.sw = 0; T3d.base.item = T3D_B_MOD; //for (int sx = 0; sx < 2; sx++) { // for (int sy = 0; sy < 5; sy++) T3d.base.vhd[sx].d[sy].cnt = 0; // T3d.base.vhd[sx].cnt = 1; //} //T3d.base.finish = 0; } /* else if (sbGBNextGrid == s) { sbGridUndo->Enabled = false; for (int sx = 0; sx < 2; sx++) { for (int sy = 0; sy < 5; sy++) T3d.base.vhd[sx].d[sy].cnt = 0; T3d.base.vhd[sx].cnt = 1; } T3d.base.item = T3D_B_V; T3d.base.finish = 0; } */ else if (sbGBNextLine == s) { if (T3d.base.vhd[T3d.base.item].cnt < 5) T3d.base.vhd[T3d.base.item].cnt++; } else if (sbGBDeleteP == s) { i = T3d.base.vhd[T3d.base.item].cnt - 1; _3d_base_pt *a = &T3d.base.vhd[T3d.base.item].d[i]; if (a->cnt) a->cnt--; else if (i > 0) { T3d.base.vhd[T3d.base.item].cnt--; T3d.base.vhd[T3d.base.item].d[i - 1].cnt--; } T3d.base.draw = 1; } else if (sbGBDeleteL == s) { _3d_base_pt *a = &T3d.base.vhd[T3d.base.item].d[T3d.base.vhd[T3d.base.item].cnt - 1]; if (a->cnt) a->cnt = 0; else { if (T3d.base.vhd[T3d.base.item].cnt > 1) { T3d.base.vhd[T3d.base.item].cnt--; a = &T3d.base.vhd[T3d.base.item].d[T3d.base.vhd[T3d.base.item].cnt - 1]; if (a->cnt) a->cnt = 0; } } if (T3d.base.vhd[T3d.base.item].cnt > 1) T3d.base.vhd[T3d.base.item].cnt--; } MainImageForm->iMainImage->Invalidate(); t3d_base_view_menu(); if (T3d.base.item == T3D_OFF) { END_LOG; return; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGModifyClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton *)Sender; int i, sx, sy, ex, ey; ExitGFunction(); if (T3d.type != T3D_MODI) { T3d.type = T3D_MODI; InitializeButton(); } if (sbGMSet == s) { T3d.mod = T3D_MBLK; } else if (sbGMMove == s) { T3d.mod = T3D_MMOVE; } else if (sbGMFix == s) { T3d.mod = T3D_MFIX; } else if (sbGMBlockFix == s) { T3d.mod = T3D_MBLOCKFIX; } else if (sbGMDeletePoint == s) { T3d.mod = T3D_MDELP; } else if (sbGMDeleteBlock == s) { T3d.mod = T3D_MDELB; delete_3d_block(); T3d.mod = 0; } else if (sbGMLast == s) { T3d.mod = T3D_MLST_RSTR; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } if (T3rstr.GridBlock.Exist) { clear_block(); GridBlock = T3rstr.GridBlock; } ex = GridBlock.Start.x + GridBlock.Length.x; ey = GridBlock.Start.y + GridBlock.Length.y; for (i = 0; i < T3rstr.cnt; i++) { sx = T3rstr.pt[i].x; sy = T3rstr.pt[i].y; TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(sx, sy); d->s = sx >= GridBlock.Start.x && sx < ex && sy >= GridBlock.Start.y && sy < ey ? _blk : 1; } T3rstr.cnt = 0; T3rstr.GridBlock.Exist = false; T3d.mod = 0; } else if (sbGMAll == s) { T3d.mod = T3D_MALL_RSTR; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } ex = GridBlock.Start.x + GridBlock.Length.x; ey = GridBlock.Start.y + GridBlock.Length.y; for (sy = 0; sy < MainImageForm->Data3D->GridData[T3d.n].cy; sy++) { for (sx = 0; sx < MainImageForm->Data3D->GridData[T3d.n].cx; sx++) { TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(sx, sy); if (d->s == 0) { d->s = sx >= GridBlock.Start.x && sx < ex && sy >= GridBlock.Start.y && sy < ey ? _blk : 1; } } } T3rstr.cnt = 0; T3d.mod = 0; } t3d_modify_view_menu(); T3d.step = 0; T3d.col = T3d.row = 0; MainImageForm->iMainImage->Invalidate(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::EditKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; if (Key == VK_RETURN) { if (s->Value < 10) s->Value = 10;//gabriel: max: 100->200, range check if (s->Value > 200) s->Value = 200; T3d.size.x = eGIMWidth->Value; T3d.size.y = eGIMHeight->Value; view_grid_data(); g_FocusControl->SetFocus(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::EditMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; s->SetFocus(); s->SelectAll(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ComboBoxChange(TObject *Sender) { BEGIN_LOG("::"); TRzComboBox *s = (TRzComboBox *)Sender; if (s->ItemIndex < 0) { END_LOG; return; } int i, sx, sy, ex; TData3D *dp = MainImageForm->Data3D; if (s->ItemIndex >= 0 && s->ItemIndex < 8) { if (cbGIMGroup == s) { T3d.fabric = s->ItemIndex; } else if (cbGICGroup == s) { /* for (i = 0, sy = -1; i < T3DF_CNT; i++) { for (sx = 0; sx < dp->fn[i].cnt; sx++) { if (T3d.n == dp->fn[i].sn[sx]) { sy = i; break; } } if (sy != s->ItemIndex) { if (sy >= 0) { // dp->fn¿¡¼­ grid¸¦ »èÁ¦ for (ex=sx+1; exfn[sy].cnt; ex++) { dp->fn[sy].sn[ex-1] = dp->fn[sy].sn[ex]; } dp->fn[sy].cnt--; // dp->fn¿¡ grid¸¦ Ãß°¡ sy = s->ItemIndex; if (dp->fn[sy].cnt>0) { if (dp->fn[sy].sn[dp->fn[sy].cnt-1]fn[sy].sn[dp->fn[sy].cnt] = T3d.n; } else { for (ex=dp->fn[sy].cnt-1; ex>=0; ex--) { if (dp->fn[sy].sn[ex]fn[sy].sn[ex+1] = T3d.n; break; } else { dp->fn[sy].sn[ ex+1] = dp->fn[sy].sn[ex]; } } if (ex<0) { dp->fn[sy].sn[0] = T3d.n; } } } else { dp->fn[sy].sn[0] = T3d.n; } dp->fn[sy].cnt++; t3d_grid_group_check(); break; } } */ for (i = 0; i < T3DF_CNT; i++) { for (sx = 0, sy = -1; sx < dp->fn[i].cnt; sx++) { if (T3d.n == dp->fn[i].sn[sx]) { sy = i; break; } } if (i == s->ItemIndex) { if (sy == -1) { // dp->fn¿¡ grid¸¦ Ãß°¡ sy = s->ItemIndex; if (dp->fn[sy].cnt>0) { if (dp->fn[sy].sn[dp->fn[sy].cnt-1]fn[sy].sn[dp->fn[sy].cnt] = T3d.n; } else { for (ex=dp->fn[sy].cnt-1; ex>=0; ex--) { if (dp->fn[sy].sn[ex]fn[sy].sn[ex+1] = T3d.n; break; } else { dp->fn[sy].sn[ ex+1] = dp->fn[sy].sn[ex]; } } if (ex<0) { dp->fn[sy].sn[0] = T3d.n; } } } else { dp->fn[sy].sn[0] = T3d.n; } dp->fn[sy].cnt++; } } else { if (sy >= 0) { // dp->fn¿¡¼­ grid¸¦ »èÁ¦ for (ex=sx+1; exfn[sy].cnt; ex++) { dp->fn[sy].sn[ex-1] = dp->fn[sy].sn[ex]; } //================================= for fit point by kjs dp->fn[sy].sn[dp->fn[sy].cnt-1] = -1; // to help find grid index in patternform //================================= dp->fn[sy].cnt--; } } } // Áß°£¿¡ ºñ¾îÀÖ´Â ºÎºÐÀÌ ¾øµµ·Ï Grid ¹øÈ£¸¦ ÀÚµ¿À¸·Î ¼ø¼­´ë·Î Shift½ÃÄÑÁÖ´Â ÇÔ¼öÀ̳ª, // µðÀÚÀ̳ʵéÀÌ ºÒÆíÇÏ´Ù°íÇÏ¿© ÁÖ¼®Ã³¸®ÇÏ¿´´Ù - by monkman (2008.08.04) //t3d_grid_group_check(); } } view_grid_data(); // combobox¿¡¼­ °è¼Ó Æ÷Ä¿½º¸¦ °¡Áö°í À־ GInfoPanelÀÇ visibleÀÌ false°¡ µÇ°í Fabric3DFormÀÌ ¶°ÀÖ´Â »óÅ¿¡¼­µµ // Index°¡ º¯°æµÇ±â ¶§¹®¿¡ Æ÷Ä¿½º¸¦ ÆÐ³Î·Î ¿Å°Ü³õÀ½. END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::CopyButtonClick(TObject *Sender) { BEGIN_LOG("::"); TRzMenuToolbarButton *s = (TRzMenuToolbarButton*)Sender; int i, j, nx, ny, *n; String size, msg; RECT rc; TData3D *dp = MainImageForm->Data3D; ExitCopyItem(); if (s == sbNormal) { if (!dp->bWorkArea) { dp->waStart.x = 0; dp->waStart.y = 0; dp->waSize.x = MainImageForm->iMainImage->uBitmap->Width; dp->waSize.y = MainImageForm->iMainImage->uBitmap->Height; } nx = MainImageForm->iMainImage->uBitmap->Width/dp->waSize.x; ny = MainImageForm->iMainImage->uBitmap->Height/dp->waSize.y; if (nx*ny>=seCount->Value+1) { CopyItem = 1; MainImageForm->iMainImage->uBitmap->RgnBitmap->RemoveRegion(); // convert by celberus if (t3ds_make_copy_image()) { MainImageForm->Modify = true; } CopyItem = 0; } else { msg = IDS_MESSAGE_NEEDSPACE; double d = sqrt(seCount->Value+1); nx = floor(d); if (d-nx>0.5) { nx++; ny = nx; } else if (d-nx>0.0) { ny = nx; nx++; } else ny = nx; switch (MainImageForm->CurrentUnit) { case uDot: size = Format("%d x %d ", OPENARRAY(TVarRec, ((int)(nx*dp->waSize.x), (int)(ny*dp->waSize.y)))); break; case uInch: size = Format("%f x %f ", OPENARRAY(TVarRec, ((double)nx*dp->waSize.x/MainImageForm->CanvasInfor.DotsPerInch, (double)ny*dp->waSize.y/MainImageForm->CanvasInfor.DotsPerInch))); break; case uCm: size = Format("%f x %f ", OPENARRAY(TVarRec, (2.54*nx*dp->waSize.x/MainImageForm->CanvasInfor.DotsPerInch, 2.54*ny*dp->waSize.y/MainImageForm->CanvasInfor.DotsPerInch))); break; } MessageDlg(size + MainImageForm->UnitName() + " " + msg, mtInformation, TMsgDlgButtons()<iMainImage->Repaint(); } else if (s == sbAuto) { if (!dp->bWorkArea) { dp->waStart.x = 0; dp->waStart.y = 0; dp->waSize.x = MainImageForm->iMainImage->uBitmap->Width; dp->waSize.y = MainImageForm->iMainImage->uBitmap->Height; } CopyItem = 2; MainImageForm->iMainImage->uBitmap->RgnBitmap->RemoveRegion(); // convert by celberus if (t3ds_make_copy_image()) { MainImageForm->Modify = true; } CopyItem = 0; } else if (s == sbSelection) { InitCopyItem(3); } else if (s == sbDeleteAll) { dp->RemoveCopy(); // t_3d_simulation(); // Point¸ÂÃß±â ÀüÀÇ Code.. to fit point by kjs if (Fabric3DForm->cbPoint->Checked && (!Fabric3DForm->bSC_Simulation)) { t_3d_simulation(true); // Point ¸ÂÃß±â·Î Simulation ÇÑ ÈÄ¿¡ ¸ðµÎ Áö¿ì´Â °æ¿ì¿¡ } else { // ´Ù½Ã SimulationÇϹǷΠÀ̸¦ ¸ÂÃçÁà¾ß ÇÔ... t_3d_simulation(); // ±âº» ÀûÀ¸·Î false°¡ ÀÎÀÚ·Î µé¾î°¨ } if (dp->bWorkArea) { rc.left = dp->waStart.x; rc.top = dp->waStart.y; rc.right = dp->waStart.x+dp->waSize.x; rc.bottom = dp->waStart.y+dp->waSize.y; MainImageForm->iMainImage->uBitmap->RgnBitmap->PutRegion(rc); // convert by celberus } ::RepaintImage(); sbDeleteAll->Down = false; MainImageForm->Modify = true; MainImageForm->iMainImage->Repaint(); Fabric3DForm->sbStandard->Down = true; Fabric3DForm->sbSelect->Enabled = false; } else if (s == sbDeleteSelection) { InitCopyItem(5); } else if (s == sbCopyWindow) { InitCopyItem(6); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::seCount_Change(TObject *Sender) { BEGIN_LOG("::"); if (seCount->Text.Length() > 0) { if (seCount->Value > 15) seCount->Value = 15; if (seCount->Value < 1) seCount->Value = 1; } END_LOG; } //--------------------------------------------------------------------------- // Private Method //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::InitItem(int i) { BEGIN_LOG("::"); HANDLE hFile; int j; TPException ec; Item = i; sbMFabric_Down = false; switch (Item) { case 0: if (MainImageForm->Data3D->CopyCount>0) { if ((hFile = CreateFile((DirectoryTemp+"\\3d.tmp").c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == NULL) { ec = EC_FILE_NOT_CREATE; SAVE_EXCEPTION(ec); goto fail; } MainImageForm->iMainImage->uBitmap->SaveToTexpiaFile(hFile, cmZLib); CloseHandle(hFile); MainImageForm->iMainImage->uBitmap->Copy(MainImageForm->Data3D->Source, SRCCOPY); MainImageForm->iMainImage->uBitmap->ConvertColorSpace(csRGB); ::RepaintImage(); } ptPickupOld.s = ptPickupNew.s = ptBlock.s = 0; for (j=0; j<15; j++) { if (!GridColorSet[j].hPen) //Æ÷ÀÎÆ® ¸ÂÃß±â À§Çؼ­ »ý¼ºÇسõ¾ÒÀ» ¼öµµ ÀÖ´Ù.... GridColorSet[j].hPen = CreatePen(PS_SOLID, 1, GridColorSet[j].Color); } MainImageForm->iMainImage->OnPaintZoom = PaintGrid; MainImageForm->iMainImage->Invalidate(); t_3d_menu_setting(); break; case 2: // ClientHeight = 53 + CopyPanel->Height; CopyPanel->Visible = true; sbNormal->Enabled = MainImageForm->Data3D->bWorkArea; sbCopyWindow->Enabled = MainImageForm->Data3D->CopyCount==0; ::RepaintImage(); break; case 3: // ClientHeight = 50; sbMFabric_Down = true; Fabric3DForm->Show(); ::RepaintImage(); break; } //Parent->Height = ParentHeight + ClientHeight; END_LOG; return; fail : EXCEPTION_MESSAGE_OK(ec); END_LOG; return; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ExitItem() { BEGIN_LOG("::"); HANDLE hFile; int j; switch (Item) { case 0: t_3d_menu_free(); if (MainImageForm->Data3D->CopyCount>0) { hFile = CreateFile((DirectoryTemp+"\\3d.tmp").c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); MainImageForm->iMainImage->uBitmap->LoadFromTexpiaFile(hFile, cmZLib); CloseHandle(hFile); DeleteFile(DirectoryTemp+"\\3d.tmp"); } // for (j=0; j<15; j++) DeleteObject(GridColorSet[j].hPen); for (j=0; j<15; j++) { if (GridColorSet[j].hPen) { DeleteObject(GridColorSet[j].hPen); GridColorSet[j].hPen = NULL; } } if (MainImageForm) { MainImageForm->iMainImage->OnPaintZoom = NULL; // MainImageForm->iMainImage->OnPaintRange = NULL; // if (MainImageForm->AutoRepeat) // MainImageForm->iMainImage->OnPaintRange = MainImageForm->DrawARepeatArea; } break; case 2: ExitCopyItem(); CopyPanel->Visible = false; break; case 3: if (Fabric3DForm) { Fabric3DForm->HidePatternForm(); Fabric3DForm->Hide(); } if (MainImageForm->iMainImage->OnPaintZoom) { // Á¤¸» ÇØ¾ß Çϴ°¡??? MainImageForm->iMainImage->OnPaintZoom = NULL; MainImageForm->iMainImage->Invalidate(); } break; } Item = -1; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::InitCopyItem(int item) { BEGIN_LOG("::"); CopyItem = item; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ExitCopyItem() { BEGIN_LOG("::"); switch (CopyItem) { case 3: sbSelection->Down = false; break; case 5: sbDeleteSelection->Down = false; break; case 6: sbCopyWindow->Down = false; sbNormal->Enabled = MainImageForm->Data3D->bWorkArea; break; } CopyItem = 0; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::PaintGrid(TObject *Sender, HDC dc) { BEGIN_LOG("::"); TCoordi *d, d1, d2; int i, j, n, x, y; TData3D *dp = MainImageForm->Data3D; TGridData *gp; HPEN hOldPen = NULL; if (dp==NULL) { END_LOG; return; } hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[6]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif for (n = 0; n < dp->GridCount; n++) { gp = &dp->GridData[n]; if (n != T3d.n) { for (j=1; jcx; j++) { draw_3d_line(dc, gp->d->pointer(j-1, 0), gp->d->pointer(j, 0)); draw_3d_line(dc, gp->d->pointer(j-1, gp->cy-1), gp->d->pointer(j, gp->cy-1)); } for (i=1; icy; i++) { draw_3d_line(dc, gp->d->pointer(0, i-1), gp->d->pointer(0, i)); draw_3d_line(dc, gp->d->pointer(gp->cx-1, i-1), gp->d->pointer(gp->cx-1, i)); } } } SelectObject(dc, hOldPen); if (dp->GridCount) { gp = &dp->GridData[T3d.n]; hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[0]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif for (i = 0; i < gp->cy; i++) { for (j = 0; j < gp->cx; j++) { if (j && gp->d->pointer(j - 1, i)->s && gp->d->pointer(j, i)->s) { draw_3d_line(dc, gp->d->pointer(j - 1, i), gp->d->pointer(j, i)); } if (i && gp->d->pointer(j, i - 1)->s && gp->d->pointer(j, i)->s) { draw_3d_line(dc, gp->d->pointer(j, i - 1), gp->d->pointer(j, i)); } } } SelectObject(dc, hOldPen); for (i = 0; i < gp->cy; i++) { for (j = 0; j < gp->cx; j++) { d = gp->d->pointer(j, i); if (d->s) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[d->s]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, d); SelectObject(dc, hOldPen); } } } hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[_pick]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif if (T3d.col != 0 && T3d.row != 0) { d = gp->d->pointer(T3d.col, T3d.row); draw_3d_point(dc, d); } SelectObject(dc, hOldPen); } if (T3d.type==T3D_BASE) { for (n = 0; n < 2; n++) { int blc = (n == 0 ? 6 : 9); int bpc = (n == 0 ? 8 : 0); for (i = 0; i < T3d.base.vhd[n].cnt; i++) { undoPt[n].cnt = T3d.base.vhd[n].cnt; _3d_base_pt *a = &T3d.base.vhd[n].d[i]; int lc = (T3d.base.mod.sw == 1 && T3d.base.mod.vh == n && T3d.base.mod.d == i ? 4 : blc); if (a->cnt) { undoPt[n].d[i].cnt = a->cnt; for (j = 0; j < a->cnt; j++) { d1.x = a->p[j].x; d1.y = a->p[j].y; undoPt[n].d[i].p[j].x = d1.x; undoPt[n].d[i].p[j].y = d1.y; if (j < a->cnt - 1) { d2.x = a->p[j + 1].x; d2.y = a->p[j + 1].y; hOldPen = (HPEN)SelectObject(dc, GridColorSet[lc].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_line(dc, &d1, &d2); SelectObject(dc, hOldPen); } if (lc == clGreen) { if (T3d.base.mod.p == j) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[10].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &d1); SelectObject(dc, hOldPen); } else { hOldPen = (HPEN)SelectObject(dc, GridColorSet[4].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &d1); SelectObject(dc, hOldPen); } } else { hOldPen = (HPEN)SelectObject(dc, GridColorSet[bpc].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &d1); SelectObject(dc, hOldPen); } } } } } if (T3d.base.item==T3D_B_V || T3d.base.item==T3D_B_H) { _3d_base_pt *a = &T3d.base.vhd[T3d.base.item].d[T3d.base.vhd[T3d.base.item].cnt - 1]; if (a && a->cnt>0) { d1.x = a->p[a->cnt - 1].x; d2.x = Lsx; d1.y = a->p[a->cnt - 1].y; d2.y = Lsy; int blc = (T3d.base.item == T3D_B_V ? 6 : 9); int bpc = (T3d.base.item == T3D_B_V ? 8 : 0); hOldPen = (HPEN)SelectObject(dc, GridColorSet[blc].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_line(dc, &d1, &d2); SelectObject(dc, hOldPen); hOldPen = (HPEN)SelectObject(dc, GridColorSet[bpc].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &d2); SelectObject(dc, hOldPen); } } } else if (T3d.type==T3D_MODI) { //================================= For 3D Error Check if (GridBlock.Exist) { //================================= for (int i = GridBlock.Start.y; i < GridBlock.Start.y + GridBlock.Length.y; i++) { for (int j = GridBlock.Start.x; j < GridBlock.Start.x + GridBlock.Length.x; j++) { d = dp->GridData[T3d.n].d->pointer(j, i); if (d->s) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[d->s]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, d); SelectObject(dc, hOldPen); } } } } } // if (Fabric3DForm) { if (sbMFabric_Down) { if (Fabric3DForm->Visible && dp->FitPoint) Show_s_point(dc); // to fit point kjs Æ÷ÀÎÆ® ¸ÂÃß±â À§ÇØ ¼±ÅÃÇÑ Á¡À» ±×·ÁÁÜ. } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::PaintGridPoint(TObject *Sender, HDC dc) { BEGIN_LOG("::"); TCoordi *d, d1, d2; int i, j, n, x, y, sx, sy, ex, ey; TData3D *dp = MainImageForm->Data3D; HPEN hOldPen; if (dp==NULL) { END_LOG; return; } if (ptPickupOld.s>0) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[ptPickupOld.s]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &ptPickupOld); SelectObject(dc, hOldPen); } if (ptPickupNew.s>0) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[_pick]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, &ptPickupNew); SelectObject(dc, hOldPen); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::PaintGridBlock(TObject *Sender, HDC dc) { BEGIN_LOG("::"); TCoordi *d, d1, d2; int i, j, n, x, y, sx, sy, ex, ey; TData3D *dp = MainImageForm->Data3D; TGridData *gp; HPEN hOldPen; if (dp==NULL) { END_LOG; return; } if (ptPickupOld.s>0) { if (ptBlock.x>ptPickupOld.x) { sx = ptPickupOld.x; ex = ptBlock.x; } else { sx = ptBlock.x; ex = ptPickupOld.x; } if (ptBlock.y>ptPickupOld.y) { sy = ptPickupOld.y; ey = ptBlock.y; } else { sy = ptBlock.y; ey = ptPickupOld.y; } for (i = sy; i <= ey; i++) { for (j = sx; j <= ex; j++) { d = dp->GridData[T3d.n].d->pointer(j, i); hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[d->s]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, d); SelectObject(dc, hOldPen); } } } if (ptPickupNew.s>0) { if (ptBlock.x>ptPickupNew.x) { sx = ptPickupNew.x; ex = ptBlock.x; } else { sx = ptBlock.x; ex = ptPickupNew.x; } if (ptBlock.y>ptPickupNew.y) { sy = ptPickupNew.y; ey = ptBlock.y; } else { sy = ptBlock.y; ey = ptPickupNew.y; } for (i = sy; i <= ey; i++) { for (j = sx; j <= ex; j++) { d = dp->GridData[T3d.n].d->pointer(j, i); if (d->s) { hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[4]].hPen); #ifdef TPDEBUG if (hOldPen==NULL) SHOWDEBUG; #endif draw_3d_point(dc, d); SelectObject(dc, hOldPen); } } } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_base_choice(int status) { BEGIN_LOG("::"); int i, j, n, sx, sy, ex, ey; if (T3d.base.item == T3D_B_MOD) { if (T3d.base.mod.sw == 0) { if (status == 0) { for (n = 0; n < 2; n++) { // T3D_B_V, T3D_B_H for (i = 0; i < T3d.base.vhd[n].cnt; i++) { _3d_base_pt a = T3d.base.vhd[n].d[i]; for (j = 0; j < a.cnt; j++) { sx = a.p[j].x - 5; sy = a.p[j].y - 5; ex = sx + 10; ey = sy + 10; if (sx <= Lsx && sy <= Lsy && ex >= Lsx && ey >= Lsy) { T3d.base.mod.sw = 1; T3d.base.mod.vh = n; T3d.base.mod.d = i; T3d.base.mod.p = j; T3d.base.mod.pos = a.p[j]; t3d_base_view_menu(); MainImageForm->iMainImage->Invalidate(); END_LOG; return; } } } } } } else { if (status == 0) { T3d.base.mod.sw = 0; t3d_base_view_menu(); } else if (status == 1) { t3d_base_modify(1); } } } else { i = T3d.base.vhd[T3d.base.item].cnt - 1; if (status == 0) { _3d_base_pt *a = &T3d.base.vhd[T3d.base.item].d[i]; if (a->cnt < T3D_BASE_PT) { a->p[a->cnt].x = Lsx; a->p[a->cnt].y = Lsy; a->cnt++; T3d.base.draw = 1; } t3d_base_view_menu(); } else if (status == 1) { t3d_base_line(); } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_modify_choice(int status) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; if (T3d.mod == T3D_MBLK) block_3d_point(status); else if (T3d.mod == T3D_MMOVE) move_3d_point(status); else if (T3d.mod == T3D_MFIX) fix_3d_point(status); else if (T3d.mod == T3D_MBLOCKFIX) block_3d_point(status); else if (T3d.mod == T3D_MDELP) { if (delete_3d_point(status) == 1) { MainImageForm->iMainImage->Invalidate(); t3d_modify_view_menu(); } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_function_choice() { BEGIN_LOG("::"); if (T3d.func.item == T3D_FCPY_N || T3d.func.item == T3D_FCPY_M) { if (define_3d_box()==0) t3d_grid_movecopy(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::draw_3d_point(HDC dc, TCoordi *d) { BEGIN_LOG("::"); int x, y; x = MainImageForm->iMainImage->BitmapToCanvasX(d->x); y = MainImageForm->iMainImage->BitmapToCanvasY(d->y); Rectangle(dc, x - 1, y - 1, x + 2, y + 2); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::draw_3d_line(HDC dc, TCoordi *s, TCoordi *e) { BEGIN_LOG("::"); int sx, sy, ex, ey; sx = MainImageForm->iMainImage->BitmapToCanvasX(s->x); sy = MainImageForm->iMainImage->BitmapToCanvasY(s->y); ex = MainImageForm->iMainImage->BitmapToCanvasX(e->x); ey = MainImageForm->iMainImage->BitmapToCanvasY(e->y); MoveToEx(dc, sx, sy, NULL); LineTo(dc, ex, ey); END_LOG; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::pickup_grid_point(int status, int &x, int &y) { BEGIN_LOG("::"); int sx, sy, ex, ey; TCoordi *d; for (y = 0; y < MainImageForm->Data3D->GridData[T3d.n].cy; y++) { for (x = 0; x < MainImageForm->Data3D->GridData[T3d.n].cx; x++) { d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x, y); if (d->s) { sx = d->x - 5; ex = sx + 10; sy = d->y - 5; ey = sy + 10; if (Lsx >= sx && Lsx <= ex && Lsy >= sy && Lsy <= ey) { if (status == 0) { if (ptPickupNew.s>0) { ptPickupOld = ptPickupNew; ptPickupNew.s = 0; MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); } END_LOG; return 1; } else if (status == 1) { if (ptPickupNew.s>0) { if (ptPickupNew.x!=d->x || ptPickupNew.y!=d->y) { ptPickupOld = ptPickupNew; ptPickupNew = *d; MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); } } else { ptPickupOld = ptPickupNew; ptPickupNew = *d; MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); } END_LOG; return 0; } } } } } if (ptPickupNew.s>0) { ptPickupOld = ptPickupNew; ptPickupNew.s = 0; MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); } END_LOG; return 0; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::define_3d_box(void) { BEGIN_LOG("::"); int i, j, k, d = 0; RECT r; if (T3d.step == 0) { tWindow.s.x = Lsx; tWindow.s.y = Lsy; Temp.left = Lsx; Temp.top = Lsy; Temp.bottom = Temp.top; Temp.right = Temp.left; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; T3d.step = 1; } else { i = Lsx; j = Lsy; if (tWindow.s.x > i) { k = i; i = tWindow.s.x; tWindow.s.x = k; d = 1; } if (tWindow.s.y > j) { k = j; j = tWindow.s.y; tWindow.s.y = k; d += 2; } tWindow.size.x = i - tWindow.s.x + 1; tWindow.size.y = j - tWindow.s.y + 1; Temp.right = Lsx; Temp.bottom = Lsy; MainImageForm->DrawRectangleLocate(Temp); if (Temp.left > Temp.right) { r.left = Temp.right; r.right = Temp.left; } else { r.left = Temp.left; r.right = Temp.right; } if (Temp.top > Temp.bottom) { r.top = Temp.bottom; r.bottom = Temp.top; } else { r.top = Temp.top; r.bottom = Temp.bottom; } IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo T3d.step = 0; END_LOG; return d; } END_LOG; return -1; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_grid_group_check(void) { BEGIN_LOG("::"); int i, j, k; for (i = j = 0; i < T3DF_CNT; i++) { if (MainImageForm->Data3D->fn[i].cnt) { if (i != j) { MainImageForm->Data3D->fn[j].cnt = MainImageForm->Data3D->fn[i].cnt; memcpy(MainImageForm->Data3D->fn[j].sn, MainImageForm->Data3D->fn[i].sn, MainImageForm->Data3D->fn[j].cnt*sizeof(int)); MainImageForm->Data3D->fn[i].cnt = 0; } j++; } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::grid_direct(int n, int sw) { BEGIN_LOG("::"); int x, y; TCoordi *a, *b, tmp; TData3D *dp = MainImageForm->Data3D; if (sw & 0x01) { for (y = 0; y < dp->GridData[n].cy; y++) { for (x = 0; x < dp->GridData[n].cx / 2; x++) { a = dp->GridData[n].d->pointer(x, y); b = dp->GridData[n].d->pointer(dp->GridData[n].cx - x - 1, y); Swap(*a, *b); } } } if (sw & 0x02) { for (x = 0; x < dp->GridData[n].cx; x++) { for (y = 0; y < dp->GridData[n].cy / 2; y++) { a = dp->GridData[n].d->pointer(x, y); b = dp->GridData[n].d->pointer(x, dp->GridData[n].cy - y - 1); Swap(*a, *b); } } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::clear_block(void) { BEGIN_LOG("::"); TData3D *dp = MainImageForm->Data3D; if (T3d.nGridCount) { for (int i = 0; i < dp->GridData[T3d.n].cy; i++) { for (int j = 0; j < dp->GridData[T3d.n].cx; j++) { if (dp->GridData[T3d.n].d->pointer(j,i)->s == _blk) dp->GridData[T3d.n].d->pointer(j,i)->s = 1; } } } GridBlock.Exist = false; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Set_Moved_Grid(void) { BEGIN_LOG("::"); int i, j, tx, ty; TCoordi temp; TData3D *dp = MainImageForm->Data3D; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } dp->GridData[dp->GridCount].lx = dp->GridData[T3d.n].lx; dp->GridData[dp->GridCount].ly = dp->GridData[T3d.n].ly; dp->GridData[dp->GridCount].cx = dp->GridData[T3d.n].cx; dp->GridData[dp->GridCount].cy = dp->GridData[T3d.n].cy; #ifdef TPDEBUG if (dp->GridData[dp->GridCount].d) SHOWDEBUG; if ((dp->GridData[dp->GridCount].d = new TPMemoryArea(dp->GridData[dp->GridCount].cx, dp->GridData[dp->GridCount].cy))==NULL) SHOWDEBUG; if (dp->GridData[dp->GridCount].d->lock()==NULL) SHOWDEBUG; #else dp->GridData[dp->GridCount].d = new TPMemoryArea(dp->GridData[dp->GridCount].cx, dp->GridData[dp->GridCount].cy); dp->GridData[dp->GridCount].d->lock(); #endif for (i=0; iGridData[dp->GridCount].cx; i++) { for (j=0; jGridData[dp->GridCount].cy; j++) { dp->GridData[dp->GridCount].d->pointer(i, j)->s = dp->GridData[T3d.n].d->pointer(i, j)->s; temp = Trans_Rotate_Move(dp->GridData[T3d.n].d->pointer(i,j), set.x, set.y); dp->GridData[dp->GridCount].d->pointer(i, j)->x = temp.x; dp->GridData[dp->GridCount].d->pointer(i, j)->y = temp.y; } } clear_block(); dp->fn[T3d.fabric].sn[dp->fn[T3d.fabric].cnt] = dp->GridCount; if (rbCopy->Checked) T3d.n = dp->GridCount; dp->GridCount++; dp->fn[T3d.fabric].cnt++; /* dp->fn[T3d.fabric].sn[dp->fn[T3d.fabric].cnt] = dp->GridCount; dp->fn[T3d.fabric].cnt++; T3d.func.item = T3D_OFF; */ MainImageForm->iMainImage->Invalidate(); t3d_function_view_menu(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::create_3d_grid(void) { BEGIN_LOG("::"); int i, j, k, d; TData3D *dp = MainImageForm->Data3D; TPException ec = EC_NONE; if (dp->GridCount < T3D_MAX_GRID && (d = define_3d_box()) != -1) { i = (tWindow.size.x - 1) / T3d.size.x + 1; if (i < 2) i = 2; j = (tWindow.size.y - 1) / T3d.size.y + 1; if (j < 2) j = 2; dp->GridData[dp->GridCount].lx = (tWindow.size.x-1) / i + 1; dp->GridData[dp->GridCount].ly = (tWindow.size.y-1) / j + 1; if (tWindow.s.x + (i - 1) * dp->GridData[dp->GridCount].lx >= MainImageForm->iMainImage->uBitmap->Width) i--; if (tWindow.s.y + (j - 1) * dp->GridData[dp->GridCount].ly >= MainImageForm->iMainImage->uBitmap->Height) j--; if (i > 1 && j > 1 && dp->GridData[dp->GridCount].lx >= 5 && dp->GridData[dp->GridCount].ly >= 5) { if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } dp->fn[T3d.fabric].sn[dp->fn[T3d.fabric].cnt] = dp->GridCount; dp->fn[T3d.fabric].cnt++; dp->GridData[dp->GridCount].cx = i; dp->GridData[dp->GridCount].cy = j; #ifdef TPDEBUG if (dp->GridData[dp->GridCount].d) SHOWDEBUG; #endif if ((dp->GridData[dp->GridCount].d = new TPMemoryArea(i, j))==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (dp->GridData[dp->GridCount].d->lock()==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } for (i = 0; i < dp->GridData[dp->GridCount].cy; i++) { k = tWindow.s.y + i * dp->GridData[dp->GridCount].ly; for (j = 0; j < dp->GridData[dp->GridCount].cx; j++) { dp->GridData[dp->GridCount].d->pointer(j, i)->s = 1; dp->GridData[dp->GridCount].d->pointer(j, i)->x = tWindow.s.x + j * dp->GridData[dp->GridCount].lx; dp->GridData[dp->GridCount].d->pointer(j, i)->y = k; } } clear_block(); T3d.n = dp->GridCount; dp->GridCount++; grid_direct(T3d.n, d); } else { dp->GridData[dp->GridCount].lx = dp->GridData[dp->GridCount].ly = 0; } t_3d_view_menu(); MainImageForm->iMainImage->Invalidate(); } END_LOG; return; fail: doDestroy(dp->GridData[dp->GridCount].d) EXCEPTION_MESSAGE_OK(ec); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::mpb(TPMemoryArea *md, int sx, int sy, int ex, int ey, int n) { BEGIN_LOG("::"); if (sy == ey) { TCoordi *d = md->pointer(n, sy); d->x = (md->pointer(sx, sy)->x*(ex - n) + md->pointer(ex, sy)->x*(n - sx)) / (ex - sx); d->y = (md->pointer(sx, sy)->y*(ex - n) + md->pointer(ex, sy)->y*(n - sx)) / (ex - sx); } else { TCoordi *d = md->pointer(sx, n); d->x = (md->pointer(sx, sy)->x*(ey - n) + md->pointer(sx, ey)->x*(n - sy)) / (ey - sy); d->y = (md->pointer(sx, sy)->y*(ey - n) + md->pointer(sx, ey)->y*(n - sy)) / (ey - sy); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::axis_block(TPMemoryArea *d, int a, int b, int p, int pole) { BEGIN_LOG("::"); int i, start, end; if (pole == 0) { start = end = a; if (a > b) { for (i = a - 1; i >= b; i--) { start = i; if (d->pointer(i, p)->s != _blk) break; } } else { for (i = a + 1; i <= b; i++) { end = i; if (d->pointer(i, p)->s != _blk) break; } } for (i = start + 1; i < end; i++) mpb(d, start, p, end, p, i); } else { start = end = a; if (a > b) { for (i = a - 1; i >= b; i--) { start = i; if (d->pointer(p, i)->s != _blk) break; } } else { for (i = a + 1; i <= b; i++) { end = i; if (d->pointer(p, i)->s != _blk) break; } } for (i = start; i < end; i++) mpb(d, p, start, p, end, i); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::move_3d_block(void) { BEGIN_LOG("::"); int i, ex, ey; TPMemoryArea *d = MainImageForm->Data3D->GridData[T3d.n].d; ex = GridBlock.Start.x + GridBlock.Length.x - 1; ey = GridBlock.Start.y + GridBlock.Length.y - 1; axis_block(d, T3d.col, GridBlock.Start.x, T3d.row, 0); axis_block(d, T3d.col, ex, T3d.row, 0); axis_block(d, T3d.row, GridBlock.Start.y, T3d.col, 1); axis_block(d, T3d.row, ey, T3d.col, 1); for (i = T3d.row - 1; i > GridBlock.Start.y; i--) { if (d->pointer(T3d.col, i)->s == _blk) { axis_block(d, T3d.col, GridBlock.Start.x, i, 0); axis_block(d, T3d.col, ex, i, 0); } else break; } for (i = T3d.row + 1; i < ey; i++) { if (d->pointer(T3d.col, i)->s == _blk) { axis_block(d, T3d.col, GridBlock.Start.x, i, 0); axis_block(d, T3d.col, ex, i, 0); } else break; } for (i = T3d.col - 1; i > GridBlock.Start.x; i--) { if (d->pointer(i, T3d.row)->s == _blk) { axis_block(d, T3d.row, GridBlock.Start.y, i, 1); axis_block(d, T3d.row, ey, i, 1); } else break; } for (i = T3d.col + 1; i < ex; i++) { if (d->pointer(i, T3d.row)->s == _blk) { axis_block(d, T3d.row, GridBlock.Start.y, i, 1); axis_block(d, T3d.row, ey, i, 1); } else break; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::move_grid_image(int sw) { BEGIN_LOG("::"); TCoordi *d = 0; int i, j, sx, sy, ex, ey; sx = MainImageForm->iMainImage->uBitmap->Width; sy = MainImageForm->iMainImage->uBitmap->Height; ex = ey = 0; if (T3d.col >= GridBlock.Start.x && T3d.col < GridBlock.Start.x + GridBlock.Length.x && T3d.row >= GridBlock.Start.y && T3d.row < GridBlock.Start.y + GridBlock.Length.y) { for (i = GridBlock.Start.y - 1; i <= GridBlock.Start.y + GridBlock.Length.y; i++) for (j = GridBlock.Start.x - 1; j <= GridBlock.Start.x + GridBlock.Length.x; j++) MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, j, i); } else { MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col, T3d.row); MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col - 1, T3d.row); MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col + 1, T3d.row); MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col, T3d.row - 1); MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col, T3d.row + 1); } if (sw == 1) { d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(T3d.col, T3d.row); d->x = Lsx; d->y = Lsy; if (T3d.col >= GridBlock.Start.x && T3d.col < GridBlock.Start.x + GridBlock.Length.x && T3d.row >= GridBlock.Start.y && T3d.row < GridBlock.Start.y + GridBlock.Length.y) move_3d_block(); MainImageForm->Data3D->GridData[T3d.n].se_in(d, sx, sy, ex, ey, T3d.col, T3d.row); } ex++; ey++; if (sw == 1) { MainImageForm->iMainImage->Repaint(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::move_3d_point(int status) { BEGIN_LOG("::"); TCoordi *d = 0; int i, j, x, y; TGridData *gp = &MainImageForm->Data3D->GridData[T3d.n]; if (T3d.step == 0) { if (pickup_grid_point(status, x, y) == 1) { T3d.step = 1; T3d.col = x; T3d.row = y; } } else { if (status == 0) { T3d.step = 0; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } d = gp->d->pointer(T3d.col, T3d.row); if (d->s) { d->x = Lsx; d->y = Lsy; } if (T3d.col >= GridBlock.Start.x && T3d.col < GridBlock.Start.x + GridBlock.Length.x && T3d.row >= GridBlock.Start.y && T3d.row < GridBlock.Start.y + GridBlock.Length.y) { d->s = _fix; move_3d_block(); } T3d.col = T3d.row = 0; } else if (status == 1) { move_grid_image(1); } } END_LOG; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::delete_3d_point(int status) { BEGIN_LOG("::"); int i, j, k, x, y; TGridData *gp = &MainImageForm->Data3D->GridData[T3d.n]; if (pickup_grid_point(status, x, y) == 1) { if (x == 0 || gp->d->pointer(x - 1, y)->s == 0 || x == gp->cx - 1 || gp->d->pointer(x + 1, y)->s == 0 || y == 0 || gp->d->pointer(x, y - 1)->s == 0 || y == gp->cy - 1 || gp->d->pointer(x, y + 1)->s == 0) { if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } gp->d->pointer(x, y)->s = 0; T3rstr.cnt = 0; T3rstr.GridBlock.Exist = false; T3rstr.Add(x, y); for (i = 0; i < gp->cy; i++) { for (j = 0; j < gp->cx; j++) { if (gp->d->pointer(j, i)->s) { k = 0; if (i > 0 && gp->d->pointer(j, i - 1)->s) k++; if (i < gp->cy - 1 && gp->d->pointer(j, i + 1)->s) k++; if (j > 0 && gp->d->pointer(j - 1, i)->s) k++; if (j < gp->cx - 1 && gp->d->pointer(j + 1, i)->s) k++; if (k < 2) { gp->d->pointer(j, i)->s = 0; T3rstr.Add(j, i); } } } } for (i = gp->cy - 1; i >= 0; i--) { for (j = gp->cx - 1; j >= 0; j--) { if (gp->d->pointer(j, i)->s) { k = 0; if (i > 0 && gp->d->pointer(j, i - 1)->s) k++; if (i < gp->cy - 1 && gp->d->pointer(j, i + 1)->s) k++; if (j > 0 && gp->d->pointer(j - 1, i)->s) k++; if (j < gp->cx - 1 && gp->d->pointer(j + 1, i)->s) k++; if (k < 2) { gp->d->pointer(j, i)->s = 0; T3rstr.Add(j, i); } } } } END_LOG; return 1; } } END_LOG; return 0; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::delete_3d_block(void) { BEGIN_LOG("::"); int i, j, k; TGridData *gp = &MainImageForm->Data3D->GridData[T3d.n]; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } T3rstr.cnt = 0; T3rstr.GridBlock = GridBlock; for (i = GridBlock.Start.y; i < GridBlock.Start.y+GridBlock.Length.y; i++) { for (j = GridBlock.Start.x; j < GridBlock.Start.x+GridBlock.Length.x; j++) { TCoordi *md = gp->d->pointer(j, i); if (md->s == _blk) { md->s = 0; T3rstr.Add(j, i); } } } clear_block(); for (i = 0; i < gp->cy; i++) { for (j = 0; j < gp->cx; j++) { if (gp->d->pointer(j, i)->s) { k = 0; if (i > 0 && gp->d->pointer(j, i - 1)->s) k++; if (i < gp->cy - 1 && gp->d->pointer(j, i + 1)->s) k++; if (j > 0 && gp->d->pointer(j - 1, i)->s) k++; if (j < gp->cx - 1 && gp->d->pointer(j + 1, i)->s) k++; if (k < 2) { gp->d->pointer(j, i)->s = 0; T3rstr.Add(j, i); } } } } for (i = gp->cy - 1; i >= 0; i--) { for (j = gp->cx - 1; j >= 0; j--) { if (gp->d->pointer(j, i)->s) { k = 0; if (i > 0 && gp->d->pointer(j, i - 1)->s) k++; if (i < gp->cy - 1 && gp->d->pointer(j, i + 1)->s) k++; if (j > 0 && gp->d->pointer(j - 1, i)->s) k++; if (j < gp->cx - 1 && gp->d->pointer(j + 1, i)->s) k++; if (k < 2) { gp->d->pointer(j, i)->s = 0; T3rstr.Add(j, i); } } } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::fix_3d_point(int status) { BEGIN_LOG("::"); int col, row, x, y; if (pickup_grid_point(status, x, y) == 1) { TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x, y); if (d->s != _fix) d->s = _fix; else { if (x>=GridBlock.Start.x && x=GridBlock.Start.y && ys = _blk; else d->s = 1; } ptPickupOld = *d; MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); ptPickupOld.s = 0; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::set_block(int sx, int sy, int ex, int ey) { BEGIN_LOG("::"); GridBlock.Exist = true; GridBlock.Start.x = ex < sx ? ex : sx; GridBlock.Start.y = ey < sy ? ey : sy; GridBlock.Length.x = abs(ex - sx) + 1; GridBlock.Length.y = abs(ey - sy) + 1; for (int i = GridBlock.Start.y; i < GridBlock.Start.y + GridBlock.Length.y; i++) { for (int j = GridBlock.Start.x; j < GridBlock.Start.x + GridBlock.Length.x; j++) { TCoordi *md = MainImageForm->Data3D->GridData[T3d.n].d->pointer(j, i); if (md->s == 1) md->s = _blk; } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::block_3d_point(int status) { BEGIN_LOG("::"); int i, j, x, y, sx, sy, ex, ey; if (T3d.step == 0) { if (pickup_grid_point(status, x, y) == 1) { ptBlock.s = 1; ptBlock.x = x; ptBlock.y = y; T3d.step = 1; } } else { for (i = 0; i < MainImageForm->Data3D->GridData[T3d.n].cy; i++) { for (j = 0; j < MainImageForm->Data3D->GridData[T3d.n].cx; j++) { TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(j, i); if (d->s) { sx = d->x - 5; ex = sx + 10; sy = d->y - 5; ey = sy + 10; if (Lsx >= sx && Lsx <= ex && Lsy >= sy && Lsy <= ey) { if (status == 0) { if (ptPickupNew.s>0) { ptPickupOld = ptPickupNew; ptPickupNew.s = 0; MainImageForm->iMainImage->PaintImageEdit(PaintGridBlock); } ptBlock.s = 0; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } if (T3d.mod == T3D_MBLK) { clear_block(); set_block(ptBlock.x, ptBlock.y, j, i); T3d.mod = T3D_MMOVE; } else if (T3d.mod == T3D_MBLOCKFIX) { GridBlock.Exist = true; GridBlock.Start.x = j < ptBlock.x ? j : ptBlock.x; GridBlock.Start.y = i < ptBlock.y ? i : ptBlock.y; GridBlock.Length.x = abs(j - ptBlock.x) + 1; GridBlock.Length.y = abs(i - ptBlock.y) + 1; for (y = GridBlock.Start.y; y < GridBlock.Start.y + GridBlock.Length.y; y++) { for (x = GridBlock.Start.x; x < GridBlock.Start.x + GridBlock.Length.x; x++) { TCoordi *d = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x, y); if (d->s != _fix) d->s = _fix; else { if (x>=GridBlock.Start.x && x=GridBlock.Start.y && ys = _blk; else d->s = 1; } } } MainImageForm->iMainImage->PaintImageEdit(PaintGridPoint); } T3d.step = 0; t_3d_view_menu(); MainImageForm->iMainImage->Invalidate(); } else if (status == 1) { if (ptPickupNew.s>0) { if (ptPickupNew.x!=j || ptPickupNew.y!=i) { ptPickupOld = ptPickupNew; ptPickupNew.s = 1; ptPickupNew.x = j; ptPickupNew.y = i; MainImageForm->iMainImage->PaintImageEdit(PaintGridBlock); } } else { ptPickupOld = ptPickupNew; ptPickupNew.s = 1; ptPickupNew.x = j; ptPickupNew.y = i; MainImageForm->iMainImage->PaintImageEdit(PaintGridBlock); } } END_LOG; return; } } } } if (ptPickupNew.s>0) { ptPickupOld = ptPickupNew; ptPickupNew.s = 0; MainImageForm->iMainImage->PaintImageEdit(PaintGridBlock); } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_insert_line(void) { BEGIN_LOG("::"); int x, y; TCoordi *a = 0, *b = 0, *c = 0; TData3D *dp = MainImageForm->Data3D; TGridData g; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } g.cx = dp->GridData[T3d.n].cx; g.cy = dp->GridData[T3d.n].cy; g.lx = dp->GridData[T3d.n].lx; g.ly = dp->GridData[T3d.n].ly; #ifdef TPDEBUG if ((g.d = new TPMemoryArea(g.cx, g.cy))==NULL) SHOWDEBUG; if (g.d->lock()==NULL) SHOWDEBUG; #else g.d = new TPMemoryArea(g.cx, g.cy); g.d->lock(); #endif for (y = 0; y < g.cy; y++) { for (x = 0; x < g.cx; x++) { *g.d->pointer(x, y) = *dp->GridData[T3d.n].d->pointer(x, y); } } doDestroy(dp->GridData[T3d.n].d) dp->GridData[T3d.n].lx = g.lx / 2; dp->GridData[T3d.n].ly = g.ly / 2; dp->GridData[T3d.n].cx = g.cx * 2 - 1; dp->GridData[T3d.n].cy = g.cy * 2 - 1; #ifdef TPDEBUG if ((dp->GridData[T3d.n].d = new TPMemoryArea(dp->GridData[T3d.n].cx, dp->GridData[T3d.n].cy))==NULL) SHOWDEBUG; if (dp->GridData[T3d.n].d->lock()==NULL) SHOWDEBUG; #else dp->GridData[T3d.n].d = new TPMemoryArea(dp->GridData[T3d.n].cx, dp->GridData[T3d.n].cy); dp->GridData[T3d.n].d->lock(); #endif for (y = 0; y < dp->GridData[T3d.n].cy; y += 2) { for (x = 0; x < dp->GridData[T3d.n].cx; x += 2) { *dp->GridData[T3d.n].d->pointer(x, y) = *g.d->pointer(x / 2, y / 2); } } for (y = 0; y < dp->GridData[T3d.n].cy; y += 2) { for (x = 1; x < dp->GridData[T3d.n].cx; x += 2) { a = dp->GridData[T3d.n].d->pointer(x, y); b = dp->GridData[T3d.n].d->pointer(x - 1, y); c = dp->GridData[T3d.n].d->pointer(x + 1, y); if (b->s && c->s) a->s = 1; else a->s = 0; a->x = (b->x + c->x) / 2; a->y = (b->y + c->y) / 2; } } for (y = 1; y < dp->GridData[T3d.n].cy; y += 2) { for (x = 0; x < dp->GridData[T3d.n].cx; x++) { a = dp->GridData[T3d.n].d->pointer(x, y); b = dp->GridData[T3d.n].d->pointer(x, y - 1); c = dp->GridData[T3d.n].d->pointer(x, y + 1); if (b->s && c->s) a->s = 1; else a->s = 0; a->x = (b->x + c->x) / 2; a->y = (b->y + c->y) / 2; } } if (GridBlock.Exist) { GridBlock.Start.x *= 2; GridBlock.Length.x = GridBlock.Length.x * 2 - 1; GridBlock.Start.y *= 2; GridBlock.Length.y = GridBlock.Length.y * 2 - 1; for (y = GridBlock.Start.y; y < GridBlock.Start.y + GridBlock.Length.y; y++) { for (x = GridBlock.Start.x; x < GridBlock.Start.x + GridBlock.Length.x; x++) { a = dp->GridData[T3d.n].d->pointer(x, y); if (a->s == 1) a->s = _blk; } } } delete g.d; MainImageForm->iMainImage->Invalidate(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_grid_movecopy(void) { BEGIN_LOG("::"); int i, j, tx, ty; TData3D *dp = MainImageForm->Data3D; if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } tx = tWindow.s.x - T3d.func.wsx; ty = tWindow.s.y - T3d.func.wsy; dp->GridData[dp->GridCount].lx = dp->GridData[T3d.n].lx; dp->GridData[dp->GridCount].ly = dp->GridData[T3d.n].ly; dp->GridData[dp->GridCount].cx = dp->GridData[T3d.n].cx; dp->GridData[dp->GridCount].cy = dp->GridData[T3d.n].cy; #ifdef TPDEBUG if (dp->GridData[dp->GridCount].d) SHOWDEBUG; if ((dp->GridData[dp->GridCount].d = new TPMemoryArea(dp->GridData[dp->GridCount].cx, dp->GridData[dp->GridCount].cy))==NULL) SHOWDEBUG; if (dp->GridData[dp->GridCount].d->lock()==NULL) SHOWDEBUG; #else dp->GridData[dp->GridCount].d = new TPMemoryArea(dp->GridData[dp->GridCount].cx, dp->GridData[dp->GridCount].cy); dp->GridData[dp->GridCount].d->lock(); #endif for (i=0; iGridData[dp->GridCount].cy; i++) { for (j=0; jGridData[dp->GridCount].cx; j++) { TCoordi *a = dp->GridData[T3d.n].d->pointer(j, i); TCoordi *b = dp->GridData[dp->GridCount].d->pointer(j, i); if (T3d.func.item==T3D_FCPY_M) b->x = 2*tWindow.s.x+tWindow.size.x-(a->x+tx); else b->x = a->x+tx; b->y = a->y+ty; b->s = a->s; if (b->x>MainImageForm->iMainImage->uBitmap->Width-1) b->x = MainImageForm->iMainImage->uBitmap->Width-1; else if (b->x<0) b->x = 0; if (b->y>MainImageForm->iMainImage->uBitmap->Height-1) b->y = MainImageForm->iMainImage->uBitmap->Height-1; else if (b->y<0) b->y = 0; } } clear_block(); dp->fn[T3d.fabric].sn[dp->fn[T3d.fabric].cnt] = dp->GridCount; T3d.n = MainImageForm->Data3D->GridCount++; dp->fn[T3d.fabric].cnt++; T3d.func.item = T3D_OFF; MainImageForm->iMainImage->Invalidate(); t3d_function_view_menu(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::view_grid_data(void) { BEGIN_LOG("::"); int i, j, k; eGIMWidth->Text = T3d.size.x; eGIMHeight->Text = T3d.size.y; for (i = 0; i < T3DF_CNT; i++) if (MainImageForm->Data3D->fn[i].cnt == 0) break; if (T3d.fabric > i) T3d.fabric = 0; cbGIMGroup->Text = T3d.fabric + 1; if (MainImageForm->Data3D->GridCount) { lGINumber->Caption = String(T3d.n+1); lGIWidth->Caption = "X : " + String(MainImageForm->Data3D->GridData[T3d.n].lx); lGIHeight->Caption = "Y : " + String(MainImageForm->Data3D->GridData[T3d.n].ly); for (i = 0, k = -1; i < T3DF_CNT; i++) { for (j = 0; j < MainImageForm->Data3D->fn[i].cnt; j++) { if (T3d.n == MainImageForm->Data3D->fn[i].sn[j]) { k = i + 1; goto next; } } } next: cbGICGroup->Text = k; } MainImageForm->iMainImage->Invalidate(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_define_view_menu(void) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; if (MainImageForm->Data3D->GridCount) sbGDDelete->Enabled = true; else sbGDDelete->Enabled = false; if (MainImageForm->Data3D->GridCount > 1) { sbGDNext->Enabled = true; sbGDPrevious->Enabled = true; } else { sbGDNext->Enabled = false; sbGDPrevious->Enabled = false; } if (T3d.type == T3D_DEF) { if (T3d.def == T3D_DNEW) { sbGDCreate->Down = true; } else if (T3d.def == T3D_DDEL) { sbGDDelete->Down = true; } else if (T3d.def == T3D_DNEXT) { sbGDNext->Down = true; } else if (T3d.def == T3D_DPRE) { sbGDPrevious->Down = true; } } view_grid_data(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_grid_f_s(void) { BEGIN_LOG("::"); int i, j, k = -1; for (i = 0; i < T3DF_CNT; i++) { if (k == -1) { for (j = 0; j < MainImageForm->Data3D->fn[i].cnt; j++) { if (MainImageForm->Data3D->fn[i].sn[j] == T3d.n) { k = j; break; } } } if (k >= 0 && k < T3D_MAX_GRID) { MainImageForm->Data3D->fn[i].cnt--; for (j = k; j < MainImageForm->Data3D->fn[i].cnt; j++) { MainImageForm->Data3D->fn[i].sn[j] = MainImageForm->Data3D->fn[i].sn[j+1]; if (MainImageForm->Data3D->fn[i].sn[j] > T3d.n) MainImageForm->Data3D->fn[i].sn[j]--; } k = T3D_MAX_GRID; } else { for (j = 0; j < MainImageForm->Data3D->fn[i].cnt; j++) { if (MainImageForm->Data3D->fn[i].sn[j] > T3d.n) MainImageForm->Data3D->fn[i].sn[j]--; } } } // Áß°£¿¡ ºñ¾îÀÖ´Â ºÎºÐÀÌ ¾øµµ·Ï Grid ¹øÈ£¸¦ ÀÚµ¿À¸·Î ¼ø¼­´ë·Î Shift½ÃÄÑÁÖ´Â ÇÔ¼öÀ̳ª, // µðÀÚÀ̳ʵéÀÌ ºÒÆíÇÏ´Ù°íÇÏ¿© ÁÖ¼®Ã³¸®ÇÏ¿´´Ù - by monkman (2008.08.04) //t3d_grid_group_check(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::middle_pt(TPoint a1, TPoint b1, TPoint &pos) { BEGIN_LOG("::"); pos.x = (a1.x + b1.x) / 2; pos.y = (a1.y + b1.y) / 2; END_LOG; } //--------------------------------------------------------------------------- TPoint __fastcall TMenu3DForm::base_inter_pt(TPoint a1, TPoint a2, TPoint b1, TPoint b2) { BEGIN_LOG("::"); double as, bs; TPoint pos; as = (a2.x - a1.x && a2.y - a1.y) ? (double)(a2.y - a1.y) / (a2.x - a1.x) : 0; bs = (b2.x - b1.x && b2.y - b1.y) ? (double)(b2.y - b1.y) / (b2.x - b1.x) : 0; if (a1.x - a2.x && a1.y - a2.y && b1.x - b2.x && b1.y - b2.y) { if (as == bs) middle_pt(a1, b1, pos); else { pos.x = (a1.x * as - b1.x * bs - a1.y + b1.y) / (as - bs); pos.y = (a1.y / as - b1.y / bs - a1.x + b1.x) / (1.0 / as - 1.0 / bs); } } else if (a1.x - a2.x && a1.y == a2.y && b1.x == b2.x && b1.y - b2.y) { pos.x = b1.x; pos.y = a1.y; } else if (a1.x == a2.x && a1.y - a2.y && b1.x - b2.x && b1.y == b2.y) { pos.x = a1.x; pos.y = b1.y; } else if (a1.x - a2.x && a1.y == a2.y && b1.x - b2.x && b1.y - b2.y) { pos.x = (a1.y - b1.y) / bs + b1.x; pos.y = a1.y; } else if (a1.x == a2.x && a1.y - a2.y && b1.x - b2.x && b1.y - b2.y) { pos.x = a1.x; pos.y = (a1.x - b1.x) * bs + b1.y; } else if (a1.x - a2.x && a1.y - a2.y && b1.x - b2.x && b1.y == b2.y) { pos.x = (b1.y - a1.y) / as + a1.x; pos.y = b1.y; } else if (a1.x - a2.x && a1.y - a2.y && b1.x == b2.x && b1.y - b2.y) { pos.x = b1.x; pos.y = (b1.x - a1.x) * as + a1.y; } else middle_pt(a1, b1, pos); if (pos.x < 0) pos.x = 0; else if(pos.x > MainImageForm->iMainImage->uBitmap->Width - 1) pos.x = MainImageForm->iMainImage->uBitmap->Width - 1; if (pos.y < 0) pos.y = 0; else if(pos.y > MainImageForm->iMainImage->uBitmap->Height - 1) pos.y = MainImageForm->iMainImage->uBitmap->Height - 1; END_LOG; return pos; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::in_a1_a2(TPoint &a1, TPoint &a2, int x1, int y1, int x2, int y2) { BEGIN_LOG("::"); a1.x = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x1, y1)->x; a1.y = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x1, y1)->y; a2.x = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x2, y2)->x; a2.y = MainImageForm->Data3D->GridData[T3d.n].d->pointer(x2, y2)->y; END_LOG; } //--------------------------------------------------------------------------- TPoint __fastcall TMenu3DForm::base_inter_pt(int vh, int vhn, int gxy) { BEGIN_LOG("::"); TPoint pos, a1, a2, b1, b2; int i, j, k, sx, sy, ex, ey; _3d_base_pt bt = T3d.base.vh[vh].d[vhn]; k = (vh == T3D_B_V ? MainImageForm->Data3D->GridData[T3d.n].cx : MainImageForm->Data3D->GridData[T3d.n].cy); for (i = 1; i < k; i++) { if (vh == T3D_B_V) in_a1_a2(a1, a2, i - 1, gxy, i, gxy); else in_a1_a2(a1, a2, gxy, i - 1, gxy, i); for (j = 1; j < bt.cnt; j++) { b1 = bt.p[j - 1]; b2 = bt.p[j]; pos = base_inter_pt(a1, a2, b1, b2); sx = (a1.x < a2.x ? a1.x : a2.x); ex = (a1.x < a2.x ? a2.x : a1.x); sy = (a1.y < a2.y ? a1.y : a2.y); ey = (a1.y < a2.y ? a2.y : a1.y); if (pos.x >= sx && pos.x <= ex && pos.y >= sy && pos.y <= ey) { sx = (b1.x < b2.x ? b1.x : b2.x); ex = (b1.x < b2.x ? b2.x : b1.x); sy = (b1.y < b2.y ? b1.y : b2.y); ey = (b1.y < b2.y ? b2.y : b1.y); if (pos.x >= sx && pos.x <= ex && pos.y >= sy && pos.y <= ey) END_LOG; return pos; } } } if (vh == T3D_B_V) in_a1_a2(a1, a2, MainImageForm->Data3D->GridData[T3d.n].cx / 2, gxy, (MainImageForm->Data3D->GridData[T3d.n].cx - 1) / 2, gxy); else in_a1_a2(a1, a2, gxy, MainImageForm->Data3D->GridData[T3d.n].cy / 2, gxy, (MainImageForm->Data3D->GridData[T3d.n].cy - 1) / 2); pos.x = (a1.x + a2.x) / 2; pos.y = (a1.y + a2.y) / 2; END_LOG; return pos; } //--------------------------------------------------------------------------- TPoint __fastcall TMenu3DForm::base_equal_gap_pt(_3d_base_pt a, int p, int total) { BEGIN_LOG("::"); TPoint pos; int i, j, k; if (p == 0) { END_LOG; return a.p[0]; } else if (p == total) { END_LOG; return a.p[a.cnt - 1]; } int d = p * a.l[0] / total; for (i = 1; i < a.cnt; i++) { if (d == a.l[i]) { END_LOG; return a.p[i]; } else if (d < a.l[i]) { if (i > 1) { d -= a.l[i - 1]; a.l[i] -= a.l[i - 1]; } pos.x = (a.p[i - 1].x * (a.l[i] - d) + a.p[i].x * d) / a.l[i]; pos.y = (a.p[i - 1].y * (a.l[i] - d) + a.p[i].y * d) / a.l[i]; END_LOG; return pos; } } j = 0; k = a.l[0]; for (i = 1; i < a.cnt; i++) { if (abs(a.l[i] - d) < k) { j = i; k = abs(a.l[i] - d); } } END_LOG; return a.p[j]; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::dis(TPoint s, TPoint e) { BEGIN_LOG("::"); double d1 = (double)(s.x - e.x); double d2 = (double)(s.y - e.y); END_LOG; return (int)sqrt(d1 * d1 + d2 * d2); } //--------------------------------------------------------------------------- TPoint __fastcall TMenu3DForm::base_grid_cnt(void) { BEGIN_LOG("::"); TPoint gap, p1, p2; _3d_base_pt a, b; int i, j, k, cnt, *l = 0, d1, d2; i = T3d.base.vh[T3D_B_V].cnt - 1; a = T3d.base.vh[T3D_B_V].d[0]; b = T3d.base.vh[T3D_B_V].d[i]; cnt = (a.l[0] + b.l[0]) / T3d.size.y; if (cnt < 2) cnt = 2; #ifdef TPDEBUG if ((l = new int[cnt])==NULL) SHOWDEBUG; #else l = new int[cnt]; #endif l[0] = dis(a.p[0], b.p[0]); l[cnt - 1] = dis(a.p[a.cnt - 1], b.p[b.cnt - 1]); for (i = 1; i < cnt - 1; i++) { p1 = a.p[0]; p2 = b.p[0]; k = a.l[a.cnt - 1] * i / (cnt - 1); for (j = 1; j < a.cnt; j++) { if (k <= a.l[j]) { d1 = k - (j == 1 ? 0 : a.l[j - 1]); d2 = a.l[j] - k; p1.x = (d2 * a.p[j - 1].x + d1 * a.p[j].x) / (d1 + d2); p1.y = (d2 * a.p[j - 1].y + d1 * a.p[j].y) / (d1 + d2); break; } } k = b.l[b.cnt - 1] * i / (cnt - 1); for (j = 1; j < b.cnt; j++) { if (k <= b.l[j]) { d1 = k - (j == 1 ? 0 : b.l[j - 1]); d2 = b.l[j] - k; p2.x = (d2 * b.p[j - 1].x + d1 * b.p[j].x) / (d1 + d2); p2.y = (d2 * b.p[j - 1].y + d1 * b.p[j].y) / (d1 + d2); break; } } l[i] = dis(p1, p2); } for (i = j = 0; i < cnt; i++) j += l[i]; gap.x = (double)j / cnt + 0.5; if (gap.x < 0) gap.x = 0; delete[] l; l = 0; i = T3d.base.vh[T3D_B_H].cnt - 1; a = T3d.base.vh[T3D_B_H].d[0]; b = T3d.base.vh[T3D_B_H].d[i]; cnt = (a.l[0] + b.l[0]) / T3d.size.x; if (cnt < 2) cnt = 2; #ifdef TPDEBUG if ((l = new int[cnt])==NULL) SHOWDEBUG; #else l = new int[cnt]; #endif l[0] = dis(a.p[0], b.p[0]); l[cnt - 1] = dis(a.p[a.cnt - 1], b.p[b.cnt - 1]); for (i = 1; i < cnt - 1; i++) { p1 = a.p[0]; p2 = b.p[0]; k = a.l[a.cnt - 1] * i / (cnt - 1); for (j = 1; j < a.cnt; j++) { if (k <= a.l[j]) { d1 = k - (j == 1 ? 0 : a.l[j - 1]); d2 = a.l[j] - k; p1.x = (d2 * a.p[j - 1].x + d1 * a.p[j].x) / (d1 + d2); p1.y = (d2 * a.p[j - 1].y + d1 * a.p[j].y) / (d1 + d2); break; } } k = b.l[b.cnt - 1] * i / (cnt - 1); for (j = 1; j < b.cnt; j++) { if (k <= b.l[j]) { d1 = k - (j == 1 ? 0 : b.l[j - 1]); d2 = b.l[j] - k; p2.x = (d2 * b.p[j - 1].x + d1 * b.p[j].x) / (d1 + d2); p2.y = (d2 * b.p[j - 1].y + d1 * b.p[j].y) / (d1 + d2); break; } } l[i] = dis(p1, p2); } for (i = j = 0; i < cnt; i++) j += l[i]; gap.y = (double)j / cnt + 0.5; if (gap.y < 0) gap.y = 0; delete[] l; l = 0; END_LOG; return gap; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::base_data_arrange(int backup) { BEGIN_LOG("::"); _3d_base_pt *a = 0, *b = 0, *c = 0, *d = 0, tmp; int n, i, j, k, l; for (n = 0; n < 2; n++) { T3d.base.vh[n].cnt = T3d.base.vhd[n].cnt; for (i = 0; i < T3d.base.vh[n].cnt; i++) { T3d.base.vh[n].d[i] = T3d.base.vhd[n].d[i]; } if (T3d.base.vh[n].d[i - 1].cnt < 2) { T3d.base.vh[n].d[i - 1].cnt = 0; T3d.base.vh[n].cnt--; } if (T3d.base.vh[n].cnt < 2) { END_LOG; return -1; } } shp = shape(); if (shp) { for (n = 0; n < 2; n++) { for (i = 0; i < T3d.base.vh[n].cnt - 1; i++) { for (j = i + 1; j < T3d.base.vh[n].cnt; j++) { k = (n == T3D_B_V ? T3d.base.vh[n].d[i].p[0].x - T3d.base.vh[n].d[j].p[0].x : T3d.base.vh[n].d[i].p[0].y - T3d.base.vh[n].d[j].p[0].y); if (k > 0) { tmp = T3d.base.vh[n].d[i]; T3d.base.vh[n].d[i] = T3d.base.vh[n].d[j]; T3d.base.vh[n].d[j] = tmp; } } tmp = T3d.base.vh[n].d[i]; j = tmp.cnt - 1; k = (n == T3D_B_V ? tmp.p[0].y - tmp.p[j].y : tmp.p[0].x - tmp.p[j].x); if (k > 0) { for (j = 0; j < tmp.cnt; j++) T3d.base.vh[n].d[i].p[j] = tmp.p[tmp.cnt - 1 - j]; } } tmp = T3d.base.vh[n].d[i]; j = tmp.cnt - 1; k = (n == T3D_B_V ? tmp.p[0].y - tmp.p[j].y : tmp.p[0].x - tmp.p[j].x); if (k > 0) { for (j = 0; j < tmp.cnt; j++) T3d.base.vh[n].d[i].p[j] = tmp.p[tmp.cnt - 1 - j]; } } } else { for (n = 0; n < 2; n++) { for (i = 0; i < T3d.base.vh[n].cnt - 1; i++) { for (j = i + 1; j < T3d.base.vh[n].cnt; j++) { k = (n == T3D_B_V ? T3d.base.vh[n].d[i].p[0].y - T3d.base.vh[n].d[j].p[0].y : T3d.base.vh[n].d[i].p[0].x - T3d.base.vh[n].d[j].p[0].x); if (k > 0) { tmp = T3d.base.vh[n].d[i]; T3d.base.vh[n].d[i] = T3d.base.vh[n].d[j]; T3d.base.vh[n].d[j] = tmp; } } tmp = T3d.base.vh[n].d[i]; j = tmp.cnt - 1; k = (n == T3D_B_V ? tmp.p[0].x - tmp.p[j].x : tmp.p[0].y - tmp.p[j].y); if (k > 0) { for (j = 0; j < tmp.cnt; j++) T3d.base.vh[n].d[i].p[j] = tmp.p[tmp.cnt - 1 - j]; } } tmp = T3d.base.vh[n].d[i]; j = tmp.cnt - 1; k = (n == T3D_B_V ? tmp.p[0].x - tmp.p[j].x : tmp.p[0].y - tmp.p[j].y); if (k > 0) { for (j = 0; j < tmp.cnt; j++) T3d.base.vh[n].d[i].p[j] = tmp.p[tmp.cnt - 1 - j]; } } } i = T3d.base.vh[T3D_B_V].cnt - 1; j = T3d.base.vh[T3D_B_H].cnt - 1; a = &T3d.base.vh[T3D_B_V].d[0]; b = &T3d.base.vh[T3D_B_H].d[0]; c = &T3d.base.vh[T3D_B_V].d[i]; d = &T3d.base.vh[T3D_B_H].d[j]; a->p[0] = b->p[0] = base_inter_pt(a->p[0], a->p[1], b->p[0], b->p[1]); b->p[b->cnt - 1] = c->p[0] = base_inter_pt(b->p[b->cnt - 1], b->p[b->cnt - 2], c->p[0], c->p[1]); c->p[c->cnt - 1] = d->p[d->cnt - 1] = base_inter_pt(c->p[c->cnt - 1], c->p[c->cnt - 2], d->p[d->cnt - 1], d->p[d->cnt - 2]); d->p[0] = a->p[a->cnt - 1] = base_inter_pt(d->p[0], d->p[1], a->p[a->cnt - 1], a->p[a->cnt - 2]); for (n = 0; n < 2; n++) { for (i = 0; i < T3d.base.vh[n].cnt; i++) { a = &T3d.base.vh[n].d[i]; a->l[0] = 0; for (j = 1; j < a->cnt; j++) { a->l[j] = a->l[0] += sqrt((double)(a->p[j].x - a->p[j - 1].x) * (a->p[j].x - a->p[j - 1].x) + (a->p[j].y - a->p[j - 1].y) * (a->p[j].y - a->p[j - 1].y)); } } } if (backup) { if (!Undo.Save(MainImageForm->Data3D, T3d.n, GridBlock)) { SAVE_EXCEPTION(EC_MEMORY_LACK); EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); } } TData3D *dp = MainImageForm->Data3D; // if (T3d.base.finish == 0) { dp->fn[T3d.fabric].sn[dp->fn[T3d.fabric].cnt] = dp->GridCount; if (T3d.base.finish == 0) { dp->fn[T3d.fabric].cnt++; T3d.n = dp->GridCount; dp->GridCount++; } TPoint gl = base_grid_cnt(); dp->GridData[T3d.n].cx = gl.x / T3d.size.x + 1; if (dp->GridData[T3d.n].cx < 2) dp->GridData[T3d.n].cx = 2; dp->GridData[T3d.n].cy = gl.y / T3d.size.y + 1; if (dp->GridData[T3d.n].cy < 2) dp->GridData[T3d.n].cy = 2; dp->GridData[T3d.n].lx = gl.x / (dp->GridData[T3d.n].cx - 1); dp->GridData[T3d.n].ly = gl.y / (dp->GridData[T3d.n].cy - 1); doDestroy(dp->GridData[T3d.n].d) #ifdef TPDEBUG if ((dp->GridData[T3d.n].d = new TPMemoryArea(dp->GridData[T3d.n].cx, dp->GridData[T3d.n].cy))==NULL) SHOWDEBUG; if (dp->GridData[T3d.n].d->lock()==NULL) SHOWDEBUG; #else dp->GridData[T3d.n].d = new TPMemoryArea(dp->GridData[T3d.n].cx, dp->GridData[T3d.n].cy); dp->GridData[T3d.n].d->lock(); #endif if (dp->GridCount == 1) t_3d_view_menu(); // } T3d.base.finish = 1; if (dp->GridCount) { for (i = 0; i < dp->GridData[T3d.n].cy; i++) { for (j = 0; j < dp->GridData[T3d.n].cx; j++) { dp->GridData[T3d.n].d->pointer(j, i)->s = 1; } } } END_LOG; return 0; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::shape() { BEGIN_LOG("::"); _3d_base_pt *a, *b; // int vcnt, hcnt; TPoint ap, bp; double vdiv, hdiv; // vcnt = T3d.base.vh[0].cnt; // hcnt = T3d.base.vh[1].cnt; a = &T3d.base.vh[0].d[0]; b = &T3d.base.vh[1].d[0]; ap = T3d.base.vh[0].d[0].p[a->cnt-1]; bp = T3d.base.vh[1].d[0].p[b->cnt-1]; if ((a->p[0].x - ap.x) && (a->p[0].y - ap.y)) { vdiv = abs((a->p[0].x - ap.x)/(a->p[0].y - ap.y)); } if ((b->p[0].x - bp.x) && (b->p[0].y - bp.y)) { hdiv = abs((b->p[0].x - bp.x)/(b->p[0].y - bp.y)); } if ( vdiv < 1 || hdiv > 1) { END_LOG; return 1; } else { END_LOG; return 0; } } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::base_ratio(int vh, int gn, TCoordi &h1, TCoordi &h2, int &vr1) { BEGIN_LOG("::"); double ratio[4]; int i; TData3D *dp = MainImageForm->Data3D; ratio[T3d.base.vh[vh].cnt - 2] = 1.0; for (i = T3d.base.vh[vh].cnt - 2; i > 0; i--) { if (vh == T3D_B_V) { h1 = *dp->GridData[T3d.n].d->pointer(0, gn); h2 = *dp->GridData[T3d.n].d->pointer(dp->GridData[T3d.n].cx - 1, gn); TPoint pos = base_inter_pt(vh, i, gn); ratio[i - 1] = (double)((int)pos.x - h1.x) / (h2.x - h1.x); } else { h1 = *dp->GridData[T3d.n].d->pointer(gn, 0); h2 = *dp->GridData[T3d.n].d->pointer(gn, dp->GridData[T3d.n].cy - 1); TPoint pos = base_inter_pt(vh, i, gn); ratio[i - 1] = (double)((int)pos.y - h1.y) / (h2.y - h1.y); } ratio[i] -= ratio[i - 1]; } vr1 = (vh == T3D_B_V ? dp->GridData[T3d.n].cy - 1 : dp->GridData[T3d.n].cx - 1); for (i = 0; iData3D; for (i = 0; i < 4; i++) { itv[i].s = itv[i].e = itv[i].m = itv[i].md = itv[i].gd = 0.0; itv[i].gs = itv[i].ge = 0; } if (base_data_arrange(backup) == -1) { END_LOG; return; } for (y = 0; y < dp->GridData[T3d.n].cy; y += dp->GridData[T3d.n].cy - 1) { a = (y == 0 ? T3d.base.vh[T3D_B_H].d[0] : T3d.base.vh[T3D_B_H].d[T3d.base.vh[T3D_B_H].cnt - 1]); for (x = 0; x < dp->GridData[T3d.n].cx; x++) { TPoint pos = base_equal_gap_pt(a, x, dp->GridData[T3d.n].cx - 1); dp->GridData[T3d.n].d->pointer(x, y)->x = pos.x; dp->GridData[T3d.n].d->pointer(x, y)->y = pos.y; } } for (x = 0; x < dp->GridData[T3d.n].cx; x += dp->GridData[T3d.n].cx - 1) { a = (x == 0 ? T3d.base.vh[T3D_B_V].d[0] : T3d.base.vh[T3D_B_V].d[T3d.base.vh[T3D_B_V].cnt - 1]); for (y = 0; y < dp->GridData[T3d.n].cy; y++) { TPoint pos = base_equal_gap_pt(a, y, dp->GridData[T3d.n].cy - 1); dp->GridData[T3d.n].d->pointer(x, y)->x = pos.x; dp->GridData[T3d.n].d->pointer(x, y)->y = pos.y; } } if (shp) { for (y = 1; y < dp->GridData[T3d.n].cy - 1; y++) { h1 = *dp->GridData[T3d.n].d->pointer(0, y); h2 = *dp->GridData[T3d.n].d->pointer(dp->GridData[T3d.n].cx - 1, y); vr1 = y; vr2 = dp->GridData[T3d.n].cy - 1 - y; for (x = 1; x < dp->GridData[T3d.n].cx-1; x++) { d = dp->GridData[T3d.n].d->pointer(x, y); v1 = *dp->GridData[T3d.n].d->pointer(x, 0); v2 = *dp->GridData[T3d.n].d->pointer(x, dp->GridData[T3d.n].cy - 1); hr1 = x; hr2 = dp->GridData[T3d.n].cx - 1 - x; d->x = (hr1 * h2.x + hr2 * h1.x) / (hr1 + hr2); d->y = (vr1 * v2.y + vr2 * v1.y) / (vr1 + vr2); if (d->s) d->s = 1; } } } else { for (y = 1; y < dp->GridData[T3d.n].cy - 1; y++) { h1 = *dp->GridData[T3d.n].d->pointer(0, y); h2 = *dp->GridData[T3d.n].d->pointer(dp->GridData[T3d.n].cx - 1, y); vr1 = y; vr2 = dp->GridData[T3d.n].cy - 1 - y; for (x = 1; x < dp->GridData[T3d.n].cx-1; x++) { d = dp->GridData[T3d.n].d->pointer(x, y); v1 = *dp->GridData[T3d.n].d->pointer(x, 0); v2 = *dp->GridData[T3d.n].d->pointer(x, dp->GridData[T3d.n].cy - 1); hr1 = x; hr2 = dp->GridData[T3d.n].cx - 1 - x; d->y = (hr1 * h2.y + hr2 * h1.y) / (hr1 + hr2); d->x = (vr1 * v2.x + vr2 * v1.x) / (vr1 + vr2); if (d->s) d->s = 1; } } } base_ratio(T3D_B_V, 0, h1, h2, vr1); base_ratio(T3D_B_V, dp->GridData[T3d.n].cy - 1, h1, h2, vr1); y = T3d.base.vh[T3D_B_V].cnt - 1; for (i = 0; i < y; i++) { itv[i].gs = (i == 0 ? 0 : itv[i - 1].ge + 1); if (i == y - 1) itv[i].ge = dp->GridData[T3d.n].cx - 1; else { double l = 0.0; for (x = 0; x <= i; x++) l = l + (itv[x].s + itv[i].e) / 2.0; for (x = itv[i].gs; x < dp->GridData[T3d.n].cx; x++) { if ((double)x / (dp->GridData[T3d.n].cx - 1) > l) break; } itv[i].ge = (x ? x - 1 : x); } } for (y = 1; y < dp->GridData[T3d.n].cy - 1 && T3d.base.vh[T3D_B_V].cnt > 2; y++) { base_ratio(T3D_B_V, y, h1, h2, vr1); for (i = 0; i < T3d.base.vh[T3D_B_V].cnt - 1; i++) { for (x = itv[i].gs, hr1 = 0; x <= itv[i].ge; x++) { if (x > 0 && x < dp->GridData[T3d.n].cx - 1) { h1 = *dp->GridData[T3d.n].d->pointer(itv[i].gs, y); d = dp->GridData[T3d.n].d->pointer(x, y); hr1 = d->x; d->x = d->x + (d->x - h1.x) * (itv[i].m / itv[i].md - 1.0); hr1 = d->x - hr1; } } for (x = itv[i].ge + 1; x < dp->GridData[T3d.n].cx - 1; x++) dp->GridData[T3d.n].d->pointer(x, y)->x += hr1; } } base_ratio(T3D_B_H, 0, h1, h2, vr1); base_ratio(T3D_B_H, dp->GridData[T3d.n].cx - 1, h1, h2, vr1); x = T3d.base.vh[T3D_B_H].cnt - 1; for (i = 0; i < x; i++) { itv[i].gs = (i == 0 ? 0 : itv[i - 1].ge + 1); if (i == x - 1) itv[i].ge = dp->GridData[T3d.n].cy - 1; else { double l = 0.0; for (y = 0; y <= i; y++) l = l + (itv[y].s + itv[i].e) / 2.0; for (y = itv[i].gs; y < dp->GridData[T3d.n].cy; y++) { if ((double)y / (dp->GridData[T3d.n].cy - 1) > l) break; } itv[i].ge = (y ? y - 1 : y); } } for (x = 1; x < dp->GridData[T3d.n].cx - 1 && T3d.base.vh[T3D_B_H].cnt > 2; x++) { base_ratio(T3D_B_H, x, h1, h2, vr1); for (i = 0; i < T3d.base.vh[T3D_B_H].cnt - 1; i++) { for (y = itv[i].gs, hr1 = 0; y <= itv[i].ge; y++) { if (y > 0 && y < dp->GridData[T3d.n].cy - 1) { h1 = *dp->GridData[T3d.n].d->pointer(x, itv[i].gs); d = dp->GridData[T3d.n].d->pointer(x, y); hr1 = d->y; d->y = d->y + (d->y - h1.y) * (itv[i].m / itv[i].md - 1.0); hr1 = d->y - hr1; } } for (y = itv[i].ge + 1; y < dp->GridData[T3d.n].cy - 1; y++) dp->GridData[T3d.n].d->pointer(x, y)->y += hr1; } } vr1 = T3d.base.vhd[T3D_B_V].d[0].p[0].y; vr2 = T3d.base.vhd[T3D_B_V].d[0].p[T3d.base.vhd[T3D_B_V].d[0].cnt - 1].y; i = (vr1 <= vr2) ? 0 : 2; hr1 = T3d.base.vhd[T3D_B_H].d[0].p[0].x; hr2 = T3d.base.vhd[T3D_B_H].d[0].p[T3d.base.vhd[T3D_B_H].d[0].cnt - 1].x; i |= (hr1 <= hr2) ? 0 : 1; grid_direct(T3d.n, i); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_base_line(void) { BEGIN_LOG("::"); if (T3d.base.draw) { _3d_base_pt a = T3d.base.vhd[T3d.base.item].d[T3d.base.vhd[T3d.base.item].cnt - 1]; if (a.cnt < 1) { END_LOG; return; } TCoordi d1, d2; d1.x = a.p[a.cnt - 1].x; d2.x = Lsx; d1.y = a.p[a.cnt - 1].y; d2.y = Lsy; MainImageForm->iMainImage->Invalidate(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::se_in(_3d_base_pt *a, int p, int &sx, int &sy, int &ex, int &ey) { BEGIN_LOG("::"); int i, j; for (i = p - 1; i <= p + 1; i++) { if (i >= 0 && i < a->cnt) { if (sx > a->p[i].x) sx = a->p[i].x; if (sy > a->p[i].y) sy = a->p[i].y; if (ex < a->p[i].x) ex = a->p[i].x; if (ey < a->p[i].y) ey = a->p[i].y; } } if (T3d.base.finish == 1 && T3d.base.vhd[0].cnt > 1 && T3d.base.vhd[1].cnt > 1) { for (i = 0; i < MainImageForm->Data3D->GridData[T3d.n].cy; i++) { for (j = 0; j < MainImageForm->Data3D->GridData[T3d.n].cx; j++) { TCoordi d = *MainImageForm->Data3D->GridData[T3d.n].d->pointer(j, i); if (sx > d.x) sx = d.x; if (sy > d.y) sy = d.y; if (ex < d.x) ex = d.x; if (ey < d.y) ey = d.y; } } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_base_modify(int sw) { BEGIN_LOG("::"); int sx, sy, ex, ey; int vh = T3d.base.mod.vh, d = T3d.base.mod.d, p = T3d.base.mod.p; if (vh > 1 || d >= T3d.base.vhd[vh].cnt) { END_LOG; return; } _3d_base_pt *a = &T3d.base.vhd[vh].d[d]; if (p >= a->cnt) { END_LOG; return; } sx = MainImageForm->iMainImage->uBitmap->Width; sy = MainImageForm->iMainImage->uBitmap->Height; ex = ey = 0; if (sw == 1) { se_in(a, p, sx, sy, ex, ey); a->p[p].x = Lsx; a->p[p].y = Lsy; if (T3d.base.finish == 1) t3d_base_form(0); } se_in(a, p, sx, sy, ex, ey); ex++; ey++; if (sw == 1) { MainImageForm->iMainImage->Invalidate(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_base_view_menu(void) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; if (T3d.base.vhd[T3D_B_V].d[0].cnt || T3d.base.vhd[T3D_B_H].d[0].cnt) sbGBModify->Enabled = true; else sbGBModify->Enabled = false; if (T3d.base.finish == 1 && MainImageForm->Data3D->GridCount < T3D_MAX_GRID) sbGBNextGrid->Enabled = true; else sbGBNextGrid->Enabled = false; if (T3d.base.item == T3D_B_V) { sbGBVertical->Down = true; } else if (T3d.base.item == T3D_B_H) { sbGBHorizontal->Down = true; } else if (T3d.base.item == T3D_B_MOD) { sbGBModify->Down = true; } else if (T3d.base.item == T3D_B_NEXT) { sbGBNextGrid->Down = true; } sbGBNextLine->Enabled = false; sbGBDeleteP->Enabled = false; sbGBDeleteL->Enabled = false; sbGBFinish->Enabled = false; if (T3d.base.item == T3D_OFF) { sbGBNextLine->Enabled = false; sbGBDeleteL->Enabled = false; sbGBFinish->Enabled = false; } else if (T3d.base.item == T3D_B_MOD) { } else { if (T3d.base.vhd[T3d.base.item].d[0].cnt) { sbGBDeleteP->Enabled = true; sbGBDeleteL->Enabled = true; } if (T3d.base.vhd[T3d.base.item].cnt < 5 && T3d.base.vhd[T3d.base.item]. d[T3d.base.vhd[T3d.base.item].cnt - 1].cnt > 1) sbGBNextLine->Enabled = true; } sx = T3d.base.vhd[T3D_B_V].cnt - 1; sy = T3d.base.vhd[T3D_B_H].cnt - 1; if (sx > 0 && sy > 0 && T3d.base.vhd[T3D_B_V].d[1].cnt > 1 && T3d.base.vhd[T3D_B_H].d[1].cnt > 1) sbGBFinish->Enabled = true; t3d_define_view_menu(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_modify_view_menu(void) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; sbGMDeleteBlock->Enabled = GridBlock.Exist; if (T3rstr.cnt) sbGMLast->Enabled = true; else sbGMLast->Enabled = false; sbGMAll->Enabled = false; for (sy = 0; sy < MainImageForm->Data3D->GridData[T3d.n].cy; sy++) { for (sx = 0; sx < MainImageForm->Data3D->GridData[T3d.n].cx; sx++) { if (MainImageForm->Data3D->GridData[T3d.n].d->pointer(sx, sy)->s == 0) { sbGMAll->Enabled = true; break; } } if (sbGMAll->Enabled) break; } sbRotate->Down = false; if (T3d.mod == T3D_MBLK) { sbGMSet->Down = true; } else if (T3d.mod == T3D_MMOVE) { sbGMMove->Down = true; } else if (T3d.mod == T3D_MFIX) { sbGMFix->Down = true; } else if (T3d.mod == T3D_MDELP) { sbGMDeletePoint->Down = true; } else if (T3d.mod == T3D_MDELB) { sbGMDeleteBlock->Down = true; } else if (T3d.mod == T3D_MLST_RSTR) { sbGMLast->Down = true; } else if (T3d.mod == T3D_MALL_RSTR) { sbGMAll->Down = true; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_function_view_menu(void) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; if (MainImageForm->Data3D->GridCount < T3D_MAX_GRID) { sbGFNormal->Enabled = true; sbGFMirror->Enabled = true; sbRotate->Enabled = true; } else { sbGFNormal->Enabled = false; sbGFMirror->Enabled = false; sbRotate->Enabled = false; } if (MainImageForm->Data3D->GridData[T3d.n].lx >= 25 && MainImageForm->Data3D->GridData[T3d.n].ly >= 25) sbGFInsert->Enabled = true; else sbGFInsert->Enabled = false; if (T3d.func.item == T3D_FINSL) { sbGFInsert->Down = true; } else if (T3d.func.item == T3D_FCPY_N) { sbGFNormal->Down = true; } else if (T3d.func.item == T3D_FCPY_M) { sbGFMirror->Down = true; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_view_menu(void) { BEGIN_LOG("::"); if (MainImageForm->Data3D->GridCount == 0 && (T3d.type == T3D_MODI || T3d.type == T3D_FUNC)) T3d.type = T3D_OFF; if (MainImageForm->Data3D->GridCount > 0) { sbGMSet->Enabled = true; sbGMMove->Enabled = true; sbGMSet->Enabled = true; sbGMFix->Enabled = true; sbGMBlockFix->Enabled = true; sbGMDeletePoint->Enabled = true; sbGFNormal->Enabled = true; sbGFMirror->Enabled = true; sbRotate->Enabled = true; ptAngle->Enabled = true; lbAngle->Enabled = true; edAngle->Enabled = true; rbCopy->Enabled = true; rbMove->Enabled = true; } else { sbGMSet->Enabled = false; sbGMMove->Enabled = false; sbGMSet->Enabled = false; sbGMFix->Enabled = false; sbGMBlockFix->Enabled = false; sbGMDeletePoint->Enabled = false; sbGFNormal->Enabled = false; sbGFMirror->Enabled = false; sbRotate->Enabled = false; ptAngle->Enabled = false; lbAngle->Enabled = false; edAngle->Enabled = false; rbCopy->Enabled = false; rbMove->Enabled = false; } // sbGBase->Enabled = MainImageForm->Data3D->GridCount < T3D_MAX_GRID ? true : false; // if (T3d.type == T3D_DEF) t3d_define_view_menu(); // else if (T3d.type == T3D_BASE) t3d_base_view_menu(); // else if (T3d.type == T3D_MODI) t3d_modify_view_menu(); // else if (T3d.type == T3D_FUNC) t3d_function_view_menu(); // else if (T3d.type == T3D_OFF) t3d_off_view_menu(); t3d_define_view_menu(); t3d_base_view_menu(); t3d_modify_view_menu(); t3d_function_view_menu(); t3d_off_view_menu(); END_LOG; } //--------------------------------------------------------------------------- bool __fastcall TMenu3DForm::size_chk(int cnt, int &sx, int &sy, int lx, int ly) { BEGIN_LOG("::"); sx = lx; sy = 0; if (sx + lx > MainImageForm->iMainImage->uBitmap->Width) { sx = 0; sy = ly; } for (int i = 0; i < cnt; i++) { if (sx + lx > MainImageForm->iMainImage->uBitmap->Width || sy + ly > MainImageForm->iMainImage->uBitmap->Height) { END_LOG; return false; } sx += lx; if (sx + lx > MainImageForm->iMainImage->uBitmap->Width) { sx = 0; sy += ly; } } END_LOG; return true; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::t3ds_auto_copy_size(int cnt, int &lx, int &ly) { BEGIN_LOG("::"); int i, sx, sy, blx, bly; blx = lx; bly = ly; while (1) { if (size_chk(cnt, sx, sy, lx, ly)) { END_LOG; return 0; } if (blx > bly) { lx--; ly = (double)bly * lx / blx; } else { ly--; lx = (double)blx * ly / bly; } if (lx == 0) lx = 1; if (ly == 0) ly = 1; } END_LOG; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::t3dcpy_choice_number(void) { BEGIN_LOG("::"); int i; TData3D *dp = MainImageForm->Data3D; if (Lsx >= 0 && Lsx < dp->CopySize.x && Lsy >= 0 && Lsy < dp->CopySize.y) { END_LOG; return -1; } for (i = 1; i < dp->CopyCount; i++) { if (Lsx >= dp->CopyData[i].x && Lsx < dp->CopyData[i].x + dp->CopySize.x && Lsy >= dp->CopyData[i].y && Lsy < dp->CopyData[i].y + dp->CopySize.y) { END_LOG; return i; } } END_LOG; return -2; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::t3ds_select_copy(void) { BEGIN_LOG("::"); int n; RECT r; TPException ec = EC_NONE; // HDC dc = NULL; if ((n = t3dcpy_choice_number()) > 0) { // if((dc = MainImageForm->iMainImage->uBitmap->CreateDC()) == NULL) goto fail; // BitBlt(dc, MainImageForm->Data3D->CopyData[n].x, MainImageForm->Data3D->CopyData[n].y, // MainImageForm->Data3D->CopySize.x, MainImageForm->Data3D->CopySize.y, dc, 0, 0, SRCCOPY); MainImageForm->iMainImage->uBitmap->CopyToItself(MainImageForm->Data3D->CopyData[n].x, MainImageForm->Data3D->CopyData[n].y, MainImageForm->Data3D->CopySize.x, MainImageForm->Data3D->CopySize.y, 0, 0, SRCCOPY); // convert by celberus // MainImageForm->iMainImage->uBitmap->DeleteDC(dc); ::RepaintImage(); sbSelection->Down = false; CopyItem = 0; END_LOG; return 1; } END_LOG; return 0; fail: EXCEPTION_MESSAGE_OK(ec); END_LOG; return 0; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::t3ds_select_remove(void) { BEGIN_LOG("::"); int i, n; RECT r; TData3D *dp = MainImageForm->Data3D; TPException ec = EC_NONE; // HDC hDC = NULL; if ((n = t3dcpy_choice_number()) > 0) { dp->CopyCount--; // if ((hDC = MainImageForm->iMainImage->uBitmap->CreateDC()) == NULL) goto fail; for (i = n; i < dp->CopyCount; i++) { // BitBlt(hDC, dp->CopyData[i].x, dp->CopyData[i].y, dp->CopySize.x, dp->CopySize.y, // hDC, dp->CopyData[i + 1].x, dp->CopyData[i + 1].y, SRCCOPY); MainImageForm->iMainImage->uBitmap->CopyToItself(dp->CopyData[i].x, dp->CopyData[i].y, dp->CopySize.x, dp->CopySize.y, dp->CopyData[i + 1].x, dp->CopyData[i + 1].y, SRCCOPY); // convert by celberus } // MainImageForm->iMainImage->uBitmap->DeleteDC(hDC); SetRect(&r, dp->CopyData[i].x, dp->CopyData[i].y, dp->CopyData[i].x + dp->CopySize.x, dp->CopyData[i].y + dp->CopySize.y); MainImageForm->iMainImage->uBitmap->FillRect(r, PaletteForm->DIB256Palette->GetBGCOLORREF(24)); ::RepaintImage(); if (CopySelect>=dp->CopyCount) CopySelect = dp->CopyCount-1; sbDeleteSelection->Down = false; CopyItem = 0; END_LOG; return 1; } END_LOG; return 0; fail: EXCEPTION_MESSAGE_OK(ec); END_LOG; return 0; } //--------------------------------------------------------------------------- bool __fastcall TMenu3DForm::t3ds_image_copy(TTexpiaBitmap *pBitmap) { BEGIN_LOG("::"); int size, sx, sy, y, i, j; POINT *cpy = NULL; HDC /*mDC = NULL, */cDC = NULL; TData3D *dp = MainImageForm->Data3D; sx = dp->CopySize.x; sy = 0; if (sx + dp->CopySize.x > MainImageForm->iMainImage->uBitmap->Width) { sx = 0; sy = dp->CopySize.y; } for (y = 1; y < dp->CopyCount; y++) { sx += dp->CopySize.x; if (sx + dp->CopySize.x > MainImageForm->iMainImage->uBitmap->Width) { sx = 0; sy += dp->CopySize.y; } } if (dp->CopyDataSize == 0) { size = sizeof(POINT) * 5; if ((dp->CopyData = (POINT *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size))==NULL) goto fail; dp->CopyDataSize = 5; } else if (dp->CopyCount+1 == dp->CopyDataSize){ size = sizeof(POINT) * (dp->CopyDataSize + 5); if ((cpy = (POINT *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size))==NULL) goto fail; memcpy(cpy, dp->CopyData, sizeof(POINT)*dp->CopyDataSize); dp->CopyDataSize += 5; HeapFree(GetProcessHeap(), 0, dp->CopyData); dp->CopyData = cpy; cpy = NULL; } // if ((mDC = MainImageForm->iMainImage->uBitmap->CreateDC())==NULL) goto fail; if ((cDC = pBitmap->CreateDC())==NULL) goto fail; // BitBlt(mDC, sx, sy, dp->CopySize.x, dp->CopySize.y, cDC, 0, 0, SRCCOPY); MainImageForm->iMainImage->uBitmap->UnionBitBlt(cDC, sx, sy, dp->CopySize.x, dp->CopySize.y, 0, 0, SRCCOPY, true); // convert by celberus pBitmap->DeleteDC(cDC); // MainImageForm->iMainImage->uBitmap->DeleteDC(mDC); dp->CopyData[0].x = 0; dp->CopyData[0].y = 0; dp->CopyData[dp->CopyCount].x = sx; dp->CopyData[dp->CopyCount].y = sy; dp->CopyCount++; END_LOG; return true; fail: // if (mDC) { if (cDC) pBitmap->DeleteDC(cDC); // MainImageForm->iMainImage->uBitmap->DeleteDC(mDC); // } END_LOG; return false; } //--------------------------------------------------------------------------- bool __fastcall TMenu3DForm::t3ds_make_copy_image(void) // º¹»ç ¹öư Ŭ¸¯.... { BEGIN_LOG("::"); int i; RECT r; HDC cDC = NULL, sDC = NULL, cmDC = NULL, mDC = NULL; TTexpiaBitmap *c = NULL; TPItemImage * Image = MainImageForm->iMainImage; TData3D *dp = MainImageForm->Data3D; TCursor OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if (dp->CopyCount>0) dp->RemoveCopy(); if (CopyItem == 1) { dp->CopySize = dp->waSize; } else { int l[2] = { dp->waSize.x, dp->waSize.y }; t3ds_auto_copy_size(seCount->Value, l[0], l[1]); dp->CopySize.x = l[0]; dp->CopySize.y = l[1]; } /* if ((c = new TTexpiaBitmap)==NULL) goto fail; if (!c->Create(dp->CopySize.x, dp->CopySize.y, 24)) goto fail; c->ColorSpace = csHLS; if ((cDC = c->CreateDC())==NULL) goto fail; if ((sDC = dp->Source->CreateDC())==NULL) goto fail; SetStretchBltMode(cDC, COLORONCOLOR); StretchBlt(cDC, 0, 0, dp->CopySize.x, dp->CopySize.y, sDC, dp->waStart.x, dp->waStart.y, dp->waSize.x, dp->waSize.y, SRCCOPY); dp->Source->DeleteDC(sDC); sDC = NULL; c->DeleteDC(cDC); cDC = NULL; if (dp->CopyBitmap==NULL) { if ((dp->CopyBitmap = new TTexpiaBitmap)==NULL) goto fail; } if (!dp->CopyBitmap->Create(dp->CopySize.x, dp->CopySize.y, 24)) goto fail; dp->CopyBitmap->Copy(c, SRCCOPY); */ if (dp->MakeCopyBitmap(&c)!=EC_NONE) goto fail; if (dp->MakeCopyMask(Image->Mask)!=EC_NONE) goto fail; SetRect(&r, 0, 0, Image->uBitmap->Width, Image->uBitmap->Height); Image->uBitmap->FillRect(r, PaletteForm->DIB256Palette->GetBGCOLORREF(24)); Image->uBitmap->ConvertColorSpace(csHLS); SetRect(&r, 0, 0, dp->CopySize.x, dp->CopySize.y); if (!Image->uBitmap->CopyToRect(r.left, r.top, dp->CopyBitmap, SRCCOPY)) goto fail; for (i = 0; i <= seCount->Value; i++) { if (!t3ds_image_copy(c)) goto fail; } delete c; c = NULL; Image->uBitmap->ConvertColorSpace(csRGB); if (CopySelect == 0) t_3d_copy_simulation(); ::RepaintImage(); Fabric3DForm->sbSelect->Enabled = true; Screen->Cursor = OldCursor; END_LOG; return true; fail: Screen->Cursor = OldCursor; if (c) { Image->uBitmap->ConvertColorSpace(csRGB); if (dp->CopyMask) { if (cmDC) { if (mDC) Image->Mask->DeleteDC(mDC); dp->CopyMask->DeleteDC(cmDC); } } doDestroy(dp->CopyBitmap) if (cDC) { if (sDC) dp->Source->DeleteDC(sDC); c->DeleteDC(cDC); } delete c; } END_LOG; return false; } //--------------------------------------------------------------------------- //---------- Simulation ----------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::repro_dis(sSimData &sm, int i, int j, int k) { sm.a[i] = sm.pos[j].y - sm.pos[k].y; sm.b[i] = sm.pos[k].x - sm.pos[j].x; sm.c[i] = sm.pos[j].x * sm.pos[k].y - sm.pos[k].x * sm.pos[j].y; sm.sqr[i] = sqrt(sm.a[i] * sm.a[i] + sm.b[i] * sm.b[i]); } //--------------------------------------------------------------------------- bool __fastcall TMenu3DForm::exist_point(TGridData *gd, int i, int j) { BEGIN_LOG("::"); bool bReturn = gd->d->pointer(i, j)->s && gd->d->pointer(i + 1, j)->s && gd->d->pointer(i + 1, j + 1)->s && gd->d->pointer(i, j + 1)->s; END_LOG; return bReturn; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_mean_piece(sSimData &sm, int n) { BEGIN_LOG("::"); int x, y; Byte *MP = 0, *UP = 0; TPlaneVertex pv; pv.Create(sm.pos[0], sm.pos[1], sm.pos[2], sm.pos[3]); repro_dis(sm, 0, 0, 1); repro_dis(sm, 1, 2, 3); repro_dis(sm, 2, 3, 0); repro_dis(sm, 3, 1, 2); if (sm.sqr[0]>0.0 && sm.sqr[1]>0.0 && sm.sqr[2]>0.0 && sm.sqr[3]>0.0) { for (y = pv.start.y; y <= pv.end.y; y++) { MP = sm.tbMask->GetScanLine(y); UP = sm.tbSrc->GetScanLine(y); for (x = pv.start.x; x <= pv.end.x; x++) { if ((MP[x >> 3] & (0x80 >> (x & 7))) == 0) { if (pv.Check(x, y)) { meansum[n] += UP[x * 3 + 1]; meancount[n]++; } } } } } END_LOG; } //--------------------------------------------------------------------------- //void __fastcall TMenu3DForm::t_3d_piece(sSimData &sm, TPBitmap *tbp, int l, int k, int n) void __fastcall TMenu3DForm::t_3d_piece(sSimData &sm, TPBitmap *tbp, int l, int k, int n, POINT fsp) { BEGIN_LOG("::"); int nx, ny; int x, y, px, py, x1, px1;; double lx1, lx2, ly1, ly2, c, s; Byte *IP = 0, *MP = 0, *FP = 0, *UP = 0, IPBuf[3],FPBuf[3]; COLORREF color, IC, FC, co, bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); double overlay = MainImageForm->Data3D->GroupList[n].FOverlay; TPBitmap *fp = tbp; int w = fp->Width; int h = fp->Height; TPlaneVertex pv; pv.Create(sm.pos[0], sm.pos[1], sm.pos[2], sm.pos[3]); repro_dis(sm, 0, 0, 1); repro_dis(sm, 1, 2, 3); repro_dis(sm, 2, 3, 0); repro_dis(sm, 3, 1, 2); if (sm.sqr[0]>0.0 && sm.sqr[1]>0.0 && sm.sqr[2]>0.0 && sm.sqr[3]>0.0) { switch (FullViewForm->Super) { case sOff: for (y = pv.start.y; y < pv.end.y; y++) { IP = sm.tbDst->GetScanLine(y); MP = sm.tbMask->GetScanLine(y); UP = sm.tbSrc->GetScanLine(y); for (x = pv.start.x; x < pv.end.x; x++) { if ((MP[x >> 3] & (0x80 >> (x & 7))) == 0) { if (pv.Check(x, y)) { ly1 = fabs(sm.a[0] * x + sm.b[0] * y + sm.c[0]) / sm.sqr[0]; ly2 = fabs(sm.a[1] * x + sm.b[1] * y + sm.c[1]) / sm.sqr[1]; lx1 = fabs(sm.a[2] * x + sm.b[2] * y + sm.c[2]) / sm.sqr[2]; lx2 = fabs(sm.a[3] * x + sm.b[3] * y + sm.c[3]) / sm.sqr[3]; if (lx1 + lx2 && ly1 + ly2) { nx = lx1 * sm.glx / (lx1 + lx2); ny = ly1 * sm.gly / (ly1 + ly2); // py = (int)(k * sm.gly + ny) % h; // source code before fit point by kjs // px = (int)(l * sm.glx + nx) % w; // to fit point by kjs (point fsp) py = (int)(k * sm.gly + ny + fsp.y) % h; px = (int)(l * sm.glx + nx + fsp.x) % w; x1 = 3 * x; px1 = 3 * px; FP = fp->ScanLine(py); IP[x1] = FP[px1]; if (mean[n] == 0) { c = FP[px1 + 1]; } else { c = FP[px1 + 1] + (UP[3 * x + 1] - mean[n]) * overlay; } if (c < 0.0) IP[x1 + 1] = 0; else if (c >= 256.0) IP[x1 + 1] = 255; else IP[x1 + 1] = c; s = -4.0 * ((double)FP[px1 + 2] / 256.0) * ((double)FP[px1 + 1] / 256.0) * ((double)FP[px1 + 1] / 256.0 - 1.0) * 256.0; if (s < 0.0) IP[x1 + 2] = 0; else if (s >= 256.0) IP[x1 + 2] = 255; else IP[x1 + 2] = s; } } } } sm.tbDst->PutScanLine(y); } break; case sOverlap: MainImageForm->InitOverlap(); case sNormal: for (y = pv.start.y; y < pv.end.y; y++) { IP = sm.tbDst->GetScanLine(y); //¹Ù²Ù°íÀÚÇÏ´Â ¹ÙÅÁ ±×¸² MP = sm.tbMask->GetScanLine(y); // ¸¶½ºÅ© UP = sm.tbSrc->GetScanLine(y); // ¸í¾ÏÀ» ÃßÃâÇϱâÀ§ÇÑ ¹ÙÅÁ±×¸² UP[x1]Àº »ö»ó UP[x1+1]Àº ¸íµµ UP[x1+2]´Â äµµ // L_ConvertColorSpace(UP, pIOutBuf, MainImageForm->Data3D->Source->Width, CCS_HLS, CCS_RGB); for (x = pv.start.x; x < pv.end.x; x++) { co = UP[3 * x] | (UP[3 * x + 1] << 8) | (UP[3 * x + 2] << 16); if (((MP[x >> 3] & (0x80 >> (x & 7))) == 0) && (co != bgc)) { if (pv.Check(x, y)) { ly1 = fabs(sm.a[0] * x + sm.b[0] * y + sm.c[0]) / sm.sqr[0]; ly2 = fabs(sm.a[1] * x + sm.b[1] * y + sm.c[1]) / sm.sqr[1]; lx1 = fabs(sm.a[2] * x + sm.b[2] * y + sm.c[2]) / sm.sqr[2]; lx2 = fabs(sm.a[3] * x + sm.b[3] * y + sm.c[3]) / sm.sqr[3]; if (lx1 + lx2 && ly1 + ly2) { nx = lx1 * sm.glx / (lx1 + lx2); ny = ly1 * sm.gly / (ly1 + ly2); // py = (int)(k * sm.gly + ny) % h; // source code before fit point by kjs // px = (int)(l * sm.glx + nx) % w; // to fit point by kjs (point fsp) py = (int)(k * sm.gly + ny + fsp.y) % h; px = (int)(l * sm.glx + nx + fsp.x) % w; x1 = 3 * x; px1 = 3 * px; FP = fp->ScanLine(py);// ÀÔÇôÁú ÆÐÅÏÀÇ ±×¸² // L_ConvertColorSpace(&IP[x1], &IC, 1, CCS_RGB, CCS_HLS); /// L_ConvertColorSpace(&IC, &IP[x1], 1, CCS_HLS, CCS_RGB); // L_ConvertColorSpace(&color, &color, 1, CCS_HLS, CCS_RGB); // IP[x1 ] = color; // IP[x1 + 1] = (color >> 8) & 0xFF; // IP[x1 + 2] = (color >> 16) & 0xFF; // L_ConvertColorSpace(&FP[px1], pFOutBuf, 1, CCS_RGB, CCS_HLS); // pFOutBuf[1] = pIOutBuf[x1 + 1] * overlay + pFOutBuf[1] * (1.00 - overlay); // L_ConvertColorSpace(pFOutBuf, &FP[px1], 1, CCS_HLS, CCS_RGB); // IP[x1] = MainImageForm->Overlap(IP[x1], FP[px1]); /* GetPixel24(&(IP[x1]), IC); GetPixel24(&(FP[px1]), FC); color = MainImageForm->Overlap(IC, FC); SetPixel24(&(IP[x1]), color); */ IP[x1] = FP[px1]; //ÀÏ´Ü ÆÐÅÏÀÇ »ö»óÀ» ±×´ë·Î µÎ°í if (mean[n] == 0) { c = FP[px1 + 1]; } else { c = FP[px1 + 1] + (UP[3 * x + 1] - mean[n]) * overlay; } if (c < 0.0) IP[x1+1] = 0; else if (c >= 256.0) IP[x1+1] = 255; else IP[x1+1] = c; // ÆÐÅÏÀÇ ¸í¾ÏÀ» Àû´çÈ÷ ¿øº»°ú ºñ½ÁÇÏ°Ô Á¶ÀýÇϰí s = -4.0 * ((double)FP[px1 + 2] / 256.0) * ((double)FP[px1 + 1] / 256.0) * ((double)FP[px1 + 1] / 256.0 - 1.0) * 256.0; if (s < 0.0) IP[x1+2] = 0; // ÆÐÅÏÀÇ Ã¤µµ¸¦ Àû´çÈ÷ ¸ÂÃá´Ù else if (s >= 256.0) IP[x1+2] = 255; else IP[x1+2] = s; /* // // L_ConvertColorSpace(FPBuf, &FP[px1], 1, CCS_HLS,CCS_RGB); // // L_ConvertColorSpace(&IP[x1], IPBuf, 1, CCS_HLS,CCS_RGB); // // Byte *ip,*fp;ip=IPBuf;fp=&FP[px1]; // // GetPixel24(fp, FC); // // GetPixel24(ip, IC); // // FC = FPBuf[0] | (FPBuf[1] << 8) | (FPBuf[2] << 16); // IC = IP[x1] | (IP[x1+1] << 8) | (IP[x1+2] << 16); // color = MainImageForm->Overlap(IC, FC); //ÀûÀýÈ÷ º¯ÇüµÈ ÆÐÅÏÀÇ ±×¸²À» ¿øº»ÀÇ ±×¸²°ú ¿À¹ö·¦ÇÑ´Ù IP[x1 ] = color; // IP[x1+1] = (color >> 8) & 0xFF; // IP[x1+ 2] = (color >> 16) & 0xFF; // // SetPixel24(ip, color); // // L_ConvertColorSpace(ip, &IP[x1], 1 , CCS_RGB,CCS_HLS); // */ //¿À¹ö·¦À» ÆÐºê¸¯ÀÇ Á¶°¢¸¶´Ù ½Ç½ÃÇÒ °æ¿ì Á¶°¢³¢¸® °ãÄ¡´Â µî ºÎÀÛ¿ëÀÌ ½ÉÇÏ¿© Á¶°¢Á¶°¢ ½ÃÇàÇÏÁö ¾Ê°í ÇѲ¨¹ø¿¡ ½Ç½ÃÇϱâÀ§ÇØ ¸·À½ //by jeegeo } } } } sm.tbDst->PutScanLine(y); } MainImageForm->ExitOverlap(); //case overlap ¿¡¼­¸¸ ½ÇÇàµÉ²¬? break; case sGauze: for (y = pv.start.y; y < pv.end.y; y++) { IP = sm.tbDst->GetScanLine(y); MP = sm.tbMask->GetScanLine(y); UP = sm.tbSrc->GetScanLine(y); for (x = pv.start.x; x < pv.end.x; x++) { if (((MP[x >> 3] & (0x80 >> (x & 7))) == 0) && ((x + y) & 1)) { if (pv.Check(x, y)) { ly1 = fabs(sm.a[0] * x + sm.b[0] * y + sm.c[0]) / sm.sqr[0]; ly2 = fabs(sm.a[1] * x + sm.b[1] * y + sm.c[1]) / sm.sqr[1]; lx1 = fabs(sm.a[2] * x + sm.b[2] * y + sm.c[2]) / sm.sqr[2]; lx2 = fabs(sm.a[3] * x + sm.b[3] * y + sm.c[3]) / sm.sqr[3]; if (lx1 + lx2 && ly1 + ly2) { nx = lx1 * sm.glx / (lx1 + lx2); ny = ly1 * sm.gly / (ly1 + ly2); // py = (int)(k * sm.gly + ny) % h; // source code before fit point by kjs // px = (int)(l * sm.glx + nx) % w; // tp fit point by kjs (point fsp) py = (int)(k * sm.gly + ny + fsp.y) % h; px = (int)(l * sm.glx + nx + fsp.x) % w; x1 = 3 * x; px1 = 3 * px; FP = fp->ScanLine(py); IP[x1] = FP[px1]; if (mean[n] == 0) { c = FP[px1 + 1]; } else { c = FP[px1 + 1] + (UP[3 * x + 1] - mean[n]) * overlay; } if (c < 0.0) IP[x1 + 1] = 0; else if (c >= 256.0) IP[x1 + 1] = 255; else IP[x1 + 1] = c; s = -4.0 * ((double)FP[px1 + 2] / 256.0) * ((double)FP[px1 + 1] / 256.0) * ((double)FP[px1 + 1] / 256.0 - 1.0) * 256.0; if (s < 0.0) IP[x1 + 2] = 0; else if (s >= 256.0) IP[x1 + 2] = 255; else IP[x1 + 2] = s; } } } } sm.tbDst->PutScanLine(y); } break; } } END_LOG; } //--------------------------------------------------------------------------- TPException __fastcall TMenu3DForm::T3DRead(TFMReadParameter rp, bool changeFileFormat) { BEGIN_LOG("::"); //============================================= by playzzang ACADEMY ¿¡¼­ ¿¡·¯°¡ ³­´Ù.(Define ¼³Á¤ ÇßÀ½) TCursor cur; TMainImageForm *Child = NULL; TPException ec = EC_NONE; cur = Screen->Cursor; Screen->Cursor = crHourGlass; // MainMenuForm->ExitForm(1); if (MainImageForm) MainImageForm->iMainImage->Deactivate(); if ((Child = new TMainImageForm(Application))==NULL) { ec = EC_FORM_NOT_CREATE; SAVE_EXCEPTION(ec); goto fail; } if ((ec = Child->InitFormFile(rp.DirName, rp.FileName, rp.ExtIndex, 24, false)) != EC_NONE) goto fail; Screen->Cursor = cur; END_LOG; return EC_NONE; fail: if (Child) delete Child; Screen->Cursor = cur; END_LOG; return ec; //============================================== } //--------------------------------------------------------------------------- //String __fastcall TMenu3DForm::T3DFileName(String FileName, // TGraphicFileFormat ExtIndex) String __fastcall TMenu3DForm::T3DFileName(String FileName, TGraphicFileFormat ExtIndex) { BEGIN_LOG("::"); /* PChar s; int FileNameLength, last1, last2, last3, last4; Char FileIndex1, FileIndex2, FileIndex3, FileIndex4; //=============================================================== FileNameLength = FileName.Length(); if(FileNameLength > 4){ last1 = FileNameLength-3; last2 = FileNameLength-2; last3 = FileNameLength-1; last4 = FileNameLength; FileIndex1 = '.'; FileIndex2 = 't'; FileIndex3 = '3'; FileIndex4 = 'd'; if((FileIndex1 == FileName[last1])&&(FileIndex2 == FileName[last2]) && (FileIndex3 == FileName[last3])&&(FileIndex4 == FileName[last4])){ s = "PASS"; }else s=NULL; }else s=NULL; //=============================================================== // s = AnsiStrScan(FileName.c_str(), '.'); if (s == NULL) { String fn = FileName + ".t3d"; return fn; } else { return FileName; } */ //String fileExtension; String fileExtension; switch(ExtIndex) { case gffT3D: fileExtension = String(".t3d"); break; #ifdef TRIAL case gffT3D_TRIAL: fileExtension = String(".tt3d"); break; default : fileExtension = String(".tt3d"); break; #else case gffT3D10: fileExtension = String(".t3d"); break; default : fileExtension = String(".t3d"); break; #endif } if (LowerCase(ExtractFileExt(FileName)) == fileExtension) { END_LOG; return FileName; } else { END_LOG; return FileName + fileExtension; } } //--------------------------------------------------------------------------- //TPException __fastcall TMenu3DForm::T3DSave(String DirName, String FileName, // TGraphicFileFormat ExtIndex, TCompressMethod cm) TPException __fastcall TMenu3DForm::T3DSave(String DirName, String FileName, TGraphicFileFormat ExtIndex, TCompressMethod cm) { BEGIN_LOG("::"); //========================================== by playzzang ACADEMY ¿¡¼­ ¿¡·¯°¡ ³­´Ù.(Define ¼³Á¤ ÇßÀ½) END_LOG; return MainImageForm->SaveToFile(DirName, FileName, ExtIndex, cm); //========================================== } //--------------------------------------------------------------------------- //bool __fastcall TMenu3DForm::simulation(sSimData &sm, TGridData *gd) bool __fastcall TMenu3DForm::simulation(sSimData &sm, TGridData *gd, bool bpoint) { BEGIN_LOG("::"); int i, j, k, l, n, cnt, tmp=0; TCursor OldCursor; POINT ratio; POINT sratio; TData3D *dp = MainImageForm->Data3D; TPBitmap *tbp = NULL; TTexpiaBitmap *ttbp = NULL; POINT fsp; cnt = 0; for (i = 0; i < T3DF_CNT; i++) { if (dp->GroupList[i].FIndex>0) { if (dp->fn[i].cnt) { for (j = 0; j < dp->fn[i].cnt; j++) { n = dp->fn[i].sn[j]; cnt += (gd[n].cx-1)*(gd[n].cy-1); } } tmp++; } } StatusProgress->Maximum = 3*cnt; cnt = 0; if (!sm.tbDst->StartScanLine()) goto fail; if (!sm.tbMask->StartScanLine()) goto fail; if (!sm.tbSrc->StartScanLine()) goto fail; if (!(dp->GroupList[0].Filter&0x80) && tmp) { if ((ttbp = new TTexpiaBitmap) == NULL) goto fail; ttbp->ColorSpace = csHLS; if ((tbp = new TPBitmap) == NULL) goto fail; for (i = 0; i < T3DF_CNT; i++) { if (dp->GroupList[i].FIndex>0) { ratio = dp->GroupList[i].FRatio; if (dp->fn[i].cnt) { //meancount[i] = 0; meansum[i] = 0; mean[i] = 0; sm.buf.x = sm.buf.y = 0; if (!ttbp->Create(dp->GroupList[i].FFabric->Width,dp->GroupList[i].FFabric->Height,24)) goto fail; ttbp->LoadFromMemory(dp->GroupList[i].FFabric->ScanLine(), dp->GroupList[i].FFabric->BytesPerLine); ttbp->ConvertColorSpace(csRGB); L_AverageFilterBitmap(ttbp->Handle,dp->GroupList[i].Filter); #ifdef TRIAL HDC dcDst = ttbp->CreateDC(); PaintWaterMark(dcDst, 0, 0, ttbp->Width, ttbp->Height, 1, 2);//, random(2) ? random(30)+10 : random(30)+320); ttbp->DeleteDC(dcDst); #endif ttbp->ConvertColorSpace(csHLS); if (!tbp->Create(dp->GroupList[i].FFabric->Width,dp->GroupList[i].FFabric->Height,24)) goto fail; tbp->Lock(); ttbp->SaveToMemory(tbp->ScanLine(), tbp->BytesPerLine); for (j = 0; j < dp->fn[i].cnt; j++) { n = dp->fn[i].sn[j]; meancount[i] = 0; meansum[i] = 0; mean[i] = 0; if (dp->SizeItem == 1) { // for fit size by kjs -- Each Size sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, true); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else if (dp->SizeItem == 2) { // for fit size by kjs -- Model Size // source code sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, false); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else { sm.glx = 100.0 * gd[n].lx / (double)ratio.x; sm.gly = 100.0 * gd[n].ly / (double)ratio.y; } //===================================== for (k = 0; k < gd[n].cy - 1; k++) { for (l = 0; l < gd[n].cx - 1; l++) { StatusProgress->Position = cnt; if (exist_point(&gd[n], l, k)) { sm.pos[0].x = gd[n].d->pointer(l, k )->x; sm.pos[0].y = gd[n].d->pointer(l, k )->y; sm.pos[1].x = gd[n].d->pointer(l + 1, k )->x; sm.pos[1].y = gd[n].d->pointer(l + 1, k )->y; sm.pos[2].x = gd[n].d->pointer(l + 1, k + 1)->x; sm.pos[2].y = gd[n].d->pointer(l + 1, k + 1)->y; sm.pos[3].x = gd[n].d->pointer(l, k + 1)->x; sm.pos[3].y = gd[n].d->pointer(l, k + 1)->y; t_3d_mean_piece(sm, i); } cnt++; } } //} if (meancount[i]) mean[i] = (double)meansum[i] / (double)meancount[i]; //sm.buf.x = sm.buf.y = 0; /* if (!ttbp->Create(dp->GroupList[i].FFabric->Width,dp->GroupList[i].FFabric->Height,24)) goto fail; ttbp->LoadFromMemory(dp->GroupList[i].FFabric->ScanLine(), dp->GroupList[i].FFabric->BytesPerLine); ttbp->ConvertColorSpace(csRGB); L_AverageFilterBitmap(ttbp->Handle,dp->GroupList[i].Filter); ttbp->ConvertColorSpace(csHLS); if (!tbp->Create(dp->GroupList[i].FFabric->Width,dp->GroupList[i].FFabric->Height,24)) goto fail; tbp->Lock(); ttbp->SaveToMemory(tbp->ScanLine(), tbp->BytesPerLine); */ //for (j = 0; j < dp->fn[i].cnt; j++) { //n = dp->fn[i].sn[j]; if (dp->SizeItem == 1) { //for fit size by kjs sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, true); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else if (dp->SizeItem == 2) { sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, false); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else { sm.glx = 100.0 * gd[n].lx / (double)ratio.x; sm.gly = 100.0 * gd[n].ly / (double)ratio.y; } //================================================ if (bpoint) // for fit point by kjs fsp = Find_sp_Fabric(n, sm, tbp->Width, tbp->Height); else fsp = Point(0, 0); for (k = 0; k < gd[n].cy - 1; k++) { for (l = 0; l < gd[n].cx - 1; l++) { StatusProgress->Position = cnt; if (exist_point(&gd[n], l, k)) { sm.pos[0].x = gd[n].d->pointer(l, k )->x; sm.pos[0].y = gd[n].d->pointer(l, k )->y; sm.pos[1].x = gd[n].d->pointer(l + 1, k )->x; sm.pos[1].y = gd[n].d->pointer(l + 1, k )->y; sm.pos[2].x = gd[n].d->pointer(l + 1, k + 1)->x; sm.pos[2].y = gd[n].d->pointer(l + 1, k + 1)->y; sm.pos[3].x = gd[n].d->pointer(l, k + 1)->x; sm.pos[3].y = gd[n].d->pointer(l, k + 1)->y; // t_3d_piece(sm, tbp, l, k, i); t_3d_piece(sm, tbp, l, k, i, fsp); // for fit point by kjs } cnt += 2; } } } tbp->Unlock(); } } } delete ttbp; ttbp = NULL; delete tbp; tbp = NULL; } else { for (i = 0; i < T3DF_CNT; i++) { if (dp->GroupList[i].FIndex>0) { #ifdef TRIAL TTexpiaBitmap *ttbp = NULL; ttbp = new TTexpiaBitmap; ttbp->ColorSpace = csHLS; ttbp->Create(dp->GroupList[i].FFabric->Width, dp->GroupList[i].FFabric->Height,24); ttbp->LoadFromMemory(dp->GroupList[i].FFabric->ScanLine(), dp->GroupList[i].FFabric->BytesPerLine); ttbp->ConvertColorSpace(csRGB); HDC dcDst = ttbp->CreateDC(); PaintWaterMark(dcDst, 0, 0, ttbp->Width, ttbp->Height, 1, 2);//, random(2) ? random(30)+10 : random(30)+320); ttbp->DeleteDC(dcDst); ttbp->ConvertColorSpace(csHLS); if ((tbp = new TPBitmap) == NULL) goto fail; if (!tbp->Create(dp->GroupList[i].FFabric->Width,dp->GroupList[i].FFabric->Height,24)) goto fail; tbp->Lock(); ttbp->SaveToMemory(tbp->ScanLine(), tbp->BytesPerLine); delete ttbp; #endif ratio = dp->GroupList[i].FRatio; if (dp->fn[i].cnt) { meancount[i] = 0; meansum[i] = 0; mean[i] = 0; sm.buf.x = sm.buf.y = 0; for (j = 0; j < dp->fn[i].cnt; j++) { meancount[i] = 0; meansum[i] = 0; mean[i] = 0; n = dp->fn[i].sn[j]; if (dp->SizeItem == 1) { //for fit size by kjs sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, true); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else if (dp->SizeItem == 2) { sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, false); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else { sm.glx = 100.0 * gd[n].lx / (double)ratio.x; sm.gly = 100.0 * gd[n].ly / (double)ratio.y; } for (k = 0; k < gd[n].cy - 1; k++) { for (l = 0; l < gd[n].cx - 1; l++) { StatusProgress->Position = cnt; if (exist_point(&gd[n], l, k)) { sm.pos[0].x = gd[n].d->pointer(l, k )->x; sm.pos[0].y = gd[n].d->pointer(l, k )->y; sm.pos[1].x = gd[n].d->pointer(l + 1, k )->x; sm.pos[1].y = gd[n].d->pointer(l + 1, k )->y; sm.pos[2].x = gd[n].d->pointer(l + 1, k + 1)->x; sm.pos[2].y = gd[n].d->pointer(l + 1, k + 1)->y; sm.pos[3].x = gd[n].d->pointer(l, k + 1)->x; sm.pos[3].y = gd[n].d->pointer(l, k + 1)->y; t_3d_mean_piece(sm, i); } cnt++; } } //} if (meancount[i]) mean[i] = (double)meansum[i] / (double)meancount[i]; //sm.buf.x = sm.buf.y = 0; //for (j = 0; j < dp->fn[i].cnt; j++) { //n = dp->fn[i].sn[j]; if (dp->SizeItem == 1) { //for fit size by kjs sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, true); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else if (dp->SizeItem == 2) { sratio = GetRatio(i, dp->GroupList[i].FFabric->Width, false); if (sratio.x < 0 || sratio.y < 0) goto fail; sm.glx = 100.0 * gd[n].lx / (double)sratio.x; sm.gly = 100.0 * gd[n].ly / (double)sratio.y; } else { sm.glx = 100.0 * gd[n].lx / (double)ratio.x; sm.gly = 100.0 * gd[n].ly / (double)ratio.y; } if (bpoint) // for fit point by kjs fsp = Find_sp_Fabric(n, sm, dp->GroupList[i].FFabric->Width, dp->GroupList[i].FFabric->Height); else fsp = Point(0, 0); for (k = 0; k < gd[n].cy - 1; k++) { for (l = 0; l < gd[n].cx - 1; l++) { StatusProgress->Position = cnt; if (exist_point(&gd[n], l, k)) { sm.pos[0].x = gd[n].d->pointer(l, k )->x; sm.pos[0].y = gd[n].d->pointer(l, k )->y; sm.pos[1].x = gd[n].d->pointer(l + 1, k )->x; sm.pos[1].y = gd[n].d->pointer(l + 1, k )->y; sm.pos[2].x = gd[n].d->pointer(l + 1, k + 1)->x; sm.pos[2].y = gd[n].d->pointer(l + 1, k + 1)->y; sm.pos[3].x = gd[n].d->pointer(l, k + 1)->x; sm.pos[3].y = gd[n].d->pointer(l, k + 1)->y; #ifdef TRIAL t_3d_piece(sm, tbp, l, k, i, fsp); #else t_3d_piece(sm, dp->GroupList[i].FFabric, l, k, i, fsp); #endif } cnt += 2; } } } } #ifdef TRIAL if (tbp) { delete tbp; tbp = NULL; } #endif } } } sm.tbSrc->StopScanLine(); sm.tbMask->StopScanLine(); sm.tbDst->StopScanLine(); StatusProgress->End(); END_LOG; return true; fail: //===================================== for fit size by kjs if (ttbp) delete ttbp; //===================================== sm.tbSrc->StopScanLine(); sm.tbMask->StopScanLine(); sm.tbDst->StopScanLine(); if (!tmp) { SAVE_EXCEPTION(EC_3D_FILTER); EXCEPTION_MESSAGE_OK(EC_3D_FILTER); } // else EXCEPTION_MESSAGE_OK(EC_MEMORY_LACK); // ´Ù¸¥ ºÎºÐ¿¡¼­ ¸Þ¼¼Áö È£ÃâÀ» ÇϹǷΠµÎ¹ø ÇÒ Çʿ䰡 ¾ø´Ù. END_LOG; return false; } //--------------------------------------------------------------------------- // Public Method //--------------------------------------------------------------------------- TPException __fastcall TMenu3DForm::InitForm() { BEGIN_LOG("::"); int i; TUnionBitmap *tb = MainImageForm->iMainImage->uBitmap; // convert by celberus TData3D *dp = MainImageForm->Data3D; TPException ec = EC_NONE; int btn; if (dp==NULL) { SAVE_EXCEPTION(EC_MEMORY_LACK); return EC_MEMORY_LACK; } CopyPanel->Left = 0; CopyPanel->Top = MainPanel->Height; sbMFabric_Down = false; sbMGrid->Down = false; sbMCopy->Down = false; sbMCopy->Enabled = MainImageForm->Data3D->CopyCount>0; MainMenuForm->SubCopy1->Enabled = MainImageForm->Data3D->CopyCount>0; ClientWidth = 248; //ParentHeight = Parent->Height + 20; ClientHeight = MainPanel->Height; //Parent->Height = ParentHeight + ClientHeight; T3d.type = T3D_DEF; T3d.gc[0] = SET3DCOLOR[0]; T3d.gc[1] = SET3DCOLOR[1]; T3d.gc[2] = SET3DCOLOR[2]; T3d.gc[3] = SET3DCOLOR[3]; T3d.gc[4] = SET3DCOLOR[4]; T3d.gc[5] = SET3DCOLOR[5]; T3d.gc[6] = SET3DCOLOR[6]; T3d.size.x = 20; T3d.size.y = 20; T3d.step = 0; T3d.def = T3D_OFF; T3d.fabric = 0; T3d.n = 0; CopyItem = 0; //========================= for fit size by kjs lengthstep = 0; //========================= for (i = 0; i < T3DF_CNT; i++) { meancount[i] = 0; meansum[i] = 0; mean[i] = 0; } if (dp->Lock()==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (Fabric3DForm==NULL) { if ((Fabric3DForm = new TFabric3DForm(NULL))==NULL) { ec = EC_FORM_NOT_CREATE; SAVE_EXCEPTION(ec); goto fail; } // if ((Fabric3DForm = new TFabric3DForm(MainForm))==NULL) { ec = EC_FORM_NOT_CREATE; SAVE_EXCEPTION(ec); goto fail; } Fabric3DForm->FilterComboBox->Filter = #ifdef TRIAL "Texpro Textile 256 Colors Trial File (*.ttex)|*.ttex|" "Texpro Textile Full Colors Trial File (*.ttfc)|*.ttfc|" "Texpro Weave Trial File (*.twea)|*.twea|" "Texpro Knit Trial File (*.tknt)|*.tknt|" #endif "Texpro Textile 256 Colors File (*.tex)|*.tex|" "Texpro Textile Full Colors File (*.tfc)|*.tfc|" "Microsoft Windows Bitmap (*.bmp)|*.bmp|" "Macintosh PICT (*.pct)|*.pct|" "PC Paintbrush File Format (*.pcx)|*.pcx|" "PNG (*.png)|*.png|" "PSD (*.psd)|*.psd|" "SUN Raster (*.ras)|*.ras|" "Targa Image File (*.tga)|*.tga|" "TIFF uncomp (*.tif)|*.tif|" "Drawing Interchange File Format (*.dxf)|*.dxf|" "JPEG (*.jpg)|*.jpg|" "Texpro Knit File (*.knt)|*.knt|" "Texpro Weave File (*.wea)|*.wea|"; Fabric3DForm->Parent = MainForm; } if (dp->Source==NULL) { if (dp->bWorkArea) { tb->RgnBitmap->RemoveRegion(); // convert by celberus dp->bWorkArea = false; } if ((dp->Source = new TUnionBitmap)==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } // convert by celberus if (!dp->Source->Create(tb->Width, tb->Height, 24)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } dp->Source->Copy(tb, SRCCOPY); if (!dp->Source->ConvertColorSpace(csHLS)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } } else { if (MainImageForm->Modify) { if(MainImageForm->T3DAutoSave)btn = mrYes; else btn = MessageDlg(IDS_MESSAGE_NEWMODEL, mtInformation, TMsgDlgButtons()<bWorkArea) { tb->RgnBitmap->RemoveRegion(); // convert by celberus dp->bWorkArea = false; } if (!dp->Source->Create(tb->Width, tb->Height, 24)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!tb->ConvertColorSpace(csHLS)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } dp->Source->Copy(tb, SRCCOPY); if (!tb->ConvertColorSpace(csRGB)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } /* } else { tb->Copy(dp->Source, SRCCOPY); if (!tb->ConvertColorSpace(csRGB)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } MainImageForm->iMainImage->Repaint(); */ } } } END_LOG; return EC_NONE; fail: if (Fabric3DForm) { if (dp->Source) { delete dp->Source; dp->Source = NULL; } delete Fabric3DForm; Fabric3DForm = NULL; } END_LOG; return ec; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ExitForm(TMainImageForm *mif) { BEGIN_LOG("::"); if (mif->Data3D) mif->Data3D->Unlock(); ExitItem(); RemoveData(); ::RepaintImage(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::RemoveData() { BEGIN_LOG("::"); int i; t_3d_menu_free(); Undo.Initial(); T3d.step = 0; T3d.col = T3d.row = 0; T3d.fabric = 0; T3d.n = 0; doDestroy(Fabric3DForm) END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::iMainImageMouseDown(TMouseButton Button, TShiftState Shift, int X, int Y) { BEGIN_LOG("::"); RECT rc; pBITMAPHANDLE bh; RGNXFORM XForm; TData3D *dp = MainImageForm->Data3D; int i; TCursor OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; Lsx = X; Lsy = Y; if (Item==0) { if (T3d.type == T3D_DEF && T3d.def == T3D_DNEW) create_3d_grid(); else if (T3d.type == T3D_BASE) t_3d_base_choice(0); else if (T3d.type == T3D_MODI) { if (isRotate) { isMove = true; isRotate = false; } else if (isMove) { isMove = false; set.x = X; set.y = Y; Set_Moved_Grid(); if (rbMove->Checked) { T3d.def = T3D_DDEL; clear_block(); t3d_grid_f_s(); // delete fn[], sn[] dp->GridCount--; for (i = T3d.n; i < dp->GridCount; i++) { dp->GridData[i].Copy(dp->GridData[i + 1], true); } T3d.n = dp->GridCount; if (dp->GridCount == 0) T3d.n = 0; else if (T3d.n >= dp->GridCount) T3d.n = dp->GridCount - 1; MainImageForm->iMainImage->Invalidate(); // T3d.def = T3D_OFF; // t_3d_view_menu(); T3d.def = T3D_BASE; } ptAngle->Visible = false; ClientHeight = MainPanel->Height + GBasePanel->Height + pnNewGrid->Height - ptAngle->Height; } else t_3d_modify_choice(0); // if (T3d.def == T3D_DNEW) t_3d_modify_choice(0); } else if (T3d.type == T3D_FUNC) t_3d_function_choice(); } else if (Item==2) { if (MainImageForm->Data3D->CopyCount>0) { if (CopyItem == 3) { t3ds_select_copy(); } else if (CopyItem == 5) { t3ds_select_remove(); } } else { if (CopyItem == 6) { if (define_3d_box()==0) { bool f = true; int n, x, y, sx, sy, ex, ey; TCoordi *d; for (n=0; nGridCount; n++) { for (y=0; yGridData[n].cy; y++) { for (x=0; xGridData[n].cx; x++) { d = dp->GridData[n].d->pointer(x, y); if (d->s) { if (f) { sx = ex = d->x; sy = ey = d->y; f = false; } else { if (d->xx; if (d->yy; if (d->x>ex) ex = d->x; if (d->y>ey) ey = d->y; } } } } } dp->bWorkArea = true; dp->waStart.x = tWindow.s.x < sx ? tWindow.s.x : sx; dp->waStart.y = tWindow.s.y < sy ? tWindow.s.y : sy; dp->waSize.x = (tWindow.s.x + tWindow.size.x - 1 > ex ? tWindow.s.x + tWindow.size.x - 1 : ex) - dp->waStart.x + 1; dp->waSize.y = (tWindow.s.y + tWindow.size.y - 1 > ey ? tWindow.s.y + tWindow.size.y - 1 : ey) - dp->waStart.y + 1; rc.left = dp->waStart.x; rc.top = dp->waStart.y; rc.right = dp->waStart.x + dp->waSize.x; rc.bottom = dp->waStart.y + dp->waSize.y; MainImageForm->iMainImage->uBitmap->RgnBitmap->PutRegion(rc); MainImageForm->iMainImage->OutlineBitmapRgn(MainImageForm->WorkArea->bComplex); MainImageForm->iMainImage->Repaint(); ExitCopyItem(); } } } } else if (Item == 3) { // CopySelect = t3dcpy_choice_number(); // source code... //========================================= // for fitting size and point by kjs if (Fabric3DForm->DoSetPoint()) { Set_s_point_LP(X, Y); // set point for fitting point by kjs MainImageForm->iMainImage->Invalidate(); // ¼±ÅÃÇÑ Á¡À» º¸¿©ÁÖ±â À§Çؼ­.... MainImageForm->iMainImage->Repaint(); } else if ((MainImageForm->Data3D->SizeItem > 0) && Fabric3DForm->sbStandard->Down) { if (lengthstep && Fabric3DForm->Visible) { // set size for fitting size by kjs MainImageForm->Data3D->I_Length = sqrt((lsp.x-X)*(lsp.x-X) + (lsp.y-Y)*(lsp.y-Y)); lengthstep = 0; } else if (Fabric3DForm->Visible){ lsp = Point(X, Y); lengthstep = 1; } } else { //============================================================================== lhskys 1¹ø ¹öư ¼± ±ß±â if (Fabric3DForm->sbSelect->Down){ // 2¹ø ¹öư ¼±Åà if (Button==mbMiddle || (Shift.Contains(ssShift) && Button==mbLeft)) CopySelect = t3dcpy_choice_number(); // source code.... else if(Shift.Contains(ssLeft)){ if (lengthstep) { // set size for fitting size by kjs MainImageForm->Data3D->I_Length = sqrt((lsp.x-X)*(lsp.x-X) + (lsp.y-Y)*(lsp.y-Y)); lengthstep = 0; } else { lsp = Point(X, Y); lengthstep = 1; } } } else { CopySelect = t3dcpy_choice_number(); // source code.... } //============================================================================== lhskys ¿©±â ±îÁö } //========================================= // for fitting size and point by kjs } MainImageForm->Modify = true; Screen->Cursor = OldCursor; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::iMainImageMouseMove(TShiftState Shift, int X, int Y) { BEGIN_LOG("::"); Extended tmp; Lsx = X; Lsy = Y; if ((MainImageForm->Data3D->SizeItem > 0) && (lengthstep > 0)) { // for fit size by kjs MainImageForm->iMainImage->Repaint(); // Each Size and Model size..... MainImageForm->DrawLineLocate(lsp, Point(X,Y)); } else { // source code before coding for fitting size and point which is requested by Japan if (isRotate) { Find_Center(); Find_Angle(X, Y); tmp = (Extended)RadToDeg(theta); if (tmp < 0) tmp = 360 + tmp; edAngle->Text = IntToStr((int)tmp); //2001.3.27. lhskys C++ Builder 5 ¿¡¼­ // edAngle->Text = IntToStr(tmp); isRotate = true; isMove = false; MainImageForm->iMainImage->Repaint(); Rotate_Grid(); } if (isMove) { MainImageForm->iMainImage->Repaint(); Move_Grid(X, Y); } if (Item==0) { if (T3d.type == T3D_DEF) { if (T3d.def == T3D_DNEW) { if (T3d.step == 1) { if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; } } } else if (T3d.type == T3D_BASE) t_3d_base_choice(1); else if (T3d.type == T3D_MODI) t_3d_modify_choice(1); else if (T3d.type == T3D_FUNC) { if (T3d.step == 1) { if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; } } } else if (Item==2) { if (CopyItem == 6) { if (T3d.step == 1) { if (IsDraw) MainImageForm->DrawRectangleLocate(Temp); Temp.right = X; Temp.bottom = Y; MainImageForm->DrawRectangleLocate(Temp); IsDraw = true; } } } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Move_Grid(int X, int Y) { BEGIN_LOG("::"); TCoordi s, e; int i, j; TData3D *dp = MainImageForm->Data3D; TGridData *gp; HDC dc = NULL; HPEN hOldPen; dc = MainImageForm->iMainImage->Canvas->Handle; hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[0]].hPen); #ifdef TPDEBUG if (hOldPen == NULL) SHOWDEBUG; #endif gp = &dp->GridData[T3d.n]; for (i = 1; i < gp->cx; i++) { s = Trans_Rotate_Move(gp->d->pointer(i-1, 0), X, Y); e = Trans_Rotate_Move(gp->d->pointer(i, 0), X, Y); draw_3d_line(dc, &s, &e); s = Trans_Rotate_Move(gp->d->pointer(i-1, gp->cy-1), X, Y); e = Trans_Rotate_Move(gp->d->pointer(i, gp->cy-1), X, Y); draw_3d_line(dc, &s, &e); } for (j = 1; j < gp->cy; j++) { s = Trans_Rotate_Move(gp->d->pointer(0, j-1), X, Y); e = Trans_Rotate_Move(gp->d->pointer(0, j), X, Y); draw_3d_line(dc, &s, &e); s = Trans_Rotate_Move(gp->d->pointer(gp->cx-1, j-1), X, Y); e = Trans_Rotate_Move(gp->d->pointer(gp->cx-1, j), X, Y); draw_3d_line(dc, &s, &e); } SelectObject(dc, hOldPen); END_LOG; return; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Rotate_Grid() { BEGIN_LOG("::"); TCoordi s, e; int i, j; TData3D *dp = MainImageForm->Data3D; TGridData *gp; HDC dc = NULL; HPEN hOldPen; dc = MainImageForm->iMainImage->Canvas->Handle; hOldPen = (HPEN)SelectObject(dc, GridColorSet[T3d.gc[0]].hPen); #ifdef TPDEBUG if (hOldPen == NULL) SHOWDEBUG; #endif gp = &dp->GridData[T3d.n]; for (i = 1; i < gp->cx; i++) { s = Trans_Rotate(gp->d->pointer(i-1, 0)); e = Trans_Rotate(gp->d->pointer(i, 0)); draw_3d_line(dc, &s, &e); s = Trans_Rotate(gp->d->pointer(i-1, gp->cy-1)); e = Trans_Rotate(gp->d->pointer(i, gp->cy-1)); draw_3d_line(dc, &s, &e); } for (j = 1; j < gp->cy; j++) { s = Trans_Rotate(gp->d->pointer(0, j-1)); e = Trans_Rotate(gp->d->pointer(0, j)); draw_3d_line(dc, &s, &e); s = Trans_Rotate(gp->d->pointer(gp->cx-1, j-1)); e = Trans_Rotate(gp->d->pointer(gp->cx-1, j)); draw_3d_line(dc, &s, &e); } SelectObject(dc, hOldPen); END_LOG; return; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Find_Angle(int X, int Y) { BEGIN_LOG("::"); double dx, dy, temp; dx = (double) X - (double) center.x; dy = (double) Y - (double) center.y; if (dx){ temp = dy/dx; if (dy == 0) { if (dx > 0) theta = 0; else theta = 3.141592; } else { theta = atan(temp); if (dx < 0) { theta = theta + 3.141592; } } } else { if (dy > 0) theta = 3.141592/2; else theta = 3*3.141592/2; } END_LOG; } //--------------------------------------------------------------------------- TCoordi __fastcall TMenu3DForm::Trans_Rotate(TCoordi *gd) { BEGIN_LOG("::"); TCoordi tCoord; TPoint tPoint; tPoint.x = gd->x - center.x; tPoint.y = gd->y - center.y; tCoord.x = cos(theta)*tPoint.x - sin(theta)*tPoint.y + center.x; tCoord.y = sin(theta)*tPoint.x + cos(theta)*tPoint.y + center.y; END_LOG; return tCoord; } //--------------------------------------------------------------------------- TCoordi __fastcall TMenu3DForm::Trans_Rotate_Move(TCoordi *gd, int X, int Y) { BEGIN_LOG("::"); TCoordi tCoord; TPoint tPoint; tPoint.x = gd->x - center.x; tPoint.y = gd->y - center.y; tCoord.x = cos(theta)*tPoint.x - sin(theta)*tPoint.y + X; tCoord.y = sin(theta)*tPoint.x + cos(theta)*tPoint.y + Y; END_LOG; return tCoord; } //--------------------------------------------------------------------------- TPoint __fastcall TMenu3DForm::Find_Center() { BEGIN_LOG("::"); int i, j, meanX=0, meanY=0, sumX=0, sumY=0; TGridData *gp; gp = &MainImageForm->Data3D->GridData[T3d.n]; for (i = 0 ; i < gp->cx ; i++) { sumX += gp->d->pointer(i, 0)->x; meanX++; sumX += gp->d->pointer(i, gp->cy-1)->x; meanX++; } for (j = 0 ; j < gp->cy ; j++) { sumY += gp->d->pointer(0, j)->y; meanY++; sumY += gp->d->pointer(gp->cx-1, j)->y; meanY++; } center.x = sumX/meanX; center.y = sumY/meanY; END_LOG; return center; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::iMainImageChange(void) { BEGIN_LOG("::"); if (IsDraw) IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::iMainImagePaint(void) { BEGIN_LOG("::"); IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL;/////////////////by jeegeo END_LOG; } //--------------------------------------------------------------------------- TPException __fastcall TMenu3DForm::LoadFrom3DFile(HANDLE fh, TEXPIAFILEHEADER &tpfh, TUnionBitmap *pBitmap) { BEGIN_LOG("::"); int i, scan; Byte *MP; WORD bpp; TPItemImage *Image = MainImageForm->iMainImage; // ti -> Image·Î º¯°æ by celberus TData3D *dp = MainImageForm->Data3D; TPException ec = EC_NONE; DWORD dwRead; TTexpiaBitmap *temp = NULL; TCursor OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if (!ReadFile(fh, &bpp, sizeof(WORD), &dwRead, NULL)) { ec = EC_FILE_NOT_READ; SAVE_EXCEPTION(ec); goto fail; } if (bpp) { // 090527 upper version if (tpfh.Version.Texpia == 'P' && tpfh.Version.Method == 'T' && tpfh.Version.Number > TextileFileVersion) { ec = EC_FILE_NOT_OPEN_NEWERVERSION; goto fail; } if (Image->Mask==NULL) Image->Mask = new TUnionBitmap; // convert by celberus if (Image->Mask==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!Image->Mask->Create(Image->uBitmap->Width, Image->uBitmap->Height ,1)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (tpfh.Version.Number < 222) { if (!Image->Mask->StartScanLine()) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } scan = (Image->Mask->Width + 7) / 8; for (i = 0; i < Image->Mask->Height; i++) { MP = Image->Mask->GetScanLine(i); if (!ReadFile(fh, MP, scan, &dwRead, NULL)) { ec = EC_FILE_NOT_READ; SAVE_EXCEPTION(ec); goto fail; } Image->Mask->PutScanLine(i); } Image->Mask->StopScanLine(); } else if (tpfh.Version.Number < 300) { temp = new TTexpiaBitmap; temp->Create(Image->Mask->Width, Image->Mask->Height, Image->Mask->BitsPerPixel); if (!temp->LoadFromTexpiaFile(fh, cmNone)) goto fail; if (!Image->Mask->Copy(temp, SRCCOPY)) goto fail; delete temp; temp = NULL; } else { if (!Image->Mask->LoadFromTexpiaFile(fh, cmNone)) goto fail; } } else { doDestroy(Image->Mask) } if ((ec = dp->LoadFromFile(fh, tpfh, Image->uBitmap->Width, Image->uBitmap->Height))!=EC_NONE) goto fail; if (dp->GridCount) { Fabric3DForm->lvSelect->Items->Clear(); Fabric3DForm->ImageList->Clear(); Fabric3DForm->sbAdd->Enabled = true; Fabric3DForm->sbReplace->Enabled = true; Fabric3DForm->sbAdd->Down = true; Fabric3DForm->SetGroup(); } if (dp->CopyCount>0) { if (!dp->bWorkArea) { dp->waStart.x = 0; dp->waStart.y = 0; dp->waSize.x = dp->Source->Width; dp->waSize.y = dp->Source->Height; } dp->MakeCopyGrid(); dp->MakeCopyBitmap(NULL); dp->MakeCopyMask(Image->Mask); sbMCopy->Enabled = true; MainMenuForm->SubCopy1->Enabled = true; seCount->Value = dp->CopyCount-1; Fabric3DForm->sbSelect->Enabled = true; } else { sbMCopy->Enabled = false; MainMenuForm->SubCopy1->Enabled = false;; Fabric3DForm->sbSelect->Enabled = false; } Image->SetPosition(0, 0); Screen->Cursor = OldCursor; END_LOG; return EC_NONE; fail: doDestroy(Image->Mask) if (temp) delete temp; Screen->Cursor = OldCursor; END_LOG; return ec; } //--------------------------------------------------------------------------- TPException __fastcall TMenu3DForm::SaveTo3DFile(HANDLE fh, TEXPIAFILEHEADER &tpfh, TTexpiaBitmap *tag, TUnionBitmap *pBitmap) { BEGIN_LOG("::"); TPItemImage *Image = MainImageForm->iMainImage; // ti -> Image ·Î º¯°æ by celberus WORD bpp = Image->Mask ? Image->Mask->BitsPerPixel : 0; TData3D *dp = MainImageForm->Data3D; TPException ec = EC_NONE; TRect src; DWORD dwWrite; TCursor OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; src.Left = 0; src.Top = 0; src.Right = Image->uBitmap->Width; src.Bottom = Image->uBitmap->Height; MakeTexpiaTag(tag, Image->uBitmap, src, 0); /* if (!SaveToTexpiaFile(fh, MainImageForm->Palette, tpfh, tag, Image->uBitmap)) { ec = EC_FILE_NOT_WRITE; SAVE_EXCEPTION(ec); goto fail; }*/ if (!SaveToTexpiaFile(fh, MainImageForm->Palette, tpfh, tag, Image->uBitmap)) { ec = EC_FILE_NOT_WRITE; SAVE_EXCEPTION(ec); goto fail; // convert by celberus } if (!WriteFile(fh, &bpp, sizeof(WORD), &dwWrite, NULL)) { ec = EC_FILE_NOT_WRITE; SAVE_EXCEPTION(ec); goto fail; } if (bpp) { if (!Image->Mask->SaveToTexpiaFile(fh, cmNone)) { ec = EC_FILE_NOT_WRITE; SAVE_EXCEPTION(ec); goto fail; } } //ÆÄÀÏ ¹öÀü¿¡ ¿µÇâÀÌ ¾øÀ½ ec = dp->SaveToFile(fh, tpfh); END_LOG; return ec; fail: Screen->Cursor = OldCursor; END_LOG; return ec; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_menu_free(void) { BEGIN_LOG("::"); if (T3d.type == T3D_BASE) { if(!undoSW) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) T3d.base.vhd[i].d[j].cnt = 0; T3d.base.vhd[i].cnt = 0; } } } else if (T3d.type == T3D_MODI) { GridBlock.Exist = false; T3rstr.Initial(0); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_menu_setting() { BEGIN_LOG("::"); T3d.step = 0; T3d.col = T3d.row = 0; if (T3d.type == T3D_PRE) { T3d.type = T3D_OFF; Undo.Read(MainImageForm->Data3D, T3d.n, GridBlock); MainImageForm->iMainImage->Invalidate(); } else if (T3d.type == T3D_MODI) { T3rstr.Initial(MainImageForm->Data3D->GridData[T3d.n].cx * MainImageForm->Data3D->GridData[T3d.n].cy); MainImageForm->iMainImage->Invalidate(); } else if (T3d.type == T3D_BASE) { // if (!undoSW) { for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) T3d.base.vhd[i].d[j].cnt = 0; T3d.base.vhd[i].cnt = 1; // } } T3d.base.item = T3D_B_V; T3d.base.finish = 0; T3d.base.draw = 0; MainImageForm->iMainImage->Invalidate(); } else if (T3d.type == T3D_FUNC) T3d.func.item = T3D_OFF; t_3d_view_menu(); END_LOG; } //--------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_copy_simulation(int s) { BEGIN_LOG("::"); TCursor OldCursor; sSimData sm; TData3D *dp = MainImageForm->Data3D; TPItemImage *Image = MainImageForm->iMainImage; TUnionBitmap *Bitmap = NULL; // convert by celberus TPException ec = EC_NONE; if (s>-1) CopySelect = s; if (CopySelect<0) { END_LOG; return; } OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; dp->MakeCopyGrid(); if ((Bitmap = new TUnionBitmap)==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } // convert by celberus if (!Bitmap->Create(dp->CopyBitmap->Width, dp->CopyBitmap->Height, 24)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!Bitmap->Copy(dp->CopyBitmap, SRCCOPY)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } sm.tbSrc = dp->CopyBitmap; sm.tbDst = Bitmap; sm.tbMask = dp->CopyMask; if ((!Fabric3DForm->sbSelect->Enabled) && Fabric3DForm->cbPoint->Checked) { if (!simulation(sm, dp->CopyGrid, true)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } // Æ÷ÀÎÆ®¸¦ ¸ÂÃß°í ÀÚµ¿º¹»ç¸¦ ÇÒ °æ¿ì¿¡ } else { // Æ÷ÀÎÆ® ¸ÂÃç¼­ simulationÇÑ À̹ÌÁö°¡ ±×´ë·Î º¸À̵µ·Ï Çϱâ À§Çؼ­.. if (!simulation(sm, dp->CopyGrid, false)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } } Bitmap->ConvertColorSpace(csRGB); if (!Image->uBitmap->CopyToRect(dp->CopyData[CopySelect].x, dp->CopyData[CopySelect].y, Bitmap, SRCCOPY)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } delete Bitmap; MainImageForm->Modify = true; Screen->Cursor = OldCursor; END_LOG; return; fail: if (Bitmap) delete Bitmap; Screen->Cursor = OldCursor; EXCEPTION_MESSAGE_OK(ec); END_LOG; } //--------------------------------------------------------------------------- //void __fastcall TMenu3DForm::t_3d_simulation() void __fastcall TMenu3DForm::t_3d_simulation(bool bpoint) { BEGIN_LOG("::"); TCursor OldCursor; sSimData sm; TData3D *dp = MainImageForm->Data3D; TPItemImage *Image = MainImageForm->iMainImage; TUnionBitmap *Bitmap = NULL; // convert by celberus TPException ec = EC_NONE; OldCursor = Screen->Cursor; Screen->Cursor = crHourGlass; if ((Bitmap = new TUnionBitmap)==NULL) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!Bitmap->Create(dp->Source->Width, dp->Source->Height, 24)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!Bitmap->Copy(dp->Source, SRCCOPY)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } sm.tbSrc = dp->Source; sm.tbDst = Bitmap; sm.tbMask = Image->Mask; // if (!simulation(sm, dp->GridData)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } if (!simulation(sm, dp->GridData, bpoint)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } Bitmap->ConvertColorSpace(csRGB); if(FullViewForm->Super==sOverlap) { sm.tbSrc->ConvertColorSpace(csRGB); t_3d_doOverlap_after_simulation(sm); sm.tbSrc->ConvertColorSpace(csHLS); } Bitmap->SetAllToUnblank(); // FablicÀÌ NoneÀÏ °æ¿ì Åõ¸íÇÏ°Ô Ã³¸®Çϱâ À§ÇØ Ãß°¡ - by monkman (2008.11.19) if (!Image->uBitmap->Copy(Bitmap, SRCCOPY)) { ec = EC_MEMORY_LACK; SAVE_EXCEPTION(ec); goto fail; } delete Bitmap; MainImageForm->Modify = true; Screen->Cursor = OldCursor; END_LOG; return; fail: if (Bitmap) delete Bitmap; Screen->Cursor = OldCursor; EXCEPTION_MESSAGE_OK(ec); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbRotate_Click(TObject *Sender) { BEGIN_LOG("::"); if (T3d.type != T3D_MODI) { T3d.type = T3D_MODI; InitializeButton(); } sbGMSet->Down = false; sbGMMove->Down = false; sbGMFix->Down = false; sbGMDeletePoint->Down = false; sbGMDeleteBlock->Down = false; ptAngle->Visible = true; ClientHeight = MainPanel->Height + GBasePanel->Height + pnNewGrid->Height; //240; sbRotate->Down = true; if (T3d.type != T3D_BASE) { isRotate = true; isMove = false; edAngle->Enabled = true; undoSW = false; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::edAngle_MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; s->SetFocus(); s->SelectAll(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::edAngle_KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; if (Key == VK_RETURN) { MainImageForm->iMainImage->Repaint(); int angle = s->Value; theta = DegToRad((Extended)angle); Find_Center(); Rotate_Grid(); isRotate = false; isMove = true; g_FocusControl->SetFocus(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGridUndo_Click(TObject *Sender) { BEGIN_LOG("::"); if(MainImageForm->Data3D->GridCount < 2) { t_3d_grid_undo1(); MainImageForm->iMainImage->Invalidate(); sbGridUndo->Enabled = false; } else { T3d.type = T3D_PRE; t_3d_menu_setting(); t_3d_grid_undo(); MainImageForm->iMainImage->Repaint(); sbGridUndo->Enabled = false; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_grid_undo1() { BEGIN_LOG("::"); TData3D *dp = MainImageForm->Data3D; int n, i; T3d.def = T3D_DDEL; clear_block(); dp->GridCount--; if(dp->GridCount < 0) dp->GridCount = 0; for (i = T3d.n; i < dp->GridCount; i++) { dp->GridData[i].Copy(dp->GridData[i + 1], true); } if (dp->GridCount == 0) T3d.n = 0; else if (T3d.n >= dp->GridCount) T3d.n = dp->GridCount - 1; T3d.def = T3D_OFF; T3d.base.finish = 0; t_3d_view_menu(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_grid_undo() { BEGIN_LOG("::"); int n, i, j; T3d.base.finish = 0; for (n = 0; n < 2; n++) { T3d.base.vhd[n].cnt = undoPt[n].cnt; for (i = 0; i < undoPt[n].cnt; i++) { _3d_base_pt *b = &T3d.base.vhd[n].d[i]; b->cnt = undoPt[n].d[i].cnt; for (j = 0; j < undoPt[n].d[i].cnt-1; j++) { b->p[j].x = undoPt[n].d[i].p[j].x; b->p[j].y = undoPt[n].d[i].p[j].y; } b->p[j].x = undoPt[n].d[i].p[j].x; b->p[j].y = undoPt[n].d[i].p[j].y; } } T3d.type = T3D_BASE; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ViewGrid(int gridindex) { BEGIN_LOG("::"); clear_block(); T3d.n = gridindex; view_grid_data(); T3d.def = T3D_OFF; Fabric3DForm->ShowIndex(); // MainImageForm->iMainImage->Invalidate(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::CreateGridPen() // for fit point by kjs { BEGIN_LOG("::"); for (int j=0; j<15; j++) { if (!GridColorSet[j].hPen) GridColorSet[j].hPen = CreatePen(PS_SOLID, 1, GridColorSet[j].Color); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::DeleteGridPen() // for fit point by kjs { BEGIN_LOG("::"); for (int j=0; j<15; j++) { if (GridColorSet[j].hPen) { DeleteObject(GridColorSet[j].hPen); GridColorSet[j].hPen = NULL; } } END_LOG; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::GetGroupIndex() { BEGIN_LOG("::"); END_LOG; return Fabric3DForm->GroupIndex; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::SetGroupIndex(int index) { BEGIN_LOG("::"); TData3D *dp = MainImageForm->Data3D; Fabric3DForm->GroupIndex = index; Fabric3DForm->ShowFabric(dp->GroupList[index].FFabric); END_LOG; } //--------------------------------------------------------------------------- int __fastcall TMenu3DForm::GetGridIndex() { BEGIN_LOG("::"); END_LOG; return Fabric3DForm->GridIndex; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::SetGridIndex(int index) { BEGIN_LOG("::"); Fabric3DForm->GridIndex = index; END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ResetStep() { BEGIN_LOG("::"); lengthstep = 0; END_LOG; } //--------------------------------------------------------------------------- /* bool __fastcall TMenu3DForm::ResizeFabric(TTexpiaBitmap *src, TTexpiaBitmap *dst, int groupindex) { int ww, hh, length; double ratio, vsl, vdl, rx=1, ry=1; HDC shDC = NULL, dhDC = NULL; vsl = MainImageForm->Data3D->M_Length; vdl = MainImageForm->Data3D->F_Length[groupindex]; // if (vsl == 0.0 || vdl == 0.0 || S_Length <= 0) { if (vsl == 0.0 || vdl == 0.0 || MainImageForm->Data3D->I_Length <= 0 || MainImageForm->Data3D->M_Length <= 0) { ShowMessage("Size or Length is zero! Input value again."); return false; } //=================================for CopyGrid if (MainImageForm->Data3D->CopyCount>0) { rx = (double)MainImageForm->Data3D->CopySize.x / MainImageForm->Data3D->waSize.x; ry = (double)MainImageForm->Data3D->CopySize.y / MainImageForm->Data3D->waSize.y; } //=================================for CopyGrid // ww = (S_Length*vdl)/(vsl*rx); ww = (MainImageForm->Data3D->I_Length*vdl)/(vsl*rx); ratio = (double)ww / src->Width; // fabricÀÇ width = src->Width; // hh = ratio * src->Width/ry; //¾Æ·¡ÀÇ °ÍÀÌ ¸Â´Â °Å ¾Æ´ÑÁö... hh = ratio * src->Height/ry; dst->ConvertColorSpace(csRGB); if (!dst->Create(ww, hh, 24)) goto fail; if ((shDC = src->CreateDC()) == NULL) goto fail; if ((dhDC = dst->CreateDC()) == NULL) goto fail; SetStretchBltMode(dhDC, COLORONCOLOR); StretchBlt(dhDC, 0, 0, ww, hh, shDC, 0, 0, src->Width, src->Height, SRCCOPY); dst->DeleteDC(dhDC); src->DeleteDC(shDC); return true; fail: if (shDC) src->DeleteDC(shDC); return false; } */ //--------------------------------------------------------------------------- POINT __fastcall TMenu3DForm::GetRatio(int groupindex, int Width, bool all) { BEGIN_LOG("::"); double ww, hh; int xx, yy; double vsl, vdl, rx=1, ry=1; POINT ratio; vsl = MainImageForm->Data3D->M_Length; if (MainImageForm->Data3D->CopyCount>0) { rx = (double)MainImageForm->Data3D->CopySize.x / MainImageForm->Data3D->waSize.x; ry = (double)MainImageForm->Data3D->CopySize.y / MainImageForm->Data3D->waSize.y; } if (all) { vdl = MainImageForm->Data3D->F_Length[groupindex]; if (vsl <= 0.0 || vdl <= 0.0 || MainImageForm->Data3D->I_Length <= 0) { ShowMessage("Input value is wrong! Input again."); END_LOG; return Point(-1, -1); } ww = (double)(MainImageForm->Data3D->I_Length*vdl)/(vsl*rx); xx = (100*ww) / Width; yy = (100*ww) / Width*ry; } else { if (vsl <= 0.0 || MainImageForm->Data3D->I_Length <= 0) { ShowMessage("Model size or input value is wrong! Input again."); END_LOG; return Point(-1, -1); } xx = (100*MainImageForm->Data3D->I_Length) / (vsl*rx); yy = (100*MainImageForm->Data3D->I_Length) / (vsl*ry); } //======================== Really need it??? to prevent to happen errors... if (xx <= 0) xx = 100; if (yy <= 0) yy = 100; //======================== END_LOG; return Point(xx, yy); } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Set_s_point_LP(int x, int y) { BEGIN_LOG("::"); TData3D *dp = MainImageForm->Data3D; TGridData *gd = dp->GridData; POINT pt[4]; HRGN rgn = NULL; int index, i, j; index = Fabric3DForm->GridIndex; MainImageForm->Data3D->s_point.GP[index] = Point(x, y); for (j=0; jpointer(i, j)->x, gd[index].d->pointer(i, j)->y); pt[1] = Point(gd[index].d->pointer(i+1, j)->x, gd[index].d->pointer(i+1, j)->y); pt[2] = Point(gd[index].d->pointer(i+1, j+1)->x, gd[index].d->pointer(i+1, j+1)->y); pt[3] = Point(gd[index].d->pointer(i, j+1)->x, gd[index].d->pointer(i, j+1)->y); rgn = CreatePolygonRgn(pt, 4, ALTERNATE); if (rgn) { if (PtInRegion(rgn, x, y)) { MainImageForm->Data3D->s_point.LP[index] = Point(i, j); DeleteObject(rgn); rgn = NULL; END_LOG; return; } DeleteObject(rgn); rgn = NULL; } } } } MainImageForm->Data3D->s_point.LP[index] = Point(-1, -1); END_LOG; } //--------------------------------------------------------------------------- POINT __fastcall TMenu3DForm::Find_sp_Fabric(int gindex, sSimData sm, int w, int h) { BEGIN_LOG("::"); POINT sp = Point(0, 0); TData3D *dp = MainImageForm->Data3D; TGridData *gd = dp->GridData; double lx1, lx2, ly1, ly2, nx, ny; int x, y; // select point in grid.... int ix, iy; // rectangle index in current grid(gindex); double lx, ly; // total rectangle length double tx, ty; // length form end rectange point to select point double sum_x, sum_y; // totoal length from start point(simulation start) to select point in MainImage int dx, dy; double dlx,dly; sSimData tsm; TPlaneVertex pv; tsm = sm; ix = dp->s_point.LP[gindex].x; iy = dp->s_point.LP[gindex].y; if (ix < 0 || iy < 0) { END_LOG; return sp; } tsm.pos[0].x = gd[gindex].d->pointer(ix, iy)->x; tsm.pos[0].y = gd[gindex].d->pointer(ix, iy)->y; tsm.pos[1].x = gd[gindex].d->pointer(ix+1, iy)->x; tsm.pos[1].y = gd[gindex].d->pointer(ix+1, iy)->y; tsm.pos[2].x = gd[gindex].d->pointer(ix+1, iy+1)->x; tsm.pos[2].y = gd[gindex].d->pointer(ix+1, iy+1)->y; tsm.pos[3].x = gd[gindex].d->pointer(ix, iy+1)->x; tsm.pos[3].y = gd[gindex].d->pointer(ix, iy+1)->y; pv.Create(tsm.pos[0], tsm.pos[1], tsm.pos[2], tsm.pos[3]); repro_dis(tsm, 0, 0, 1); repro_dis(tsm, 1, 2, 3); repro_dis(tsm, 2, 3, 0); repro_dis(tsm, 3, 1, 2); x = dp->s_point.GP[gindex].x; y = dp->s_point.GP[gindex].y; if (pv.Check(x, y)) { ly1 = fabs(tsm.a[0] * x + tsm.b[0] * y + tsm.c[0]) / tsm.sqr[0]; ly2 = fabs(tsm.a[1] * x + tsm.b[1] * y + tsm.c[1]) / tsm.sqr[1]; lx1 = fabs(tsm.a[2] * x + tsm.b[2] * y + tsm.c[2]) / tsm.sqr[2]; lx2 = fabs(tsm.a[3] * x + tsm.b[3] * y + tsm.c[3]) / tsm.sqr[3]; if (lx1 + lx2 && ly1 + ly2) { nx = lx1 * tsm.glx / (lx1 + lx2); ny = ly1 * tsm.gly / (ly1 + ly2); lx = ix * sm.glx + nx; ly = iy * sm.gly + ny; //======================================================= sp.x = w - (int)(lx-dp->s_point.FP[gindex].x)%w; sp.y = h - (int)(ly-dp->s_point.FP[gindex].y)%h; // dlx = lx-dp->s_point.FP[gindex].x; // ¿ÀÂ÷°ªÀÇ Â÷À̰¡ ????? // dly = ly-dp->s_point.FP[gindex].y; // dx = dlx/w; // dy = dly/h; // sp.x = w - (dlx - dx*w); // sp.y = h - (dly - dy*h); //======================================================= } } END_LOG; return sp; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Show_FabricSize() { BEGIN_LOG("::"); if (Fabric3DForm) { if (Fabric3DForm->Visible) Fabric3DForm->Show_FabricSize(); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::Show_s_point(HDC DC) { BEGIN_LOG("::"); int i, sx, sy, ex, ey; TData3D *dp = MainImageForm->Data3D; // dp°¡ ÀÖ´ÂÁö ¾ø´ÂÁö´Â ¾Õ¿¡¼­ üũÇÔ.. HPEN hOldPen = NULL, hPen = NULL; TPException ec = EC_NONE; // if ((hPen = CreatePen(PS_SOLID, 2, clRed)) == NULL) goto fail; if ((hPen = CreatePen(PS_SOLID, 2, dp->PointColor)) == NULL) { ec = EC_RESOURCE_LACK; SAVE_EXCEPTION(ec); goto fail; } hOldPen = (HPEN)SelectObject(DC, hPen); for (i=0; iGridCount; i++) { if ((dp->s_point.LP[i].x > -1) && (dp->s_point.LP[i].y > -1)) { // ¼±ÅÃÁ¡ÀÌ ±×¸®µå ¹ÛÀ¸·Î ³ª°¥ °æ¿ì¿¡ ÀÌ °ªµéÀÌ (-1, -1)·Î ¼¼ÆÃ µÈ´Ù. sx = MainImageForm->iMainImage->BitmapToCanvasX(dp->s_point.GP[i].x); sy = MainImageForm->iMainImage->BitmapToCanvasY(dp->s_point.GP[i].y); MoveToEx(DC, sx, sy-5, NULL); LineTo(DC, sx, sy+5); MoveToEx(DC, sx-5, sy, NULL); LineTo(DC, sx+5, sy); } } SelectObject(DC, hOldPen); DeleteObject(hPen); END_LOG; return; fail: EXCEPTION_MESSAGE_OK(ec); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t_3d_doOverlap_after_simulation(sSimData &sm) { BEGIN_LOG("::"); if(FullViewForm->Super == sOverlap){ int i, j, w, h; Byte *FP, *UP, *MP; COLORREF color, FC, UC, bgc, c; w = sm.tbSrc->Width; h = sm.tbSrc->Height; bgc = PaletteForm->DIB256Palette->GetBGCOLORREF(24); if (!sm.tbSrc->StartScanLine()) { END_LOG; return; } if (!sm.tbDst->StartScanLine()) { END_LOG; return; } if (!sm.tbMask->StartScanLine()) { END_LOG; return; } MainImageForm->InitOverlap(); for (i=0; iGetScanLine(i); MP = sm.tbMask->GetScanLine(i); UP = sm.tbSrc->GetScanLine(i); // simulationÀÌ ³¡³­ FP¸¦ ¿øº» UP¿Í ¿À¹ö·¦ÇÒ °ÍÀÓ for (j=0; j> 3] & (0x80 >> (j & 7))) == 0)) { if (c != bgc) { GetPixel24(UP, UC); GetPixel24(FP, FC); color = MainImageForm->Overlap(UC, FC); SetPixel24(FP, color); } else CopyPixel24(FP, UP); } } sm.tbDst->PutScanLine(i); } MainImageForm->ExitOverlap(); sm.tbSrc->StopScanLine(); sm.tbMask->StopScanLine(); sm.tbDst->StopScanLine(); } } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::eGIMWHChange(TObject *Sender) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; int S = 0, width = 0, height = 0; S = s->Value; width = eGIMWidth->Value; height = eGIMHeight->Value; if(eGIMWidth->Enabled || eGIMHeight->Enabled){ if (S >= 10 && S <= 100) { T3d.size.x = width; T3d.size.y = height; view_grid_data(); } } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::edAngle_Change(TObject *Sender) { BEGIN_LOG("::"); TNumEdit *s = (TNumEdit *)Sender; if(edAngle->Enabled){ MainImageForm->iMainImage->Repaint(); int angle = s->Value; theta = DegToRad((Extended)angle); Find_Center(); Rotate_Grid(); isRotate = false; isMove = true; } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::EditorSelectAll(TObject *Sender) { SetFocusAndSelectAll(Sender); } //--------------------------------------------------------------------------- //090721 void __fastcall TMenu3DForm::iMainImageKeyDown(TObject *Sender, WORD Key, TShiftState Shift) { BEGIN_LOG("::"); if (Key == 'X') { if (sbGBNextLine->Enabled == true) BaseClick(sbGBNextLine); } // else if (Shift.Contains(ssCtrl) && (Key == 'Z' || Key == 'z')) { // sbGridButtonClick(sbGUndo); // } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ExecuteHotKey(String command) { BEGIN_LOG("::"); if (command == "Undo") { sbGridButtonClick(sbGUndo); } END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::FormClose(TObject *Sender, TCloseAction &Action) { BEGIN_LOG("::"); HWND hWnd=((TWinControl *)Owner)->Handle; PostMessage(hWnd, TPM_EXITFUNCTION, 0, 0); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::InitializeButton() { BEGIN_LOG("::"); isRotate = false; GBasePanel->Visible = true; // ptAngle->Visible = false; t_3d_menu_free(); t_3d_menu_setting(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::SelectColor() { BEGIN_LOG("::"); TColorPicker *Form = new TColorPicker(this); int selectedIndex = 0; Form->Top = this->Top + 46; Form->Left = this->Left - Form->Width; Form->rzrbGrid->Caption = IDS_GRIDLINE; Form->rzrbNormal->Caption = IDS_NORMALPOINT; Form->rzrbBlock->Caption = IDS_BLOCKMARK; Form->rzrbFixed->Caption = IDS_FIXEDPOINT; Form->rzrbNew->Caption = IDS_NEWBLOCK; Form->rzrbSelect->Caption = IDS_SELECTPOINT; Form->rzrbOther->Caption = IDS_OTHERGRID; Form->plGridLine->Color = (TColor)GridColorSet[T3d.gc[0]].Color; Form->plNormal->Color = (TColor)GridColorSet[T3d.gc[1]].Color; Form->plBlock->Color = (TColor)GridColorSet[T3d.gc[2]].Color; Form->plFixed->Color = (TColor)GridColorSet[T3d.gc[3]].Color; Form->plNew->Color = (TColor)GridColorSet[T3d.gc[4]].Color; Form->plSelect->Color = (TColor)GridColorSet[T3d.gc[5]].Color; Form->plOther->Color = (TColor)GridColorSet[T3d.gc[6]].Color; if (Form->ShowModal() == mrOk) { // if (Form->rzrbGrid->Checked) {selectedIndex = 0;} // else if (Form->rzrbNormal->Checked) {selectedIndex = 1;} // else if (Form->rzrbBlock->Checked) {selectedIndex = 2;} // else if (Form->rzrbFixed->Checked) {selectedIndex = 3;} // else if (Form->rzrbNew->Checked) {selectedIndex = 4;} // else if (Form->rzrbSelect->Checked) {selectedIndex = 5;} // else if (Form->rzrbOther->Checked) {selectedIndex = 6;} // // GridColorSet[T3d.gc[selectedIndex]].Color = (COLORREF)Form->RzColorPicker1->SelectedColor; // GridColorSet[T3d.gc[selectedIndex]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[selectedIndex]].Color); GridColorSet[T3d.gc[0]].Color = (COLORREF)Form->plGridLine->Color; GridColorSet[T3d.gc[0]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[0]].Color); GridColorSet[T3d.gc[1]].Color = (COLORREF)Form->plNormal->Color; GridColorSet[T3d.gc[1]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[1]].Color); GridColorSet[T3d.gc[2]].Color = (COLORREF)Form->plBlock->Color; GridColorSet[T3d.gc[2]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[2]].Color); GridColorSet[T3d.gc[3]].Color = (COLORREF)Form->plFixed->Color; GridColorSet[T3d.gc[3]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[3]].Color); GridColorSet[T3d.gc[4]].Color = (COLORREF)Form->plNew->Color; GridColorSet[T3d.gc[4]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[4]].Color); GridColorSet[T3d.gc[5]].Color = (COLORREF)Form->plSelect->Color; GridColorSet[T3d.gc[5]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[5]].Color); GridColorSet[T3d.gc[6]].Color = (COLORREF)Form->plOther->Color; GridColorSet[T3d.gc[6]].hPen = (HPEN) CreatePen(PS_SOLID, 1, GridColorSet[T3d.gc[6]].Color); } delete Form; MainImageForm->iMainImage->Invalidate(); END_LOG; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::sbGSettingClick(TObject *Sender) { SelectColor(); } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::ExitGFunction() { isRotate = false; isMove = false; IsDraw = false; MainImageForm->iMainImage->OnPaintLocate = NULL; T3d.step = 0; ptAngle->Visible = false; ClientHeight = MainPanel->Height + GBasePanel->Height + pnNewGrid->Height - ptAngle->Height; } //--------------------------------------------------------------------------- void __fastcall TMenu3DForm::t3d_off_view_menu(void) { if(sbGBVertical->Down) sbGBVertical->Down = false; if(sbGBHorizontal->Down) sbGBHorizontal->Down = false; if(sbGBNextLine->Down) sbGBNextLine->Down = false; if(sbGBModify->Down) sbGBModify->Down = false; if(sbGBFinish->Down) sbGBFinish->Down = false; if(sbGBDeleteP->Down) sbGBDeleteP->Down = false; if(sbGBDeleteL->Down) sbGBDeleteL->Down = false; if(sbGMSet->Down) sbGMSet->Down = false; if(sbGMMove->Down) sbGMMove->Down = false; if(sbGMFix->Down) sbGMFix->Down = false; if(sbGMBlockFix->Down) sbGMBlockFix->Down = false; if(sbGMDeletePoint->Down) sbGMDeletePoint->Down = false; if(sbGMDeleteBlock->Down) sbGMDeleteBlock->Down = false; if(sbGFInsert->Down) sbGFInsert->Down = false; if(sbGDCreate->Down) sbGDCreate->Down = false; if(sbGDDelete->Down) sbGDDelete->Down = false; if(sbGFNormal->Down) sbGFNormal->Down = false; if(sbGFMirror->Down) sbGFMirror->Down = false; if(sbRotate->Down) sbRotate->Down = false; if(sbGSetting->Down) sbGSetting->Down = false; }