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

📄 gmcaddoc.cpp

📁 《Visual C++.NET MFC类库应用详解》程序实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GMCADDoc.cpp : implementation of the CGMCADDoc class
//

#include "stdafx.h"
#include "GMCAD.h"
#include "GMCADDoc.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGMCADDoc
enum {HXBL=1,LZBL};
enum {PINGXING_DESIGN=1,CHUMU_DESIGN,CHONGTOU_DESIGN,XGT_TEST,VIEW_VOLUME};
const double pi=3.1415926;

IMPLEMENT_DYNCREATE(CGMCADDoc, CDocument)

BEGIN_MESSAGE_MAP(CGMCADDoc, CDocument)
	//{{AFX_MSG_MAP(CGMCADDoc)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
	ON_COMMAND(ID_TRAN_REFSURF, OnTranRefsurf)
	ON_UPDATE_COMMAND_UI(ID_TRAN_REFSURF, OnUpdateTranRefsurf)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGMCADDoc construction/destruction

CGMCADDoc::CGMCADDoc()
{
	// TODO: add one-time construction code here
    m_DesignFinish=0;
	m_TotalH=0.0;
	m_TotalVolue=0.0;
	m_TotalArea=0.0;
    m_Axisx=0.0;

    m_StartX=0.0;
	m_StartY=0.0;
	m_RH=0.0;
	PreDD=0.0;
    CurrentDesign=0;
	blf=LZBL;
}

CGMCADDoc::~CGMCADDoc()
{
}

BOOL CGMCADDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CGMCADDoc serialization

void CGMCADDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	    ar<<CurrentDesign<<m_DesignFinish<<m_TotalH<<m_TotalVolue<<m_TotalArea<<m_Axisx; 
	    m_ObArray.Serialize(ar);
	}
	else
	{
		// TODO: add loading code here
	    ar>>CurrentDesign>>m_DesignFinish>>m_TotalH>>m_TotalVolue>>m_TotalArea>>m_Axisx; 
		m_ObArray.Serialize(ar);
	}
}

void CGMCADDoc::DeleteContents() 
{
	// TODO: Add your specialized code here and/or call the base class

	int index;
	index=m_ObArray.GetSize();
	while(index--)
	   delete m_ObArray.GetAt(index);
	m_ObArray.RemoveAll();	

	m_TotalVolue=0.0;
	m_TotalArea=0.0;
	m_TotalH=0.0;
	m_RH=0.0;
    m_StartX=0.0;
	m_StartY=0.0;
    PreDD=0.0;	
}

void CGMCADDoc::OnEditUndo() 
{
	// TODO: Add your command handler code here
    int index;
	index=m_ObArray.GetUpperBound();
	if(index>=0)
	{
	    CRevSurf *p=(CRevSurf *)m_ObArray.GetAt(index);
		m_StartX=p->m_Bx;
		m_StartY=p->m_By;
		m_RH=m_RH+p->m_H;
		PreDD=p->PreDD;
        m_TotalVolue=m_TotalVolue-p->m_Vol;
	    m_TotalArea=m_TotalArea-p->m_Area;
        
		m_RedoObArray.Add(p);

//		delete m_ObArray.GetAt(index);
		m_ObArray.RemoveAt(index);

	}
    UpdateAllViews(NULL);
    SetModifiedFlag();		
}

void CGMCADDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_ObArray.GetSize());
}

void CGMCADDoc::OnEditRedo() 
{
	// TODO: Add your command handler code here
    int index;
	index=m_RedoObArray.GetUpperBound();
	if(index>=0)
	{
	    CRevSurf *p=(CRevSurf *)m_RedoObArray.GetAt(index);
		m_StartX=p->m_Ex;
		m_StartY=p->m_Ey;
		m_RH=m_RH-p->m_H;
		PreDD=p->PreDD;
        m_TotalVolue=m_TotalVolue+p->m_Vol;
	    m_TotalArea=m_TotalArea+p->m_Area;

		m_ObArray.Add(p);
		m_RedoObArray.RemoveAt(index);
	}
    UpdateAllViews(NULL);
    SetModifiedFlag();			
}

void CGMCADDoc::OnUpdateEditRedo(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_RedoObArray.GetSize());
	
}

/////////////////////////////////////////////////////////////////////////////
// CGMCADDoc diagnostics

