- 3
- 0
- 约4.96千字
- 约 9页
- 2015-08-11 发布于山西
- 举报
CAD
工程名称:CAD
工程作者:杨志(信计0701)
主要功能:
1、在顶视图(XY平面)画4个圆,在每一个圆上取36个控制点,在每个圆取一个相应点,利用样条插值获取31个点(含之前的4个点),画出三维图像。
2、利用STL的栈,实现撤消和返回的功能。
工程简介:
顶视图画圆:
pDoc-RNum记录圆的个数,当圆的个数小于等于4时OnLButtonDown获取圆心位置存放在Point3 roundpoint[4]中。
OnLButtonUp获取点point,求出半径float radius[4];每隔10度获取一个控制点,存放在CArrayPoint3,Point3 PtDate中。
获取壶嘴。画完4个圆之后,OnLButtonDblClk 选中第四个圆的一个控制点,OnLButtonDown获取壶嘴的位置。
左视图:
每画完一个圆,左视图DrawLeft()画出此圆的36个控制点,OnLButtonDown选中一个圆的36个控制点,OnMouseMove移动鼠标,OnLButtonUp获取移动后的位置,PtDate[]把原来的点改成新的点坐标,在前视图,顶视图和三维视图根据新的点重新画图。
前视图:(同左视图)
撤消操作:
Mesh中声明Round类,如下:
class Round
{
public:
CArrayPoint3,Point3 ptarrray;
Point3 roundpoint[4]; //圓心
float radius[4]; //半径
int roundNum; //圆的个数
int roundNo; //圆的编号
BOOL ISOVER;
Round()
{
for (int i=0;i4;i++)
{
roundpoint[i].x=0;
roundpoint[i].y=0;
roundpoint[i].z=0;
radius[i]=0;
}
roundNum=0;
roundNo=0;
ISOVER=FALSE;
}
Round(const Round rd)
{
for (int i=0;i4;i++)
{
roundpoint[i].x=rd.roundpoint[i].x;
roundpoint[i].y=rd.roundpoint[i].y;
roundpoint[i].z=rd.roundpoint[i].z;
radius[i]=rd.radius[i];
}
ptarrray.Copy(rd.ptarrray);
roundNum=rd.roundNum;
roundNo=rd.roundNo;
ISOVER=rd.ISOVER;
}
const Round operator=(const Round rd)
{
for (int i=0;i4;i++)
{
roundpoint[i].x=rd.roundpoint[i].x;
roundpoint[i].y=rd.roundpoint[i].y;
roundpoint[i].z=rd.roundpoint[i].z;
radius[i]=rd.radius[i];
}
ptarrray.Copy(rd.ptarrray);
roundNum=rd.roundNum;
roundNo=rd.roundNo;
ISOVER=rd.ISOVER;
return *this;
}
};
定义栈stackRound roundStack,用于存放每次操作的点。在画圆过程OnLButtonUp把PtDate的点COPY()到栈中,在画壶嘴时把点COPY()到栈中。
单击撤消按钮时执行下面函数:
void CMy3DMAXDoc::OnBack()
{
// TODO: Add your command handler code here
if (mesh.roundStack.size()==1)
{
AfxMessageBox(已空!);
return;
}
else if (!mesh.roundStack.empty())
{
//将要弹出的round保存到redoStack中
Round roundPop=mesh.roundStack.top();
mesh.redoStack.push(roundPop);
//
mesh.roundStack.pop();
原创力文档

文档评论(0)