423 lines
11 KiB
C++
423 lines
11 KiB
C++
// RailDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "RailDlg.h"
|
|
#include "actrans.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRailDlg dialog
|
|
|
|
|
|
BOOL CRailDlg::m_iViewType=1;
|
|
CRailDlg::CRailDlg(CWnd* pParent)
|
|
:GlwCAcUiDialog(CRailDlg::IDD, pParent)// , m_ssUnit(SS_FREE)
|
|
{
|
|
//{{AFX_DATA_INIT(CRailDlg)
|
|
m_csUnitWidth = _T("");
|
|
m_csInitDist = _T("");
|
|
m_nAlignment = 0;
|
|
m_bAutoExpand = FALSE;
|
|
m_csPtX = _T("");
|
|
m_csPtY = _T("");
|
|
m_csMoveDist = _T("0.0");
|
|
m_bDelPoly = FALSE;
|
|
//}}AFX_DATA_INIT
|
|
m_hIcon1=NULL;
|
|
m_hIcon2=NULL;
|
|
}
|
|
|
|
|
|
void CRailDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CRailDlg)
|
|
DDX_Control(pDX, IDC_BUTTON_PICKCELL, m_ctrlPickCell);
|
|
DDX_Control(pDX, IDC_BUTTON_PICK, m_ctrlPick);
|
|
DDX_Text(pDX, IDC_EDIT_CELLWIDTH, m_csUnitWidth);
|
|
DDX_Text(pDX, IDC_EDIT_INITDIST, m_csInitDist);
|
|
DDX_Radio(pDX, IDC_RADIO_ALIGN_MID, m_nAlignment);
|
|
DDX_Check(pDX, IDC_CHECK_AUTOEXPAND, m_bAutoExpand);
|
|
DDX_Text(pDX, IDC_EDIT_PTX, m_csPtX);
|
|
DDX_Text(pDX, IDC_EDIT_PTY, m_csPtY);
|
|
DDX_Text(pDX, IDC_EDIT_MOVE, m_csMoveDist);
|
|
DDX_Check(pDX, IDC_CHECK_DELPOLY, m_bDelPoly);
|
|
DDX_Radio(pDX, IDC_VIEW2D, m_iViewType);
|
|
//}}AFX_DATA_MAP
|
|
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CRailDlg, GlwCAcUiDialog)
|
|
//{{AFX_MSG_MAP(CRailDlg)
|
|
ON_BN_CLICKED(IDC_BUTTON_PICK, OnButtonPick)
|
|
ON_BN_CLICKED(IDC_BUTTON_CELLWIDTH, OnButtonCellwidth)
|
|
ON_BN_CLICKED(IDC_BUTTON_INITDIST, OnButtonInitdist)
|
|
ON_BN_CLICKED(IDC_BUTTON_PREVIEW, OnButtonPreview)
|
|
ON_BN_CLICKED(IDC_BUTTON_PICKCELL, OnButtonPickcell)
|
|
ON_WM_DESTROY()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CRailDlg message handlers
|
|
|
|
BOOL CRailDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
CAcModuleResourceOverride vTemp;
|
|
|
|
m_hIcon1 = AfxGetApp()->LoadIcon(IDI_ICON_PICKBASE);
|
|
if (!m_hIcon1)
|
|
MessageBox(_T("无法找到指定ICON文件。"));
|
|
else
|
|
m_ctrlPick.SetIcon(m_hIcon1);
|
|
m_hIcon2 = AfxGetApp()->LoadIcon(IDI_ICON_PICK);
|
|
if (!m_hIcon2)
|
|
MessageBox(_T("无法找到指定ICON文件。"));
|
|
else
|
|
m_ctrlPickCell.SetIcon(m_hIcon2);
|
|
|
|
m_wndToolTip.Create(this);
|
|
m_wndToolTip.Activate(true);
|
|
CWnd *pWndChild = GetDlgItem(IDC_BUTTON_PICKCELL);
|
|
CString strToolTip = _T("选择作为排列单元的对象");
|
|
m_wndToolTip.AddTool(pWndChild, strToolTip);
|
|
|
|
UpdateData(FALSE);
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void CRailDlg::HideDialog(BOOL Flag)
|
|
{
|
|
if (Flag) {
|
|
GetParent()->EnableWindow(TRUE);
|
|
GetParent()->SetFocus();
|
|
GetParent()->SetActiveWindow();
|
|
ShowWindow(SW_HIDE);
|
|
}
|
|
else {
|
|
GetParent()->EnableWindow(FALSE);
|
|
EnableWindow(TRUE);
|
|
SetActiveWindow();
|
|
ShowWindow(SW_SHOW);
|
|
}
|
|
}
|
|
|
|
void CRailDlg::OnButtonPick()
|
|
{
|
|
UpdateData(TRUE);
|
|
HideDialog(TRUE);
|
|
|
|
int ret = 0;
|
|
m_ptPrevious = m_ptBase;
|
|
ret = XGetPoint(Wcs2Ucs(m_ptCen), _T("\n单元基点"), m_ptBase);
|
|
if (ret != RTNORM)
|
|
m_ptBase = m_ptCen;
|
|
else
|
|
m_ptBase=Ucs2Wcs(m_ptBase);
|
|
|
|
m_ptBase.z= m_ptCen.z + _tstof(m_csMoveDist); //ptBase 不能通过.xy, z=0设置
|
|
m_csPtX = Dist2Str(m_ptBase.x - m_ptCen.x);
|
|
m_csPtY = Dist2Str(m_ptBase.y - m_ptCen.y);
|
|
|
|
ChangeBase() ;
|
|
HideDialog(FALSE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CRailDlg::OnOK()
|
|
{
|
|
UpdateData(TRUE);
|
|
m_ptPrevious = m_ptBase;
|
|
m_ptBase.z= m_ptCen.z + _tstof(m_csMoveDist); //ptBase 不能通过.xy, z=0设置
|
|
m_ptBase.x= m_ptCen.x + _tstof(m_csPtX);
|
|
m_ptBase.y= m_ptCen.y + _tstof(m_csPtY);
|
|
ChangeBase();
|
|
|
|
if (!m_idRail)
|
|
DoDrawRail();
|
|
else
|
|
DoChangeRail();
|
|
|
|
if (m_bDelPoly && !m_idBind)
|
|
m_ent.Delete();
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
void CRailDlg::OnButtonCellwidth()
|
|
{
|
|
UpdateData(TRUE);
|
|
HideDialog(TRUE);
|
|
double nx=_tstof(m_csUnitWidth);
|
|
int ret = 0;
|
|
if (GetDist(_T("\n单元间距"), nx, RSG_NONEG|RSG_NOZERO)==RTNORM)
|
|
m_csUnitWidth = (const TCHAR*)Dist2Str(nx);
|
|
HideDialog(FALSE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CRailDlg::OnButtonInitdist()
|
|
{
|
|
UpdateData(TRUE);
|
|
HideDialog(TRUE);
|
|
double nx=_tstof(m_csInitDist);
|
|
if (GetDist(_T("\n单元间距"), nx, RSG_NONEG|RSG_NOZERO)==RTNORM)
|
|
m_csInitDist = (const TCHAR*)Dist2Str(nx);
|
|
HideDialog(FALSE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CRailDlg::OnButtonPreview()
|
|
{
|
|
UpdateData(TRUE);
|
|
HideDialog(TRUE);
|
|
|
|
m_ptPrevious = m_ptBase;
|
|
m_ptBase.z= m_ptCen.z + _tstof(m_csMoveDist); //ptBase 不能通过.xy, z=0设置
|
|
m_ptBase.x= m_ptCen.x + _tstof(m_csPtX);
|
|
m_ptBase.y= m_ptCen.y + _tstof(m_csPtY);
|
|
ChangeBase();
|
|
|
|
XString sKeyword;
|
|
if (!m_idRail)
|
|
DoDrawRail();
|
|
else
|
|
DoChangeRail();
|
|
ads_getstring(0, _T("\n按右键或回车返回对话框。"),sKeyword);
|
|
|
|
HideDialog(FALSE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CRailDlg::DoChangeRail()
|
|
{
|
|
if (!m_idRail)
|
|
return;
|
|
UpdateData(TRUE);
|
|
|
|
double nDistMove= _tstof(m_csMoveDist);
|
|
OPENOBJ_BEGIN(m_idRail, AcDb::kForWrite, TDbRail, pRail);
|
|
if (!pRail)
|
|
return;
|
|
pRail->SetUnitId(m_idUnit);
|
|
pRail->SetInitDist(_tstof(m_csInitDist));
|
|
pRail->SetUnitWidth(_tstof(m_csUnitWidth));
|
|
pRail->SetLeftAlign(m_nAlignment);
|
|
pRail->SetAutoExpand(m_bAutoExpand);
|
|
pRail->SetHas2D(m_iViewType==0 || m_iViewType==2);
|
|
pRail->SetHas3D(m_iViewType==1 || m_iViewType==2);
|
|
OPENOBJ_END();
|
|
|
|
actrTransactionManager->flushGraphics(); //acad 刷新
|
|
acedUpdateDisplay();
|
|
|
|
}
|
|
|
|
|
|
void CRailDlg::GetUnitID(PickSet& ssUnit)
|
|
{
|
|
BOOL bRestore=FALSE;
|
|
AcDbObjectId idUnit;
|
|
Entity entUnit;
|
|
if (ssUnit.Length()==1) {
|
|
Entity ent=ssUnit[0L];
|
|
entUnit=ent;
|
|
if (ent.Is(_T("INSERT"))) {
|
|
ssUnit.Free();
|
|
ssUnit.IncludeBegin();
|
|
// Zyu modify on 100721,支持64位
|
|
//ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (long *)ent, RTNONE);
|
|
ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent, RTNONE);
|
|
ssUnit.IncludeEnd();
|
|
bRestore=TRUE;
|
|
} else if (ent.Is(_T("TCH_BLOCK_INSERT"))) {
|
|
PickSet ssTemp(SS_FREE);
|
|
ssTemp.IncludeBegin();
|
|
// Zyu modify on 100721,支持64位
|
|
//ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (long *)ent, RTNONE);
|
|
ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent, RTNONE);
|
|
ssTemp.IncludeEnd();
|
|
ASSERT(ssTemp.Length()==1);
|
|
Entity ent1=ssTemp[0L];
|
|
ssUnit.Free();
|
|
ssUnit.IncludeBegin();
|
|
// Zyu modify on 100721,支持64位
|
|
//ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (long *)ent1, RTNONE);
|
|
ads_command(RTSTR, _T(".EXPLODE"), RTENAME, (TLong_ptr *)ent1, RTNONE);
|
|
ssUnit.IncludeEnd();
|
|
if (ssUnit.Length()<1) {
|
|
ent.Delete(); //Restore
|
|
return;
|
|
}
|
|
bRestore=TRUE;
|
|
}
|
|
}
|
|
m_idUnit=MakeBlock(_T("*U"), ssUnit, m_ptBase);
|
|
if (bRestore) {
|
|
ssUnit.Erase();
|
|
entUnit.Delete();
|
|
}
|
|
//return idUnit;
|
|
}
|
|
|
|
void CRailDlg::DoDrawRail()
|
|
{
|
|
UpdateData(TRUE);
|
|
if (!m_idUnit) return;
|
|
ASSERT(!m_idRail);
|
|
TDbRail *pRail=new TDbRail;
|
|
pRail->SetUnitId(m_idUnit);
|
|
pRail->SetInitDist(_tstof(m_csInitDist));
|
|
pRail->SetUnitWidth(_tstof(m_csUnitWidth));
|
|
pRail->SetLeftAlign(m_nAlignment);
|
|
pRail->SetAutoExpand(m_bAutoExpand);
|
|
pRail->SetHas2D(m_iViewType==0 || m_iViewType==2);
|
|
pRail->SetHas3D(m_iViewType==1 || m_iViewType==2);
|
|
if (!m_idBind) {
|
|
XPoly2D basePoly(m_ent);
|
|
if (!basePoly) {
|
|
XCurveSegment segTemp(m_ent);
|
|
if (!segTemp) {
|
|
delete pRail;
|
|
pRail = NULL;
|
|
return;
|
|
}
|
|
segTemp.AsPoly2D(basePoly);
|
|
}
|
|
ASSERT(!!basePoly);
|
|
|
|
pRail->SetPathPoly(basePoly,pRail->GetNormal().AsAcGeVector3d());
|
|
m_idRail = pRail->AddToMSpace(Adesk::kTrue);
|
|
} else {
|
|
m_idRail = pRail->AddToMSpace(Adesk::kFalse);
|
|
if (pRail->SetBindObject(m_idBind)!=Acad::eOk)
|
|
pRail->erase(Adesk::kTrue);
|
|
pRail->close();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CRailDlg::OnCancel()
|
|
{
|
|
if (m_idRail) {
|
|
OPENOBJ_BEGIN(m_idRail, AcDb::kForWrite, TDbRail, pRail);
|
|
if (pRail)
|
|
pRail->erase(Adesk::kTrue);
|
|
OPENOBJ_END();
|
|
}
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CRailDlg::SelectPickcell()
|
|
{
|
|
PickSet ssUnit(SS_FREE);
|
|
RBList mask(RTDXF0, _T("TCH_*,3DFACE,LWPOLYLINE,POLYLINE,3DSOLID,REGION,LINE,ARC,CIRCLE,INSERT"), NULL);
|
|
const TCHAR *szPrompts[2]={ _T("选择作为排列单元的对象:"), _T("移除已选择的对象:") };
|
|
if (ssUnit.Get(_T(":$"), szPrompts, NULL, mask)!=RTNORM) {
|
|
return;
|
|
}
|
|
double nx, ny, nz;
|
|
ssUnit.GetExtend(m_ptCen, &nx, &ny, &nz);
|
|
m_csUnitWidth = (const TCHAR *)Dist2Str(nx);
|
|
m_csPtX = _T("0");
|
|
m_csPtY = _T("0");
|
|
m_csMoveDist=_T("0");
|
|
m_ptCen.z -= nz/2;
|
|
m_ptBase=m_ptCen; //ptBase 不能通过.xy, z=0设置
|
|
m_ptPrevious = m_ptBase;
|
|
GetUnitID(ssUnit);
|
|
if (m_idRail) {
|
|
OPENOBJ_BEGIN(m_idRail, AcDb::kForWrite, TDbRail, pRail);
|
|
if (!pRail){
|
|
return;
|
|
}
|
|
pRail->SetUnitId(m_idUnit);
|
|
OPENOBJ_END();
|
|
actrTransactionManager->flushGraphics(); //acad 刷新
|
|
acedUpdateDisplay();
|
|
}
|
|
}
|
|
|
|
void CRailDlg::ChangeBase()
|
|
{
|
|
|
|
double nx,ny,nz;
|
|
nx = m_ptBase.x - m_ptPrevious.x;
|
|
ny = m_ptBase.y - m_ptPrevious.y;
|
|
nz = m_ptBase.z - m_ptPrevious.z;
|
|
|
|
OPENOBJ_BEGIN(m_idUnit, AcDb::kForWrite, AcDbBlockTableRecord, pBlock);
|
|
if (pBlock) {
|
|
AcGeMatrix3d mat;
|
|
mat.setToTranslation(AcGeVector3d(-nx, -ny, -nz));
|
|
AcDbBlockTableRecordIterator *pIter=NULL;
|
|
VERIFY(pBlock->newIterator(pIter)==Acad::eOk);
|
|
for(pIter->start(); !pIter->done(); pIter->step()) {
|
|
AcDbEntity *pEnt=NULL;
|
|
VERIFY(pIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk);
|
|
ASSERT(pEnt);
|
|
pEnt->transformBy(mat);
|
|
pEnt->close();
|
|
}
|
|
delete pIter;
|
|
|
|
}
|
|
OPENOBJ_END();
|
|
|
|
}
|
|
|
|
void CRailDlg::OnButtonPickcell()
|
|
{
|
|
UpdateData(TRUE);
|
|
HideDialog(TRUE);
|
|
SelectPickcell();
|
|
HideDialog(FALSE);
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
|
|
BOOL CRailDlg::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
if (pMsg->message >= WM_MOUSEFIRST &&
|
|
pMsg->message <= WM_MOUSELAST)
|
|
{
|
|
MSG msg;
|
|
::CopyMemory(&msg, pMsg, sizeof(MSG));
|
|
HWND hWndParent = ::GetParent(msg.hwnd);
|
|
//while (hWndParent && hWndParent != m_hWnd)
|
|
//{
|
|
// msg.hwnd = hWndParent;
|
|
// hWndParent = ::GetParent(hWndParent);
|
|
//}
|
|
if (msg.hwnd)
|
|
{
|
|
m_wndToolTip.RelayEvent(&msg);
|
|
}
|
|
}
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CRailDlg::OnDestroy()
|
|
{
|
|
CDialog::OnDestroy();
|
|
m_wndToolTip.DestroyWindow();
|
|
|
|
if (m_hIcon1)
|
|
::DestroyIcon(m_hIcon1);
|
|
if (m_hIcon2)
|
|
::DestroyIcon(m_hIcon2);
|
|
}
|