#ifdef _DEBUG
void CGMCADDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CGMCADDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGMCADDoc commands
void CGMCADDoc::AddRevSurf(CRevSurf *pRevSurf)
{
	m_ObArray.Add(pRevSurf);
	SetModifiedFlag();
}
CRevSurf *CGMCADDoc::GetRevSurf(int index)
{
	if(index<0||index>m_ObArray.GetUpperBound())return 0;
	return(CRevSurf *)m_ObArray.GetAt(index);
}
int CGMCADDoc::GetRevSurfNumber()
{
	return m_ObArray.GetSize();
}


/////////////////////////////////////////////////////////////////////////////
// 全局函数

double Angle(double CX,double CY,double R,double px,double py)
{
	double alfa,Xangle;
	if(fabs(px-CX)/R>0.95)
	    alfa=atan(fabs(py-CY)/fabs(px-CX))*180/pi;
	else
	    alfa=acos(fabs(px-CX)/R)*180/pi;
	if(py==CY)
	{
		if(px>CX)
		    Xangle=0;
		else
		    Xangle=180;
	}
	else if(py>CY)
	{	
		if(px==CX)
			Xangle=90;
		else if(px>CX)
		    Xangle=alfa;
        else
			Xangle=180-alfa;
	}
	else
	{	
		if(px==CX)
			Xangle=270;
		else if(px>CX)
		    Xangle=360-alfa;
        else
			Xangle=180+alfa;
	}
    return Xangle;
}

void SER_Arc(CDC *pDC,double StartX, double StartY,double EndX,double EndY,double CX,double CY,double R)
{
    double startAngle,endAngle,sweepAngle;
    startAngle=Angle(CX,CY,R,StartX,StartY);
    endAngle=Angle(CX,CY,R,EndX,EndY);
	if(endAngle>startAngle)
		sweepAngle=endAngle-startAngle;
	else
		sweepAngle=360+endAngle-startAngle;
    
	pDC->MoveTo(StartX,StartY);
	pDC->AngleArc(CX,CY,R,-startAngle,-sweepAngle);
}

TempStruct offsetxy(char xx1,double xa1,double ya1,double xb1,double yb1,double xc1,double yc1,double r1,
			  char xx2,double xa2,double ya2,double xb2,double yb2,double xc2,double yc2,double r2,
			  double s, int jlh1,int jlh2)
{
    double k1,k2,p1,p2,sina,cosa,sinb,cosb;
    double delta,x1,y1,x2,y2,bb,aa,a,B,c;
	double xna1,yna1,xnb1,ynb1,xna2,yna2,xnb2,ynb2;
	//(xna1,yna1)为第一条线的起点,(xnb1,ynb1)为第一条线的终点, 
	//(xna2,yna2)为第二条线的起点,(xnb2,ynb2)为第二条线的终点

    if(xx1=='L' && xx2=='L')   //线与线相交
	{
		k1=(ya1-yb1)/(xa1-xb1);
        k2=(ya2-yb2)/(xa2-xb2);
        p1=sqrt((xa1-xb1)*(xa1-xb1)+(ya1-yb1)*(ya1-yb1));
        p2=sqrt((xa2-xb2)*(xa2-xb2)+(ya2-yb2)*(ya2-yb2));
        sina=(ya1-yb1)/p1;
        cosa=(xa1-xb1)/p1;
        sinb=(ya2-yb2)/p2;
        cosb=(xa2-xb2)/p2;
        if(k1>0)
		{
           if(k2>0)
		   {
               xna1=xa1+s*sina;
               yna1=ya1-s*cosa;
               xnb2=xb2+s*sinb;
               ynb2=yb2-s*cosb;
		   }
           else
		   {
               xna1=xa1+s*sina;
               yna1=ya1-s*cosa;
               xnb2=xb2+s*sinb;
               ynb2=yb2+s*cosb;
		   }
		}
        else
		{
           if(k2>0)
		   {
               xna1=xa1+s*sina;
               yna1=ya1+s*cosa;
               xnb2=xb2+s*sinb;
               ynb2=yb2-s*cosb;
		   }
           else
		   {
               xna1=xa1+s*sina;
               yna1=ya1+s*cosa;
               xnb2=xb2+s*sinb;
               ynb2=yb2+s*cosb;
		   }
		}
        xnb1=(yna1-ynb2+k2*xnb2-k1*xna1)/(k2-k1);
        ynb1=k1*xnb1-k1*xna1+yna1;
    }
    if(xx1=='A' && xx2=='A')    //弧与弧相交
	{
       aa=-(xc1-xc2)/(yc1-yc2);
       a=aa*aa+1;
       if(xc1>xa1)
	   {
          if(xc2>xa2)   //圆心在右、右
		  {
             xna1=xa1+s*(xc1-xa1)/r1;
             yna1=ya1-s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xc1-xb1)/r1;
             ynb1=yb1+s*(yc1-yb1)/r1;
             
             xnb2=xb2+s*(xc2-xb2)/r2;
             ynb2=yb2+s*(yc2-yb2)/r2;
             bb=(-(r1-s)*(r1-s)+(r2-s)*(r2-s)+xc1*xc1-xc2*xc2+yc1*yc1-yc2*yc2)/2/(yc1-yc2);
             B=2*aa*bb-2*xc1-2*aa*yc1;
             c=xc1*xc1+yc1*yc1+bb*bb-2*bb*yc1-(r1-s)*(r1-s);
		  }
          else           //圆心在右、左
		  {
             xna1=xa1+s*(xc1-xa1)/r1;
             yna1=ya1-s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xc1-xb1)/r1;
             ynb1=yb1+s*(yc1-yb1)/r1;
             
             xnb2=xb2+s*(xb2-xc2)/r2;
             ynb2=yb2-s*(yc2-yb2)/r2;
             bb=(-(r1-s)*(r1-s)+(r2+s)*(r2+s)+xc1*xc1-xc2*xc2+yc1*yc1-yc2*yc2)/2/(yc1-yc2);
             B=2*aa*bb-2*xc1-2*aa*yc1;
             c=xc1*xc1+yc1*yc1+bb*bb-2*bb*yc1-(r1-s)*(r1-s);
          }
	   }
       else
	   {
          if(xc2>xa2)     //圆心在左、右
		  {
             xna1=xa1+s*(xa1-xc1)/r1;
             yna1=ya1+s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xb1-xc1)/r1;
             ynb1=yb1-s*(yc1-yb1)/r1;
             
             xnb2=xb2+s*(xc2-xb2)/r2;
             ynb2=yb2+s*(yc2-yb2)/r2;
             bb=(-(r1+s)*(r1+s)+(r2-s)*(r2-s)+xc1*xc1-xc2*xc2+yc1*yc1-yc2*yc2)/2/(yc1-yc2);
             B=2*aa*bb-2*xc1-2*aa*yc1;
             c=xc1*xc1+yc1*yc1+bb*bb-2*bb*yc1-(r1+s)*(r1+s);
		  }
          else              //圆心在左、左
		  {
             xna1=xa1+s*(xa1-xc1)/r1;
             yna1=ya1+s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xb1-xc1)/r1;
             ynb1=yb1-s*(yc1-yb1)/r1;
             
             xnb2=xb2+s*(xb2-xc2)/r2;
             ynb2=yb2-s*(yc2-yb2)/r2;
             bb=(-(r1+s)*(r1+s)+(r2+s)*(r2+s)+xc1*xc1-xc2*xc2+yc1*yc1-yc2*yc2)/2/(yc1-yc2);
             B=2*aa*bb-2*xc1-2*aa*yc1;
             c=xc1*xc1+yc1*yc1+bb*bb-2*bb*yc1-(r1+s)*(r1+s);
          }
	   }
       

       delta=sqrt(B*B-4*a*c);
       x1=(-B+delta)/2/a;
       x2=(-B-delta)/2/a;
       y1=aa*x1+bb;
       y2=aa*x2+bb;
       if(sqrt((x1-xnb1)*(x1-xnb1)+(y1-ynb1)*(y1-ynb1))<sqrt((x2-xnb1)*(x2-xnb1)+(y2-ynb1)*(y2-ynb1)))
	   {
           xnb1=x1;
           ynb1=y1;
	   }
       else
	   {
           xnb1=x2;
           ynb1=y2;
	   }
    }
    if(xx1=='L' && xx2=='A')   //线与弧相交
	{
       k1=(ya1-yb1)/(xa1-xb1);
       p1=sqrt((xa1-xb1)*(xa1-xb1)+(ya1-yb1)*(ya1-yb1));
       sina=(ya1-yb1)/p1;
       cosa=(xa1-xb1)/p1;
       if(k1>0)
	   {
          if(xc2>xa2)      //圆心在右
		  {
             xna1=xa1+s*sina;
             yna1=ya1-s*cosa;
             xnb1=xb1+s*sina;
             ynb1=yb1-s*cosa;
             
             xnb2=xb2+s*(xc2-xb2)/r2;
             ynb2=yb2+s*(yc2-yb2)/r2;
		  }
          else
		  {
             xna1=xa1+s*sina;
             yna1=ya1-s*cosa;
             xnb1=xb1+s*sina;
             ynb1=yb1-s*cosa;
             
             xnb2=xb2+s*(xb2-xc2)/r2;
             ynb2=yb2-s*(yc2-yb2)/r2;
          }
	   }
       else
	   {
          if(xc2>xa2)
		  {
             xna1=xa1+s*sina;
             yna1=ya1+s*cosa;
             xnb1=xb1+s*sina;
             ynb1=yb1+s*cosa;
             
             xnb2=xb2+s*(xc2-xb2)/r2;
             ynb2=yb2+s*(yc2-yb2)/r2;
		  }
          else
		  {
             xna1=xa1+s*sina;
             yna1=ya1+s*cosa;
             xnb1=xb1+s*sina;
             ynb1=yb1+s*cosa;
             
             xnb2=xb2+s*(xb2-xc2)/r2;
             ynb2=yb2-s*(yc2-yb2)/r2;
          }
       }
       a=1+k1*k1;
       B=2*k1*(yna1-k1*xna1-yc2)-2*xc2;
       if(xc2>xa2)    //圆心在右
	   {
           c=xc2*xc2+(yna1-k1*xna1-yc2)*(yna1-k1*xna1-yc2)-(r2-s)*(r2-s);
	   }
       else     //圆心在左
	   {
           c=xc2*xc2+(yna1-k1*xna1-yc2)*(yna1-k1*xna1-yc2)-(r2+s)*(r2+s);
       }
       delta=sqrt(B*B-4*a*c);
       x1=(-B+delta)/2/a;
       x2=(-B-delta)/2/a;
       y1=k1*x1-k1*xna1+yna1;
       y2=k1*x2-k1*xna1+yna1;
       if(sqrt((x1-xnb1)*(x1-xnb1)+(y1-ynb1)*(y1-ynb1))<sqrt((x2-xnb1)*(x2-xnb1)+(y2-ynb1)*(y2-ynb1)))
	   {
          xnb1=x1;
          ynb1=y1;
	   }
       else
	   {
          xnb1=x2;
          ynb1=y2;
       }
    }
    if(xx1=='A'&&xx2=='L')    //弧与线相交
	{
       k2=(ya2-yb2)/(xa2-xb2);
       p2=sqrt((xa2-xb2)*(xa2-xb2)+(ya2-yb2)*(ya2-yb2));
       sinb=(ya2-yb2)/p2;
       cosb=(xa2-xb2)/p2;
       if(xc1>=xa1)      //圆心在右
	   {
          if(k2>0)
		  {
			 xna1=xa1+s*(xc1-xa1)/r1;
             yna1=ya1-s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xc1-xb1)/r1;
             ynb1=yb1+s*(yc1-yb1)/r1;
            
             xna2=xa2+s*sinb;
             yna2=ya2-s*cosb;
             xnb2=xb2+s*sinb;
             ynb2=yb2-s*cosb;
		  }
          else
		  {
             xna1=xa1+s*(xc1-xa1)/r1;
             yna1=ya1-s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xc1-xb1)/r1;
             ynb1=yb1+s*(yc1-yb1)/r1;
             
             xna2=xa2+s*sinb;
             yna2=ya2+s*cosb;
             xnb2=xb2+s*sinb;
             ynb2=yb2+s*cosb;
          }
	   }
       else
	   {
          if(k2>0)
		  {
             xna1=xa1+s*(xa1-xc1)/r1;
             yna1=ya1+s*(ya1-yc1)/r1;
             xnb1=xb1+s*(xb1-xc1)/r1;
             ynb1=yb1-s*(yc1-yb1)/r1;
             
             xna2=xa2+s*sinb;
             yna2=ya2-s*cosb;
             xnb2=xb2+s*sinb;

⌨️ 快捷键说明

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