📄 gmcaddoc.cpp
字号:
ynb2=yb2-s*cosb;
}
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;
xna2=xa2+s*sinb;
yna2=ya2+s*cosb;
xnb2=xb2+s*sinb;
ynb2=yb2+s*cosb;
}
}
if( jlh1 != 1 ) //若为第一条弧则不求交点
{
a=1+k2*k2;
B=2*k2*(ynb2-k2*xnb2-yc1)-2*xc1;
if(xc2>xa2) //圆心在右
{
c=xc1*xc1+(ynb2-k2*xnb2-yc1)*(ynb2-k2*xnb2-yc1)-(r1-s)*(r1-s);
}
else //圆心在左
{
c=xc1*xc1+(ynb2-k2*xnb2-yc1)*(ynb2-k2*xnb2-yc1)-(r1+s)*(r1+s);
}
delta=sqrt(B*B-4*a*c);
x1=(-B-delta)/2/a;
x2=(-B+delta)/2/a;
y1=k2*x1-k2*xnb2+ynb2;
y2=k2*x2-k2*xnb2+ynb2;
if(sqrt((x1-xna2)*(x1-xna2)+(y1-yna2)*(y1-yna2))<sqrt((x2-xna2)*(x2-xna2)+(y2-yna2)*(y2-yna2)))
{
xnb1=x1;
ynb1=y1;
}
else
{
xnb1=x2;
ynb1=y2;
}
}
}
xna2=xnb1; //上一次的终点为下一次的起点
yna2=ynb1;
TempStruct tt;
tt.xna1=xna1;
tt.xna2=xna2;
tt.xnb1=xnb1;
tt.xnb2=xnb2;
tt.yna1=yna1;
tt.yna2=yna2;
tt.ynb1=ynb1;
tt.ynb2=ynb2;
return tt;
}
void qgxdyj(CStdioFile *fp,double qdx,double qdy,double zdy)
{
CString outstr;
double dfr=2.0; //倒圆角半径
outstr.Format("pline %f,%f a ce %f,%f %f,%f l\n",qdx+dfr,qdy,qdx+dfr,qdy-dfr,qdx,qdy-dfr);
fp->WriteString(outstr);
outstr.Format("%f,%f a ce %f,%f %f,%f \n",qdx,zdy+dfr,qdx+dfr,zdy+dfr,qdx+dfr,zdy);
fp->WriteString(outstr);
}
FPOINT linecircle(double cx,double cy, double r, double k)
{
FPOINT fp;
double jj=52.5*k+cy-k*cx;
double a=1+k*k;
double B=2*k*jj-2*cx-2*k*cy;
double c=cx*cx+cy*cy+jj*jj-r*r-2*cy*jj;
double delta=sqrt(B*B-4*a*c);
double x1=(-B+delta)/2.0/a;
double x2=(-B-delta)/2.0/a;
if(x1>cx-52.5)
fp.x=x1;
else
fp.x=x2;
fp.y=fp.x*k+jj;
return fp;
}
double Vol_HuTai(double Axisx,double h, double r, double x0, double y0, double Y,
char symbol)
{
double a,b,v1,v2,v3,v4,v5,tv,vol;
a = y0-Y;
b = Axisx-x0;
v1 = pi*h*(b*b+r*r-a*a+a*h-h*h/3.0);
v2 = (h-a)*sqrt(fabs(r*r-(h-a)*(h-a)))/2.0;
v3 = r*r*asin((h-a)/r)/2.0;
v4 = a*sqrt(fabs(r*r-a*a))/2.0;
v5 = r*r*asin(-a/r)/2.0;
tv = 2*pi*b*(v2+v3+v4-v5);
if(symbol=='+')
vol = v1+tv;
else
vol = v1-tv;
return vol;
}
double Area_HuTai(double Axisx,double h, double r, double x0, double y0, double Y,
char symbol)
{
double a,b,a2,a3,a4,a5,aa,area;
a = y0-Y;
b = Axisx-x0;
a2 =(h-a)*sqrt(fabs(r*r-(h-a)*(h-a)))/2.0;
a3 =r*r*asin((h-a)/r)/2.0;
a4 =a*sqrt(fabs(r*r-a*a))/2.0;
a5 =r*r*asin(-a/r)/2.0;
aa =2*pi*(a2+a3+a4-a5);
if(symbol=='+')
area = 2*pi*b*h+aa;
else
area = 2*pi*b*h-aa;
return area;
}
void SymmetryLine(CDC *pDC,double cx,double bx,double by,double ex,double ey)
{
pDC->MoveTo(bx,by);
pDC->LineTo(ex,ey);
double b1x=2*cx-bx;
double e1x=2*cx-ex;
pDC->MoveTo(b1x,by);
pDC->LineTo(e1x,ey);
}
void SymmetryArc(CDC *pDC,double cx,double x0,double y0,double r,
double bx,double by,double ex,double ey,char symbol)
{
double RectLx1,Recty1,RectLx2,Recty2;
double x0d,RectRx1,RectRx2,bRx,eRx;
RectLx1=x0-r;
Recty1=y0+r;
RectLx2=x0+r;
Recty2=y0-r;
x0d=2*cx-x0;
RectRx1=x0d-r;
RectRx2=x0d+r;
bRx=2*cx-bx;
eRx=2*cx-ex;
if(symbol=='+')
{
pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,bx,by,ex,ey);
pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,eRx,ey,bRx,by);
}
else
{
pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,ex,ey,bx,by);
pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,bRx,by,eRx,ey);
}
}
/////////////////////////////////////////////////////////////////////////////
// CRevSurf类
IMPLEMENT_SERIAL(CRevSurf,CObject,1)
void CRevSurf::Serialize(CArchive &ar)
{
if(ar.IsStoring())
ar<<m_XX<<m_Bx<<m_By<<m_Ex<<m_Ey<<m_H<<PreDD<<m_Vol<<m_Area;
else
ar>>m_XX>>m_Bx>>m_By>>m_Ex>>m_Ey>>m_H>>PreDD>>m_Vol>>m_Area;
}
/////////////////////////////////////////////////////////////////////////////
// CCuboid类
IMPLEMENT_SERIAL(CCuboid,CRevSurf,1)
CCuboid::CCuboid(double Bx,double By,double Ex,double Ey,double h,double predd,double Vol,double Area)
{
m_XX='R';
m_Bx=Bx;
m_By=By;
m_Ex=Ex;
m_Ey=Ey;
m_H=h;
PreDD=predd;
m_Vol=Vol;
m_Area=Area;
}
void CCuboid::Drawing(CDC *pDC)
{
pDC->MoveTo(m_Bx,m_By);
pDC->LineTo(m_Ex,m_By);
pDC->LineTo(m_Ex,m_Ey);
pDC->LineTo(m_Bx,m_Ey);
pDC->LineTo(m_Bx,m_By);
}
void CCuboid::Serialize(CArchive &ar)
{
CRevSurf::Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CHLine类
IMPLEMENT_SERIAL(CHLine,CRevSurf,1)
CHLine::CHLine(double Bx,double By,double Ex,double Ey,double h,double predd,double Vol,double Area)
{
m_XX='H';
m_Bx=Bx;
m_By=By;
m_Ex=Ex;
m_Ey=Ey;
m_H=h;
PreDD=predd;
m_Vol=Vol;
m_Area=Area;
}
void CHLine::Drawing(CDC *pDC)
{
pDC->MoveTo(m_Bx,m_By);
pDC->LineTo(m_Ex,m_Ey);
}
void CHLine::Serialize(CArchive &ar)
{
CRevSurf::Serialize(ar);
}
/////////////////////////////////////////////////////////////////////////////
// CYuanTai类
IMPLEMENT_SERIAL(CYuanTai,CRevSurf,1)
CYuanTai::CYuanTai(double Bx,double By,double Ex,double Ey,double Ax,
double h,double predd,double Vol,double Area)
{
m_XX='L';
m_Bx=Bx;
m_By=By;
m_Ex=Ex;
m_Ey=Ey;
m_Axisx=Ax;
m_H=h;
PreDD=predd;
m_Vol=Vol;
m_Area=Area;
}
void CYuanTai::Drawing(CDC *pDC)
{
SymmetryLine(pDC,m_Axisx,m_Bx,m_By,m_Ex,m_Ey);
}
void CYuanTai::Serialize(CArchive &ar)
{
CRevSurf::Serialize(ar);
if(ar.IsStoring())
ar<<m_Axisx;
else
ar>>m_Axisx;
}
/////////////////////////////////////////////////////////////////////////////
// CHuTai类
IMPLEMENT_SERIAL(CHuTai,CRevSurf,1)
CHuTai::CHuTai(double Bx,double By,double Ex,double Ey,double Ax,double x0,double y0,
double r, char LorR,double h,double predd,double Vol,double Area)
{
m_XX='A';
m_Bx=Bx;
m_By=By;
m_Ex=Ex;
m_Ey=Ey;
m_Axisx=Ax;
m_x0=x0;
m_y0=y0;
m_r=r;
m_LorR=LorR;
m_H=h;
PreDD=predd;
m_Vol=Vol;
m_Area=Area;
}
void CHuTai::Drawing(CDC *pDC)
{
SymmetryArc(pDC,m_Axisx,m_x0,m_y0,m_r,m_Bx,m_By,
m_Ex,m_Ey,m_LorR);
}
void CHuTai::Serialize(CArchive &ar)
{
CRevSurf::Serialize(ar);
if(ar.IsStoring())
ar<<m_Axisx<<m_x0<<m_y0<<m_r<<m_LorR;
else
ar>>m_Axisx>>m_x0>>m_y0>>m_r>>m_LorR;
}
/////////////////////////////////////////////////////////////////////////////
// CPingDi类
IMPLEMENT_SERIAL(CPingDi,CRevSurf,1)
CPingDi::CPingDi(double Axisx,double Bx,double By,double xc,double yc,
double x01,double y01,double r1,double x02,double y02,double r2,
double h,double predd,double Vol,double Area)
{
m_XX='P';
m_Bx=Bx; m_By=By;
m_Ex=xc; m_Ey=yc;
m_Ax=Axisx;
m_R1=r1; //r1
m_R2=r2; //m_RR
m_x1=x01;m_y1=y01;
m_x2=x02;m_y2=y02;
m_H=h;PreDD=predd;
m_Vol=Vol; m_Area=Area;
}
void CPingDi::Drawing(CDC *pDC)
{
double RectLx1,Recty1,RectLx2,Recty2;
double x2d,RectRx1,RectRx2,bRx,eRx;
RectLx1=m_x2-m_R1;
Recty1=m_y2+m_R1;
RectLx2=m_x2+m_R1;
Recty2=m_y2-m_R1;
pDC->Arc(RectLx1,Recty1,RectLx2,Recty2,m_Bx,m_By,m_Ex,m_Ey);
x2d=2*m_Ax-m_x2;
RectRx1=x2d-m_R1;
RectRx2=x2d+m_R1;
bRx=2*m_Ax-m_Bx;
eRx=2*m_Ax-m_Ex;
pDC->Arc(RectRx1,Recty1,RectRx2,Recty2,eRx,m_Ey,bRx,m_By);
SymmetryArc(pDC,m_Ax,m_x1,m_y1,m_R2,m_Ax,m_By,m_Ex,m_Ey,'+');
}
void CPingDi::Serialize(CArchive &ar)
{
CRevSurf::Serialize(ar);
if(ar.IsStoring())
{
ar<<m_Ax<<m_R1<<m_R2<<m_x1<<m_y1<<m_x2<<m_y2;
}
else
{
ar>>m_Ax>>m_R1>>m_R2>>m_x1>>m_y1>>m_x2>>m_y2;
}
}
void CGMCADDoc::OnTranRefsurf()
{
// 瓶形立体图转换
LPCTSTR lpszDefExt=".scr";
static char szFilter[]="SCR Files(*.scr)|*.scr||";
CStdioFile cf;
CRevSurf *p;
CFileDialog FileDlg(FALSE,lpszDefExt,NULL,OFN_OVERWRITEPROMPT,szFilter);
if(FileDlg.DoModal()==IDOK && cf.Open(FileDlg.GetPathName(),CFile::modeCreate | CFile::modeWrite))
{
CString outstr;
double hhhh,wwwr,hy,AxisX,qdx,qdy,zdx,zdy;
int index;
index=GetRevSurfNumber();
p=GetRevSurf(1);
CYuanTai *yyyp=(CYuanTai *)p;
AxisX=yyyp->m_Axisx;
qdx=2*(AxisX-p->m_Bx);
zdx=2*(AxisX-p->m_Ex);
qdy=p->m_By;
zdy=p->m_Ey;
if(qdy>zdy)hy=qdy;
else hy=zdy;
hhhh=295-hy;
wwwr=-255;
outstr="limits 0,0 297,500\n";
cf.WriteString(outstr);
outstr="pline 148,195 w 0.01 0.01 148,195 \n";
cf.WriteString(outstr);
outstr="zoom all\n";
cf.WriteString(outstr);
char XX,PreXX;
double s1,s2,s3,s4,s5,s6,s7,alfa1,alfa2,minx,xdx,xdy;
for(int i=0;i<index;i++)
{
p=GetRevSurf(i);
XX=p->m_XX;
s1=p->m_Bx+wwwr;
s2=p->m_By+hhhh;
s3=p->m_Ex+wwwr;
s4=p->m_Ey+hhhh;
if(i==0)
{
outstr.Format("pline %f,%f %f,%f\n",s1,s2,s1,s4);
cf.WriteString(outstr);
PreXX='L';
minx=s1;
xdx=s1;
xdy=(s2+s4)/2;
}
else
{
if(i==1)
{
if(s2>s4)
outstr.Format("%f,%f\n",s1,s2);
else
outstr.Format("%f,%f\n",s3,s4);
cf.WriteString(outstr);
}
if(minx>s1)minx=s1;
if(XX=='L')
{
if(PreXX=='L')
outstr.Format("%f,%f\n",s3,s4);
else
outstr.Format("l %f,%f\n",s3,s4);
cf.WriteString(outstr);
}
if(XX=='A')
{
CHuTai *hp=(CHuTai *)p;
s5=hp->m_x0+wwwr;
s6=hp->m_y0+hhhh;
s7=hp->m_r;
if(s2>s4)
{
if(s1==s5)
alfa1=pi/2;
else
alfa1=pi+atan((s2-s6)/(s1-s5));
if(s3==s5)
alfa2=pi*1.5;
else
alfa2=pi+atan((s4-s6)/(s3-s5));
if(PreXX=='L')
outstr.Format("a a %f c %f,%f\n",(alfa2-alfa1)*180/pi,s5,s6);
else
outstr.Format("a %f c %f,%f\n",(alfa2-alfa1)*180/pi,s5,s6);
cf.WriteString(outstr);
}
else
{
if(s1==s5)
alfa1=-pi/2;
else
alfa1=atan((s2-s6)/(s1-s5));
if(s3==s5)
alfa2=pi/2;
else
alfa2=atan((s4-s6)/(s3-s5));
if(PreXX=='L')
outstr.Format("a a %f c %f,%f\n",(alfa1-alfa2)*180/pi,s5,s6);
else
outstr.Format("a %f c %f,%f\n",(alfa1-alfa2)*180/pi,s5,s6);
cf.WriteString(outstr);
}
}
if(XX=='P') //瓶底部分
{
double cx1,cy1,cx2,cy2,r1,r2,ax;
CPingDi *pp=(CPingDi *)p;
cx1=pp->m_x1+wwwr;
cy1=pp->m_y1+hhhh;
r1=pp->m_R1;
cx2=pp->m_x2+wwwr;
cy2=pp->m_y2+hhhh;
r2=pp->m_R2;
ax=pp->m_Ax+wwwr;
alfa1=pi+atan((s2-cy2)/(s1-cx2));
alfa2=2*pi-atan((cy2-s4)/(s3-cx2));
if(PreXX=='L')
outstr.Format("a a %f c %f,%f\n",(alfa2-alfa1)*180/pi,cx2,cy2);
else
outstr.Format("a %f c %f,%f\n",(alfa2-alfa1)*180/pi,cx2,cy2);
cf.WriteString(outstr);
alfa1=atan((cx1-s3)/(s4-cy1));
if(PreXX=='L')
outstr.Format("a a %f c %f,%f\n",-alfa1*180/pi,cx1,cy1);
else
outstr.Format("a %f c %f,%f\n",-alfa1*180/pi,cx1,cy1);
cf.WriteString(outstr);
}
PreXX=XX;
}
}
outstr="\n";
cf.WriteString(outstr);
outstr="line 148,35 148,420 \n";
cf.WriteString(outstr);
outstr="surftab1 64\n";
cf.WriteString(outstr);
outstr="revsurf\n";
cf.WriteString(outstr);
outstr.Format("%f,%f\n",xdx,xdy);
cf.WriteString(outstr);
outstr="148,35 0 360\n";
cf.WriteString(outstr);
outstr="erase 148,35 \n";
cf.WriteString(outstr);
outstr="vpoint 0,4,-10\n";
cf.WriteString(outstr);
}
}
void CGMCADDoc::OnUpdateTranRefsurf(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_DesignFinish && CurrentDesign==PINGXING_DESIGN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -