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

📄 fe_libdlg.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:

	if(m_dragTargetList!=NULL)
	{
		if(!IsFolder(m_dragTargetList)){
			int k=m_mylist.GetItemData(m_dragTargetList);
			ModifyMaterial(k);
			m_mylist.SetItemText(m_dragTargetList,LibProps[k].BlockName);
		}
	}

	
	*pResult = 0;
}

void fe_CLibDlg::OnDblclkMytree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POINT point;
	GetCursorPos(&point);
	CPoint ptList(point);
	UINT uHitTest = TVHT_ONITEM;
	GetDesktopWindow()->MapWindowPoints( &m_mytree, &ptList, 1 );
	m_dragTargetTree = m_mytree.HitTest( ptList, &uHitTest );
	m_dragTargetList = NULL;

	if(m_dragTargetTree!=NULL)
	{
		if(!IsFolder(m_dragTargetTree)){
			int k=m_mytree.GetItemData(m_dragTargetTree);
			ModifyMaterial(k);
			m_mytree.SetItemText(m_dragTargetTree,LibProps[k].BlockName);
		}
	}

	*pResult = 0;
}

void fe_CLibDlg::ModifyMaterial(int k) 
{
	CMatDlg zDlg;

	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_WireD=LibProps[k].WireD;
	zDlg.m_NStrands=LibProps[k].NStrands;
	zDlg.m_BlockName=LibProps[k].BlockName;
	zDlg.LamType=LibProps[k].LamType;
	zDlg.m_lam_fill=LibProps[k].LamFill;
//	for(int nn=0;nn<LibProps.GetSize();nn++)
//		if(nn!=k) zDlg.namelist.Add(LibProps[nn].BlockName);
	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].NStrands=zDlg.m_NStrands;
		LibProps[k].WireD=zDlg.m_WireD;
		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);
	}
}

void fe_CLibDlg::MouseModify()
{
	if(m_dragTargetList!=NULL)
	{
		if(!IsFolder(m_dragTargetList)){
			int k=m_mylist.GetItemData(m_dragTargetList);
			ModifyMaterial(k);
			m_mylist.SetItemText(m_dragTargetList,LibProps[k].BlockName);
		}
	}

	if(m_dragTargetTree!=NULL)
	{
		if(!IsFolder(m_dragTargetTree)){
			int k=m_mytree.GetItemData(m_dragTargetTree);
			ModifyMaterial(k);
			m_mytree.SetItemText(m_dragTargetTree,LibProps[k].BlockName);
		}
		else{
			CLibFolderInfo dlg;
			
			int k=m_mytree.GetItemData(m_dragTargetTree);
			dlg.m_foldername  =FoldProps[k].FolderName;
			dlg.m_folderurl   =FoldProps[k].FolderURL;
			dlg.m_foldervendor=FoldProps[k].FolderVendor;
			if (dlg.DoModal()==IDOK)
			{
				m_mytree.SetItemText(m_dragTargetTree,dlg.m_foldername);
				FoldProps[k].FolderName  =dlg.m_foldername;
				FoldProps[k].FolderURL   =dlg.m_folderurl;
				FoldProps[k].FolderVendor=dlg.m_foldervendor;
			}
		}
	}
}

void fe_CLibDlg::OnOK() 
{
	HTREEITEM hChild;
	CArray<CMaterialProp,CMaterialProp&> &blockproplist=pDoc->blockproplist;
	int k;

	// copy Model Materials into the model
	blockproplist.RemoveAll();
	hChild=m_mytree.GetChildItem(ModelParent) ;
	while (hChild!=NULL)
	{
		k=m_mytree.GetItemData(hChild);
		blockproplist.Add(LibProps[k]);
		CopyBHdata(LibProps[k],blockproplist[blockproplist.GetUpperBound()]);
		hChild = m_mytree.GetNextSiblingItem(hChild) ;
	}

	// write Library Materials to disk

	CString LibName=BinDir+"matlib.dat";
	FILE *fp;

	if ((fp=fopen(LibName,"wt"))==NULL) return;
	
	hChild=m_mytree.GetChildItem(LibParent);
	while(hChild!=NULL)
	{
		CopyItemToDisk(hChild,fp);
		hChild = m_mytree.GetNextSiblingItem(hChild) ;
	}

	fclose(fp);


	CResizableDialog::OnOK();
}

