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

📄 gmcadview.cpp

📁 这源代码是书本《visual c++.net MFC 类库应用详解》的
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                       alfa2=acos((o1b+m_RR2*m_RR2-(m_RR+m_RR2)*(m_RR+m_RR2))/(2*sqrt(o1b)*m_RR2));
                       alfa=alfa1-alfa2;
                       x02=EndX+m_RR2*cos(alfa);
                       y02=EndY+m_RR2*sin(alfa);
                       if(x01==x02)
                          beita=pi/2;
                       else
					   {
                          beita=atan((y02-y01)/(x02 - x01));
                          if(beita<0)
                             beita=beita+pi;
                       }
                       xc=x02+m_RR2*cos(beita);
                       yc=y02+m_RR2*sin(beita);
                    }
                    else   // 已知h1: symb1='-', symb2='-'
					{
                       if(EndX==x01)
                          alfa1=pi/2;
                       else
					   {
                          alfa1=atan((EndY-y01)/(EndX-x01));
                          if(alfa1<0)
                             alfa1=pi+alfa1;
                       }
                       alfa2=acos((o1b+m_RR2*m_RR2-(m_RR-m_RR2)*(m_RR-m_RR2))/(2*sqrt(o1b)*m_RR2));
                       if(m_RR>m_RR2)
                          alfa=alfa1-alfa2;
                       else
                          alfa=alfa1+alfa2;
                       x02=EndX+m_RR2*cos(alfa);
                       y02=EndY+m_RR2*sin(alfa);
                       if(x01==x02)
                          beita=pi/2;
                       else
                          beita=atan((y02-y01)/(x02-x01));
                       xc=x02-m_RR2*cos(beita);
                       yc=y02-m_RR2*sin(beita);
					}
                }
			}
			else     // 已知h2,未知h1
			{
                y02=EndY-m_HH2;
                wc=sqrt(m_RR2*m_RR2-m_HH2*m_HH2);
                if(symb2=='+')
                    x02=EndX+wc;
                else
                    x02=EndX-wc;
                o2a=(BeginY-y02)*(BeginY-y02)+(BeginX-x02)*(BeginX-x02);
                o2aa=sqrt(o2a);

                if(symb2=='+')
				{
                    if(symb1=='+')   // 已知h2: symb2='+', symb1='+'
					{
                       if(BeginX==x02)
                          alfa1=pi/2;
                       else
					   {
                          alfa1=atan((BeginY-y02)/(BeginX-x02));
                          if(alfa1<0)
                             alfa1=0-alfa1;
                          else
                             alfa1=pi-alfa1;
                       }
                       alfa2=acos((o2a+m_RR*m_RR-(m_RR-m_RR2)*(m_RR-m_RR2))/(2*sqrt(o2a)*m_RR));
                       if(m_RR>m_RR2)
                          alfa=alfa1-alfa2;
                       else
                          alfa=alfa1+alfa2;
                       x01=BeginX+m_RR*cos(alfa);
                       y01=BeginY-m_RR*sin(alfa);
                       beita=atan((y02-y01)/(x02-x01));
                       xc=x02-m_RR2*cos(beita);
                       yc=y02-m_RR2*sin(beita);
					}
                    else   // 已知h2: symb2='+', symb1='-'
					{
                       if(BeginX==x02)
                          alfa1=pi/2;
                       else
					   {
                          alfa1=atan((BeginY-y02)/(BeginX-x02));
                          if(alfa1<0)
                             alfa1=pi+alfa1;
                       }
                       alfa2=acos((o2a-m_RR*m_RR+(m_RR+m_RR2)*(m_RR+m_RR2))/(2*sqrt(o2a)*(m_RR+m_RR2)));
                       alfa=alfa1+alfa2;
                       x01=x02+(m_RR+m_RR2)*cos(alfa);
                       y01=y02+(m_RR+m_RR2)*sin(alfa);
                       xc=x02+m_RR2*cos(alfa);
                       yc=y02+m_RR2*sin(alfa);
                    }
                }
                else  // symb2='-'
				{
                    if(symb1=='+')   // 已知h2: symb2='-', symb1='+'
					{
                       if(BeginX==x02)
                          alfa1=pi/2;
                       else
					   {
                          alfa1=atan((BeginY-y02)/(BeginX-x02));
                          if(alfa1<0)
                             alfa1=alfa1+pi;
                       }
                       alfa2=acos((o2a-m_RR*m_RR+(m_RR+m_RR2)*(m_RR+m_RR2))/(2*sqrt(o2a)*(m_RR+m_RR2)));
                       alfa=alfa1-alfa2;
                       x01=x02+(m_RR+m_RR2)*cos(alfa);
                       y01=y02+(m_RR+m_RR2)*sin(alfa);
                       xc=x02+m_RR2*cos(alfa);
                       yc=y02+m_RR2*sin(alfa);
                    }
                    else    // 已知h2: symb2='-', symb1='-'
					{
                       if(BeginX==x02)
					      alfa1=pi/2;
                       else
					   {
                          alfa1=atan((BeginY-y02)/(BeginX-x02));
                          if(alfa1<0)
                             alfa1=0-alfa1;
                          else
                             alfa1=pi-alfa1;
                       }
                       alfa2=acos((o2a+m_RR*m_RR-(m_RR-m_RR2)*(m_RR-m_RR2))/(2*sqrt(o2a)*m_RR));
                       if(m_RR>m_RR2)
                          alfa=alfa1+alfa2;
                       else
                          alfa=alfa1-alfa2;
                       x01=BeginX+m_RR*cos(alfa);
                       y01=BeginY-m_RR*sin(alfa);
                       beita=atan((y02-y01)/(x02-x01));
                       xc=x02-m_RR2*cos(beita);
                       yc=y02-m_RR2*sin(beita);
                    }
				}
			}

      // 第一弧线部分
		    SymmetryArc(&dc,Axisx,x01,y01,m_RR,BeginX,BeginY,xc,yc,symb1);
            double temph,tempd;
			temph=fabs(BeginY-yc);
			tempd=fabs(Axisx-xc)*2;
            double Vol1=Vol_HuTai(Axisx,temph,m_RR,x01,y01,yc,symb1);
		    double Area1=Area_HuTai(Axisx,temph,m_RR,x01,y01,yc,symb1);

			pRevSurf=new CHuTai(BeginX,BeginY,xc,yc,Axisx,x01,y01,m_RR,
		          symb1,temph,pDoc->PreDD,Vol1,Area1);
	        pDoc->AddRevSurf(pRevSurf);
			pDoc->PreDD=tempd;      			

	   // 第二弧线部分
		    SymmetryArc(&dc,Axisx,x02,y02,m_RR2,xc,yc,EndX,EndY,symb2);

            double Vol2=Vol_HuTai(Axisx,m_HH-temph,m_RR2,x02,y02,EndY,symb2);
		    double Area2=Area_HuTai(Axisx,m_HH-temph,m_RR2,x02,y02,EndY,symb2);

			pRevSurf=new CHuTai(xc,yc,EndX,EndY,Axisx,x02,y02,
		          m_RR2,symb2,m_HH-temph,pDoc->PreDD,Vol2,Area2);
	        pDoc->AddRevSurf(pRevSurf);
            
			pDoc->PreDD=m_DD;			
            Vol=Vol1+Vol2;
			Area=Area1+Area2;

			break;
		}

		case XIANXING_PD:
		{
	        pDoc->m_RH=pDoc->m_RH-m_HH;
            double x01,y01,x02,y02,hpd,a1,b1,a2,b2,c1,c2;
			double r1,alfa,x02d,xc,yc;
            x01=Axisx;  //x01为第二弧的弧心横坐标
            hpd=BeginY-m_HH;  
            y01=hpd+m_HH-m_RR;   //y01为第二弧的弧心横坐标
            a1=2*(BeginY-y01-m_RR);
            b1=2*(BeginX-x01);
            c1=y01*y01-BeginY*BeginY+x01*x01-BeginX*BeginX-m_RR*m_RR+2*m_RR*hpd;
            a2=(a1/b1)*(a1/b1);
            b2=-2*BeginY+2*(-a1/b1)*(-c1/b1)-2*(-a1/b1)*BeginX+2*hpd;
            c2=BeginY*BeginY+((-c1/b1)-BeginX)*((-c1/b1)-BeginX)-hpd*hpd;
            if(a2==0.0)
                y02=-c2/b2;
            else
                y02=(-b2-sqrt(b2*b2-4*a2*c2))/(2*a2);
            x02=(-a1/b1)*y02-c1/b1;
            r1=y02-hpd;   //r1为第一弧的半径
            alfa=pi+atan((y01-y02)/(x01-x02));
            xc=x01+m_RR*cos(alfa);
            yc=y01+m_RR*sin(alfa);
    
            double RectLx1,Recty1,RectLx2,Recty2;
	        double RectRx1,RectRx2,bRx,eRx;
	        RectLx1=x02-r1;
	        Recty1=y02+r1;
	        RectLx2=x02+r1;
	        Recty2=y02-r1;
            dc.Arc(RectLx1,Recty1,RectLx2,Recty2,BeginX,BeginY,xc,yc);       

            x02d=2*Axisx-x02;
	        RectRx1=x02d-r1;
	        RectRx2=x02d+r1;
	        bRx=2*Axisx-BeginX;
	        eRx=2*Axisx-xc;
	        dc.Arc(RectRx1,Recty1,RectRx2,Recty2,eRx,yc,bRx,BeginY);

	        SymmetryArc(&dc,Axisx,x01,y01,m_RR,Axisx,BeginY,xc,yc,'+');
            double h2,h3;
            h2=yc-hpd;
            h3=m_HH-h2;

            double vold11=Vol_HuTai(Axisx,m_HH,r1,x02,y02,hpd,'+');
            double vold12=Vol_HuTai(Axisx,h2,r1,x02,y02,hpd,'-');
            double aread11=Area_HuTai(Axisx,m_HH,r1,x02,y02,hpd,'+');
            double aread12=Area_HuTai(Axisx,h2,r1,x02,y02,hpd,'-');
            double vold2=pi*h3*h3*(m_RR-h3/3.0);
            double aread2=2*pi*m_RR*h3;
            Vol=vold11-vold12-vold2;
            Area=aread11+aread12+aread2;

		    pRevSurf=new CPingDi(Axisx,BeginX,BeginY,xc,yc,
		       x01,y01,r1,x02,y02,m_RR,m_HH,pDoc->PreDD,Vol,Area);
	        pDoc->AddRevSurf(pRevSurf);
			pDoc->PreDD=0.0;
			break;
		}	
        
		case XIANXING_HLINE:
		{
	        if((pDoc->CurrentDesign==CHUMU_DESIGN) && (HLineNumber==0))
            {
			    pDoc->m_TotalH=m_HH;  // m_HH为总高
				pDoc->m_RH=m_HH;

	            FirstY=CenterY+m_HH/2.0;
                BeginX=Axisx-m_DD/2.0;
		        BeginY=FirstY;
			    EndX=Axisx+m_DD/2.0;
                EndY=BeginY;
			}
            else
			{
				EndX=Axisx+pDoc->PreDD/2.0;
                EndY=BeginY;
			}
	        dc.MoveTo(BeginX,BeginY);
	        dc.LineTo(EndX,EndY);            

            Vol=0;
		    Area=0;

		    pRevSurf=new CHLine(BeginX,BeginY,EndX,EndY,0,pDoc->PreDD,Vol,Area);
	        pDoc->AddRevSurf(pRevSurf);

            HLineNumber++;
			EndX=BeginX;
			pDoc->PreDD=m_DD;
			break;
		}		
		case XIANXING_RECT:
		{
			pDoc->m_TotalH=m_HH;  // m_HH为总高
	        pDoc->m_RH=m_HH-m_DD;
	        FirstY=CenterY+m_HH/2.0;

            BeginX=Axisx-m_RR/2.0; // m_RR为口径
		    BeginY=FirstY;
		    EndX=Axisx+m_RR/2.0;
		    EndY=BeginY-m_DD;  // m_DD为口高

			dc.MoveTo(BeginX,BeginY);
			dc.LineTo(EndX,BeginY);
			dc.LineTo(EndX,EndY);
			dc.LineTo(BeginX,EndY);
			dc.LineTo(BeginX,BeginY);

		    Vol=pi*m_DD*m_RR*m_RR/4;
		    Area=pi*m_DD*m_RR;

		
		    pRevSurf=new CCuboid(BeginX,BeginY,EndX,EndY,m_DD,pDoc->PreDD,Vol,Area);
	        pDoc->AddRevSurf(pRevSurf);

			EndX=Axisx-m_RR2/2.0;
            pDoc->PreDD=m_RR2;
    		break;
		}	    
	  }//switch
	  BeginX=EndX;
	  BeginY=EndY;
	  pDoc->m_StartX=BeginX;
	  pDoc->m_StartY=BeginY;	
		
      pDoc->m_TotalVolue=pDoc->m_TotalVolue+Vol;
	  pDoc->m_TotalArea=pDoc->m_TotalArea+Area;

      CString str;
      str.Format("%12.2f",Vol);
	  m_VolEdit.SetWindowText(str);
      str.Format("%12.2f",Area);
	  m_AreaEdit.SetWindowText(str);

      m_ZHStatic.SetWindowText("剩余总高度:");
      m_ZVStatic.SetWindowText("已有总体积:");
      m_ZAStatic.SetWindowText("已有总面积:");
      str.Format("%12.2f",pDoc->m_RH);
	  m_RemainZGEdit.SetWindowText(str);
      str.Format("%12.2f",pDoc->m_TotalVolue);
	  m_ZVEdit.SetWindowText(str);
      str.Format("%12.2f",pDoc->m_TotalArea);
      m_ZAEdit.SetWindowText(str);
      ClearAll();

	  if(!(int)pDoc->m_RH)
	  {
	     if((pDoc->CurrentDesign==CHUMU_DESIGN) && (HLineNumber>0))
		 {
			 m_TipStatic.SetWindowText("用横线封底,之后按右下角“结束设计”按钮。");
		 }
         else
		 {
			 m_TipStatic.SetWindowText("剩余高度已为0,请按右下角“结束设计”按钮。");
		 }
   
	  }
	}
	else
    {
		m_TipStatic.SetWindowText("请先选择“设计”菜单下的某一个菜单项");
	}
}

