📄 femmedoc.cpp
字号:
if (zDlg.m_linemeshsize>0)
linelist[i].MaxSideLength=zDlg.m_linemeshsize;
else zDlg.m_linemeshsize=-1;
}
if (zDlg.cursel==0) linelist[i].BoundaryMarker="<None>";
else linelist[i].BoundaryMarker=lineproplist[zDlg.cursel-1].BdryName;
linelist[i].Hidden=zDlg.m_hide;
linelist[i].InGroup=zDlg.m_ingroup;
}
}
}
}
void CFemmeDoc::OpArcSegDlg()
{
int i,j,k,nselected;
COpArcSegDlg zDlg;
// check to see how many (if any) arcs are selected.
for(i=0,k=0,nselected=0;i<arclist.GetSize();i++)
{
if (arclist[i].IsSelected==TRUE){
if(nselected==0){
nselected++;
zDlg.m_ingroup=arclist[i].InGroup;
}
else if(arclist[i].BoundaryMarker!=arclist[k].BoundaryMarker)
nselected++;
if(arclist[i].InGroup!=zDlg.m_ingroup) zDlg.m_ingroup=0;
k=i;
}
}
if (nselected==0) return;
// find properties block size;
double ms=0;
zDlg.m_hide=FALSE;
for(i=0,j=0;i<arclist.GetSize();i++)
if(arclist[i].IsSelected==TRUE){
ms+=arclist[k].MaxSideLength;
j++;
if(arclist[i].Hidden==TRUE) zDlg.m_hide=TRUE;
}
ms/=(double) j;
zDlg.plineproplist=&lineproplist;
if (nselected==1){
zDlg.m_MaxSeg=ms;
for(i=0,zDlg.cursel=0;i<lineproplist.GetSize();i++)
if (lineproplist[i].BdryName==arclist[k].BoundaryMarker)
zDlg.cursel=i+1;
}
else{
zDlg.cursel=0;
zDlg.m_MaxSeg=ms;
}
if (zDlg.DoModal()==IDOK){
for(i=0;i<arclist.GetSize();i++)
{
if(arclist[i].IsSelected==TRUE){
if (zDlg.cursel==0) arclist[i].BoundaryMarker="<None>";
else arclist[i].BoundaryMarker=lineproplist[zDlg.cursel-1].BdryName;
arclist[i].MaxSideLength=zDlg.m_MaxSeg;
arclist[i].Hidden=zDlg.m_hide;
arclist[i].InGroup=zDlg.m_ingroup;
}
}
}
}
void CFemmeDoc::OpGrpDlg()
{
COpGrp dlg;
BOOL bFlag=FALSE;
int nsel=0;
int i;
dlg.m_ingroup=0;
for(i=0;i<arclist.GetSize();i++)
if (arclist[i].IsSelected==TRUE){
nsel++;
if(dlg.m_ingroup!=arclist[i].InGroup)
{
if(bFlag==FALSE){
dlg.m_ingroup=arclist[i].InGroup;
bFlag=TRUE;
}
else dlg.m_ingroup=0;
}
}
for(i=0;i<linelist.GetSize();i++)
if (linelist[i].IsSelected==TRUE)
{
nsel++;
if(dlg.m_ingroup!=linelist[i].InGroup)
{
if(bFlag==FALSE){
dlg.m_ingroup=linelist[i].InGroup;
bFlag=TRUE;
}
else dlg.m_ingroup=0;
}
}
for(i=0;i<blocklist.GetSize();i++)
if (blocklist[i].IsSelected==TRUE)
{
nsel++;
if(dlg.m_ingroup!=blocklist[i].InGroup)
{
if(bFlag==FALSE){
dlg.m_ingroup=blocklist[i].InGroup;
bFlag=TRUE;
}
else dlg.m_ingroup=0;
}
}
for(i=0;i<nodelist.GetSize();i++)
if (nodelist[i].IsSelected==TRUE)
{
nsel++;
if(dlg.m_ingroup!=nodelist[i].InGroup)
{
if(bFlag==FALSE){
dlg.m_ingroup=nodelist[i].InGroup;
bFlag=TRUE;
}
else dlg.m_ingroup=0;
}
}
if (nsel==0) return;
if(dlg.DoModal()==IDOK){
for(i=0;i<nodelist.GetSize();i++)
if(nodelist[i].IsSelected==TRUE)
nodelist[i].InGroup=dlg.m_ingroup;
for(i=0;i<linelist.GetSize();i++)
if(linelist[i].IsSelected==TRUE)
linelist[i].InGroup=dlg.m_ingroup;
for(i=0;i<arclist.GetSize();i++)
if(arclist[i].IsSelected==TRUE)
arclist[i].InGroup=dlg.m_ingroup;
for(i=0;i<blocklist.GetSize();i++)
if(blocklist[i].IsSelected==TRUE)
blocklist[i].InGroup=dlg.m_ingroup;
}
}
BOOL CFemmeDoc::OldOnOpenDocument(LPCTSTR lpszPathName)
{
FILE *fp;
int i,j,k,t,len;
char s[1024];
CPointProp PProp;
CBoundaryProp BProp;
CMaterialProp MProp;
CNode node;
CSegment segm;
CArcSegment asegm;
CBlockLabel blk;
if ((fp=fopen(lpszPathName,"rt"))==NULL){
AfxMessageBox("Couldn't read from specified .fem file");
return FALSE;
}
fscanf(fp,"Frequency = %lf\n",&Frequency);
fscanf(fp,"LengthUnits = %i\n",&LengthUnits);
fscanf(fp,"ProblemType = %i\n",&ProblemType);
fscanf(fp,"Coords = %i\n",&Coords);
fgets(s,1024,fp);
len=strlen(s);
len--;
s[len]=NULL;
for(i=0;i<len;i++){
if(s[i]=='{') s[i]=13;
if(s[i]=='}') s[i]=10;
}
ProblemNote=s;
// Read in materials library...
fscanf(fp,"%i\n",&k);
for(i=0;i<k;i++)
{
fgets(s,1024,fp);
len=strlen(s); for(j=0;j<len;j++) if (s[j]<26) s[j]=NULL;
PProp.PointName=s;
fscanf(fp,"%lf %lf %lf %lf\n",&PProp.Jr,&PProp.Ji,&PProp.Ar,&PProp.Ai);
nodeproplist.Add(PProp);
}
fscanf(fp,"%i\n",&k);
for(i=0;i<k;i++)
{
fgets(s,1024,fp);
len=strlen(s); for(j=0;j<len;j++) if (s[j]<26) s[j]=NULL;
BProp.BdryName=s;
fscanf(fp,"%i %lf %lf %lf %lf %lf %lf %lf %lf\n",&BProp.BdryFormat,
&BProp.A0,&BProp.A1,&BProp.A2,&BProp.phi,&BProp.Mu,
&BProp.Sig,&BProp.c0,&BProp.c1);
lineproplist.Add(BProp);
}
fscanf(fp,"%i\n",&k);
for(i=0;i<k;i++)
{
fgets(s,1024,fp);
len=strlen(s); for(j=0;j<len;j++) if (s[j]<26) s[j]=NULL;
MProp.BlockName=s;
fscanf(fp,"%lf %lf %lf %lf %lf %lf %lf %lf %lf %i %lf\n",
&MProp.mu_x,&MProp.mu_y,&MProp.H_c,
&MProp.Theta_m,&MProp.Jr,&MProp.Ji,&MProp.Cduct,
&MProp.Lam_d,&MProp.Theta_hn,&MProp.LamType,&MProp.LamFill);
MProp.Theta_hx=MProp.Theta_hn;
MProp.Theta_hy=MProp.Theta_hn;
fgets(s,1024,fp);
sscanf(s,"%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);
}
blockproplist.Add(MProp);
}
MProp.BHpoints=0;
// read in node list
fgets(s,1024,fp);
sscanf(s,"%i",&k);
for(i=0;i<k;i++)
{
fscanf(fp,"%lf %lf %i\n",&node.x,&node.y,&t);
t=t-2;
if(t<0) node.BoundaryMarker="";
else node.BoundaryMarker=nodeproplist[t].PointName;
nodelist.Add(node);
}
// read in segment list
fgets(s,1024,fp);
sscanf(s,"%i",&k);
for(i=0;i<k;i++)
{
fscanf(fp,"%i %i %lf %i\n",&segm.n0,&segm.n1,&segm.MaxSideLength,&t);
t=-(t+2);
if(t<0) segm.BoundaryMarker="";
else segm.BoundaryMarker=lineproplist[t].BdryName;
linelist.Add(segm);
}
// read in arc segment list
fgets(s,1024,fp);
sscanf(s,"%i",&k);
for(i=0;i<k;i++)
{
fscanf(fp,"%i %i %lf %lf %i\n",&asegm.n0,&asegm.n1,
&asegm.ArcLength,&asegm.MaxSideLength,&t);
t=-(t+2);
if(t<0) asegm.BoundaryMarker="";
else asegm.BoundaryMarker=lineproplist[t].BdryName;
arclist.Add(asegm);
}
// read in list of holes;
fscanf(fp,"%i\n",&k);
blk.BlockType="<No Mesh>";
blk.MaxArea=0;
for(i=0;i<k;i++)
{
fscanf(fp,"%lf %lf\n",&blk.x,&blk.y);
blocklist.Add(blk);
}
// read in regional attributes
fscanf(fp,"%i\n",&k);
for(i=0;i<k;i++)
{
fscanf(fp,"%lf %lf %i %lf\n",&blk.x,&blk.y,&t,&blk.MaxArea);
blk.MagDir=0.;
blk.Turns=1;
if (blk.MaxArea<0) blk.MaxArea=0;
if (t<0) blk.BlockType="<None>";
else{
blk.BlockType=blockproplist[t].BlockName;
blk.MagDir =blockproplist[t].Theta_m;
}
blocklist.Add(blk);
}
fclose(fp);
FirstDraw=TRUE;
return TRUE;
}
char* StripKey(char *c)
{
char *d;
int i,k;
k=strlen(c);
for(i=0;i<k;i++){
if (c[i] == '='){
d=c+i+1;
return d;
}
}
return c+k;
}
char *ParseDbl(char *t, double *f)
{
if (t==NULL) return NULL;
int i,j,k,u,ws;
static char w[]="\t, \n";
char *v;
k=strlen(t); if(k==0) return NULL;
for(i=0,u=0,v=NULL;i<k;i++){
for(j=0,ws=0;j<4;j++){
if (t[i]==w[j]){
ws=1;
if (u==1) u=2;
}
}
if ((ws==0) && (u==0)) u=1;
if ((ws==0) && (u==2)){
v=t+i;
break;
}
}
if (u==0) return NULL; //nothing left in the string;
if (v==NULL) v=t+k;
sscanf(t,"%lf",f);
return v;
}
char *ParseInt(char *t, int *f)
{
if (t==NULL) return NULL;
int i,j,k,u,ws;
static char w[]="\t, \n";
char *v;
k=strlen(t); if(k==0) return NULL;
for(i=0,u=0,v=NULL;i<k;i++){
for(j=0,ws=0;j<4;j++){
if (t[i]==w[j]){
ws=1;
if (u==1) u=2;
}
}
if ((ws==0) && (u==0)) u=1;
if ((ws==0) && (u==2)){
v=t+i;
break;
}
}
if (u==0) return NULL; //nothing left in the string;
if (v==NULL) v=t+k;
sscanf(t,"%i",f);
return v;
}
BOOL CFemmeDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// make sure old document is cleared out...
OnNewDocument();
FILE *fp;
int i,j,k,t;
int vers=0;
char s[1024],q[1024];
char *v;
CPointProp PProp;
CBoundaryProp BProp;
CMaterialProp MProp;
CCircuit CProp;
CNode node;
CSegment segm;
CArcSegment asegm;
CBlockLabel blk;
if ((fp=fopen(lpszPathName,"rt"))==NULL){
AfxMessageBox("Couldn't read from specified .fem file");
return FALSE;
}
// Check to see if this is an old-version femm datafile
fgets(s,1024,fp);
if (strncmp(s,"Frequency",8)==0){
fclose(fp);
return OldOnOpenDocument(lpszPathName);
}
else rewind(fp); // Go back to beginning of the file;
// hook to catch old files where depth wasn't defined:
Depth=-1;
// parse the file
while (fgets(s,1024,fp)!=NULL)
{
if (sscanf(s,"%s",q)==EOF) q[0]=NULL;
// int _strnicmp( const char *string1, const char *string2, size_t count );
// Deal with flag for file format version
if( _strnicmp(q,"[format]",8)==0 ){
v=StripKey(s);
double dblvers;
sscanf(v,"%lf",&dblvers); vers = (int) (10.*dblvers + 0.5);
if(vers>40) AfxMessageBox("This file is from a newer version of FEMM\nThis file may contain attributes not\nsupported by this version of FEMM");
q[0]=NULL;
}
// Frequency of the problem
if( _strnicmp(q,"[frequency]",11)==0){
v=StripKey(s);
sscanf(v,"%lf",&Frequency);
q[0]=NULL;
}
// Depth in the into-the-page direction
if( _strnicmp(q,"[depth]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&Depth);
q[0]=NULL;
}
// Required solver precision
if( _strnicmp(q,"[precision]",11)==0){
v=StripKey(s);
sscanf(v,"%lf",&Precision);
q[0]=NULL;
}
// Minimum Angle Constraint for finite element mesh
if( _strnicmp(q,"[minangle]",10)==0){
v=StripKey(s);
sscanf(v,"%lf",&MinAngle);
q[0]=NULL;
}
// Units of length used by the problem
if( _strnicmp(q,"[lengthunits]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if( _strnicmp(q,"inches",6)==0) LengthUnits=0;
else if( _strnicmp(q,"millimeters",11)==0) LengthUnits=1;
else if( _strnicmp(q,"centimeters",1)==0) LengthUnits=2;
else if( _strnicmp(q,"mils",4)==0) LengthUnits=4;
else if( _strnicmp(q,"microns",6)==0) LengthUnits=5;
else if( _strnicmp(q,"meters",6)==0) LengthUnits=3;
q[0]=NULL;
}
// Problem Type (planar or axisymmetric)
if( _strnicmp(q,"[problemtype]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if( _strnicmp(q,"planar",6)==0) ProblemType=0;
if( _strnicmp(q,"axisymmetric",3)==0) ProblemType=1;
q[0]=NULL;
}
// Coordinates (cartesian or polar)
if( _strnicmp(q,"[coordinates]",13)==0){
v=StripKey(s);
sscanf(v,"%s",q);
if ( _strnicmp(q,"cartesian",4)==0) Coords=0;
if ( _strnicmp(q,"polar",5)==0) Coords=1;
q[0]=NULL;
}
// Comments
if (_strnicmp(q,"[comment]",9)==0){
v=StripKey(s);
// put in carriage returns;
k=strlen(v);
for(i=0;i<k;i++)
if((v[i]=='\\') && (v[i+1]=='n')){
v[i]=13;
v[i+1]=10;
}
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;
}
}
ProblemNote=v;
q[0]=NULL;
}
// properties for axisymmetric external region
if( _strnicmp(q,"[extzo]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extZo);
q[0]=NULL;
}
if( _strnicmp(q,"[extro]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extRo);
q[0]=NULL;
}
if( _strnicmp(q,"[extri]",7)==0){
v=StripKey(s);
sscanf(v,"%lf",&extRi);
q[0]=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -