//--------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "capture.h" #include "Main_F.h" #include "Viewer.h" #include "Design.h" #include "Palette.h" #include "FloatingWin.h" #include "jpeg.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "RzPanel" #pragma link "RzEdit" #pragma link "RzCmboBx" #pragma link "RzButton" #pragma resource "*.dfm" //--------------------------------------------------------------------------- #define IDS_CAPTURE StringTable[0] #define IDS_ZOOM StringTable[1] #define IDS_WHOLE_VIEWER StringTable[2] #define IDS_LOAD_IMAGE StringTable[3] #define IDS_SAVE_IMAGE StringTable[4] #define IDS_TYPE StringTable[5] #define IDS_POSITION StringTable[6] #define IDS_LENGTH StringTable[7] #define IDS_UNDO StringTable[8] #define IDS_MEASURE StringTable[9] #define IDS_GRID StringTable[10] #define IDS_SET StringTable[11] #define IDS_GRID_MOVE StringTable[12] #define IDS_PATH StringTable[13] #define IDS_COPY StringTable[14] #define IDS_POINT StringTable[15] #define IDS_LINE StringTable[16] #define IDS_TRIANGLE StringTable[17] #define IDS_POLYGON StringTable[18] #define IDS_CIRCLE StringTable[19] #define IDS_SIZE StringTable[20] #define IDS_COUNT StringTable[21] //--------------------------------------------------------------------------- #define DEFAULT_RES_WIDTH 320 // ÇØ»óµµ 320 X 240 #define DEFAULT_MAGNIFICATION 100 // 100¹èÁÜ #define DEFAULT_TUNING 300000 //--------------------------------------------------------------------------- int MAGNIFICATION = DEFAULT_MAGNIFICATION; int RES_WIDTH = DEFAULT_RES_WIDTH; int TUNING = DEFAULT_TUNING; double UM_PER_DOT = (double)TUNING / (double)RES_WIDTH / (double)MAGNIFICATION; // 1000 um = 1 mm //--------------------------------------------------------------------------- int default_point_size=5; int default_line_dot=1; int default_font_size=10; bool mode = 0; //# 0 : video, 1: capture image //--------------------------------------------------------------------------- TCaptureForm *CaptureForm; //--------------------------------------------------------------------------- __fastcall TCaptureForm::TCaptureForm(TComponent* Owner) : TForm(Owner) { lpgrid=NULL; gridx=0; gridy=0; ImageGraphicObjectList= new TList; temp_path = new TList; tm = new TTexpiaBitmap; step = 0; } //--------------------------------------------------------------------------- volatile void foo() { } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbCaptureClick(TObject *Sender) { /* // tmp AnsiString tmpname; for (int i = 0; i < 10; ++i) { char DeviceName[80]; char DeviceVersion[80]; if(capGetDriverDescription(i, DeviceName, 80, DeviceVersion, 80)) { tmpname += AnsiString(DeviceName); tmpname += ":"; tmpname += AnsiString(DeviceVersion); } } CaptureForm->Caption = AnsiString(tmpname); return; // tmp end */ if(hWndC==NULL){ mode = 0; pmLoadImage->Enabled=false; pmSaveImage->Enabled=false; pmViewer->Enabled=false; //ImageManagerForm->Visible=false; if(Image->Cursor==crCross) Image->Cursor = crDefault; try{ TCursor cursor = Screen->Cursor; Screen->Cursor = crHourGlass; CAPDRIVERCAPS CapDriverCaps; CAPSTATUS CapStatus; HANDLE hwndParent = ImageScrollBox->Handle; hWndC = capCreateCaptureWindow( (PROGRAM_NAME + " Capture Window").c_str(), WS_CHILD | WS_VISIBLE , 0, 0, ImageScrollBox->Width-4, ImageScrollBox->Height-4, hwndParent, 0); RECT r; GetWindowRect(hWndC,&r); Image->Width=(r.right-r.left); Image->Height=(r.bottom-r.top); Image->Picture->Bitmap->Width=Image->Width; Image->Picture->Bitmap->Height=Image->Height; Image->Picture->Bitmap->Canvas->Brush->Color = clGray; Image->Picture->Bitmap->Canvas->FillRect(Image->ClientRect); ResetObjectList(); UpdateLabel(); if(lpgrid){ VirtualUnlock(lpgrid,gridx*gridy*sizeof(POINT)); VirtualFree(lpgrid,gridx*gridy*sizeof(POINT),MEM_DECOMMIT); lpgrid=NULL; gridx=0; gridy=0; } comboObjectType->Enabled=false; pnObject->Enabled=false; sbUndo->Enabled=false; comboMagnification->Enabled=false; lbInfo->Enabled=false; pnGrid->Enabled=false; edWale->Enabled=false; edCourse->Enabled=false; sbSet->Enabled=false; sbGridMove->Enabled=false; sbPath->Enabled=false; ImageScrollBox->VertScrollBar->Visible=false; ImageScrollBox->HorzScrollBar->Visible=false; capDriverConnect(hWndC, 0); capDriverGetCaps(hWndC, &CapDriverCaps, sizeof (CAPDRIVERCAPS)); Screen->Cursor = cursor; if (CapDriverCaps.fHasDlgVideoSource) capDlgVideoSource(hWndC); if (CapDriverCaps.fHasDlgVideoFormat) { capDlgVideoFormat(hWndC); //BITMAPINFO VideoFormat; //capGetVideoFormat(hWndC,&VideoFormat,sizeof(BITMAPINFO)); //VideoFormat.bmiHeader.biWidth=320; //VideoFormat.bmiHeader.biHeight=240; //capSetVideoFormat(hWndC,&VideoFormat,sizeof(BITMAPINFO)); //capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS)); //SetWindowPos(hWndC, NULL, 0, 0, CapStatus.uiImageWidth, // CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE); } //capPreviewScale(hWndC,true); //TPoint pt = TPoint(0,0); //capSetScrollPos(hWndC,&pt); BITMAPINFO VideoFormat; capGetVideoFormat(hWndC,&VideoFormat,sizeof(BITMAPINFO)); SetWindowPos(hWndC, NULL, 0, 0, (int)(VideoFormat.bmiHeader.biWidth), (int)(VideoFormat.bmiHeader.biHeight), SWP_NOZORDER | SWP_NOMOVE) ; capOverlay(hWndC,false); capPreviewRate(hWndC, 66); // rate, in milliseconds capPreview(hWndC, TRUE); // starts preview capPreviewScale(hWndC,TRUE); } catch(...){ if(hWndC){ capPreview(hWndC, FALSE); capDriverDisconnect (hWndC); DestroyWindow(hWndC); hWndC=NULL; } } } else { mode = 1; BITMAPINFO VideoFormat; capGetVideoFormat(hWndC,&VideoFormat,sizeof(BITMAPINFO)); Image->Width=VideoFormat.bmiHeader.biWidth; Image->Height=VideoFormat.bmiHeader.biHeight; Image->Picture->Bitmap->Width=Image->Width; Image->Picture->Bitmap->Height=Image->Height; capFileSaveDIB(hWndC,"test.bmp"); Image->Picture->LoadFromFile("test.bmp"); Image->Repaint(); //RestoreImage(); remove("test.bmp"); capPreview(hWndC, FALSE); capDriverDisconnect (hWndC); DestroyWindow(hWndC); hWndC=NULL; pmLoadImage->Enabled=true; pmSaveImage->Enabled=true; pmViewer->Enabled=true; comboObjectType->Enabled=true; pnObject->Enabled=true; sbUndo->Enabled=true; comboMagnification->Enabled=true; lbInfo->Enabled=true; pnGrid->Enabled=true; edWale->Enabled=true; edCourse->Enabled=true; sbSet->Enabled=true; sbGridMove->Enabled=true; sbPath->Enabled=true; if(sbMeasure->Down){ comboObjectType->Visible=true; pnObject->Visible=true; pnGrid->Visible=false; } else { comboObjectType->Visible=false; pnObject->Visible=false; pnGrid->Visible=true; } } ImageScrollBox->VertScrollBar->Visible=true; ImageScrollBox->HorzScrollBar->Visible=true; ImageScrollBox->Repaint(); } //--------------------------------------------------------------------------- //capture.cpp void __fastcall TCaptureForm::pmViewerClick(TObject *Sender) { //½ºÅ©·Ñ ¹Ù¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î ¾Èº¸ÀÌ°Ô Ã³¸®ÇÔ Viewer_F->scHori->Visible = false; Viewer_F->scVert->Visible = false; Viewer_F->pnCorner->Visible = false; Viewer_F->Image->Width = Image->Width; Viewer_F->Image->Height = Image->Height; Viewer_F->Width = Image->Width+6; Viewer_F->Height = Image->Height+29; Viewer_F->Image->Width=Image->Width; Viewer_F->Image->Height=Image->Height; Viewer_F->Image->Picture->Bitmap->Width=Image->Width; Viewer_F->Image->Picture->Bitmap->Height=Image->Height; //ScrollBar À§Ä¡°¡ ¸ÂÁö ¾Ê¾Æ¼­ ¼öÁ¤ - 20191213 kisub //Àüüº¸±â Ư¼º»ó ½ºÅ©·Ñ¹Ù¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø¾î¼­ ÀÏ´Ü ÁÖ¼® ó¸® ////////////////////////////////////////////////////////////////////////////////////////// /* Viewer_F->scHori->Left = 0; Viewer_F->scHori->Top = Image->Height - 18; Viewer_F->scHori->Width = Image->Width - 16; Viewer_F->scHori->Height = 16; Viewer_F->scVert->Left = Image->Width - 16; Viewer_F->scVert->Top = 0; Viewer_F->scVert->Width = 16; Viewer_F->scVert->Height = Image->Height - 18; Viewer_F->pnCorner->Left = Image->Width - 16; Viewer_F->pnCorner->Top = Image->Height - 18; */ ////////////////////////////////////////////////////////////////////////////////////////// HDC hDC = Viewer_F->Image->Canvas->Handle; BitBlt(hDC,0,0,Viewer_F->Width,Viewer_F->Height,Image->Canvas->Handle,0,0,SRCCOPY); Viewer_F->Show(); Viewer_F->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::pmLoadImageClick(TObject *Sender) { mode = 1; if (OpenPictureDialog->Execute()) { if(OpenPictureDialog->FilterIndex==1){ Graphics::TBitmap *bm = new Graphics::TBitmap; bm->LoadFromFile(OpenPictureDialog->FileName); tm->Create(bm->Width,bm->Height,24); HDC dst=tm->CreateDC(); HDC src=bm->Canvas->Handle; BitBlt(dst,0,0,bm->Width,bm->Height,src,0,0,SRCCOPY); tm->DeleteDC(dst); Image->Height = bm->Height; Image->Width = bm->Width; Image->Picture->Bitmap->Assign(bm); Image->Repaint(); if(bm) delete bm; } else if(OpenPictureDialog->FilterIndex==2){ TJPEGImage *jp = new TJPEGImage(); try { jp->LoadFromFile(OpenPictureDialog->FileName); Image->Height = jp->Height; Image->Width = jp->Width; Image->Picture->Bitmap->Assign(jp); tm->Create(jp->Width,jp->Height,24); HDC dst=tm->CreateDC(); HDC src=Image->Picture->Bitmap->Canvas->Handle; BitBlt(dst,0,0,jp->Width,jp->Height,src,0,0,SRCCOPY); tm->DeleteDC(dst); Image->Repaint(); } __finally { delete jp; } } } ResetObjectList(); UpdateLabel(); if(lpgrid){ VirtualUnlock(lpgrid,gridx*gridy*sizeof(POINT)); VirtualFree(lpgrid,gridx*gridy*sizeof(POINT),MEM_DECOMMIT); lpgrid=NULL; gridx=0; gridy=0; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::pmSaveImageClick(TObject *Sender) { if (SavePictureDialog->Execute()) { if(SavePictureDialog->FilterIndex==1){ Image->Picture->Bitmap->SaveToFile(SavePictureDialog->FileName); } else if(SavePictureDialog->FilterIndex==2){ TJPEGImage *jp = new TJPEGImage(); try { jp->Assign(Image->Picture->Bitmap); jp->SaveToFile(SavePictureDialog->FileName); } __finally { delete jp; } } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::FormCreate(TObject *Sender) { hWndC=NULL; SetFont(); StringTable.Create(BaseDir, Language, "Capture"); Caption=IDS_CAPTURE; pmZoom->Caption=IDS_ZOOM; pmViewer->Caption=IDS_WHOLE_VIEWER; pmLoadImage->Caption=IDS_LOAD_IMAGE; pmSaveImage->Caption=IDS_SAVE_IMAGE; pmCopyToClipboard->Caption=IDS_COPY; comboObjectType->Items->Clear(); comboObjectType->Items->Add(IDS_POINT); comboObjectType->Items->Add(IDS_LINE); comboObjectType->Items->Add(IDS_TRIANGLE); comboObjectType->Items->Add(IDS_POLYGON); comboObjectType->Items->Add(IDS_CIRCLE); comboObjectType->ItemIndex=0; //sbUndo->Caption = IDS_UNDO; //sbMeasure->Caption = IDS_MEASURE; //sbGrid->Caption = IDS_GRID; sbSet->Caption = IDS_SET; //sbGridMove->Caption = IDS_GRID_MOVE; //sbPath->Caption = IDS_PATH; lbSize->Caption=IDS_SIZE; lbInfo->Caption = IDS_COUNT; grid_step=0; Image->Width=0; Image->Height=0; OpenPictureDialog->InitialDir=BaseDir+"\\bmp"; OpenPictureDialog->DefaultExt = "bmp"; OpenPictureDialog->FileName = "*.bmp"; OpenPictureDialog->Filter="Bitmaps (*.bmp)|*.bmp|JPEG Image File (*.jpg)|*.jpg"; SavePictureDialog->InitialDir=BaseDir+"\\bmp"; SavePictureDialog->DefaultExt = "bmp"; SavePictureDialog->FileName = "Noname1"; SavePictureDialog->Filter="Bitmaps (*.bmp)|*.bmp|JPEG Image File (*.jpg)|*.jpg"; TIniFile *IniFile = new TIniFile(BaseDir + "\\Main.ini"); if (IniFile) { UM_PER_DOT=IniFile->ReadFloat("Capture", "UM/DOT", UM_PER_DOT); MAGNIFICATION=IniFile->ReadInteger("Capture", "MAGNIFICATION", DEFAULT_MAGNIFICATION); RES_WIDTH=IniFile->ReadInteger("Capture", "RES_WIDTH", DEFAULT_RES_WIDTH); TUNING=IniFile->ReadInteger("Capture", "TUNING", DEFAULT_TUNING); delete IniFile; } comboMagnification->Text = IntToStr(MAGNIFICATION); if(sbMeasure->Down){ comboObjectType->Visible=true; pnObject->Visible=true; pnGrid->Visible=false; } else { comboObjectType->Visible=false; pnObject->Visible=false; pnGrid->Visible=true; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::FormDestroy(TObject *Sender) { if(ImageGraphicObjectList){ /* while(ImageGraphicObjectList->Count){ delete (GraphicObjectHeader *)ImageGraphicObjectList->Last(); ImageGraphicObjectList->Remove(ImageGraphicObjectList->Last()); } delete ImageGraphicObjectList; ImageGraphicObjectList=NULL; */ GraphicObjectHeader *goh; for (int i = 0; i < ImageGraphicObjectList->Count; i++) { goh = (GraphicObjectHeader *)ImageGraphicObjectList->Items[i]; delete goh; } ImageGraphicObjectList->Clear(); delete ImageGraphicObjectList; ImageGraphicObjectList = NULL; } if(hWndC){ capPreview(hWndC, FALSE); capDriverDisconnect (hWndC); DestroyWindow(hWndC); hWndC=NULL; } if(lpgrid){ VirtualUnlock(lpgrid,gridx*gridy*sizeof(POINT)); VirtualFree(lpgrid,gridx*gridy*sizeof(POINT),MEM_DECOMMIT); lpgrid=NULL; } /* while(temp_path->Count){ KO *ko=(KO *)temp_path->Last(); delete ko; temp_path->Remove(ko); } delete temp_path; */ KO *itemKO; for (int i = 0; i < temp_path->Count; i++) { itemKO = (KO *)temp_path->Items[i]; delete itemKO; } temp_path->Clear(); delete temp_path; delete tm; CaptureForm=NULL; TIniFile *IniFile = new TIniFile(BaseDir + "\\Main.ini"); if (IniFile) { IniFile->WriteFloat("Capture", "UM/DOT", UM_PER_DOT); IniFile->WriteInteger("Capture", "MAGNIFICATION", MAGNIFICATION); IniFile->WriteInteger("Capture", "RES_WIDTH", RES_WIDTH); IniFile->WriteInteger("Capture", "TUNING", TUNING); delete IniFile; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(sbCapture->Down){ return; } else if(sbMeasure->Down){ Image->Picture->Bitmap->Canvas->Font->Size=default_font_size; if(!Shift.Contains(ssLeft))return; if(!Image->Picture->Bitmap->Empty){ TCanvas *canvas = Image->Picture->Bitmap->Canvas; switch(comboObjectType->ItemIndex) { case 0: { GO_POINT *go = new GO_POINT; go->x1 = X; go->y1 = Y; GraphicObjectHeader *goh = new GraphicObjectHeader; goh->got = POINT_TYPE; goh->lpgo = go; AddAndDrawObject(canvas, goh); UpdateLabel(); Image->Repaint(); break; } case 1: { if(step==0){ GO_LINE *go = new GO_LINE; go->x1 = X; go->y1 = Y; go->x2 = X; go->y2 = Y; GraphicObjectHeader *goh = new GraphicObjectHeader; goh->got = LINE_TYPE; goh->lpgo = go; strcpy(goh->description,"0 um"); AddAndDrawObject(canvas, goh); step++; } else { GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==LINE_TYPE) { GO_LINE *go = (GO_LINE *)goh->lpgo; go->x2 = X; go->y2 = Y; double len = sqrt((go->x1-go->x2)*(go->x1-go->x2)+(go->y1-go->y2)*(go->y1-go->y2)); strcpy(goh->description,(IntToStr((int)(len*UM_PER_DOT+0.5))+" um").c_str()); DrawObjectList(); } step = 0; } UpdateLabel(); Image->Repaint(); break; } case 2: { if(step==0){ GO_TRIANGLE *go = new GO_TRIANGLE; go->x1 = X; go->y1 = Y; go->x2 = X; go->y2 = Y; go->x3 = X; go->y3 = Y; go->h = 0; GraphicObjectHeader *goh = new GraphicObjectHeader; goh->got = TRIANGLE_TYPE; goh->lpgo = go; AddAndDrawObject(canvas, goh); step++; } else if(step==1){ GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==TRIANGLE_TYPE) { GO_TRIANGLE *go = (GO_TRIANGLE *)goh->lpgo; go->x2 = X; go->y2 = Y; go->x3 = X; go->y3 = Y; DrawObjectList(); } step++; } else if(step==2){ GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==TRIANGLE_TYPE) { GO_TRIANGLE *go = (GO_TRIANGLE *)goh->lpgo; go->x3 = X; go->y3 = Y; go->find_perpendicular(); AnsiString s = "H = " + IntToStr((int)(go->get_height()*UM_PER_DOT+0.5)) + " um, " + "S = " + IntToStr((int)(go->get_area()*UM_PER_DOT*UM_PER_DOT+0.5)) + " um©÷"; strcpy(goh->description, s.c_str()); DrawObjectList(); } step = 0; } UpdateLabel(); Image->Repaint(); break; } case 3: { if(step==0){ GO_POLYGON *go = new GO_POLYGON; go->add(X,Y); go->add(X,Y);//µÎ¹ø ´õÇÔ GraphicObjectHeader *goh = new GraphicObjectHeader; goh->got = POLYGON_TYPE; goh->lpgo = go; AddAndDrawObject(canvas, goh); step++; } else { GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==POLYGON_TYPE) { GO_POLYGON *go = (GO_POLYGON *)goh->lpgo; if(go->last){ go->last->x=X; go->last->y=Y; } go->add(X,Y); if(Shift.Contains(ssCtrl)){ go->last->x=go->first->x; go->last->y=go->first->y; AnsiString s = "L = " + IntToStr((int)(go->get_length()*UM_PER_DOT+0.5)) + " um, " + "S = " + IntToStr((int)(go->get_area()*UM_PER_DOT*UM_PER_DOT+0.5)) + " um©÷"; strcpy(goh->description, s.c_str()); step=0; } DrawObjectList(); } } UpdateLabel(); Image->Repaint(); break; } case 4: { if(step==0){ GO_SIMPLE_CIRCLE *go = new GO_SIMPLE_CIRCLE; go->x1 = X; go->y1 = Y; go->x2 = X; go->y2 = Y; go->r = 0; GraphicObjectHeader *goh = new GraphicObjectHeader; goh->got = SIMPLE_CIRCLE_TYPE; goh->lpgo = go; AddAndDrawObject(canvas, goh); step++; } else if(step==1){ GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==SIMPLE_CIRCLE_TYPE) { GO_SIMPLE_CIRCLE *go = (GO_SIMPLE_CIRCLE *)goh->lpgo; go->x2 = X; go->y2 = Y; go->find_circle();//cx, cy, r AnsiString s = "L = " + IntToStr((int)(2.0*go->r*UM_PER_DOT+0.5)) + " um, " + "S = " + IntToStr((int)(go->get_area()*UM_PER_DOT*UM_PER_DOT+0.5)) + " um©÷"; strcpy(goh->description, s.c_str()); DrawObjectList(); } step=0; } UpdateLabel(); Image->Repaint(); break; } default: Image->Repaint(); break; } } } else { if(!Shift.Contains(ssLeft))return; if(sbGridMove->Down){ pt=FindNearestPoint(X,Y); if(pt.x==-1) { grid_step=0; return; } if(grid_step==0)grid_step=1; else if(grid_step==1)grid_step=0; //POINT *p2=(POINT *)lpgrid+(gridx*j+i); } else { pt=FindNearestPoint(X,Y); if(pt.x==-1) return; Tex *tex=(Tex *)Main->texlayer->TexList->Items[Main->LayerNum]; KO *ko=(KO *)tex->Curve->Items[(gridy-1-pt.y)%tex->Curve->Count]; int x=gridx-1-pt.x; if(ko->via==x){ ko->in=x; ko->via=x+1; } else { ko->in=x+1; ko->via=x; } tex->Correction(); UpdatePath(); DesignForm->DrawChart(false); } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ImageMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(sbCapture->Down==false&&sbMeasure->Down==true){//&&comboObjectType->ItemIndex==1){ Image->Cursor=crCross; } else { Image->Cursor=crDefault; } if(sbCapture->Down){ return; } else if(sbMeasure->Down){ Image->Picture->Bitmap->Canvas->Font->Size=default_font_size; if(Shift.Contains(ssLeft))return; if(!Image->Picture->Bitmap->Empty){ //TCanvas *canvas = Image->Picture->Bitmap->Canvas; switch(comboObjectType->ItemIndex) { case 0: { //Image->Repaint(); break; } case 1: { if(step==1){ RestoreImage(); GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==LINE_TYPE){ GO_LINE *go = (GO_LINE *)goh->lpgo; go->x2 = X; go->y2 = Y; double len = sqrt((go->x1-go->x2)*(go->x1-go->x2)+(go->y1-go->y2)*(go->y1-go->y2)); strcpy(goh->description,(IntToStr((int)(len*UM_PER_DOT+0.5))+" um").c_str()); } DrawObjectList(); UpdateLabel(); Image->Repaint(); } break; } case 2: { if(step==1){ RestoreImage(); GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==TRIANGLE_TYPE){ GO_TRIANGLE *go = (GO_TRIANGLE *)goh->lpgo; go->x2 = X; go->y2 = Y; go->x3 = X; go->y3 = Y; } DrawObjectList(); UpdateLabel(); Image->Repaint(); } else if(step==2){ RestoreImage(); GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==TRIANGLE_TYPE){ GO_TRIANGLE *go = (GO_TRIANGLE *)goh->lpgo; go->x3 = X; go->y3 = Y; go->find_perpendicular(); AnsiString s = "H = " + IntToStr((int)(go->get_height()*UM_PER_DOT+0.5)) + " um, " + "S = " + IntToStr((int)(go->get_area()*UM_PER_DOT*UM_PER_DOT+0.5)) + " um©÷"; strcpy(goh->description, s.c_str()); } DrawObjectList(); UpdateLabel(); Image->Repaint(); } break; } case 3: { if(step>0){ RestoreImage(); GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==POLYGON_TYPE){ GO_POLYGON *go = (GO_POLYGON *)goh->lpgo; if(go->last){ go->last->x = X; go->last->y = Y; } } DrawObjectList(); UpdateLabel(); Image->Repaint(); } break; } case 4: { if(step==1){ RestoreImage(); GraphicObjectHeader *goh = GetLastGraphicObject(); if(goh && goh->got==SIMPLE_CIRCLE_TYPE){ GO_SIMPLE_CIRCLE *go = (GO_SIMPLE_CIRCLE *)goh->lpgo; go->x2 = X; go->y2 = Y; go->find_circle();//cx, cy, r AnsiString s = "L = " + IntToStr((int)(2.0*go->r*UM_PER_DOT+0.5)) + " um, " + "S = " + IntToStr((int)(go->get_area()*UM_PER_DOT*UM_PER_DOT+0.5)) + " um©÷"; strcpy(goh->description, s.c_str()); } DrawObjectList(); UpdateLabel(); Image->Repaint(); } break; } default: { Image->Repaint(); break; } } } } else { if(sbGridMove->Down){ if(grid_step==1){ RestoreImage(); POINT *p=(POINT *)lpgrid+(gridx*pt.y+pt.x); if(p){ TCanvas *canvas = Image->Picture->Bitmap->Canvas; if((pt.x==0&&pt.y==0)||(pt.x==0&&pt.y==gridy-1)||(pt.x==gridx-1&&pt.y==0)||(pt.x==gridx-1&&pt.y==gridy-1)){ p->x=X; p->y=Y; POINT *p11=(POINT *)lpgrid+(gridx*0+0); POINT *p21=(POINT *)lpgrid+(gridx*0+gridx-1); POINT *p12=(POINT *)lpgrid+(gridx*(gridy-1)+0); POINT *p22=(POINT *)lpgrid+(gridx*(gridy-1)+gridx-1); for(int i=0;ix*(gridx-1-i)+p21->x*(i))/(gridx-1); double x1222=(p12->x*(gridx-1-i)+p22->x*(i))/(gridx-1); double x=(x1121*(gridy-1-j)+x1222*(j))/(gridy-1); double y1121=(p11->y*(gridx-1-i)+p21->y*(i))/(gridx-1); double y1222=(p12->y*(gridx-1-i)+p22->y*(i))/(gridx-1); double y=(y1121*(gridy-1-j)+y1222*(j))/(gridy-1); POINT *p2=(POINT *)lpgrid+(gridx*j+i); p2->x=x; p2->y=y; } } for(int i=0;iPen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Ellipse(p2->x-default_point_size,p2->y-default_point_size,p2->x+default_point_size,p2->y+default_point_size); } } } else { p->x=X; p->y=Y; for(int i=0;iPen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Ellipse(p2->x-default_point_size,p2->y-default_point_size,p2->x+default_point_size,p2->y+default_point_size); } } } } } } else { } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::AddAndDrawObject(TCanvas *canvas, GraphicObjectHeader *goh) { DrawObject(canvas,goh); AddObject(goh); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::DrawObject(TCanvas *canvas, GraphicObjectHeader *goh){ switch(goh->got){ // ±×¸²À» ±×¸² case POINT_TYPE: { GO_POINT *go=(GO_POINT *)goh->lpgo; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Ellipse(go->x1-default_point_size,go->y1-default_point_size,go->x1+default_point_size,go->y1+default_point_size); canvas->TextOut(go->x1,go->y1,goh->description); break; } case LINE_TYPE: { GO_LINE *go=(GO_LINE *)goh->lpgo; canvas->Font->Color = clBlack; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->MoveTo(go->x1,go->y1); canvas->LineTo(go->x2,go->y2); canvas->TextOut(go->x2,go->y2,goh->description); break; } case TRIANGLE_TYPE: { GO_TRIANGLE *go=(GO_TRIANGLE *)goh->lpgo; canvas->Font->Color = clBlack; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->MoveTo(go->x1,go->y1); canvas->LineTo(go->x2,go->y2); canvas->LineTo(go->x3,go->y3); canvas->LineTo(go->x1,go->y1); if(go->h) { canvas->LineTo(go->px,go->py); } canvas->TextOut(go->x1,go->y1,goh->description); break; } case POLYGON_TYPE: { GO_POLYGON *go=(GO_POLYGON *)goh->lpgo; canvas->Font->Color = clBlack; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; if(go->pts->Count>1){ canvas->MoveTo(go->last->x,go->last->y); for(int i=0;ipts->Count-1;i++){ TPoint *p=(TPoint *)go->pts->Items[go->pts->Count-2-i]; canvas->LineTo(p->x,p->y); } if(go->before_last) { canvas->TextOut(go->before_last->x,go->before_last->y,goh->description); } } break; } case SIMPLE_CIRCLE_TYPE: { GO_SIMPLE_CIRCLE *go=(GO_SIMPLE_CIRCLE *)goh->lpgo; canvas->Font->Color = clBlack; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->MoveTo(go->x1,go->y1); canvas->LineTo(go->x2,go->y2); if(go->r) { canvas->Brush->Style = bsClear; canvas->Ellipse(go->cx-go->r,go->cy-go->r,go->cx+go->r,go->cy+go->r); canvas->Brush->Style = bsSolid; canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Ellipse(go->cx-3,go->cy-3,go->cx+3,go->cy+3); canvas->TextOut(go->cx,go->cy,goh->description); } break; } default: break; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::AddObject(GraphicObjectHeader *goh){ ImageGraphicObjectList->Add(goh); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::DeleteLastObject(){ // µ¥ÀÌÅÍ¿Í ±×¸²À» Áö¿ò RestoreImage(); if(ImageGraphicObjectList->Count){ GraphicObjectHeader *goh = (GraphicObjectHeader *)ImageGraphicObjectList->Last(); ImageGraphicObjectList->Remove(goh); delete goh; DrawObjectList(); } } //--------------------------------------------------------------------------- GraphicObjectHeader *__fastcall TCaptureForm::GetLastGraphicObject() { GraphicObjectHeader *goh = NULL; if(ImageGraphicObjectList->Count){ goh = (GraphicObjectHeader *)ImageGraphicObjectList->Last(); } return goh; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ResetObjectList(){ // µ¥ÀÌÅ͸¦ Áö¿ò if(ImageGraphicObjectList){ /* while(ImageGraphicObjectList->Count){ GraphicObjectHeader *goh = (GraphicObjectHeader *)ImageGraphicObjectList->Last(); ImageGraphicObjectList->Remove(goh); delete goh; } */ GraphicObjectHeader *goh; for (int i = 0; i < ImageGraphicObjectList->Count; i++) { goh = (GraphicObjectHeader *)ImageGraphicObjectList->Items[i]; delete goh; } ImageGraphicObjectList->Clear(); } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbUndoClick(TObject *Sender) { DeleteLastObject(); UpdateLabel(); Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::UpdateLabel(){ GraphicObjectHeader *goh = new GraphicObjectHeader; for(int i=0;iCount;i++){ goh = (GraphicObjectHeader *)ImageGraphicObjectList->Items[i]; } if(goh){ // last graphic object header if(goh->got==POINT_TYPE){ lbInfo->Caption = IDS_COUNT + " : " + (String)ImageGraphicObjectList->Count; } else { lbInfo->Caption=goh->description; } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::OnChangeSize(){ int h=ClientHeight; int w=ClientWidth; pnMode->Width=w-2; //#sjpark - left margin 1px, right margin 1px sbGrid->Left=pnMode->Width-sbGrid->Width-10; sbMeasure->Left=sbGrid->Left-sbMeasure->Width-5; pnObject->Width = pnMode->Width-280; sbUndo->Left = pnObject->Width-sbUndo->Width-10; pnGrid->Width = pnObject->Width; sbPath->Left = sbUndo->Left; sbGridMove->Left = sbPath->Left - sbGridMove->Width - 5; ImageScrollBox->Left=2; ImageScrollBox->Top=pnGrid->Top+pnGrid->Height+4; ImageScrollBox->Height=h-ImageScrollBox->Top-4; ImageScrollBox->Width=w-4; ImageScrollBox->HorzScrollBar->Position=0; ImageScrollBox->VertScrollBar->Position=0; Image->Top=0; Image->Left=0; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::FormResize(TObject *Sender) { OnChangeSize(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::SetFont(){ SetSmallFont(Font); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbSetClick(TObject *Sender) { RestoreImage(); ResetGrid(true); DrawGrid(); if(sbPath->Down) DrawPath(); Image->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbMeasureClick(TObject *Sender) { RestoreImage(); DrawObjectList(); Image->Repaint(); if(sbCapture->Down){ sbCaptureClick(NULL); sbCapture->Down=false; } comboObjectType->Visible=true; pnObject->Visible=true; pnGrid->Visible=false; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbGridClick(TObject *Sender) { ResetObjectList(); UpdateLabel(); RestoreImage(); DrawGrid(); if(sbPath->Down) DrawPath(); Image->Repaint(); if(sbCapture->Down){ sbCaptureClick(NULL); sbCapture->Down=false; } comboObjectType->Visible=false; pnObject->Visible=false; pnGrid->Visible=true; } //--------------------------------------------------------------------------- POINT __fastcall TCaptureForm::FindNearestPoint(int &X, int &Y){ POINT p=Point(-1,-1),*p2=NULL; if(lpgrid){ double r=-1,r2=0; for(int i=0;ix-X)*(p2->x-X)+(p2->y-Y)*(p2->y-Y); } else { r2=(p2->x-X)*(p2->x-X)+(p2->y-Y)*(p2->y-Y); if(r>r2){ r=r2; p=Point(i,j); } } } } } return p; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ImageMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(sbCapture->Down){ return; } else if(sbMeasure->Down){ } else { if(sbGridMove->Down){ if(grid_step==1){ grid_step=0; } } else { } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbPathClick(TObject *Sender) { RestoreImage(); DrawGrid(); UpdatePath(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::sbGridMoveClick(TObject *Sender) { RestoreImage(); DrawGrid(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::UpdatePath(){ RestoreImage(); DrawGrid(); if(lpgrid){ Tex *tex=(Tex *)Main->texlayer->TexList->Items[Main->LayerNum]; while(tex->Curve->Count>temp_path->Count){ KO *ko=new KO; *ko=*(KO *)tex->Curve->Items[temp_path->Count]; temp_path->Add(ko); } while(tex->Curve->CountCount){ KO *ko=(KO *)temp_path->Last(); delete ko; temp_path->Remove(ko); } for(int i=0;iCount;i++){ KO *ko1=(KO *)tex->Curve->Items[i]; KO *ko2=(KO *)temp_path->Items[i]; *ko2=*ko1; } DrawPath(); } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::edWaleKeyPress(TObject *Sender, char &Key) { if(Key!=VK_RETURN) return; edCourse->SetFocus(); ResetGrid(false); RestoreImage(); DrawGrid(); if(sbPath->Down) DrawPath(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::edCourseKeyPress(TObject *Sender, char &Key) { if(Key!=VK_RETURN) return; ResetGrid(false); RestoreImage(); DrawGrid(); if(sbPath->Down) DrawPath(); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ResetGrid(bool init_pos){ bool exist=false; POINT p11,p12,p21,p22; //TCanvas *canvas = Image->Picture->Bitmap->Canvas; if(lpgrid){ exist=true; p11=*((POINT *)lpgrid+(gridx*0+0)); p21=*((POINT *)lpgrid+(gridx*0+gridx-1)); p12=*((POINT *)lpgrid+(gridx*(gridy-1)+0)); p22=*((POINT *)lpgrid+(gridx*(gridy-1)+gridx-1)); VirtualUnlock(lpgrid,gridx*gridy*sizeof(POINT)); VirtualFree(lpgrid,gridx*gridy*sizeof(POINT),MEM_DECOMMIT); lpgrid=NULL; } gridx=StrToInt(edWale->Text); gridy=StrToInt(edCourse->Text); if(gridx<2||gridy<2){ edWale->Text="2";edCourse->Text="2"; gridx=2;gridy=2; } lpgrid = VirtualAlloc(NULL,gridx*gridy*sizeof(POINT),MEM_COMMIT,PAGE_READWRITE); if(lpgrid) VirtualLock(lpgrid,gridx*gridy*sizeof(POINT)); if(init_pos||exist==false){ for(int i=0;ix=20+i*(ImageScrollBox->Width-40)/gridx; // p->y=20+j*(ImageScrollBox->Height-40)/gridy; p->x=20+i*(min(ImageScrollBox->Width, Image->Width)-40)/gridx; //ÀåÁø¸¸: ±×¸®µå Á¡ÀÌ È­¸é ¹ÛÀ¸·Î ³ª°¡Áö ¾Ê°Ô p->y=20+j*(min(ImageScrollBox->Height, Image->Height)-40)/gridy; } } } else { for(int i=0;ix=x; p2->y=y; } } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::FormShow(TObject *Sender) { static bool first=true; if(first){ InitForm(); } first=false; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::spGridColorMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Shift.Contains(ssLeft)&&((X-12)*(X-12)+(Y-12)*(Y-12)<100)) {//Á߽ɿ¡ °¡±î¿ì¸é..//spGridColor´Â 25 x 25 Å©±âÀÓ TColor c; PaletteForm->Left=Mouse->CursorPos.x; PaletteForm->Top=Mouse->CursorPos.y; PaletteForm->Visible=true; PaletteForm->InitForm(PaletteForm->Palette);//visible »óÅ¿¡¼­ ÃʱâÈ­ÇØ¾ß ½ºÅ©·Ñ¹Ù°¡ ¿òÁ÷¿©Áø´Ù PaletteForm->Visible=false; if(PaletteForm->ShowModal()==mrOk){ spGridColor->Brush->Color=PaletteForm->DIB256Palette->FGColor; RestoreImage(); if(sbCapture->Down){ } else if(sbMeasure->Down){ DrawObjectList(); } else if(sbGrid->Down){ DrawGrid(); if(sbPath->Down) DrawPath(); } } }/* else { TCursor cursor = Screen->Cursor; Screen->Cursor = crIBeam; FloatingWindow->Left=Mouse->CursorPos.x; FloatingWindow->Top=Mouse->CursorPos.y; FloatingWindow->edit->Text = default_point_size; if(FloatingWindow->ShowModal()==mrOk){ default_point_size = StrToInt(FloatingWindow->edit->Text); RestoreImage(); if(sbCapture->Down){ } else if(sbMeasure->Down){ DrawObjectList(); } else if(sbGrid->Down){ DrawGrid(); if(sbPath->Down) DrawPath(); } } Screen->Cursor = cursor; }*/ } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::RestoreImage() { HDC src=tm->CreateDC(); HDC dst=Image->Picture->Bitmap->Canvas->Handle; BitBlt(dst,0,0,Image->Width,Image->Height,src,0,0,SRCCOPY); tm->DeleteDC(src); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::DrawObjectList() { GraphicObjectHeader *goh = NULL; TCanvas *canvas = Image->Picture->Bitmap->Canvas; for(int i=0;iCount;i++){ goh = (GraphicObjectHeader *)ImageGraphicObjectList->Items[i]; DrawObject(canvas, goh); } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::DrawGrid() { TCanvas *canvas = Image->Picture->Bitmap->Canvas; for(int i=0;iPen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Ellipse(p->x-default_point_size,p->y-default_point_size,p->x+default_point_size,p->y+default_point_size); } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::DrawPath() { TCanvas *canvas = Image->Picture->Bitmap->Canvas; for(int j=0;jItems[j%temp_path->Count]; int x=min(ko->in,ko->via); if(x>=gridx||x<0)continue; POINT *p=(POINT *)lpgrid+gridx*((gridy-1-j)%gridy)+(gridx-1-x); KO *ko2=(KO *)temp_path->Items[(j+1)%temp_path->Count]; int x2=min(ko2->in,ko2->via); if(x2>=gridx||x2<0)continue; POINT *p2=(POINT *)lpgrid+gridx*((gridy-1-(j+1))%gridy)+(gridx-1-x2); canvas->Pen->Color = spGridColor->Brush->Color; canvas->Brush->Color = spGridColor->Brush->Color; canvas->Pen->Width=10; canvas->MoveTo(p->x,p->y); canvas->LineTo(p2->x,p2->y); canvas->Pen->Width=1; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::InitForm(){ Top=0; #ifdef NO_SIM_VERSION Height=Main->ClientHeight-4; #else Height=(Main->ClientHeight-4)/2; #endif Left=0; Width=(Main->ClientWidth-209-2)/2; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::FormClose(TObject *Sender, TCloseAction &Action) { TIniFile *IniFile = new TIniFile(BaseDir + "\\Main.ini"); if (IniFile) { IniFile->WriteBool("Capture", "Visible", false); delete IniFile; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::ImagePopupMenuPopup(TObject *Sender) { if(mode){ //# capture image //pmZoom->Enabled=true; pmViewer->Enabled=true; pmSaveImage->Enabled=true; pmCopyToClipboard->Enabled=true; } else { //# video //pmZoom->Enabled=false; pmViewer->Enabled=false; pmSaveImage->Enabled=false; pmCopyToClipboard->Enabled=false; } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::comboObjectTypeChange(TObject *Sender) { step = 0; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::pmCopyToClipboardClick(TObject *Sender) { BITMAPHANDLE bh; HDC dcSrc = NULL, dcDst = NULL; memset(&bh, 0, sizeof(BITMAPHANDLE)); L_CreateBitmap(&bh, sizeof(BITMAPHANDLE), TYPE_CONV, Image->Picture->Width, Image->Picture->Height, 24, ORDER_BGR, NULL, TOP_LEFT, NULL, NULL); dcDst = L_CreateLeadDC(&bh); dcSrc = Image->Picture->Bitmap->Canvas->Handle; BitBlt(dcDst, 0, 0, Image->Picture->Width, Image->Picture->Height, dcSrc, 0, 0, SRCCOPY); L_DeleteLeadDC(dcDst); dcDst = NULL; L_CopyToClipboard(Handle, &bh, COPY2CB_EMPTY | COPY2CB_DIB); L_FreeBitmap(&bh); } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::comboMagnificationChange(TObject *Sender) { int mag = StrToInt(comboMagnification->Text); if(mag){ MAGNIFICATION = mag;//¹èÀ² º¯°æ if(RES_WIDTH){ UM_PER_DOT = (double)TUNING / (double)RES_WIDTH / (double)MAGNIFICATION; } else { UM_PER_DOT = (double)TUNING / (double)DEFAULT_RES_WIDTH / (double)MAGNIFICATION; } } } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::lbMagnificationClick(TObject *Sender) { TCursor cursor = Screen->Cursor; Screen->Cursor = crIBeam; FloatingWindow->Left=Mouse->CursorPos.x; FloatingWindow->Top=Mouse->CursorPos.y-FloatingWindow->Height; FloatingWindow->edit->Text = IntToStr(TUNING); if(FloatingWindow->ShowModal()==mrOk){ TUNING = StrToInt(FloatingWindow->edit->Text); if(TUNING&&RES_WIDTH&&MAGNIFICATION){ UM_PER_DOT = (double)TUNING / (double)RES_WIDTH / (double)MAGNIFICATION; } } Screen->Cursor = cursor; } //--------------------------------------------------------------------------- void __fastcall TCaptureForm::edSizeKeyPress(TObject *Sender, char &Key) { if(Key==VK_RETURN){ default_point_size = StrToInt(edSize->Text); RestoreImage(); if(sbCapture->Down){ } else if(sbMeasure->Down){ DrawObjectList(); } else if(sbGrid->Down){ DrawGrid(); if(sbPath->Down) DrawPath(); } } } //---------------------------------------------------------------------------