일단 첨부한 압축파일에 사진을 봐주시면 이해하기가 한결 편하실 겁니다.
file select 콤보박스에서 파일넘버를 선택하면 그 파일에서 데이터를 읽어서 배열에 저장합니다.
이 데이터는 다른 콤포넌트에서도 사용하기 때문에 수정하지 않기 위해 Peak chart 내부에
이 데이터를 복사한 배열을 따로 만들었습니다. 그리고 복사한 배열을 통해서 chart2와(그림파일에서 아래의 chart)
사이의 bitmap 을 구간별로 256색 컬러맵핑한 것입니다.
문제는 첨부파일을 보시면 아시겠지만, 같은 파일에서 데이터를 읽어오는 것임에도 file select를 반복해서
왔다갔다하면 계속해서 chart2가 변합니다. chart2만 다른게 아니라 bitmap이 달라지는걸 봐선
그리기위한 데이터가 계속해서 변한다고 밖에 생각이 안되는데요ㅠ 왜 달라지는지를 모르겠습니다.
문장이 변하지 않으니 계속해서 같은 데이터를 가져올텐데...초기화를 안해서인가 싶어서 초기화도
해보고는 하는데 결과가 달라지진 않네요ㅠ 무슨 문제점이 있는지 지적해주시면 좋겠습니다ㅠ
그리고 chart2 에서 가져오는 데이터를 chart1의 게이트(tool ---> colorline1, colorline2로 구성한 겁니다)
의 움직임에 따라 실시간으로 연동하고 싶은데, chart1에선 변하지만 chart2에선 변하지 않습니다.
chart2에서 series를 그릴 때 게이트값이 움직이는걸 바로 가져오게 하는 방법을..힌트 좀 부탁드려요ㅎ
이것저것 실험해서 제가 다 해보고 싶긴한데...무한 삽질이 될 가능성도 있고..무한 삽질은 해도 되는데 내일까지는
도저히 못할 것 같아서 조언을 부탁드립니다ㅠ
아래는 Peak chart 그리기(chart2) 소스와, file select combo 소스입니다.
void __fastcall TForm1::PeakChartClick(TObject *Sender) //Peak chart
{
Chart2->LeftAxis->Minimum = -2048; //y축 범위 설정
Chart2->LeftAxis->Maximum = 2048;
Chart2->BottomAxis->Minimum = 0; //X축 범위 설정
Chart2->BottomAxis->Maximum = ScanPts;
SeriesPositive->Clear(); //Peak-Min
SeriesNegative->Clear(); //Peak_Max
SeriesAbsolute->Clear(); //Absolute_Peak
Series3->Clear(); //Absolute_Peak
short *ScanLine = new short[Points*ScanPts];
memset(ScanLine, 0, sizeof(short)*Points*ScanPts);
for(i=0; i<Points*ScanPts; i++)
{
ScanLine[i] = pData[i]-2048;
}
short *peakMaxVal = new short[ScanPts];
short *peakMaxIdx = new short[ScanPts];
short *peakMinVal = new short[ScanPts];
short *peakMinIdx = new short[ScanPts];
short *peakAbsVal = new short[ScanPts];
short *peakAbsIdx = new short[ScanPts];
//idx = ScanIndexSelect->ItemIndex;
for(j= 0; j < ScanPts; j++)
{
for(i = 1000; i < 3500; i++)
{
//Positive Peak
if(ScanLine[(j*Points)+i] > peakMaxVal[j])
{
peakMaxVal[j] = ScanLine[(j*Points)+i];
peakMaxIdx[j] = (j*Points)+i;
}
//Negative Peak
if(ScanLine[(j*Points)+i] < peakMinVal[j])
{
peakMinVal[j] = ScanLine[(j*Points)+i];
peakMinIdx[j] = (j*Points)+i;
}
//Absolute Peak
if(abs(ScanLine[(j*Points)+i]) > peakAbsVal[j])
{
peakAbsVal[j] = abs(ScanLine[(j*Points)+i]);
peakAbsIdx[j] = (j*Points)+i;
}
}
SeriesPositive->AddXY(j, peakMaxVal[j]);
SeriesNegative->AddXY(j, peakMinVal[j]);
SeriesAbsolute->AddXY(j, peakAbsVal[j]);
Series3->AddXY(j, abs(peakMinVal[j]));
}
Chart2->Refresh();
Image1->Picture->Bitmap->Width = Form1->Width; //ScanPts*2;
Image1->Picture->Bitmap->Height = Image1->Height;
double colorVal = 0;
Image1->Picture = NULL;
Image1->Canvas->Refresh();
for(i = 0 ; i < ScanPts; i++)
{
colorVal = 256*peakMaxVal[i]/2048.0;
//for(int j = 0; j < Image1->Height; j++)
//Image1->Canvas->Pixels[i*2][j] = colorJet[(int)colorVal]; //---->pixel로 뿌리기.
Image1->Canvas->Brush->Color = colorJet[(int)colorVal];
Image1->Canvas->FillRect(Rect(i*2, 0, (i+1)*2, Image1->Height));
}
Image1->Canvas->Refresh();
delete [] peakMaxVal;
peakMaxVal = NULL;
delete [] peakMaxIdx;
peakMaxIdx = NULL;
delete [] peakMinVal;
peakMinVal = NULL;
delete [] peakMinIdx;
peakMinIdx = NULL;
delete [] peakAbsVal;
peakAbsVal = NULL;
delete [] peakAbsIdx;
peakAbsIdx = NULL;
ScanLine = NULL;
delete [] ScanLine;
}
//---------------------------------------------
void __fastcall TForm1::FileSelectChange(TObject *Sender)
{
idx = FileSelect->ItemIndex;
AnsiString fileName = "D:\\111\\222_Ch2_part" + IntToStr(idx) + ".tmp";
FileName = fileName;
StatusBar1->Panels->Items[0]->Text = "OpenFile : " + fileName;
if(pData != NULL)
{
delete [] pData;
pData = NULL;
}
TFileStream *pOpenStream = new TFileStream(FileName.c_str(), fmOpenRead);
pOpenStream->Seek(HeadData, soFromBeginning);
pData = new short[Points*ScanPts];
memset(pData, 0, sizeof(short)*Points*ScanPts);
pOpenStream->Read(pData, sizeof(short)*Points*ScanPts);
delete pOpenStream;
PeakChart->Click();
if(RF_Mode->Checked)
Bt_RF->Click();
else
Bt_Video->Click();
}