⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 femmedoc.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					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 + -