void fe_CLibDlg::CopyItemToDisk(HTREEITEM hItem, FILE *fp)
{
	HTREEITEM hChild;
	int i = m_mytree.GetItemData(hItem);
		
	if (IsFolder(hItem))
	{
		fprintf(fp,"<BeginFolder>\n");
		fprintf(fp,"<FolderName> = \"%s\"\n",FoldProps[i].FolderName);
		if(FoldProps[i].FolderURL!="")
			fprintf(fp,"<FolderURL> = \"%s\"\n",FoldProps[i].FolderURL);
		if(FoldProps[i].FolderVendor!="")
			fprintf(fp,"<FolderVendor> = \"%s\"\n",FoldProps[i].FolderVendor);

		hChild=m_mytree.GetChildItem(hItem) ;
		while (hChild!=NULL)
		{
			CopyItemToDisk(hChild,fp) ;
			hChild = m_mytree.GetNextSiblingItem(hChild) ;
		}

		fprintf(fp,"<EndFolder>\n");
	}
	else{
		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,"<NStrands> = %i\n",LibProps[i].NStrands);
		fprintf(fp,"<WireD> = %.17g\n",LibProps[i].WireD);
		fprintf(fp,"<BHPoints> = %i\n",LibProps[i].BHpoints);
		for(int 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");		
	}
}

void fe_CLibDlg::VendorLink()
{
	if (VendorURL!="")
		ShellExecute(m_hWnd,"open",VendorURL,"","",SW_SHOWMAXIMIZED);
	else
		MsgBox("No URL available for %s",VendorName);
}

void fe_CLibDlg::ImportMaterials()
{
	CFileDialog *fname_dia;
	CString SourceFile;

	fname_dia=new CFileDialog(
		TRUE,
		"fem | * ",
		NULL,
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"Magnetostatic Input File (*.fem) | *.fem; *.FEM | All Files (*.*) | *.*||",
		NULL);


	if(fname_dia->DoModal()==IDCANCEL){
		delete[] fname_dia;
		return;
	}

	SourceFile=fname_dia->GetPathName();
	delete[] fname_dia;

	// Add selected properties to the library;
	FILE *fp;
	CMaterialProp MProp;
	CFolderProp   FProp;
	char s[1024];
	int k;
	BOOL bToLibrary=TRUE;

	if ((fp=fopen(SourceFile,"rt"))==NULL) return;

	Ancestors.RemoveAll();
	if(m_dragTargetTree!=NULL){
		// importing into the library
		// put the imported materials in a new folder
		Parent=m_mytree.InsertItem("Imported Materials", 0, 1, LibParent, TVI_FIRST );
		FProp.FolderName="Imported Materials";
		FProp.FolderURL="";
		FProp.FolderVendor="";
		FoldProps.Add(FProp);
		m_mytree.SetItemData(Parent,FoldProps.GetUpperBound());
	}
	else if(m_dragTargetList!=NULL){
		Parent=ModelParent;
		bToLibrary=FALSE;
	}
	else return;

	while (fgets(s,1024,fp)!=NULL)
	{
		switch(ParseLine(s,fp,MProp))
		{
			case 1:

				// add a material to library
				k=LibProps.GetSize();
				LibProps.Add(MProp);
				if(bToLibrary)
					m_mytree.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT,
						MProp.BlockName,2,2,NULL,NULL,k,Parent,NULL);
				else
					m_mylist.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT,
						MProp.BlockName,2,2,NULL,NULL,k,Parent,NULL);
				MProp.BHpoints=0;

				break;

			case 2:
				if (bToLibrary)
				{
					// open a new folder
					if (Parent!=NULL) Ancestors.Add(Parent);
					k=FoldProps.GetSize();
					FoldProps.Add(FProp);
					Parent=m_mytree.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT,
						FProp.FolderName,0,1,NULL,NULL,k,Parent,NULL);
				}

				break;

			case 3:
				if (bToLibrary)
				{
					// close a folder
					k=Ancestors.GetUpperBound();
					if (k>=0){
						Parent=Ancestors[k];
						Ancestors.RemoveAt(k);
					}
				}
				break;

			default:
				
				break;
		}
	}

	MProp.BHpoints=0;

	fclose(fp);
}

BOOL fe_CLibDlg::IsTailChasing(HTREEITEM hSource, HTREEITEM hDest)
{
	HTREEITEM hItem;

	hItem=hDest;
	while(hItem!=NULL)
	{
		if(hSource==hItem) return TRUE;
		hItem=m_mytree.GetParentItem(hItem);
	}

	return FALSE;
}

void fe_CLibDlg::OnKeydownMylist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;

	if(pTVKeyDown->wVKey==VK_DELETE){
		HTREEITEM hItem=m_mylist.GetSelectedItem();
		if ((hItem!=NULL) && (hItem!=ModelParent)) 
			m_mylist.DeleteItem(hItem);
	}

	if(pTVKeyDown->wVKey==VK_INSERT){
		m_dragTargetList=m_mylist.GetSelectedItem();
		m_dragTargetTree=NULL;
		AddNewProperty();
	}

	*pResult = 0;
}

void fe_CLibDlg::OnKeydownMytree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;

	if(pTVKeyDown->wVKey==VK_DELETE){
		HTREEITEM hItem=m_mytree.GetSelectedItem();
		if ((hItem!=NULL) && (hItem!=LibParent)) 
			m_mytree.DeleteItem(hItem);
	}

	if(pTVKeyDown->wVKey==VK_INSERT){
		m_dragTargetTree=m_mytree.GetSelectedItem();
		m_dragTargetList=NULL;
		AddNewProperty();
	}
	
	*pResult = 0;
}


void fe_CLibDlg::OnTimer(UINT nIDEvent)
{
	POINT pt ;
    GetCursorPos ( &pt ) ;
    RECT rect ;
	

	// check if Library needs to be scrolled and do it;	
	m_mytree.GetClientRect ( &rect ) ;
    m_mytree.ClientToScreen ( &rect ) ; 
	if((pt.x>rect.left) && (pt.x<rect.right))
	{
		if ( pt.y < rect.top + 10 )
		{
			CImageList::DragShowNolock ( FALSE ) ;
			m_mytree.SendMessage ( WM_VSCROLL, SB_LINEUP ) ;
			CImageList::DragShowNolock ( TRUE ) ;
		}
		else
		{
			if ( pt.y > rect.bottom - 10 )
			{
				CImageList::DragShowNolock ( FALSE ) ;
				m_mytree.SendMessage ( WM_VSCROLL, SB_LINEDOWN ) ;
				CImageList::DragShowNolock ( TRUE ) ;
			}
		}
	}

	// check if Model Materials needs to be scrolled and do it;	
	m_mylist.GetClientRect ( &rect ) ;
    m_mylist.ClientToScreen ( &rect ) ; 
	if((pt.x>rect.left) && (pt.x<rect.right))
	{
		if ( pt.y < rect.top + 10 )
		{
			CImageList::DragShowNolock ( FALSE ) ;
			m_mylist.SendMessage ( WM_VSCROLL, SB_LINEUP ) ;
			CImageList::DragShowNolock ( TRUE ) ;
		}
		else
		{
			if ( pt.y > rect.bottom - 10 )
			{
				CImageList::DragShowNolock ( FALSE ) ;
				m_mylist.SendMessage ( WM_VSCROLL, SB_LINEDOWN ) ;
				CImageList::DragShowNolock ( TRUE ) ;
			}
		}
	}

    CResizableDialog::OnTimer(nIDEvent);
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -