862 lines
21 KiB
C++
862 lines
21 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;
|
|||
|
|
}
|