📄 matlib.cpp
字号:
// MatLib.cpp : implementation file
//
#include "stdafx.h"
#include "femme.h"
#include "FemmeDoc.h"
#include "MatLib.h"
#include "MatDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMatLib dialog
CMatLib::CMatLib(CWnd* pParent /*=NULL*/)
: CDialog(CMatLib::IDD, pParent)
{
//{{AFX_DATA_INIT(CMatLib)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CMatLib::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMatLib)
DDX_Control(pDX, IDC_INMODEL, m_inmodel);
DDX_Control(pDX, IDC_INLIBRARY, m_inlibrary);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMatLib, CDialog)
//{{AFX_MSG_MAP(CMatLib)
ON_BN_CLICKED(IDC_LIB_MODIFY, OnLibModify)
ON_BN_CLICKED(IDC_LIB_REMOVE, OnLibRemove)
ON_BN_CLICKED(IDC_TOMODEL, OnToModel)
ON_BN_CLICKED(IDC_TOLIBRARY, OnToLibrary)
ON_BN_CLICKED(IDC_MODEL_DEL, OnModelDel)
ON_BN_CLICKED(IDC_NEW_LIB_ENTRY, OnNewLibEntry)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMatLib message handlers
void CMatLib::OnLibModify()
{
// TODO: Add your control notification handler code here
CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
CMatDlg zDlg;
if (LibProps.GetSize()==0) return;
int k=m_inlibrary.GetCurSel();
if (k==CB_ERR) return;
zDlg.m_mu_x=LibProps[k].mu_x;
zDlg.m_mu_y=LibProps[k].mu_y;
zDlg.m_H_c=LibProps[k].H_c;
zDlg.m_Jr=LibProps[k].Jr;
zDlg.m_Ji=LibProps[k].Ji;
zDlg.m_Cduct=LibProps[k].Cduct;
zDlg.m_Lam_d=LibProps[k].Lam_d;
zDlg.m_Theta_hn=LibProps[k].Theta_hn;
zDlg.m_Theta_hx=LibProps[k].Theta_hx;
zDlg.m_Theta_hy=LibProps[k].Theta_hy;
zDlg.m_BlockName=LibProps[k].BlockName;
zDlg.LamType=LibProps[k].LamType;
zDlg.m_lam_fill=LibProps[k].LamFill;
if (LibProps[k].BHpoints==0) zDlg.m_nlflag=FALSE;
else{
zDlg.m_nlflag=TRUE;
LibProps[k].BHDataToCString(zDlg.BData,zDlg.HData);
}
if(pDoc->ProblemType==0){
zDlg.m_mu1label="x";
zDlg.m_mu2label="y";
zDlg.m_h1label="hx";
zDlg.m_h2label="hy";
}
else{
zDlg.m_mu1label="r";
zDlg.m_mu2label="z";
zDlg.m_h1label="hr";
zDlg.m_h2label="hz";
}
if(zDlg.DoModal()==IDOK){
LibProps[k].BlockName=zDlg.m_BlockName;
LibProps[k].mu_x=zDlg.m_mu_x;
LibProps[k].mu_y=zDlg.m_mu_y;
LibProps[k].H_c=zDlg.m_H_c;
LibProps[k].Jr=zDlg.m_Jr;
LibProps[k].Ji=zDlg.m_Ji;
LibProps[k].Cduct=zDlg.m_Cduct;
LibProps[k].Lam_d=zDlg.m_Lam_d;
LibProps[k].Theta_hn=zDlg.m_Theta_hn;
LibProps[k].Theta_hx=zDlg.m_Theta_hx;
LibProps[k].Theta_hy=zDlg.m_Theta_hy;
LibProps[k].LamType=zDlg.LamType;
LibProps[k].LamFill=zDlg.m_lam_fill;
if (zDlg.m_nlflag==FALSE)
{
zDlg.BData.Empty();
zDlg.HData.Empty();
}
LibProps[k].StripBHData(zDlg.BData,zDlg.HData);
m_inlibrary.InsertString(k,zDlg.m_BlockName);
m_inlibrary.DeleteString(k+1);
m_inlibrary.SetCurSel(k);
}
}
void CMatLib::OnLibRemove()
{
// TODO: Add your control notification handler code here
int k=m_inlibrary.GetCurSel();
if((k!=CB_ERR) && (LibProps.GetSize()!=0))
{
LibProps.RemoveAt(k);
m_inlibrary.DeleteString(k);
m_inlibrary.SetCurSel(0);
}
}
void CMatLib::OnToModel()
{
// TODO: Add your control notification handler code here
CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
int k=m_inlibrary.GetCurSel();
if (k==CB_ERR) return;
int i=blockproplist.GetSize();
int j;
// check to see if the property has already been included;
for(j=0;j<i;j++)
if(blockproplist[j].BlockName==LibProps[k].BlockName){
AfxMessageBox("Cannot add this property; a property\nwith this name is already in the model");
return;
}
blockproplist.Add(LibProps[k]);
m_inmodel.AddString(LibProps[k].BlockName);
m_inmodel.SetCurSel(i);
if(blockproplist[i].BHpoints!=0){
blockproplist[i].BHdata=(CComplex *)calloc(blockproplist[i].BHpoints,
sizeof(CComplex));
for(j=0;j<blockproplist[i].BHpoints;j++)
blockproplist[i].BHdata[j]=LibProps[k].BHdata[j];
}
}
void CMatLib::OnToLibrary()
{
// TODO: Add your control notification handler code here
CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
int k=m_inmodel.GetCurSel();
if (k==CB_ERR) return;
int i=LibProps.GetSize();
int j;
// check to see if the property has already been included;
for(j=0;j<i;j++)
if(blockproplist[k].BlockName==LibProps[j].BlockName){
AfxMessageBox("Cannot add this property; a property\nwith this name is already in the library");
return;
}
LibProps.Add(blockproplist[k]);
m_inlibrary.AddString(blockproplist[k].BlockName);
m_inlibrary.SetCurSel(i);
if(LibProps[i].BHpoints!=0){
LibProps[i].BHdata=(CComplex *)calloc(LibProps[i].BHpoints,sizeof(CComplex));
for(j=0;j<LibProps[i].BHpoints;j++)
LibProps[i].BHdata[j]=blockproplist[k].BHdata[j];
}
}
void CMatLib::OnModelDel()
{
// TODO: Add your control notification handler code here
CArray <CMaterialProp, CMaterialProp&> &blockproplist=pDoc->blockproplist;
int k=m_inmodel.GetCurSel();
if((k!=CB_ERR) && (blockproplist.GetSize()!=0))
{
blockproplist.RemoveAt(k);
m_inmodel.DeleteString(k);
m_inmodel.SetCurSel(0);
}
}
BOOL CMatLib::OnInitDialog()
{
CDialog::OnInitDialog();
CArray<CMaterialProp,CMaterialProp&> &blockproplist=pDoc->blockproplist;
int i,j,k;
CString LibName=BinDir+"matlib.dat";
FILE *fp;
CMaterialProp MProp;
char s[1024],q[1024];
char *v;
// Put Model's properties into the InModel edit box;
for(i=0;i<blockproplist.GetSize();i++)
m_inmodel.AddString(blockproplist[i].BlockName);
m_inmodel.SetCurSel(0);
// read in materials library;
LibProps.RemoveAll();
if ((fp=fopen(LibName,"rt"))==NULL) return TRUE;
while (fgets(s,1024,fp)!=NULL)
{
sscanf(s,"%s",q);
// Block Properties;
if( _strnicmp(q,"<beginblock>",12)==0){
MProp.BlockName="New Material";
MProp.mu_x=1.;
MProp.mu_y=1.; // permeabilities, relative
MProp.H_c=0.; // magnetization, A/m
MProp.Jr=0.;
MProp.Ji=0.; // applied current density, MA/m^2
MProp.Cduct=0.; // conductivity of the material, MS/m
MProp.Lam_d=0.; // lamination thickness, mm
MProp.Theta_hn=0.; // hysteresis angle, degrees
MProp.Theta_hx=0.;
MProp.Theta_hy=0.;
MProp.LamFill=1.; // lamination fill factor;
MProp.LamType=0; // type of lamination;
MProp.BHpoints=0;
MProp.BHdata=NULL;
q[0]=NULL;
}
if( _strnicmp(q,"<blockname>",10)==0){
v=StripKey(s);
k=strlen(v);
for(i=0;i<k;i++)
if(v[i]=='\"'){
v=v+i+1;
i=k;
}
k=strlen(v);
if(k>0) for(i=k-1;i>=0;i--){
if(v[i]=='\"'){
v[i]=0;
i=-1;
}
}
MProp.BlockName=v;
q[0]=NULL;
}
if( _strnicmp(q,"<mu_x>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.mu_x);
q[0]=NULL;
}
if( _strnicmp(q,"<mu_y>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.mu_y);
q[0]=NULL;
}
if( _strnicmp(q,"<H_c>",5)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.H_c);
q[0]=NULL;
}
if( _strnicmp(q,"<J_re>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Jr);
q[0]=NULL;
}
if( _strnicmp(q,"<J_im>",6)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Ji);
q[0]=NULL;
}
if( _strnicmp(q,"<sigma>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Cduct);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_h>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hn);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_hx>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hx);
q[0]=NULL;
}
if( _strnicmp(q,"<phi_hy>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Theta_hy);
q[0]=NULL;
}
if( _strnicmp(q,"<d_lam>",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.Lam_d);
q[0]=NULL;
}
if( _strnicmp(q,"<LamFill>",8)==0){
v=StripKey(s);
sscanf(v,"%lf",&MProp.LamFill);
q[0]=NULL;
}
if( _strnicmp(q,"<LamType>",9)==0){
v=StripKey(s);
sscanf(v,"%i",&MProp.LamType);
q[0]=NULL;
}
if( _strnicmp(q,"<BHPoints>",10)==0){
v=StripKey(s);
sscanf(v,"%i",&MProp.BHpoints);
if (MProp.BHpoints>0)
{
MProp.BHdata=(CComplex *)calloc(MProp.BHpoints,sizeof(CComplex));
for(j=0;j<MProp.BHpoints;j++){
fgets(s,1024,fp);
sscanf(s,"%lf %lf",&MProp.BHdata[j].re,&MProp.BHdata[j].im);
}
}
q[0]=NULL;
}
if( _strnicmp(q,"<endblock>",9)==0){
LibProps.Add(MProp);
MProp.BHpoints=0;
q[0]=NULL;
}
}
MProp.BHpoints=0;
fclose(fp);
// Put Library's properties into the InLibrary edit box;
for(i=0;i<LibProps.GetSize();i++)
m_inlibrary.AddString(LibProps[i].BlockName);
m_inlibrary.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMatLib::OnOK()
{
int i,j;
CString LibName=BinDir+"matlib.dat";
FILE *fp;
if ((fp=fopen(LibName,"wt"))==NULL) return;
for(i=0;i<LibProps.GetSize();i++)
{
fprintf(fp,"<BeginBlock>\n");
fprintf(fp,"<BlockName> = \"%s\"\n",LibProps[i].BlockName);
fprintf(fp,"<Mu_x> = %.17g\n",LibProps[i].mu_x);
fprintf(fp,"<Mu_y> = %.17g\n",LibProps[i].mu_y);
fprintf(fp,"<H_c> = %.17g\n",LibProps[i].H_c);
fprintf(fp,"<H_cAngle> = %.17g\n",LibProps[i].Theta_m);
fprintf(fp,"<J_re> = %.17g\n",LibProps[i].Jr);
fprintf(fp,"<J_im> = %.17g\n",LibProps[i].Ji);
fprintf(fp,"<Sigma> = %.17g\n",LibProps[i].Cduct);
fprintf(fp,"<d_lam> = %.17g\n",LibProps[i].Lam_d);
fprintf(fp,"<Phi_h> = %.17g\n",LibProps[i].Theta_hn);
fprintf(fp,"<Phi_hx> = %.17g\n",LibProps[i].Theta_hx);
fprintf(fp,"<Phi_hy> = %.17g\n",LibProps[i].Theta_hy);
fprintf(fp,"<LamType> = %i\n",LibProps[i].LamType);
fprintf(fp,"<LamFill> = %.17g\n",LibProps[i].LamFill);
fprintf(fp,"<BHPoints> = %i\n",LibProps[i].BHpoints);
for(j=0;j<LibProps[i].BHpoints;j++)
fprintf(fp," %.17g %.17g\n",LibProps[i].BHdata[j].re,
LibProps[i].BHdata[j].im);
fprintf(fp,"<EndBlock>\n\n");
}
fclose(fp);
CDialog::OnOK();
}
void CMatLib::OnNewLibEntry()
{
// TODO: Add your control notification handler code here
CMaterialProp MProp;
int k=LibProps.GetSize();
LibProps.Add(MProp);
m_inlibrary.AddString(LibProps[k].BlockName);
m_inlibrary.SetCurSel(k);
OnLibModify();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -