// 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); }