📄 gmcaddoc.cpp
字号:
// 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 + -