// C60XRDView.cpp : CC60XRDView クラスの動作の定義を行います。 // #include "stdafx.h" #include "C60XRD.h" #include "C60XRDDoc.h" #include "C60XRDView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include "MyDialog1.h" #include "MyDialog2.h" #include "MyDialog3.h" #include "MyDialog4.h" #include "MyDialog5.h" #include "MyDialog6.h" #include #include double atom(double s); ///////////////////////////////////////////////////////////////////////////// // CC60XRDView IMPLEMENT_DYNCREATE(CC60XRDView, CView) BEGIN_MESSAGE_MAP(CC60XRDView, CView) //{{AFX_MSG_MAP(CC60XRDView) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_condition, Oncondition) ON_COMMAND(ID_thermal, Onthermal) ON_COMMAND(ID_FWHM, OnFwhm) ON_COMMAND(ID_XYobs, OnXYobs) ON_COMMAND(ID_XYcalc, OnXYcalc) ON_COMMAND(ID_FILE_SAVE, OnFileSave) ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) //}}AFX_MSG_MAP // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CC60XRDView クラスの構築/消滅 CC60XRDView::CC60XRDView() { // TODO: この場所に構築用のコードを追加してください。 WaveLength=0.4983; Xmin=0.0; Xmax=0.0; Ymin=0.0; Ymax=0.0; DataXmin=0.0; DataXmax=0.0; DataYmin=0.0; DataYmax=0.0; LatticeA=14.15; FWHM=0.001; Rc=3.5; Thermal=0.0; Xcolumn=1; Ycolumn=2; SkipLine=0; Lastline=4000; YminC=0; YmaxC=0; } CC60XRDView::~CC60XRDView() { } BOOL CC60XRDView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CC60XRDView クラスの描画 void CC60XRDView::OnDraw(CDC* pDC) { CC60XRDDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 int xt,yt,i; pDC->TextOut(10,10, openfilename); for (i=0; i=Xmin && xd[i]<=Xmax && yd[i]>=Ymin && yd[i]<=Ymax) { xt=(int) 550*(xd[i]-Xmin)/(Xmax-Xmin)+100; yt=(int) -250*(yd[i]-Ymin)/(Ymax-Ymin)+300; pDC->SetPixel(xt,yt,RGB(0,0,255)); pDC->SetPixel(xt+1,yt,RGB(0,0,255)); pDC->SetPixel(xt,yt+1,RGB(0,0,255)); pDC->SetPixel(xt+1,yt+1,RGB(0,0,255)); } } char name[20], *t1; if (ndata>0) { pDC->TextOut(250,30, "XRD simulation"); t1 = gcvt(Xmin, 8, name); pDC->TextOut(100,410, t1); t1 = gcvt(Xmax, 8, name); pDC->TextOut(640,410, t1); pDC->SetTextColor(RGB(255,0,0)); t1 = gcvt(Ymax, 8, name); pDC->TextOut(35,50, t1); t1 = gcvt(Ymin, 8, name); pDC->TextOut(35,280, t1); CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(125,125,125)); CBrush* OldBrush=pDC->SelectObject(&NewBrush); CRect DRect(100,50,650,300); pDC->FrameRect(DRect, &NewBrush); CRect DRect2(100,50,650,400); pDC->FrameRect(DRect2, &NewBrush); pDC->SelectObject(OldBrush); NewBrush.DeleteObject(); } if (ndata>0) { int Ndiffraction; Ndiffraction=5; double Sd[5], Multi[5], Scatter[5], d_value[5]; double Q, s; d_value[0]=LatticeA/sqrt(3); d_value[1]=LatticeA/2.0; d_value[2]=LatticeA/sqrt(8); d_value[3]=LatticeA/sqrt(11); d_value[4]=LatticeA/sqrt(12); Multi[0]=8; Multi[1]=6; Multi[2]=12; Multi[3]=24; Multi[4]=8; for (i=0; i<5; i++) { Sd[i] = 1.0/(2.0*d_value[i]); } for (i=0; i<5; i++) { Q=Sd[i]*4.0*3.14159; Scatter[i] = atom(Sd[i])*sin(Q*Rc)/(Q*Rc)*exp(-Thermal*Sd[i]*Sd[i]); } for (i=0; i<500; i++) { s = 0.15*i/500.0; Intensity[i] =0.0; for (int j=0; j<5; j++) { Intensity[i] = Intensity[i] + Scatter[j]*Scatter[j]*exp(-(s-Sd[j])*(s-Sd[j])/(FWHM*FWHM)); } } double IYmax, IYmin; if (YminC==0 & YmaxC==0) { IYmin=Intensity[0]; IYmax=Intensity[0]; for (i=0; i<500; i++) { if (IYmin>Intensity[i]) { IYmin=Intensity[i];} if (IYmaxSetPixel(xt,yt,RGB(255,0,0)); pDC->SetPixel(xt+1,yt,RGB(255,0,0)); pDC->SetPixel(xt,yt+1,RGB(255,0,0)); pDC->SetPixel(xt+1,yt+1,RGB(255,0,0)); } double Smax,Smin; Smax=0;Smin=0; for (i=0; i<500; i++) { s = 0.15*i/500.0; Q=s*4.0*3.14159; Scatt[i]= atom(s)*sin(Q*Rc)/(Q*Rc); if (SmaxScatt[i]) {Smin=Scatt[i];} } for (i=0; i<500; i++) { s = 0.15*i/500.0; xt=(int) 550*(s-Xmin)/(Xmax-Xmin)+100; yt=(int) -100*(Scatt[i]-Smin)/(Smax-Smin)+400; pDC->SetPixel(xt,yt,RGB(255,0,255)); yt=(int) -100*(0-Smin)/(Smax-Smin)+400; pDC->SetPixel(xt,yt,RGB(0,0,0)); } } } double atom(double s) { double a[5],b[5],c; double ans; a[1]=2.31; a[2]=1.02; a[3]=1.5886; a[4]=0.865; b[1]=20.8439; b[2]=10.2075; b[3]=0.5687; b[4]=51.6512; c=0.2156; ans=0.0; for (int i=1; i<=4; i++){ ans=ans+a[i]*exp(-b[i]*s*s); } ans=ans+c; return ans; } ///////////////////////////////////////////////////////////////////////////// // CC60XRDView クラスの印刷 BOOL CC60XRDView::OnPreparePrinting(CPrintInfo* pInfo) { // デフォルトの印刷準備 return DoPreparePrinting(pInfo); } void CC60XRDView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷前の特別な初期化処理を追加してください。 } void CC60XRDView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 印刷後の後処理を追加してください。 } ///////////////////////////////////////////////////////////////////////////// // CC60XRDView クラスの診断 #ifdef _DEBUG void CC60XRDView::AssertValid() const { CView::AssertValid(); } void CC60XRDView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CC60XRDDoc* CC60XRDView::GetDocument() // 非デバッグ バージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CC60XRDDoc))); return (CC60XRDDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CC60XRDView クラスのメッセージ ハンドラ void CC60XRDView::OnFileOpen() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください CFileDialog filedlg(TRUE, "", "*.*"); CString filename; FILE *ifp; char s[256]; int n,m,k,nd; if (filedlg.DoModal() == IDOK) { filename = filedlg.GetPathName(); openfilename=filename; ifp = fopen(filename, "r"); } MyDialog4 mD; int ret4; mD.m_x_column=Xcolumn; mD.m_y_column=Ycolumn; mD.m_skipline=SkipLine; mD.m_lastline=Lastline; mD.m_wavelength=WaveLength; ret4=mD.DoModal(); if (ret4==IDOK) { Xcolumn=mD.m_x_column; Ycolumn=mD.m_y_column; SkipLine=mD.m_skipline; Lastline=mD.m_lastline; WaveLength=mD.m_wavelength; } for (n=0; n=Lastline) break; if (strlen(s)<=1) break; if (strlen(s)) { for(n=0; n=2) { m=0; k=0; break; } if (isspace(s[n]) || s[n]==',') { m=0; } else { if (m==0) { if (k==0) { nd=nd+1;} k=k+1; if (k==Xcolumn) { xd[nd]=atof(&s[n]); } else if (k==Ycolumn) { yd[nd]=atof(&s[n]); } } m=1; } } } } fclose(ifp); ndata=nd; for (int i=0; ixd[i]) { DataXmin=xd[i];} if (DataYmaxyd[i]) { DataYmin=yd[i];} } Xmax=0.15; Xmin=0.0; Ymax=DataYmax; Ymin=DataYmin; RedrawWindow(); } void CC60XRDView::Oncondition() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog1 myDL; myDL.m_Ainput=LatticeA; myDL.m_Rinput=Rc; int ret; ret=myDL.DoModal(); if (ret==IDOK) { LatticeA=myDL.m_Ainput; Rc=myDL.m_Rinput; } RedrawWindow(); } void CC60XRDView::Onthermal() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog2 myDL; myDL.m_thermal=Thermal; int ret; ret=myDL.DoModal(); if (ret==IDOK) { Thermal=myDL.m_thermal; } RedrawWindow(); } void CC60XRDView::OnFwhm() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog3 myDL; int ret; myDL.m_FWHM=FWHM; ret=myDL.DoModal(); if (ret==IDOK) { FWHM=myDL.m_FWHM; } RedrawWindow(); } void CC60XRDView::OnXYobs() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog5 myDL; int ret; myDL.m_Xmin=Xmin; myDL.m_Xmax=Xmax; myDL.m_Ymin=Ymin; myDL.m_Ymax=Ymax; ret=myDL.DoModal(); if (ret==IDOK) { Xmin=myDL.m_Xmin; Xmax=myDL.m_Xmax; Ymin=myDL.m_Ymin; Ymax=myDL.m_Ymax; } RedrawWindow(); } void CC60XRDView::OnXYcalc() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください MyDialog6 myDL; int ret; myDL.m_YminC=YminC; myDL.m_YmaxC=YmaxC; ret=myDL.DoModal(); if (ret==IDOK) { YminC=myDL.m_YminC; YmaxC=myDL.m_YmaxC; } RedrawWindow(); } void CC60XRDView::OnFileSave() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください CC60XRDDoc* pDoc = GetDocument(); CFileDialog filedlg(FALSE, "dat", "*.dat"); CString filename; FILE *ofp; int m=0,nd=0; if (filedlg.DoModal() == IDOK) { filename = filedlg.GetPathName(); ofp = fopen(filename, "w"); double s; for (int i=0; i<500; i++) { s = 0.15*i/500.0; fprintf(ofp, "%f %f %f\n", s, Intensity[i], Scatt[i]); } fclose(ofp); } } void CC60XRDView::OnFileSaveAs() { // TODO: この位置にコマンド ハンドラ用のコードを追加してください CC60XRDDoc* pDoc = GetDocument(); CFileDialog filedlg(FALSE, "dat", "*.dat"); CString filename; FILE *ofp; int m=0,nd=0; if (filedlg.DoModal() == IDOK) { filename = filedlg.GetPathName(); ofp = fopen(filename, "w"); for (int i=0; i