Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/LinePatternDlg.cpp
T

1223 lines
28 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// GraphicDlg.cpp : implementation file
//
/*解决动态绘制时“闪”的问题分三步完成:
第一,JIG里只绘制最后一段,但poly数据不变
第二,JIG每绘制完一段后,将前面段更新到数据库
第三,JIG里的UNDO修改*/
#include "stdafx.h"
#include "actrans.h"
#include "LinePatternDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern GEOAPI int GetBlockExtents(AcDbObjectId idBlock, XPoint &ptLow, XPoint &ptUp);
// extern GEOAPI BOOL SplitLibraryPath(const TCHAR *totalName, TCHAR *slbFile, TCHAR *sldFile);
int CGraphicDlg::g_nCurSel=0;
/////////////////////////////////////////////////////////////////////////////
// CGraphicDlg dialog
CString CGraphicDlg::s_strWidth = _T("120");
int CGraphicDlg::s_iAlign = 0;
int CGraphicDlg::s_iBase=0;
BOOL CGraphicDlg::s_bUseRatio=FALSE;
double CGraphicDlg::s_fRatio=80.0;
BOOL CGraphicDlg::m_bDynamic=TRUE;
IMPLEMENT_DYNAMIC(CGraphicDlg, CModelessDialog)//add by fxj on 070508
CGraphicDlg::CGraphicDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CGraphicDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGraphicDlg)
//}}AFX_DATA_INIT
m_bRail=FALSE;
CRegProperty regProp(::GetRegLocation(), _T("Settings"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
if (!regProp.GetValue(_T("LinePattern"), m_csCurPattern))
m_csCurPattern=_T("LinePat(45度线)");
}
CGraphicDlg::~CGraphicDlg()
{
}
void CGraphicDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGraphicDlg)
DDX_Text(pDX, IDC_WIDTH, s_strWidth);
DDX_Radio(pDX, IDC_RADIO_UP, s_iAlign);
DDX_Radio(pDX, IDC_RADIO_ALIGN_MID, s_iBase);
DDX_Check(pDX, IDC_CHECK_RATIO,s_bUseRatio);
DDX_Text(pDX,IDC_RATIO,s_fRatio);
DDX_Slider(pDX,IDC_PATTERN_SLIDE,g_nCurSel);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGraphicDlg, CModelessDialog)
//{{AFX_MSG_MAP(CGraphicDlg)
ON_BN_CLICKED(IDC_GRAPHIC_WIDTH, OnGraphicWidth)
ON_BN_CLICKED(IDC_BUTTON_PATH, OnButtonPath)
ON_BN_CLICKED(IDC_BUTTON_DYNAMIC, OnButtonDynamic)
ON_WM_PAINT()
ON_WM_SETCURSOR()
ON_BN_CLICKED(IDC_PATTERN_SLIDE, OnPatternSlide)
ON_BN_CLICKED(IDC_CHECK_RATIO,OnCheckRatio)
ON_EN_KILLFOCUS(IDC_WIDTH, OnKillFocusWidth)
ON_EN_KILLFOCUS(IDC_RATIO,OnKillFocusRatio)
ON_BN_CLICKED(IDC_RADIO_UP,OnRadioUp)
ON_BN_CLICKED(IDC_RADIO_MIDDLE,OnRadioMiddle)
ON_BN_CLICKED(IDC_RADIO_DOWN,OnRadioDown)
ON_BN_CLICKED(IDC_RADIO_ALIGN_MID,OnRadioAlignMid)
ON_BN_CLICKED(IDC_RADIO_ALIGN_LEFT,OnRadioAlignLeft)
ON_BN_CLICKED(IDC_RADIO_ALIGN_RIGHT,OnRadioAlignRight)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraphicDlg message handlers
BOOL CGraphicDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
//CRect rect;
//GetWindowRect(rect);
// SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(), 0);
m_nOperCode=0;
ShowSlide(g_nCurSel);
// TODO: Add extra initialization here
GetDlgItem(IDC_RATIO)->EnableWindow(s_bUseRatio);
if (m_bDynamic)
((CButton*)GetDlgItem(IDC_BUTTON_DYNAMIC))->SetCheck(1);
else
((CButton*)GetDlgItem(IDC_BUTTON_PATH))->SetCheck(1);
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CGraphicDlg::OnClose()
{
m_bUserEsc=TRUE;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnKillFocusWidth()
{
UpdateData(TRUE);
if (GetFocus()==acedGetAcadFrame())
{
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
}
void CGraphicDlg::OnGraphicWidth()
{
// TODO: Add your control notification handler code here
m_nOperCode = 1;
m_bUserEsc=FALSE;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::SetGraphicWidth()
{
UpdateData(TRUE);
ShowWindow(SW_HIDE);
double nWidth=_tstof(s_strWidth);
if (GetDist(_T("\n图案宽度<退出>:"), nWidth, RSG_NOZERO|RSG_NONEG)!=RTNORM)
{
ShowWindow(SW_SHOW);
return;
}
s_strWidth = (const TCHAR *)Dist2Str(nWidth);
m_nOperCode=0;
UpdateData(FALSE);
ShowWindow(SW_SHOW);
if (m_pickSet!=NULL)
UpdatePickSet();
}
void CGraphicDlg::OnButtonPath()
{
((CButton*)GetDlgItem(IDC_BUTTON_DYNAMIC))->SetCheck(0);
((CButton*)GetDlgItem(IDC_BUTTON_PATH))->SetCheck(1);
m_bDynamic = FALSE;
m_bUserEsc=FALSE;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnButtonDynamic()
{
((CButton*)GetDlgItem(IDC_BUTTON_PATH))->SetCheck(0);
((CButton*)GetDlgItem(IDC_BUTTON_DYNAMIC))->SetCheck(1);
m_bDynamic=TRUE;
m_bUserEsc=FALSE;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::DoDrawing(int nCurSel)
{
if (!m_polyPath)
return;
XString sBlockName, sFile;
sFile << g_sDwbPath << m_csCurPattern;
if (LoadDwbBlock(sFile, sBlockName)!=RTNORM)
return;
AcDbObjectId idBlock=InitBlock(sBlockName);
TDbPolyPathArray *pRail=new TDbPolyPathArray;
if (s_iAlign==0)
pRail->SetEqualScale(FALSE);
else if (s_iAlign==1)
{
pRail->SetEqualScale(TRUE);
pRail->SetAutoExpand(TRUE);
}
else
{
pRail->SetEqualScale(TRUE);
pRail->SetAutoExpand(FALSE);
}
if (s_iBase==0)
pRail->SetBaseType(2);
else if (s_iBase==1)
pRail->SetBaseType(0);
else
pRail->SetBaseType(1);
if (s_bUseRatio)
pRail->SetRatio(s_fRatio/100);
else
pRail->SetRatio(1);
pRail->SetUnitId(idBlock);
pRail->SetUnitHeight(_tstof(s_strWidth));
pRail->SetPathPoly(m_polyPath,pRail->GetNormal());
m_pickSet += AddToCurrentSpace(pRail,Adesk::kTrue);
m_bRail=TRUE;
}
extern BOOL InvokeTkwMan(const TCHAR *pszLib, BOOL bSelOnly, XString &sBlockName);
void CGraphicDlg::ShowSlide(int idx)
{
XString sSlideName;
sSlideName << g_sDwbPath << (const TCHAR *)m_csCurPattern; //_T("LinePat(") << slide << _T(")");
CWnd *pWnd=GetDlgItem(IDC_PATTERN_SLIDE);
CClientDC dc(pWnd);
CRect cR;
pWnd->GetClientRect(&cR);
m_image.InitDC(&dc, cR, GetAcadBackColor());
m_image.PaintSlide(sSlideName);
m_image.SetDC(NULL);
}
void CGraphicDlg::OnPaint()
{
CModelessDialog::OnPaint();
CWnd *pWnd=GetDlgItem(IDC_PATTERN_SLIDE);
CClientDC dc(pWnd);
CRect cR;
pWnd->GetClientRect(&cR);
m_image.InitDC(&dc, cR, GetAcadBackColor());
m_image.Redraw();
m_image.SetDC(NULL);
// Do not call CAcUiDialog::OnPaint() for painting messages
}
BOOL CGraphicDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CWnd *pSlideWnd=GetDlgItem(IDC_PATTERN_SLIDE);
if (pWnd && pWnd->m_hWnd==pSlideWnd->m_hWnd)
{
CAcModuleResourceOverride vTemp;
HCURSOR hIcon = AfxGetApp()->LoadCursor( IDC_CUR_PICK );
SetCursor( hIcon );
return TRUE;
}
return CModelessDialog::OnSetCursor(pWnd, nHitTest, message);
}
void CGraphicDlg::OnCheckRatio()
{
CDataExchange dx(this,TRUE);
DDX_Check(&dx,IDC_CHECK_RATIO,s_bUseRatio);
BOOL b=GetDlgItem(IDC_RATIO)->EnableWindow(s_bUseRatio);
if (m_pickSet.Length()>=1)
{
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
}
void CGraphicDlg::OnPatternSlide()
{
XString sLibFile, sBlockName;
sBlockName << (const TCHAR *)m_csCurPattern;
sLibFile << g_sDwbPath << _T("LinePat.TKW");
if (!InvokeTkwMan(sLibFile, TRUE, sBlockName)) return;
XString sLib, sItem;
if (SplitLibraryPath(sBlockName, sLib, sItem))
{
m_csCurPattern = (const TCHAR *)sBlockName;
XString sSlideName;
sSlideName << g_sDwbPath << sBlockName;
CWnd *pWnd=GetDlgItem(IDC_PATTERN_SLIDE);
CClientDC dc(pWnd);
CRect cR;
pWnd->GetClientRect(&cR);
m_image.InitDC(&dc, cR, GetAcadBackColor());
m_image.PaintSlide(sSlideName);
m_image.SetDC(NULL);
UpdateData(FALSE);
CRegProperty regProp(::GetRegLocation(), _T("Settings"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
regProp.SetValue(_T("LinePattern"), m_csCurPattern);
}
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioUp()
{
s_iAlign = 0;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioMiddle()
{
s_iAlign=1;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioDown()
{
s_iAlign=2;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioAlignMid()
{
s_iBase=0;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioAlignLeft()
{
s_iBase=1;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnRadioAlignRight()
{
s_iBase=2;
UpdateData(FALSE);
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
void CGraphicDlg::OnKillFocusRatio()
{
UpdateData(TRUE);//add by fxj 2007-6-5
if (GetFocus()==acedGetAcadFrame())
{
m_bUserEsc=FALSE;
m_nOperCode = 2;
acedPostCommand(_T("\33"));
}
}
void CGraphicDlg::UpdatePickSet()
{
m_nOperCode = 0;
m_bUserEsc=TRUE;
TDocLock lock;
UpdateData(TRUE);
int pickLen=m_pickSet.Length();
for(long i=0;i<pickLen;i++)
{
Entity ent=m_pickSet[i];
OPENOBJ_BEGIN(ent,AcDb::kForWrite,TDbPolyPathArray,pRail)
if (pRail!=NULL)
{
g_nCurSel=m_combNameList.GetCurSel();
XString sBlockName, sFile;
sFile << g_sDwbPath <<m_csCurPattern;
if (LoadDwbBlock(sFile, sBlockName)!=RTNORM)
return;
AcDbObjectId idBlock=InitBlock(sBlockName);
if (s_iAlign==0)
pRail->SetEqualScale(FALSE);
else if (s_iAlign==1)
{
pRail->SetEqualScale(TRUE);
pRail->SetAutoExpand(TRUE);
}
else
{
pRail->SetEqualScale(TRUE);
pRail->SetAutoExpand(FALSE);
}
if (s_iBase==0)
pRail->SetBaseType(2);
else if (s_iBase==1)
pRail->SetBaseType(0);
else
pRail->SetBaseType(1);
if (s_bUseRatio)
pRail->SetRatio(s_fRatio/100);
else
pRail->SetRatio(1);
pRail->SetUnitId(idBlock);
pRail->SetUnitHeight(_tstof(s_strWidth));
pRail->SetPathPoly(m_polyPath,pRail->GetNormal());
}
OPENOBJ_END()
}
}
// [3/19/2008 nsh]
static BOOL bStart=TRUE;//用于控制消息的循环iStatus的 0→3 | 3→0
static int iStatus=0;//iStatus为控制状态字,控制线图案显示的外观,iStatus的取值有四个{0,1,2,3}
static BOOL bFirst=TRUE;//表示第一种状态的初始化态,即iStatus=0,没有发生翻转的情况下
static BOOL bChange=FALSE;//判断Jig是否有触发【F(翻转)】的热键
//------------------------------
class TGraphicEdJig : public TSymbEdJig
{
public:
enum TGraphicOper {kNone=0, kLinePoint=1, kArcPoint=2, kArcMidPoint=3, kArcRadius=4};
TDbPolyPathArray *m_pRail,m_railLast;//m_railLast为 *m_pRail的最后一段
protected:
TGraphicOper m_nOperCode;
CGraphicDlg *m_pGraphicDlg;
BOOL m_bFirst;
BOOL m_bBlockNull;//add by fxj 070606
public:
TGraphicEdJig(TDbPolyPathArray*,CGraphicDlg*);
virtual int DoIt(int *pKeyIndex=NULL);
virtual DragStatus GetPoint(XPoint &pt);
protected:
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
public:
void SetOperCode(TGraphicEdJig::TGraphicOper opCode) {m_nOperCode=opCode;}
TGraphicOper GetOperCode() {return m_nOperCode;}
};
TGraphicEdJig::TGraphicEdJig(TDbPolyPathArray *pElev,CGraphicDlg *pDlg)
{
m_pRail=pElev;
m_pGraphicDlg=pDlg;
m_bFirst = TRUE;
m_bBlockNull = FALSE;
}
AcEdJig::DragStatus
TGraphicEdJig::GetPoint(XPoint &pt)
{
DragStatus stat;
XPoly2D polyPath;
AcGeVector3d normal;
m_pRail->GetPathPoly(polyPath,normal);
int nLen=polyPath.Length();
if (nLen>0)
{
if (m_bFirst)
{
XPoint ptBase = *polyPath[nLen-1];
stat=acquirePoint(pt, ptBase);
return stat;
}
else
{
XPoint ptBase = *polyPath[nLen-2];
stat=acquirePoint(pt, ptBase);
return stat;
}
}
else
{
stat=acquirePoint(pt);
return stat;
}
}
// 开始执行拖动
int TGraphicEdJig::DoIt(int *keyIndex)
{
m_bFirst = TRUE;
XPoly2D poly2d;
AcGeVector3d normal;
m_pRail->GetPathPoly(poly2d,normal);
if (m_nOperCode==kLinePoint || m_nOperCode==kArcPoint)
{
m_ptResult=*poly2d.Tail();
}
else if (m_nOperCode==kArcMidPoint)
{ // MidPoint
XCurveSegment cv;
int nSeg=poly2d.TotalSegments();
int nRet=poly2d.Nth(nSeg-1,cv);
m_ptResult=cv.MidPoint();
}
int nRet = TSymbEdJig::DoIt(keyIndex);
if (m_bBlockNull == TRUE)//add by fxj 070606
{
adsout << _T("\n请选择图案样式:");
}
return nRet;
}
// 更新实体数据
Adesk::Boolean TGraphicEdJig::update()
{
m_pGraphicDlg->UpdateData(TRUE);
Adesk::Boolean bRet=Adesk::kTrue;
//以下是对原有的插入模型控件的图案进行实时修改的操作-----------m_pRail对象操作开始------------------------
XPoly2D poly2d;
AcGeVector3d normal;
m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (m_nOperCode==kLinePoint || m_nOperCode==kArcPoint)
{
if (m_bFirst)
{
m_bFirst = FALSE;
poly2d.AppendNode(m_ptResult);
}
else
*poly2d.Tail()=m_ptResult;
}
else if (m_nOperCode==kArcMidPoint)
{
XDirectionCurve cv;
int nSeg=poly2d.TotalSegments();
poly2d.Nth(nSeg-1,cv);
XCurveSegment seg;
seg = XArc(cv.StartPoint(), m_ptResult, cv.EndPoint());
if (!!seg)
{
if (seg.StartPoint().Distance(cv.StartPoint())>_DIST_SNAP)
{
// 2010-3-15 17:26 wubo
// 移植Geo
seg.SetBulge(-seg.GetBulge());
}
poly2d.SetBulge(nLen-2, seg.GetBulge());
}
}
else if (m_nOperCode==kArcRadius)
{
XPoint ptBase, ptPrev;
ptBase=*poly2d[nLen-1];
ptPrev=*poly2d[nLen-2];
double nChordLen=ptBase.Distance2d(ptPrev);
double nRadius=ptBase.Distance2d(m_ptResult);
if (nChordLen<2.0*nRadius+1.0E-6)
{
double bulge=2.0*asin(nChordLen/2.0/nRadius);
if (XLine(ptBase, ptPrev).OnWhichSide(m_ptResult)==OFFSET_LEFT)
bulge = -bulge;
poly2d.SetBulge(nLen-1, bulge);
}
}
XString sBlockName, sFile;
sFile << g_sDwbPath << m_pGraphicDlg->m_csCurPattern;
//add by fxj 070606
if (LoadDwbBlock(sFile, sBlockName)!=RTNORM)
{
bRet=Adesk::kFalse;
m_bFirst=TRUE;
m_bBlockNull=TRUE;
return bRet;
}
m_bBlockNull=FALSE;
m_pRail->SetUnitId(InitBlock(sBlockName));
m_pRail->SetPathPoly(poly2d,normal);
if (m_pGraphicDlg->s_iBase==0)
m_pRail->SetBaseType(2);
else if (m_pGraphicDlg->s_iBase==1)
m_pRail->SetBaseType(0);
else
m_pRail->SetBaseType(1);//0,左,1,右,2,中
if (m_pGraphicDlg->s_iAlign==0)
m_pRail->SetEqualScale(FALSE);
else if (m_pGraphicDlg->s_iAlign==1)
{
m_pRail->SetEqualScale(TRUE);
m_pRail->SetAutoExpand(TRUE);
}
else
{
m_pRail->SetEqualScale(TRUE);
m_pRail->SetAutoExpand(FALSE);
}
m_pRail->SetUnitHeight(_tstof(m_pGraphicDlg->s_strWidth));
if (m_pGraphicDlg->s_bUseRatio)
m_pRail->SetRatio((m_pGraphicDlg->s_fRatio)/100);
else
m_pRail->SetRatio(1);
//-------------------------------------------------m_pRail对象操作结束--------------------------------
//以下的代码为Jig拖动时的效果----------------------m_railLast对象的开始-------------------------------
XPoly2D poly;
XCurveSegment cv;
poly2d.Nth(poly2d.TotalSegments()-1,cv);
cv.AsPoly2D(poly);
m_railLast.SetUnitId(InitBlock(sBlockName));
if (m_pGraphicDlg->s_iBase==0)
m_railLast.SetBaseType(2);
else if (m_pGraphicDlg->s_iBase==1)
m_railLast.SetBaseType(0);
else
m_railLast.SetBaseType(1);//0,左,1,右,2,中
if (m_pGraphicDlg->s_iAlign==0)
m_railLast.SetEqualScale(FALSE);
else if (m_pGraphicDlg->s_iAlign==1)
{
m_railLast.SetEqualScale(TRUE);
m_railLast.SetAutoExpand(TRUE);
}
else
{
m_railLast.SetEqualScale(TRUE);
m_railLast.SetAutoExpand(FALSE);
}
m_railLast.SetUnitHeight(_tstof(m_pGraphicDlg->s_strWidth));
if (m_pGraphicDlg->s_bUseRatio)
m_railLast.SetRatio((m_pGraphicDlg->s_fRatio)/100);
else
m_railLast.SetRatio(1);
// [3/18/2008 nsh]
//-------------begin-------------
if (bChange)
{
switch(iStatus)
{
case 0:
{
if (!bFirst)
{
poly.Reverse();
m_railLast.Reverse();
}
}
break;
case 1:
case 2:
case 3:
{
m_railLast.Reverse();
}
break;
default:
break;
}
bChange=FALSE;
}
if (iStatus==2 || iStatus==3)
poly.Reverse();
m_railLast.SetPathPoly(poly,AcGeVector3d(0,0,1));
//-----------end-----------------
//-----------------------------------------m_railLast对象操作结束---------------------------
return bRet;
}
AcDbEntity* TGraphicEdJig::entity() const
{
return (AcDbEntity*)&m_railLast;//以JIG只显示最后一段
}
void myGraphic()
{
CAcModuleResourceOverride vTemp;
CGraphicDlg dlg;
if (!dlg.Create(dlg.IDD, NULL))
return;
dlg.ShowWindow(SW_SHOW);
acedGetAcadFrame()->SetFocus();
// [3/19/2008 nsh]
//回到初始化态
bStart=TRUE;
bChange=FALSE;
//------------------
while(1)
{ //第一个循环
Nstat: dlg.m_bUserEsc=TRUE;
if (dlg.m_bDynamic)
{
int nRet;
XPoint ptStart;
XPoly2D poly2d;
AcGeVector3d normal(0,0,1);
dlg.m_pickSet.Free();
nRet = ads_getpoint(NULL, _T("\n起点<退出>: "), ptStart);
if (nRet==RTCAN)
{
if (!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
dlg.SetGraphicWidth();
continue;
}
else
break;
}
else if (nRet == RTNORM)
{
ptStart = Ucs2Wcs(ptStart);
poly2d.InsertNodeAt(0, ptStart);
}
else
break;
TDbPolyPathArray ent;
ent.SetPathPoly(poly2d,ent.GetNormal());
dlg.m_polyPath.InsertNodeAt(0,ptStart);
TGraphicEdJig jig(&ent,&dlg);
//add by xlc on 090505 06以下平台资源冲突
CAcModuleResourceOverride resOverride(acedGetAcadResourceInstance());
jig.SetKeyword(_T("A U F"));
jig.SetOperCode(TGraphicEdJig::kLinePoint);
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)/翻转(F)]<结束>:"));
while(1)
{//第二个循环 Jig的拖动循环
int nKeyIndex;
BOOL bBreak=FALSE;
int nRet = jig.DoIt(&nKeyIndex);
if (nRet == RTNORM)
{//nRet==RTNORM开始
ent.GetPathPoly(poly2d,normal);
if (jig.GetOperCode()==TGraphicEdJig::kArcPoint) //弧段begin
{
TGraphicEdJig jig1(&ent,&dlg);
jig1.SetOperCode(TGraphicEdJig::kArcMidPoint);
jig1.SetPrompt(_T("\n点取弧上一点或 [输入半径(R)]:"));
jig1.SetKeyword(_T("R"));
while(1)
{//第三个循环
int nRetCode1=jig1.DoIt();
if (nRetCode1 == RTNORM)
{
ent.GetPathPoly(poly2d,normal);
break;
}
else if (nRetCode1==RTKWORD)
{
TGraphicEdJig jig2(&ent,&dlg);
jig2.SetOperCode(TGraphicEdJig::kArcRadius);
jig2.SetPrompt(_T("\n输入半径(光标位置确定弧的方向):"));
while(1)
{
int nRetCode2 = jig2.DoIt();
if (nRetCode2 == RTNORM)
{
ent.GetPathPoly(poly2d,normal);
bBreak=TRUE;
break;
}
else if (nRetCode2==RTCAN)
{
if (!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
{
dlg.SetGraphicWidth();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else if (dlg.m_nOperCode==2)
{
if (dlg.m_pickSet.Length()>=1)
dlg.UpdatePickSet();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else
goto Nstat;
}
else
{
if (::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
return;
}
}
else
{
if (::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
return;
}
}
}
else
{
if (!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
{
dlg.SetGraphicWidth();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else if (dlg.m_nOperCode==2)
{
if (dlg.m_pickSet.Length()>=1)
dlg.UpdatePickSet();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else
goto Nstat;
}
else
{
if (::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
return;
}
}
if (bBreak==TRUE)
break;
}//第三个循环结束
}//弧段end
jig.m_pRail->GetPathPoly(poly2d,normal);
dlg.m_polyPath=poly2d;
if (poly2d.Length()<=2)
{
dlg.m_pickSet.Free();
dlg.m_pickSet+=AddToCurrentSpace((TDbEntity *)ent.clone(),Adesk::kTrue);
// [12/11/2007 nsh]
//---------------begin------------
Entity ent1=dlg.m_pickSet[0L];
OPENOBJ_BEGIN(ent1,AcDb::kForWrite,TDbPolyPathArray,pRail)
XPoly2D poly;
AcGeVector3d vt(0,0,1);
pRail->GetPathPoly(poly,vt);
switch(iStatus)
{
case 0:
{
if (bFirst)
{
bFirst=FALSE;
}
else
{
poly.Reverse();
pRail->Reverse();
}
}
break;
case 1:
{
pRail->Reverse();
}
break;
case 2:
{
poly.Reverse();
}
break;
case 3:
{
pRail->Reverse();
poly.Reverse();
}
break;
default:
break;
}
pRail->SetPathPoly(poly,vt);
OPENOBJ_END()
bStart =FALSE;
//-------------end---------------
int pickLen=dlg.m_pickSet.Length();
}
else//实体修改
{
if (dlg.m_pickSet.Length()>=1)
{
int setLen=dlg.m_pickSet.Length();
Entity ent1=dlg.m_pickSet[0L];
OPENOBJ_BEGIN(ent1,AcDb::kForWrite,TDbPolyPathArray,pRail)
if (pRail!=NULL)
{
XPoly2D polypre(poly2d);
// [12/6/2007 nsh]
AcGeVector3d vt(0,0,1);
if (iStatus ==2 || iStatus ==3)
{
polypre.Reverse();
}
pRail->SetPathPoly(polypre,AcGeVector3d(0,0,1));
//-----------------------------
}
OPENOBJ_END()
}
}
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)/翻转(F)]<结束>: "));
jig.SetOperCode(TGraphicEdJig::kLinePoint);
jig.SetKeyword(_T("A U F"));
}//end RTNORM
else if (nRet == RTKWORD)
{
if (jig.GetOperCode()==TGraphicEdJig::kLinePoint)
{
// [11/27/2007 nsh]
//-----------------begin--------------
if (nKeyIndex ==2)
{
bChange=TRUE;//让Jig中拖动效果只改变一次
if (bStart)
{
if (iStatus >=3)
{
iStatus =0;
}
else
iStatus +=1;
}
else
{
if (iStatus >=3)
{
iStatus=0;
}
else
iStatus+=1;
Entity ent1=dlg.m_pickSet[0L];
OPENOBJ_BEGIN(ent1,AcDb::kForWrite,TDbPolyPathArray,pRail)
XPoly2D poly;
AcGeVector3d vt(0,0,1);
pRail->GetPathPoly(poly,vt);
switch(iStatus)
{
case 0:
{
if (bFirst)
{
bFirst=FALSE;
}
else
{
poly.Reverse();
pRail->Reverse();
}
}
break;
case 1:
{
pRail->Reverse();
}
break;
case 2:
{
pRail->Reverse();
poly.Reverse();
}
break;
case 3:
{
poly.Reverse();
pRail->Reverse();
poly.Reverse();
}
break;
default:
break;
}
pRail->SetPathPoly(poly,vt);
OPENOBJ_END()
}
}
//-------------------end------------
if (nKeyIndex==0)
{
jig.SetOperCode(TGraphicEdJig::kArcPoint);
jig.SetPrompt(_T("\n弧段下一点或 [直段(L)/回退(U)]<结束>: "));
jig.SetKeyword(_T("L U"));
}
else if (nKeyIndex==1) //回退
{
int nLen = poly2d.Length();
if (nLen<=2)// [3/20/2008 nsh]//使第一种状态回到初始化态
bFirst=TRUE;
if (nLen>1)
{
XPoly2D polyPre(poly2d);
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-2);
Entity ent1=dlg.m_pickSet[0L];
OPENOBJ_BEGIN(ent1,AcDb::kForWrite,TDbPolyPathArray,pRail)
if (pRail!=NULL)
{
polyPre.RemoveNode(polyPre.Length()-1);
pRail->SetPathPoly(polyPre,AcGeVector3d(0,0,1));
}
OPENOBJ_END()
}
}
}
else if (jig.GetOperCode()==TGraphicEdJig::kArcPoint)
{
if (nKeyIndex==0)
{
jig.SetOperCode(TGraphicEdJig::kLinePoint);
jig.SetPrompt(_T("\n直段下一点或 [弧段(A)/回退(U)]<结束>: "));
jig.SetKeyword(_T("A U F"));
}
else if (nKeyIndex==1)
{
int nLen = poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
}
}
}
ent.SetPathPoly(poly2d,normal);
}
else if (nRet == RTNONE)
{
// [12/11/2007 nsh]
//回到初始化
iStatus=0;
bFirst=TRUE;
bStart =TRUE;
//---------------
ent.SetPathPoly(poly2d,normal);
break;
}
else
{
if (!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
{
dlg.SetGraphicWidth();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else if (dlg.m_nOperCode==2)
{
if (dlg.m_pickSet.Length()>=1)
dlg.UpdatePickSet();
jig.m_pRail->GetPathPoly(poly2d,normal);
int nLen=poly2d.Length();
if (nLen>1)
{
poly2d.Remove(nLen-1);
poly2d.RemoveBugle(nLen-1);
jig.m_pRail->SetPathPoly(poly2d,normal);
}
continue;
}
else
{
bChange=TRUE;
bFirst=TRUE;// [3/20/2008 nsh]//使第一种状态回到初始化
goto Nstat;
}
}
else
{
// [12/11/2007 nsh]
//回到初始化
iStatus=0;
bFirst=TRUE;
bStart =TRUE;
//---------------
if (::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
return;
}
}
}//第二个循环结束
// AddToCurrentSpace((TDbEntity *)ent.clone(),Adesk::kTrue);
}
else//选择路径
{
RBList rbMask(RTDXF0, _T("LINE,ARC,POLYLINE,LWPOLYLINE,CIRCLE"), NULL);
Entity ent;
int nRet=SelectEntity(_T("\n请选择作为路径的曲线(线/圆/弧/多段线)<退出>:"),ent,rbMask);
if (nRet==RTCAN&&!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
dlg.SetGraphicWidth();
continue;
}
else if (nRet!=RTNORM)
break;
dlg.m_bRail=FALSE;
dlg.UpdateData(TRUE);
XPoly2D basePoly(ent);
if (!basePoly)
{
XCurveSegment segTemp(ent);
if (!segTemp)
return;
segTemp.AsPoly2D(basePoly);
}
dlg.m_polyPath=basePoly;
dlg.g_nCurSel=dlg.m_combNameList.GetCurSel();
PickSet ssRail(SS_FREE);
ssRail.IncludeBegin();
if (!dlg.m_bRail)
{
dlg.DoDrawing(dlg.g_nCurSel);
}
ssRail.IncludeEnd();
dlg.m_pickSet=ssRail;
Entity ent1=ssRail[0L]; //yes or no
adsout << _T("\n确定[Y]或 取消[N]:<Y>");
while(1)//选择路径后的确定
{
TCHAR sInput[256]=_T("");
INITGET_BEG(RSG_NONEG, _T("Y N"));
int nRet=acedGetKword(_T("\n是否确定?[是(Y)/否(N)]<Y>:"),sInput);
INITGET_END()
if (nRet==RTNORM)
{
if (sInput[0]==_T('Y'))
break;
else if (sInput[0]==_T('N'))
{
ent1.Erase();
break;
}
else
{
if (!dlg.m_bUserEsc)
{
if (dlg.m_nOperCode==1)
dlg.SetGraphicWidth();
else if (dlg.m_nOperCode==2)
dlg.UpdatePickSet();
else
break;
}
else
break;
}
}
else
break;
}
}
}//第一个循环结束
if (::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
}