Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/RailDlg.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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