void CGMCADView::OnButtonEnd() 
{
	// TODO: Add your control notification handler code here
    CGMCADDoc* pDoc = GetDocument();

    if(XGTTesting)
	{
		IsXGTTest=0;
		XGTTesting=0;
		m_TipStatic.SetWindowText("请选择“设计”菜单下的某一项来开始设计,或选择“转换”菜单下的某一项来进行转换。");
        m_OKButton.SetWindowText("结束设计");

		m_XXVStatic.SetWindowText("本线型体积:");
        m_XXAStatic.SetWindowText("本线型面积:");
        m_XXVUnitStatic.SetWindowText("立方毫米");
        m_XXAUnitStatic.SetWindowText("平方毫米");

        m_dispStatic.ShowWindow(SW_HIDE);

        m_RHUnitStatic.SetWindowText("毫米");
        m_ZVUnitStatic.SetWindowText("立方毫米");
        m_ZAUnitStatic.SetWindowText("平方毫米");
	}

	if(pDoc->CurrentDesign==PINGXING_DESIGN || pDoc->CurrentDesign==CHUMU_DESIGN
		|| pDoc->CurrentDesign==CHONGTOU_DESIGN)
	{
	    IsDesigning=0;
        HLineNumber=0;
        pDoc->m_DesignFinish=1;
	}

    if(pDoc->CurrentDesign==VIEW_VOLUME && pDoc->m_TotalVolue>0.0)
	{
       int k;
	   double mkrl,bh,i;
	   double zbmj=pDoc->m_TotalArea;
       double ztj=pDoc->m_TotalVolue;
       double kg=m_XXVol;
	   ztj=ztj/1000.0;
       k=1;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text11.Format("%6.2f",i);
          m_text21.Format("%6.2f",mkrl);
          m_text31.Format("%6.2f",bh);
       k=2;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text12.Format("%6.2f",i);
          m_text22.Format("%6.2f",mkrl);
          m_text32.Format("%6.2f",bh);
       k=3;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text13.Format("%6.2f",i);
          m_text23.Format("%6.2f",mkrl);
          m_text33.Format("%6.2f",bh);
       k=4;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text14.Format("%6.2f",i);
          m_text24.Format("%6.2f",mkrl);
          m_text34.Format("%6.2f",bh);
       k=5;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text15.Format("%6.2f",i);
          m_text25.Format("%6.2f",mkrl);
          m_text35.Format("%6.2f",bh);
       k=6;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text16.Format("%6.2f",i);
          m_text26.Format("%6.2f",mkrl);
          m_text36.Format("%6.2f",bh);
       k=7;
          i=kg-15+(k-1)*5;
	      mkrl=ztj-i*1.025/2.5;
          bh=(i/2.5)/zbmj*1000;
          m_text17.Format("%6.2f",i);
          m_text27.Format("%6.2f",mkrl);
          m_text37.Format("%6.2f",bh);
	   UpdateData(FALSE);
	}
    if(IsXGTTest)
	{
	   CClientDC dc(this);
       dc.SetMapMode(MM_ANISOTROPIC);
       dc.SetWindowExt(50,-50);
	   dc.SetViewportExt(50,50);
       POINT temp;
	   temp.x=m_Axisx;
	   temp.y=m_CenterY;
       dc.DPtoLP(&temp);
	   double cmzh=0.0,ctzh=0.0;
	   double ccy=2*temp.y;
//      double Axisx=temp.x;  
	   int index;
	   CRevSurf *p1,*p2;
	   inde

⌨️ 快捷键说明

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