862 lines
22 KiB
C++
862 lines
22 KiB
C++
#include "stdafx.h"
|
||
#include "StairMaker.h"
|
||
#include "MultiStairCreateDlg.h"
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
//外部引用
|
||
extern void DrawOsnapShape(AcGiViewportDraw *pVd, XPoint m_ptLoc, int m_osShape);
|
||
//定义获取距离的函数
|
||
void GetDist();
|
||
/////////////////////////////////////////////////////////////////////////////////////
|
||
//计算lastSeg(包括lastSeg)前面梯段的总踏步数,第一梯段的编号为0
|
||
int GetMTStepNum(const TDbMultiStair&stair)
|
||
{
|
||
DList<TDbEntity> subList;
|
||
stair.ExplodeTo(subList);
|
||
int res=0;
|
||
for(int i=0;i<subList.Length();i++)
|
||
{
|
||
TDbEntity *pEntity=subList[i];
|
||
if (pEntity->isKindOf(TDbStair::desc()))
|
||
res+=TDbStair::cast(pEntity)->GetStepNum();
|
||
}
|
||
return res;
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
//多跑楼梯拖制类
|
||
// ----------------------------------------------------------------------------------------------------------------------------- [10/17/2007 nsh]
|
||
TMultiStairJig::TMultiStairJig()
|
||
{
|
||
pJigStair=new TJigMultiStair;
|
||
}
|
||
TMultiStairJig::~TMultiStairJig()
|
||
{
|
||
delete pJigStair;
|
||
}
|
||
const XPoly2D&TMultiStairJig::GetPath()
|
||
{
|
||
return path;
|
||
}
|
||
void TMultiStairJig::Init(const XPoint&pt,CMultiStairDlg&dlg)
|
||
{
|
||
dlg.Dlg2Obj(pJigStair);
|
||
|
||
//add by whl on 070315,解决绘制时崩溃问题
|
||
pJigStair->SetHandRail(0,FALSE);
|
||
pJigStair->SetHandRail(1,FALSE);
|
||
|
||
stepNum=dlg.m_nStepNum;
|
||
|
||
path.Reset();
|
||
path.AppendNode(pt);//bottom
|
||
path.AppendNode(pt);//current point
|
||
type.Reset();
|
||
type.Append(new Adesk::UInt8(1));//这是虚拟的平台
|
||
type.Append(new Adesk::UInt8(0));//这才是第一个是梯段
|
||
}
|
||
void TMultiStairJig::Push()
|
||
{
|
||
path.AppendNode(GetCurPoint());
|
||
type.Append(new Adesk::UInt8(1));//下一个还是平台
|
||
}
|
||
void TMultiStairJig::Pop()
|
||
{
|
||
path.RemoveNode(path.Length()-1);
|
||
type.Remove(type.Length()-1);
|
||
}
|
||
bool TMultiStairJig::MakeIt()
|
||
{//执行拖制
|
||
bool bContinue=true,result=true;
|
||
while(bContinue)
|
||
{
|
||
bool bMakePlatform=IsMakePlatform();//当前定位平台, 还是定位梯段。
|
||
|
||
int status;
|
||
try
|
||
{
|
||
status=DoIt();
|
||
}
|
||
catch(...)
|
||
{
|
||
status=RTERROR;
|
||
}
|
||
|
||
if (status==RTNORM)
|
||
{//用户选定点
|
||
if (bMakePlatform)
|
||
{
|
||
if (pJigStair->IsPathValid())
|
||
Push();
|
||
else
|
||
acutPrintf(_T("请正确选择平台终点!"));
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->IsPathValid())
|
||
{
|
||
if (GetMTStepNum(*pJigStair)<stepNum-1)//not finished
|
||
Push();
|
||
else//finished
|
||
bContinue=false;
|
||
}
|
||
else
|
||
acutPrintf(_T("\n请正确选择梯段终点!"));
|
||
}
|
||
}
|
||
else if (status==RTNONE&&IsMakePlatform()&&IsPlatformLast())//当前为绘制连续平台情况,回车切换为绘制梯段
|
||
{
|
||
*type[type.Length()-1]=0;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
else if (status==RTKWORD)
|
||
{//用户键入命令
|
||
switch(nRetKey)
|
||
{
|
||
case 1://切换类型
|
||
if (!IsFirstStair())
|
||
{
|
||
if (bMakePlatform&&IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
|
||
{
|
||
*type[type.Length()-1]=0;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
else if (!bMakePlatform)//当前为绘制梯段情况,可以切换为绘制连续平台
|
||
{
|
||
*type[type.Length()-1]=1;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
}
|
||
break;
|
||
case 2://切换路径
|
||
{
|
||
double dist=pJigStair->GetPathSide()==0?pJigStair->GetStairWidth():-(pJigStair->GetStairWidth());
|
||
XPoly2D path0(path),pathNew;
|
||
if (IsFirstStair())
|
||
{
|
||
if (path0.QuickOffset(dist,pathNew)==RTNORM)
|
||
{
|
||
path=pathNew;
|
||
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
|
||
}
|
||
else
|
||
acutPrintf(_T("\n当前无法切换!"));
|
||
}
|
||
else
|
||
{
|
||
path0.Remove(path0.Length()-1);
|
||
if (path0.QuickOffset(dist,pathNew)==RTNORM)
|
||
{
|
||
pathNew.AppendNode(*pathNew[pathNew.Length()-1]);
|
||
path=pathNew;
|
||
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
|
||
}
|
||
else
|
||
acutPrintf(_T("\n当前无法切换!"));
|
||
}
|
||
}
|
||
break;
|
||
case 3: //撤消命令
|
||
if (!IsFirstStair())
|
||
Pop();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{//用户退出
|
||
bContinue=false;
|
||
result=false;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int TMultiStairJig::DoIt()
|
||
{
|
||
int nRet;
|
||
if (!IsFirstStair())
|
||
{
|
||
if (IsMakePlatform())
|
||
{
|
||
if (IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<绘制梯段>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<绘制梯段>:"));
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
|
||
}
|
||
}
|
||
else//当前为绘制梯段情况,可以切换为绘制连续平台
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)]<退出>:"));
|
||
}
|
||
INITGET_BEG(-1,_T("T Q U"));
|
||
nRet=drag();
|
||
INITGET_END();
|
||
|
||
if (nRet == AcEdJig::kCancel)
|
||
return RTCAN;
|
||
else if (nRet == AcEdJig::kNull)
|
||
return RTNONE;
|
||
else if (nRet <= 0)
|
||
return RTNORM;
|
||
else {
|
||
nRetKey=nRet;
|
||
return RTKWORD;
|
||
}
|
||
}
|
||
AcEdJig::DragStatus TMultiStairJig::sampler()
|
||
{//反馈
|
||
setUserInputControls((UserInputControls)
|
||
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
|
||
|AcEdJig::kNoNegativeResponseAccepted|AcEdJig::kNoZeroResponseAccepted));
|
||
setKeywordList(_T("T Q U"));
|
||
|
||
XPoint ptTemp;
|
||
|
||
DragStatus stat=acquirePoint(ptTemp,GetStartPoint());
|
||
|
||
if (stat==AcEdJig::kNormal)
|
||
{
|
||
if (ptTemp==GetCurPoint())//与实际数据点相同
|
||
return AcEdJig::kNoChange;
|
||
XVector3D vt1=ptTemp-GetStartPoint();
|
||
if (vt1.Length()<_DIST_SNAP)//与起始点距离过小
|
||
return AcEdJig::kNoChange;
|
||
if (!IsFirstStair())
|
||
{
|
||
XVector3D vt2=GetStartPoint()-(*path[path.Length()-3]);
|
||
vt1.Normalize();
|
||
vt2.Normalize();
|
||
if ((!!vt2)&&(vt1&vt2)<-0.5)//与上段的夹角不能大于150度
|
||
return AcEdJig::kNoChange;
|
||
}
|
||
|
||
SetCurPoint(ptTemp);//当前拖动点
|
||
|
||
if (!Apply())
|
||
return AcEdJig::kNoChange;
|
||
}
|
||
return stat;
|
||
}
|
||
BOOL TMultiStairJig::Apply()
|
||
{
|
||
pJigStair->SetStairFlag(1);//中间层
|
||
pJigStair->SetHandRail(OFFSET_LEFT, FALSE);
|
||
pJigStair->SetHandRail(OFFSET_RIGHT, FALSE);
|
||
|
||
pJigStair->ResetSegType();
|
||
for(long i=1;i<type.Length();i++)
|
||
pJigStair->SetSegType(i-1,*type[i]);
|
||
|
||
XPoly2D path1(path);
|
||
if (IsMakePlatform())
|
||
{
|
||
XVector3D vt=GetCurPoint()-GetStartPoint();
|
||
vt.Normalize();
|
||
vt.Scale(pJigStair->GetStepWidth()*stepNum);
|
||
XPoint ptEnd(GetCurPoint()+vt);
|
||
path1.AppendNode(ptEnd);
|
||
}
|
||
pJigStair->SetPolySide2d(path1);
|
||
|
||
if (IsMakePlatform())
|
||
pJigStair->SetActiveStep(1);
|
||
else
|
||
pJigStair->SetActiveStep(0);
|
||
return pJigStair->IsPathValid();
|
||
}
|
||
void TMultiStairJig::Apply(TDbMultiStair* pStair)
|
||
{
|
||
|
||
for(long i=1;i<type.Length();i++)
|
||
pStair->SetSegType(i-1,*type[i]);
|
||
|
||
pStair->SetPolySide2d(path);
|
||
pStair->SetPathSide(pJigStair->GetPathSide());
|
||
}
|
||
Adesk::Boolean TMultiStairJig::update()
|
||
{//更新临时实体
|
||
return pJigStair->IsPathValid()?Adesk::kTrue:Adesk::kFalse;
|
||
}
|
||
AcDbEntity* TMultiStairJig::entity() const
|
||
{
|
||
return pJigStair;
|
||
}
|
||
// ------------------------------------------------------------------------------------------------------------------------------ [10/17/2007 nsh]
|
||
//以下为新添加的Jig
|
||
// ------------------------------------------------------------------------------------------------------------------------------ [10/17/2007 nsh]
|
||
TMultiStairCreateJig::TMultiStairCreateJig()
|
||
{
|
||
pJigStair=new TJigMultiStair;
|
||
}
|
||
TMultiStairCreateJig::~TMultiStairCreateJig()
|
||
{
|
||
delete pJigStair;
|
||
}
|
||
const XPoly2D&TMultiStairCreateJig::GetPath()
|
||
{
|
||
return path;
|
||
}
|
||
void TMultiStairCreateJig::Init(const XPoint&pt,CMultiStairCreateDlg&dlg)
|
||
{
|
||
m_dlg=&dlg;
|
||
dlg.Dlg2Obj(pJigStair);
|
||
|
||
//add by whl on 070315,解决绘制时崩溃问题
|
||
pJigStair->SetHandRail(0,FALSE);
|
||
pJigStair->SetHandRail(1,FALSE);
|
||
|
||
stepNum=dlg.m_nStepNum;
|
||
|
||
path.Reset();
|
||
path.AppendNode(pt);//bottom
|
||
path.AppendNode(pt);//current point
|
||
type.Reset();
|
||
type.Append(new Adesk::UInt8(1));//这是虚拟的平台
|
||
type.Append(new Adesk::UInt8(0));//这才是第一个是梯段
|
||
}
|
||
void TMultiStairCreateJig::Push()
|
||
{
|
||
path.AppendNode(GetCurPoint());
|
||
type.Append(new Adesk::UInt8(1));//下一个还是平台
|
||
if (path.Length()>1)
|
||
{
|
||
m_dlg->m_bModify=FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_dlg->m_bModify=TRUE;
|
||
}
|
||
}
|
||
void TMultiStairCreateJig::Pop()
|
||
{
|
||
path.RemoveNode(path.Length()-1);
|
||
type.Remove(type.Length()-1);
|
||
if (path.Length()>2)
|
||
{
|
||
m_dlg->m_bModify=FALSE;
|
||
}
|
||
else
|
||
{
|
||
m_dlg->m_bModify=TRUE;
|
||
}
|
||
}
|
||
bool TMultiStairCreateJig::MakeIt()
|
||
{//执行拖制
|
||
bool bContinue=true,result=true;
|
||
while(bContinue)
|
||
{
|
||
bool bMakePlatform=IsMakePlatform();//当前定位平台, 还是定位梯段。
|
||
|
||
int status;
|
||
try
|
||
{
|
||
status=DoIt();
|
||
}
|
||
catch(...)
|
||
{
|
||
status=RTERROR;
|
||
}
|
||
|
||
if (status==RTNORM)
|
||
{//用户选定点
|
||
if (bMakePlatform)
|
||
{
|
||
if (pJigStair->IsPathValid())
|
||
Push();
|
||
else
|
||
acutPrintf(_T("请正确选择平台终点!"));
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->IsPathValid())
|
||
{
|
||
if (GetMTStepNum(*pJigStair)<stepNum-1)//not finished
|
||
Push();
|
||
else//finished
|
||
bContinue=false;
|
||
}
|
||
else
|
||
acutPrintf(_T("\n请正确选择梯段终点!"));
|
||
}
|
||
}
|
||
else if (status==RTNONE&&IsMakePlatform()&&IsPlatformLast())//当前为绘制连续平台情况,回车切换为绘制梯段
|
||
{
|
||
*type[type.Length()-1]=0;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
else if (status==RTKWORD)
|
||
{//用户键入命令
|
||
switch(nRetKey)
|
||
{
|
||
case 1://切换类型
|
||
if (!IsFirstStair())
|
||
{
|
||
if (bMakePlatform&&IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
|
||
{
|
||
*type[type.Length()-1]=0;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
else if (!bMakePlatform)//当前为绘制梯段情况,可以切换为绘制连续平台
|
||
{
|
||
*type[type.Length()-1]=1;
|
||
SetCurPoint(GetStartPoint());//强制更新
|
||
}
|
||
}
|
||
break;
|
||
case 2://切换路径
|
||
{
|
||
double dist=pJigStair->GetPathSide()==0?pJigStair->GetStairWidth():-(pJigStair->GetStairWidth());
|
||
XPoly2D path0(path),pathNew;
|
||
if (IsFirstStair())
|
||
{
|
||
if (path0.QuickOffset(dist,pathNew)==RTNORM)
|
||
{
|
||
path=pathNew;
|
||
|
||
//add by xlc on 090420
|
||
m_dlg->m_nBaseType=1-pJigStair->GetPathSide();
|
||
m_dlg->UpdateData(FALSE);
|
||
|
||
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
|
||
}
|
||
else
|
||
acutPrintf(_T("\n当前无法切换!"));
|
||
}
|
||
else
|
||
{
|
||
path0.Remove(path0.Length()-1);
|
||
if (path0.QuickOffset(dist,pathNew)==RTNORM)
|
||
{
|
||
pathNew.AppendNode(*pathNew[pathNew.Length()-1]);
|
||
path=pathNew;
|
||
|
||
//add by xlc on 090420
|
||
m_dlg->m_nBaseType=1-pJigStair->GetPathSide();
|
||
m_dlg->UpdateData(FALSE);
|
||
|
||
pJigStair->SetPathSide(1-pJigStair->GetPathSide());
|
||
}
|
||
else
|
||
acutPrintf(_T("\n当前无法切换!"));
|
||
}
|
||
}
|
||
break;
|
||
case 3: //撤消命令
|
||
if (!IsFirstStair())
|
||
Pop();
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{//用户退出
|
||
bContinue=false;
|
||
result=false;
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
int TMultiStairCreateJig::DoIt()
|
||
{
|
||
int nRet;
|
||
if (!IsFirstStair())
|
||
{
|
||
if (IsMakePlatform())
|
||
{
|
||
if (IsPlatformLast())//当前为绘制连续平台情况,可以切换为绘制梯段
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [绘制梯段(T)/路径切换到右侧(Q)/撤消上一点(U)]<切换到绘制梯段>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [绘制梯段(T)/路径切换到左侧(Q)/撤消上一点(U)]<切换到绘制梯段>:"));
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
|
||
}
|
||
}
|
||
else//当前为绘制梯段情况,可以切换为绘制连续平台
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到右侧(Q)/撤消上一点(U)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [绘制平台(T)/路径切换到左侧(Q)/撤消上一点(U)]<退出>:"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pJigStair->GetPathSide()==OFFSET_LEFT)
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到右侧(Q)]<退出>:"));
|
||
else
|
||
setDispPrompt(_T("\n输入下一点或 [路径切换到左侧(Q)]<退出>:"));
|
||
}
|
||
INITGET_BEG(-1,_T("T Q U"));
|
||
nRet=drag();
|
||
INITGET_END();
|
||
|
||
if (nRet == AcEdJig::kCancel)
|
||
return RTCAN;
|
||
else if (nRet == AcEdJig::kNull)
|
||
return RTNONE;
|
||
else if (nRet <= 0)
|
||
return RTNORM;
|
||
else {
|
||
nRetKey=nRet;
|
||
return RTKWORD;
|
||
}
|
||
}
|
||
AcEdJig::DragStatus TMultiStairCreateJig::sampler()
|
||
{//反馈
|
||
setUserInputControls((UserInputControls)
|
||
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
|
||
|AcEdJig::kNoNegativeResponseAccepted|AcEdJig::kNoZeroResponseAccepted));
|
||
|
||
setKeywordList(_T("T Q U"));
|
||
|
||
|
||
XPoint ptTemp;
|
||
|
||
DragStatus stat=acquirePoint(ptTemp,GetStartPoint());
|
||
|
||
if (stat==AcEdJig::kNormal)
|
||
{
|
||
if (ptTemp==GetCurPoint())//与实际数据点相同
|
||
return AcEdJig::kNoChange;
|
||
XVector3D vt1=ptTemp-GetStartPoint();
|
||
if (vt1.Length()<_DIST_SNAP)//与起始点距离过小
|
||
return AcEdJig::kNoChange;
|
||
if (!IsFirstStair())
|
||
{
|
||
XVector3D vt2=GetStartPoint()-(*path[path.Length()-3]);
|
||
vt1.Normalize();
|
||
vt2.Normalize();
|
||
if ((!!vt2)&&(vt1&vt2)<-0.5)//与上段的夹角不能大于150度
|
||
return AcEdJig::kNoChange;
|
||
}
|
||
|
||
SetCurPoint(ptTemp);//当前拖动点
|
||
|
||
if (!Apply())
|
||
return AcEdJig::kNoChange;
|
||
}
|
||
return stat;
|
||
}
|
||
BOOL TMultiStairCreateJig::Apply()
|
||
{
|
||
m_dlg->Dlg2Obj(pJigStair);
|
||
pJigStair->SetStairFlag(1);//中间层
|
||
pJigStair->SetHandRail(OFFSET_LEFT, FALSE);
|
||
pJigStair->SetHandRail(OFFSET_RIGHT, FALSE);
|
||
|
||
pJigStair->ResetSegType();
|
||
for(long i=1;i<type.Length();i++)
|
||
pJigStair->SetSegType(i-1,*type[i]);
|
||
|
||
XPoly2D path1(path);
|
||
if (IsMakePlatform())
|
||
{
|
||
XVector3D vt=GetCurPoint()-GetStartPoint();
|
||
vt.Normalize();
|
||
vt.Scale(pJigStair->GetStepWidth()*stepNum);
|
||
XPoint ptEnd(GetCurPoint()+vt);
|
||
path1.AppendNode(ptEnd);
|
||
}
|
||
pJigStair->SetPolySide2d(path1);
|
||
|
||
if (IsMakePlatform())
|
||
pJigStair->SetActiveStep(1);
|
||
else
|
||
pJigStair->SetActiveStep(0);
|
||
return pJigStair->IsPathValid();
|
||
}
|
||
void TMultiStairCreateJig::Apply(TDbMultiStair* pStair)
|
||
{
|
||
for(long i=1;i<type.Length();i++)
|
||
pStair->SetSegType(i-1,*type[i]);
|
||
|
||
pStair->SetPolySide2d(path);
|
||
pStair->SetPathSide(pJigStair->GetPathSide());
|
||
}
|
||
Adesk::Boolean TMultiStairCreateJig::update()
|
||
{//更新临时实体
|
||
return pJigStair->IsPathValid()?Adesk::kTrue:Adesk::kFalse;
|
||
}
|
||
AcDbEntity* TMultiStairCreateJig::entity() const
|
||
{
|
||
return pJigStair;
|
||
}
|
||
// end of the new class
|
||
//////////////////////////////////////////////////////////////////////////////////////
|
||
//多跑楼梯拖制临时实体
|
||
TJigMultiStair::TJigMultiStair()
|
||
{
|
||
setLayer(InitLayer(LAY_STAIR));
|
||
SetLayerHand3d(InitLayer(LAY_HANDRAIL));
|
||
SetLayerRail3d(InitLayer(LAY_RAIL));
|
||
}
|
||
TJigMultiStair::~TJigMultiStair()
|
||
{
|
||
}
|
||
Adesk::Boolean TJigMultiStair::subWorldDraw(AcGiWorldDraw *mode)
|
||
{//有待简化...
|
||
return TDbMultiStair::subWorldDraw(mode);
|
||
}
|
||
void TJigMultiStair::subViewportDraw(AcGiViewportDraw *mode)
|
||
{//有待完善、简化...
|
||
TDbMultiStair::subViewportDraw(mode);
|
||
//DrawOsnapShape(mode, m_ptLoc, m_osShape);
|
||
}
|
||
|
||
BOOL TJigMultiStair::IsPathValid() const
|
||
{
|
||
DList<TDbEntity> lstEnts;
|
||
Acad::ErrorStatus es=ExplodeTo(lstEnts);
|
||
return (es==Acad::eOk);
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////////////////////////////////
|
||
//创建多跑楼梯命令
|
||
// ---------------------------------------------------------------------------------------------------------------------- [10/16/2007 nsh]
|
||
//获取距离的函数
|
||
void GetDist()
|
||
{
|
||
ads_real dDist;
|
||
int i=0;
|
||
if (CMultiStairCreateDlg::m_bGetStair==TRUE)
|
||
{
|
||
i=acedGetDist(NULL, _T("\n 请输入梯段宽度<取消>:"), &dDist);
|
||
if (i == RTNORM)
|
||
{
|
||
char mm[32];
|
||
sprintf(mm,"%.2f",dDist);
|
||
CMultiStairCreateDlg::m_pWnd->UpdateData();
|
||
CMultiStairCreateDlg::m_strStairWidth =mm;
|
||
CMultiStairCreateDlg::m_pWnd->UpdateData(FALSE);
|
||
CMultiStairCreateDlg::m_pWnd->UpdateEdit(IDC_STAIR_WIDTH,true);
|
||
//CLineStairCreateDlg::pSelfCSC->UpdateData(FALSE);
|
||
CMultiStairCreateDlg::m_bGetStair=FALSE;
|
||
CMultiStairCreateDlg::m_pWnd->ShowWindow(SW_SHOW);
|
||
}
|
||
else
|
||
{
|
||
CMultiStairCreateDlg::m_bGetStair=FALSE;
|
||
CMultiStairCreateDlg::m_pWnd->ShowWindow(SW_SHOW);
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
void MultiStair()
|
||
{
|
||
/*CMultiStairDlg dlg(acedGetAcadFrame());
|
||
{
|
||
CAcModuleResourceOverride vTemp;
|
||
if (dlg.DoModal()!=IDOK)
|
||
return;
|
||
}*/
|
||
//CMultiStairCreateDlg *dlg =new CMultiStairCreateDlg(acedGetAcadFrame());
|
||
CAcModuleResourceOverride vTemp;
|
||
/*CMultiStairCreateDlg dlg(acedGetAcadFrame());
|
||
dlg.Create(IDD_MULTI_STAIR1,acedGetAcadFrame());
|
||
CMultiStairCreateDlg::m_pWnd=&dlg;*/
|
||
CMultiStairCreateDlg *dlg=new CMultiStairCreateDlg(acedGetAcadFrame());
|
||
dlg->Create(IDD_MULTI_STAIR1,acedGetAcadFrame());
|
||
|
||
//add by xlc on 090522 在屏幕菜单处点击命令后直接按ESC时命令不退出
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
CMultiStairCreateDlg::m_pWnd=dlg;
|
||
while(CMultiStairCreateDlg::m_pWnd!=NULL && CMultiStairCreateDlg::m_pWnd->GetParentFrame()!=NULL)
|
||
{
|
||
GetDist();
|
||
if (dlg->m_nMakeMode==0)
|
||
{
|
||
XPoint ptStart;
|
||
int i=ads_getpoint(NULL,_T("\n起点<退出>:"),ptStart);
|
||
if (i!=RTNORM || i==-5001)
|
||
{
|
||
if (i==RTNONE)
|
||
{
|
||
dlg ->DestroyWindow();
|
||
CMultiStairCreateDlg::m_pWnd=NULL;
|
||
break;
|
||
}
|
||
else if (i==RTCAN)
|
||
{
|
||
if (/*CMultiStairCreateDlg::m_bUpdateEdit ||*/ CMultiStairCreateDlg::m_bCheckSW || CMultiStairCreateDlg::m_bRCButton)
|
||
{
|
||
// if (CMultiStairCreateDlg::m_bUpdateEdit==TRUE)
|
||
// {
|
||
// CMultiStairCreateDlg::m_bUpdateEdit=FALSE;
|
||
// }
|
||
// else
|
||
if (CMultiStairCreateDlg::m_bCheckSW==TRUE)
|
||
{
|
||
CMultiStairCreateDlg::m_bCheckSW=FALSE;
|
||
}
|
||
else if (CMultiStairCreateDlg::m_bRCButton==TRUE)
|
||
{
|
||
CMultiStairCreateDlg::m_bRCButton =FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dlg->DestroyWindow();
|
||
CMultiStairCreateDlg::m_pWnd=NULL;
|
||
break;
|
||
}
|
||
}
|
||
//return;
|
||
}
|
||
else
|
||
{
|
||
dlg->m_bChangeMode=FALSE;
|
||
TMultiStairCreateJig stairJig;
|
||
stairJig.Init(Ucs2Wcs(ptStart),*dlg);
|
||
|
||
//add by xlc on 090505 06以下平台资源冲突
|
||
CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance());
|
||
|
||
if (stairJig.MakeIt())
|
||
{
|
||
TDbMultiStair *pStair=new TDbMultiStair;
|
||
dlg->Dlg2Obj(pStair);
|
||
pStair->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
|
||
pStair->SetLayerRail3d(InitLayer(LAY_RAIL));
|
||
|
||
//add by xlc on 090205 解决用户坐标系下文字倾斜的问题
|
||
pStair->SetLayoutRotation(Ucs2Wcs(0));
|
||
|
||
stairJig.Apply(pStair);
|
||
pStair->AddToMSpace(Adesk::kTrue);
|
||
pStair->close();
|
||
pStair=NULL;
|
||
dlg->m_bModify=TRUE;
|
||
dlg->m_bChangeMode=TRUE;
|
||
}
|
||
else
|
||
{
|
||
dlg->DestroyWindow();
|
||
CMultiStairCreateDlg::m_pWnd=NULL;
|
||
}
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
PickSet ss(SS_FREE);
|
||
RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 0, NULL);
|
||
const TCHAR *sPrompt=dlg->m_nBaseType==0?_T("\n选择楼梯左边路径:"):_T("\n选择楼梯右边路径:");
|
||
int i=SelectEntities(sPrompt, ss, mask);
|
||
if (i!=RTNORM || i==RTERROR)
|
||
{
|
||
//判断发出取消命令的原因,是程序自身发出的取消命令还是用户按下ESC/Space/Enter/Right Button of Mouse发出的取消命令。
|
||
//{-------------------
|
||
if (i==RTNONE || i==RTERROR /*|| i==RTCAN*/)
|
||
{
|
||
CMultiStairCreateDlg::m_pWnd ->DestroyWindow();
|
||
CMultiStairCreateDlg::m_pWnd=NULL;
|
||
}
|
||
else if (i==RTCAN)
|
||
{
|
||
if (/*CMultiStairCreateDlg::m_bUpdateEdit || */CMultiStairCreateDlg::m_bCheckSW|| CMultiStairCreateDlg::m_bRCButton)
|
||
{
|
||
// if (CMultiStairCreateDlg::m_bUpdateEdit==TRUE)
|
||
// {
|
||
// CMultiStairCreateDlg::m_bUpdateEdit=FALSE;
|
||
// }
|
||
// else
|
||
if (CMultiStairCreateDlg::m_bCheckSW==TRUE)
|
||
{
|
||
CMultiStairCreateDlg::m_bCheckSW=FALSE;
|
||
}
|
||
else if (CMultiStairCreateDlg::m_bRCButton==TRUE)
|
||
{
|
||
CMultiStairCreateDlg::m_bRCButton=FALSE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CMultiStairCreateDlg::m_pWnd->DestroyWindow();
|
||
CMultiStairCreateDlg::m_pWnd=NULL;
|
||
}
|
||
}
|
||
//}-------------------
|
||
}
|
||
else
|
||
{
|
||
int lCount=ss.Length();
|
||
for(long i=0L; i<lCount; i++)
|
||
{
|
||
Entity ent=ss[i];
|
||
XPoly2D poly2d(ent);
|
||
TDbMultiStair *pStair=new TDbMultiStair;
|
||
dlg->Dlg2Obj(pStair);
|
||
pStair->SetPolySide2d(poly2d);
|
||
|
||
if (pStair->IsValid()&&poly2d.Length()%2==0)
|
||
{ //wrong code, remove it!
|
||
pStair->SetLayerHand3d(InitLayer(LAY_HANDRAIL));
|
||
pStair->SetLayerRail3d(InitLayer(LAY_RAIL));
|
||
pStair->AddToMSpace(Adesk::kTrue);
|
||
}
|
||
else
|
||
{
|
||
acutPrintf(_T("路径不正确:路径要求奇数分段!"));
|
||
delete pStair;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
acedGetAcadDwgView()->SetFocus();
|
||
|
||
}
|
||
///////////////////////////////////////////////////////////////////////////////////////
|
||
//编辑多跑楼梯命令
|
||
int EditMultiStair(AcDbObjectId id)
|
||
{
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMultiStair, pStep);
|
||
if (!pStep)
|
||
return RTERROR;
|
||
// CMultiStairDlg dlg(acedGetAcadFrame());
|
||
CMultiStairCreateDlg dlg(acedGetAcadFrame());
|
||
dlg.m_bEdit=TRUE;
|
||
dlg.Obj2Dlg(pStep);
|
||
{
|
||
CAcModuleResourceOverride vTemp;
|
||
if (dlg.DoModal()!= IDOK)
|
||
return RTERROR;
|
||
}
|
||
if (pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->assertWriteEnabled();
|
||
dlg.Dlg2Obj(pStep);
|
||
pStep->downgradeOpen();
|
||
OPENOBJ_END();
|
||
return RTNORM;
|
||
} |