Files
envi-code/SourceCode/Code2026/tg_shs/shs_siteplan/SinglePlaceTreeDlg.cpp
T
2026-09-28 15:28:50 +08:00

973 lines
24 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "stdafx.h"
#include "SinglePlaceTreeDlg.h"
#include "rxregsvc.h"
#include <ctype.h>
#include <time.h>
#include "GlwGlobalVariable.h"
#include "GlwPlaceTreeDataManage.h"
//#include "GlwUIDefine.h"
//#define UIFRAME_API __declspec( dllimport )
//#include "GlwUtility.h"
#if ADS < 18
#define DBL_MAX 1.7976931348623158e+308
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// 原始圆图片elev(00001730)
# define SYS_CIRCLETREE _T("TARCH(MULTPLACETREE01)")
extern AcDbObjectId InsertBlock(CString &csBlkName, int &iTreeType);
double GetRandomSize(double dOrigRad)
{
double dRand = 0;
dRand = (((double) rand() / (double) RAND_MAX) * dOrigRad + dOrigRad*0.5);
return dRand;
}
CSinglePlaceTreeDlg::CSinglePlaceTreeDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CSinglePlaceTreeDlg::IDD, pParent)
{
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
m_iTreeType = pDataManage->GetTreeType();
m_iDrawStyle = pDataManage->GetDrawType();
m_csRad = GetFormatData(pDataManage->GetTreeRad(FALSE));
m_csDis = GetFormatData(pDataManage->GetTreeDis());
m_csOffset = GetFormatData(pDataManage->GetTreeOffset());
m_bIsRandSize = pDataManage->GetIsSetRandomSize();
m_bIsRotation = pDataManage->GetIsSetRotation();
m_bIsSetDis = pDataManage->GetIsSetDis();
m_idTreeStyle = pDataManage->GetTreeId();
m_hIcon = NULL;
}
// 根据需求修改编辑框中数据的显示格式
CString CSinglePlaceTreeDlg::GetFormatData(double dData)
{
CString csTemp;
if (DocGetMeterUnitDraw())
{
csTemp.Format(_T("%.3f"), dData);
}
else
{
csTemp.Format(_T("%.0f"), dData);
}
return csTemp;
}
namespace
{
enum GlwEnum
{
eLayerName = 0,
eLayerOpen,
eLayerFrozen,
eLayerLocked,
eLayerColor,
eLayerLType,
eLayerLWeight,
eLayerPlottable,
eLayerDesc,
eWinVerOld,
eWinVerXp,
eWinVerVista,
eWinVerWin7,
eWinVerWin8,
eCADVer2007,
eCADVer2008,
eCADVer2009,
eCADVer2010,
eCADVer2011,
eCADVer2012,
eCADVer2013,
eCADVer2014,
eCADVer2015,
eCADVer2016,
eCADVerUnknow,
EV_TOP, // 俯视
EV_BOTTOM, // 仰视
EV_LEFT, // 左视
EV_RIGHT, // 右视
EV_FORNT, // 前视
EV_BACK, // 后视
EV_WS, // 西南
EV_ES, // 东南
EV_EN, // 东北
EV_WN, // 西北
EV_NONE, // 啥也不是
};
GlwEnum GetCadVer()
{
TCHAR strVer[20];
TGGetVar(_T("ACADVER"), strVer);
CString str = strVer;
str = str.Left(4);
if (_T("17.0") == str)
return eCADVer2007;
else if (_T("17.1") == str)
return eCADVer2008;
else if (_T("17.2") == str)
return eCADVer2009;
else if (_T("18.0") == str)
return eCADVer2010;
else if (_T("18.1") == str)
return eCADVer2011;
else if (_T("18.2") == str)
return eCADVer2012;
else if (_T("19.0") == str)
return eCADVer2013;
else if (_T("19.1") == str)
return eCADVer2014;
else if (_T("20.0") == str)
return eCADVer2015;
else if (_T("20.1") == str)
return eCADVer2016;
return eCADVerUnknow;
}
}
//add by yyc 增加打开的图纸和当前打开的CAD版本对比,图纸版本比CAD版本低的进行提示
//AC1015:CAD2000版 AC1018:CAD2004版 AC1021:CAD2007版
//AC1027:CAD2013版 AC1024:CAD2010版
BOOL JudgeVersion(CString strFile)//判断版本
{
CStdioFile file;
file.Open(strFile, CFile::modeRead);
CString strFileVersion;
file.ReadString(strFileVersion);
file.Close();
strFileVersion = strFileVersion.Mid(0, 6);
if (strFileVersion.IsEmpty())
return FALSE;
if (GetCadVer() == eCADVer2007 && (strFileVersion != _T("AC1027") && strFileVersion != _T("AC1024")))
return TRUE;
else if (GetCadVer() == eCADVer2008 && (strFileVersion != _T("AC1027") && strFileVersion != _T("AC1024")))
return TRUE;
else if (GetCadVer() == eCADVer2009 && (strFileVersion != _T("AC1027") && strFileVersion != _T("AC1024")))
return TRUE;
else if (GetCadVer() == eCADVer2010 && strFileVersion != _T("AC1027"))
return TRUE;
else if (GetCadVer() == eCADVer2011 && strFileVersion != _T("AC1027"))
return TRUE;
else if (GetCadVer() == eCADVer2012 && strFileVersion != _T("AC1027"))
return TRUE;
else if (GetCadVer() == eCADVer2013 )
return TRUE;
else if (GetCadVer() == eCADVer2014)
return TRUE;
else if (GetCadVer() == eCADVer2015)
return TRUE;
else if (GetCadVer() == eCADVer2016)
return TRUE;
else
return FALSE;
}
CSinglePlaceTreeDlg::~CSinglePlaceTreeDlg()
{
// 按钮图标销毁
if (m_hIcon)
{
::DestroyIcon(m_hIcon);
}
// 保存数据mm单位
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetTreeType(m_iTreeType);
pDataManage->SetDrawType(m_iDrawStyle);
pDataManage->SetTreeRad(_tstof(m_csRad));
pDataManage->SetTreeDis(_tstof(m_csDis));
pDataManage->SetTreeOffset(_tstof(m_csOffset));
pDataManage->SetIsSetRotation(m_bIsRotation);
pDataManage->SetIsSetRandSize(m_bIsRandSize);
pDataManage->SetIsSetDis(m_bIsSetDis);
pDataManage->SetTreeId(m_idTreeStyle);
m_PreviewCtrl.clearAll();
}
void CSinglePlaceTreeDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSinglePlaceTreeDlg)
DDX_Radio(pDX, IDC_RAD_FROMBLK, m_iTreeType);
DDX_Radio(pDX, IDC_RAD_POINT, m_iDrawStyle);
DDX_Text(pDX, IDC_EDT_RAD, m_csRad);
DDX_Text(pDX, IDC_EDT_DIS, m_csDis);
DDX_Text(pDX, IDC_EDT_OFFSET, m_csOffset);
//DDV_MinMaxDouble(pDX, m_dOffset, 0, DBL_MAX );
DDX_Check(pDX, IDC_CHK_ROTATION, m_bIsRotation);
DDX_Check(pDX, IDC_CHK_SETDIS, m_bIsSetDis);
DDX_Check(pDX, IDC_CHK_RAND_SIZE, m_bIsRandSize);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSinglePlaceTreeDlg, CModelessDialog)
//{{AFX_MSG_MAP(CMultPlaceTreeDlg)
ON_BN_CLICKED(IDC_BUT_PICK, OnBnClickedButPick)
ON_BN_CLICKED(IDC_BUT_RAD, OnBnClickedButRad)
ON_BN_CLICKED(IDC_BUT_DIS, OnBnClickedButDis)
ON_BN_CLICKED(IDC_CHK_RAND_SIZE, OnChkRandSize)
ON_BN_CLICKED(IDC_CHK_ROTATION, OnChkRotation)
ON_BN_CLICKED(IDC_CHK_SETDIS, OnChkSetDis)
ON_WM_PAINT()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_RAD_POINT, OnBnClickedDrawStyle)
ON_BN_CLICKED(IDC_RAD_JIG, OnBnClickedDrawStyle)
ON_BN_CLICKED(IDC_RAD_PATH, OnBnClickedDrawStyle)
ON_BN_CLICKED(IDC_RAD_AREA_LAYOUT, OnBnClickedDrawStyle)
ON_BN_CLICKED(IDC_RAD_FROMBLK, OnBnClickedTreeFormSelect)
ON_BN_CLICKED(IDC_RAD_FROMGALLERY, OnBnClickedTreeFormSelect)
ON_BN_CLICKED(IDC_RAD_FROMFILE, OnBnClickedTreeFormSelect)
//}}AFX_MSG_MAP
//ON_BN_CLICKED(IDC_BUT_OFFSET, OnBnClickedButOffset)
ON_EN_CHANGE(IDC_EDT_OFFSET, OnEnChangeEdtOffset)
ON_EN_CHANGE(IDC_EDT_RAD, OnEnChangeEdtRad)
ON_EN_CHANGE(IDC_EDT_DIS, OnEnChangeEdtDis)
END_MESSAGE_MAP()
BOOL CSinglePlaceTreeDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
UpdateData(FALSE);
UpdateData(TRUE);
// 按钮图标
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON_PICK);
if (!m_hIcon)
{
AfxMessageBox(_T("无法找到指定ICON文件。"));
}
else
{
((CButton*)GetDlgItem(IDC_BUT_PICK))->SetIcon(m_hIcon);
}
// 获取当前的绘图单位,对话框标题设置
if (DocGetMeterUnitDraw())
{
this->SetWindowText(_T("任意布树(单位:M)"));
}
else
{
this->SetWindowText(_T("任意布树(单位:mm)"));
}
AcDbObjectId idBlk;
int n = 0;
CString csBlkName = _T("tree1");
while(!m_idTreeStyle.isValid())// 用户没有设值新的树形,使用默认值
{
m_idTreeStyle = InsertBlock(csBlkName, n);
}
// add by xly on 110329 解决图纸切换时,发生崩溃
if (m_idTreeStyle.database()!=curDoc()->database())
{
m_idTreeStyle = InsertBlock(csBlkName, n);
}
AcDbBlockTableRecord *pBTRecord = NULL;
if(acdbOpenObject(pBTRecord, m_idTreeStyle, AcDb::kForRead) != Acad::eOk)
{
m_idTreeStyle = InsertBlock(csBlkName, n);
}
else
pBTRecord->close();
GetDlgItem(IDC_CHK_SETDIS)->EnableWindow(m_iDrawStyle==2);
GetDlgItem(IDC_BUT_DIS)->EnableWindow(!(m_iDrawStyle==0 || m_iDrawStyle==3));
GetDlgItem(IDC_EDT_DIS)->EnableWindow(!(m_iDrawStyle==0 || m_iDrawStyle==3));
UpdateControlState();
GetDlgItem(IDC_BUT_PICK)->SetFocus();
// 预览
if (!m_PreviewCtrl.SubclassDlgItem(IDC_STATIC_PREVIEW, this))
return FALSE;
m_PreviewCtrl.SetOrbitFlag(OBF_ZOOM|OBF_PAN);
// add by xly on 110325 设置显示方式
UpdatePreview();
UpdateData(FALSE);
return TRUE;
}
Adesk::Boolean acedPostCommand(const TCHAR * );
void CSinglePlaceTreeDlg::OnClose()
{
m_bUseEsc = true;
if (m_bModeless)
{
acedPostCommand(_T("\33\33"));
}
else
{
CModelessDialog::OnClose();
}
}
// 调用构件库
BOOL InvokeTkwMan(const TCHAR *pszLib, BOOL bSelOnly, XString &sBlockName)
{
if (!AT_loaded(_T("wfB")))
{
#ifndef ZWCAD
int nRet = acrxLoadModule(_T("wfB.arx"), Adesk::kTrue, true);
#else
int nRet = acrxLoadModule(_T("wfB.zrx"), Adesk::kTrue, true);
#endif
if (!nRet)
{
return FALSE;
}
}
int nCode = bSelOnly ? RTT : RTNIL;
RBList rbCmd = ads_buildlist(RTSTR, _T("ITkw"), RTSTR, pszLib, nCode, RTSTR,
(const TCHAR *)sBlockName, NULL);
resbuf *rbRes = NULL;
if (ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes)
{
if (rbRes && rbRes->restype==RTSTR)
sBlockName = rbRes->resval.rstring;
ads_relrb(rbRes);
return TRUE;
}
return FALSE;
}
extern AcDbObjectId InsertBlock(CString &csBlkName, int &iTreeType);
// 获得天正图库中图块的ID
AcDbObjectId CSinglePlaceTreeDlg::GetTgTreeBlockId(XString sBlockName)
{
AcDbObjectId idBlock;
AcDbBlockTable *pBlockTab = NULL;
if (acdbCurDwg()->getSymbolTable(pBlockTab, AcDb::kForWrite) != Acad::eOk) // 获得块表
{
return idBlock;
}
if (pBlockTab->getAt(sBlockName, idBlock, false) == Acad::eOk) // 检查块是否存
{
pBlockTab->close();
return idBlock;
}
AcDbBlockTableRecord* pBlkRecord = new AcDbBlockTableRecord;
pBlkRecord->setName(sBlockName);
if (pBlockTab->add(idBlock, pBlkRecord) != Acad::eOk)
{
pBlockTab->close();
delete pBlkRecord;
return AcDbObjectId::kNull;
}
pBlkRecord->close();
pBlockTab->close();
return idBlock;
}
// 树的绘制类型
int CSinglePlaceTreeDlg::GetDrawType()
{
UpdateData(true);
return m_iDrawStyle;
}
// 窗口重绘消息.
void CSinglePlaceTreeDlg::OnPaint()
{
UpdateData(TRUE);
CPaintDC dc(this);
CRect rcClip, rcImage;
dc.GetClipBox(&rcClip);
CWnd *pImageBox = GetDlgItem(IDC_STATIC_PREVIEW);
if (pImageBox)
{
pImageBox->GetWindowRect(&rcImage);
ScreenToClient(&rcImage);
if (!rcImage.IntersectRect(&rcImage, &rcClip))
return;
CDC *pDC = pImageBox->GetDC();
m_imgPreview.SetDC(pDC);
m_imgPreview.Redraw();
m_imgPreview.SetDC(NULL);
pImageBox->ReleaseDC(pDC);
}
}
// 设置幻灯片
void CSinglePlaceTreeDlg::SetPicture(CString &csFile)
{
UpdateData(TRUE);
XString sFilePath(256);
sFilePath << csFile;
// 获得图片控件
CWnd* pWndBmp = GetDlgItem(IDC_STATIC_PREVIEW);
ASSERT(pWndBmp);
// 获得图片区域
CDC *pDC = pWndBmp->GetDC();
CRect rect;
pWndBmp->GetClientRect(rect);
m_imgPreview.InitDC(pDC, rect, GetAcadBackColor());
m_imgPreview.PaintSlide(sFilePath);
m_imgPreview.SetDC(NULL);
pWndBmp->ReleaseDC(pDC);
}
// 获得块的预览
void CSinglePlaceTreeDlg::UpdatePreview()
{
UpdateData(TRUE);
m_PreviewCtrl.clearAll();
m_PreviewCtrl.init(true);
// 锁定当前文档
acDocManager->lockDocument(curDoc());
// 块表记录
AcDbBlockTableRecord *pBTRecord = NULL;
if(acdbOpenObject(pBTRecord, m_idTreeStyle, AcDb::kForRead) != Acad::eOk)
{
return;
}
// 定义本数据库的块表记录
AcDbBlockTableRecordIterator *pItor = NULL;
pBTRecord->newIterator(pItor);
// 预览数据库
AcDbBlockTable *pBlockTab = NULL;
Acad::ErrorStatus es = m_PreviewDb.getSymbolTable(pBlockTab, AcDb::kForWrite);
if( es !=Acad::eOk)
return;
// 定义预览数据库的块记录
AcDbBlockTableRecord *pBlockTabRecord = new AcDbBlockTableRecord;
pBlockTabRecord->setName(_T("*U"));
// 将块表中实体添加到新的数据库的块表记录中
AcDbEntity *pClone = NULL,
*pEnt = NULL;
for (; !pItor->done(); pItor->step())
{
es = pItor->getEntity(pEnt,AcDb::kForRead,false);
if (es != Acad::eOk)
{
delete pBlockTabRecord;
pBlockTab->close();
return;
}
pClone = (AcDbEntity*)pEnt->clone();
es = pBlockTabRecord->appendAcDbEntity(pClone);
if (es != Acad::eOk)
{
delete pBlockTabRecord;
pBlockTab->close();
return;
}
pClone->close();
pEnt->close();
}
delete pItor;
pBTRecord->close();
AcDbBlockReference *pRef = new AcDbBlockReference(AcGePoint3d(0,0,0), m_idTreeStyle);
// 获得块的包围盒
AcDbExtents extents;
pRef->getGeomExtents(extents);
// 块的外包盒的角点
AcGePoint3d ptLow, ptUp;
// 获得图块的大小
ptLow = extents.minPoint();
ptUp = extents.maxPoint();
double dXWidth = (ptUp.x-ptLow.x),
dYHeigh = (ptUp.y-ptLow.y);
//pBlockTab->add(pBlockTabRecord);
pBlockTab->close();
pBlockTabRecord->close();
// 设置观察位置
AcGePoint3d ptIns(extents.minPoint()/2 +extents.maxPoint()/2),
target = ptIns;
AcGePoint3d position(target.x, target.y, 1);
m_PreviewCtrl.view()->setView(position, target, AcGeVector3d(0, 1, 0),dXWidth *2, dYHeigh*2);
m_PreviewCtrl.view()->add(pBTRecord,m_PreviewCtrl.model());
m_PreviewCtrl.Invalidate();
acDocManager->unlockDocument(curDoc());
UpdateData(FALSE);
}
// 设置对话框隐藏
void CSinglePlaceTreeDlg::SetWindowHide(bool bHide)
{
if (bHide) // 隐藏
{
GetParent()->EnableWindow(TRUE);
GetParent()->SetFocus();
GetParent()->SetActiveWindow();
ShowWindow(SW_HIDE);
}
else // 显示
{
GetParent()->EnableWindow(FALSE);
EnableWindow(TRUE);
SetActiveWindow();
ShowWindow(SW_SHOW);
GetParent()->EnableWindow(TRUE);
}
}
// 点取拾取按钮实现
void CSinglePlaceTreeDlg::OnBnClickedButPick()
{
UpdateData(TRUE);
// 图块的ID
AcDbObjectId endId;
AcApDocument *pDoc = acDocManager->curDocument();
// 选择不同的树形选择方式
switch(m_iTreeType)
{
case 0: // 点取本图图块
{
SetWindowHide(true);
// 选择图块
Entity ent;
int iRet;
TADSGePoint3d ptPick;
RBList rbList(RTDXF0, _T("INSERT,TCH_BLOCK_INSERT"), NULL);
iRet = SelectEntity1(_T("\n请选择要布置的图块<返回>:"), ent,ptPick,rbList);
while(iRet == RTERROR)
{
iRet = SelectEntity1(_T("\n请选择要布置的图块<返回>:"), ent, ptPick,rbList);
/*if(iRet == RTNORM)
{
break;
}*/
}
if(iRet == RTNORM) // 获取图块成功
{
// 锁定文档
//acDocManager->lockDocument(pDoc);
// 获得块表记录的ID
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbBlockReference, pBlkRef);
m_idTreeStyle = pBlkRef->blockTableRecord();
OPENOBJ_END();
//acDocManager->unlockDocument(pDoc);
// 预览块
UpdatePreview();
}
/*else if (iRet!=RTNONE)//delete by xly on 110325 退出时返回对话框
{
return;
}*/
SetWindowHide(false);
acedGetAcadDwgView()->SetFocus();
// add by xly on 110327 更新命令行提示
if (m_iDrawStyle==0)
{
acutPrintf(_T("\n请点取插入点<退出>:"));
}
else if (m_iDrawStyle==1)
{
acutPrintf(_T("\n请输入起始点<退出>:"));
}
else if(m_iDrawStyle==2)
{
acutPrintf(_T("\n请选择作为路径的曲线(直线、圆弧、多段线)<退出>:"));
}
}
break;
case 1: // 从图库选择
{
// 找到sys路径下的dwg文件
CString szFileName = _T("植物.TKW"),
sLibFile = g_sDwbPath;
sLibFile = sLibFile.Left(sLibFile.GetLength() - 5) + _T("\\DWB\\") + szFileName;
XString sBlockName;
// modify by xly on 110325 修改默认值
//sBlockName= m_csTreeStyle;
sBlockName = _T("植物(00000092)");
if (InvokeTkwMan(sLibFile, TRUE, sBlockName))
{
szFileName = (const TCHAR *)(XPathParser(sBlockName).m_sFileName);
sLibFile = g_sDwbPath;
CString csPath = sLibFile.Left(sLibFile.GetLength() - 5) + _T("\\DWB\\");
csPath += szFileName;
// 锁定文档
acDocManager->lockDocument(pDoc);
int nRet = LoadDwbBlock(csPath,sBlockName);
if(nRet == RTNORM)
{
m_idTreeStyle = InitBlock(sBlockName);
//m_csTreeStyle = csPath;
}
acDocManager->unlockDocument(pDoc);
UpdatePreview();
}
}
break;
case 2: // 从文件选取
{
// 定义打开文件对话框
CString csFilter = _T("CAD图形文件(*.dwg)|*.dwg");
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
csFilter, NULL);
// 设置对话框默认呈现的路径
CString sLibFile = g_sDwbPath;
sLibFile = sLibFile.Left(sLibFile.GetLength() - 5);
dlg.m_ofn.lpstrInitialDir = sLibFile;
if (dlg.DoModal() != IDOK)
return;
// 获得文件名
CString strFilePath = dlg.GetPathName();
if (strFilePath.IsEmpty())
return;
//判断图纸版本和当前CAD版本是否匹配
if (!JudgeVersion(strFilePath))
{
acutPrintf(_T("不能打开此 DWG 文件,因为它是使用更新版本的 AutoCAD 创建的。"));
acutPrintf(_T("请从 Autodesk 下载 DWG TrueConvert 工具,已将 DWG 文件转换为不同版本"));
return;
}
// 锁定文档
acDocManager->lockDocument(pDoc);
// 打开dwg文件
AcDbDatabase *pXrefDb = new AcDbDatabase(Adesk::kFalse);
#if ADS < 21
Acad::ErrorStatus es = pXrefDb->readDwgFile(strFilePath,_SH_DENYNO, false);
#else
Acad::ErrorStatus es = pXrefDb->readDwgFile(strFilePath, AcDbDatabase::kForReadAndAllShare, false);
#endif
if (es != Acad::eOk)
{
delete pXrefDb;
return;
}
// 将树形文件以块的形式插入数据库
if (acdbCurDwg()->insert(m_idTreeStyle, _T("*UT"), pXrefDb, true) != Acad::eOk)
{
delete pXrefDb;
return ;
}
delete pXrefDb;
acDocManager->unlockDocument(pDoc);
// 预览dwg图纸
UpdatePreview();
}
break;
default:
break;
}
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetTreeId(m_idTreeStyle);
UpdateData(FALSE);
}
// 切换绘制方式
void CSinglePlaceTreeDlg::OnBnClickedDrawStyle()
{
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
UpdateData(TRUE);
GetDlgItem(IDC_CHK_SETDIS)->EnableWindow(m_iDrawStyle==2);
// add by xly on 110324 任意绘制时树间距不可用
if (m_iDrawStyle==0 || m_iDrawStyle==3)
GetDlgItem(IDC_BUT_DIS)->EnableWindow(false);
if (m_iDrawStyle==0 || m_iDrawStyle==3)
{
GetDlgItem(IDC_BUT_DIS)->EnableWindow(FALSE);
GetDlgItem(IDC_EDT_DIS)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_BUT_DIS)->EnableWindow(TRUE);
GetDlgItem(IDC_EDT_DIS)->EnableWindow(TRUE);
}
UpdateControlState();
pDataManage->SetDrawType(m_iDrawStyle);
m_bUseEsc = false;
acedPostCommand(_T("\33"));
}
void CSinglePlaceTreeDlg::OnBnClickedTreeFormSelect()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetTreeType(m_iTreeType);
}
void CSinglePlaceTreeDlg::OnBnClickedButRad()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
GetDis(m_csRad, true);
pDataManage->SetTreeRad(_tstof(m_csRad));
UpdateData(FALSE);
}
void CSinglePlaceTreeDlg::OnBnClickedButDis()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
GetDis(m_csDis, false);
pDataManage->SetTreeDis(_tstof(m_csDis));
UpdateData(FALSE);
}
void CSinglePlaceTreeDlg::OnChkRandSize()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetIsSetRandSize(m_bIsRandSize);
}
void CSinglePlaceTreeDlg::OnChkRotation()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetIsSetRotation(m_bIsRotation);
}
void CSinglePlaceTreeDlg::OnChkSetDis()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetIsSetDis(m_bIsSetDis);
}
void CSinglePlaceTreeDlg::OnEnChangeEdtRad()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetTreeRad(_tstof(m_csRad));
}
void CSinglePlaceTreeDlg::OnEnChangeEdtDis()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
pDataManage->SetTreeDis(_tstof(m_csDis));
}
// 获取点取的距离
void CSinglePlaceTreeDlg::GetDis(CString &csLength, bool isRadOrDis)
{
double nHeight = _tstof(csLength);
CString csPrompt = isRadOrDis ? _T("\n请点取树半径") : _T("\n请点取树间距");
BeginEditorCommand();
if (GetDist(csPrompt, nHeight, RSG_NOZERO|RSG_NONEG) == RTNORM)
{
csLength = GetFormatData(nHeight);
}
CompleteEditorCommand();
}
/*
void CSinglePlaceTreeDlg::OnBnClickedButOffset()
{
UpdateData(TRUE);
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
SetWindowHide(TRUE);
ads_real dDist;
double dOffset = _tstof(m_csOffset);
int i=0;
CString strTip = _T("");
strTip.Format(_T("请点取偏移距离<%d>:"), dOffset);
if (acedGetDist(NULL, strTip, &dDist) == RTNORM)
{
dOffset = dDist;
}
m_csOffset = GetFormatData(dOffset);
pDataManage->SetTreeOffset(_tstof(m_csOffset));
UpdateData(FALSE);
SetWindowHide(FALSE);
}
*/
int is_digit(WCHAR *str)
{
size_t len = wcslen(str);
size_t lenPre = len;
bool bDoubleFlag = false;
while(len > 0)
{
if (len != lenPre && *str == '.' && bDoubleFlag == false)//判断是否是double值
{
bDoubleFlag = true;
}
else if (*str < '0' || *str > '9') {
return -1;
}
str++;
len--;
}
return 0;
}
void CSinglePlaceTreeDlg::OnEnChangeEdtOffset()
{
if(!GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage))
SET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage, new GlwPlaceTreeDataManage);
GlwPlaceTreeDataManage *pDataManage = GET_GLOBAL_VARIABLE(GlwPlaceTreeDataManage);
CString strOffset = _T("");
BOOL bIsNum = FALSE;
GetDlgItem(IDC_EDT_OFFSET)->GetWindowText(strOffset);
if (strOffset.GetLength() > 0)
{
if (strOffset.GetAt(0) < '0' || strOffset.GetAt(0) > '9')
{
AfxMessageBox(_T("请输入≥0的数值!"));
UpdateData(FALSE);
}
else
{
if (strOffset.GetLength() >= 2)
{
if (strOffset.GetAt(0) == '0')
{
if (strOffset.GetAt(1) == '.')
{
CString strTemp;
strTemp = strOffset.Right(1);
WCHAR *wch = (WCHAR*)strTemp.GetBuffer(strTemp.GetLength());
if (strOffset.GetLength() > 2)
{
if (is_digit(wch) == -1)
{
AfxMessageBox(_T("请输入≥0的数值!"));
UpdateData(FALSE);
}
else
{
UpdateData(TRUE);
pDataManage->SetTreeOffset(_tstof(m_csOffset));
}
}
}
else
{
AfxMessageBox(_T("请输入≥0的数值!"));
UpdateData(FALSE);
}
}
else
{
WCHAR *wch = (WCHAR*)strOffset.GetBuffer(strOffset.GetLength());
strOffset.ReleaseBuffer(strOffset.GetLength());
//关于小数点的问题
if (is_digit(wch) == -1)
{
AfxMessageBox(_T("请输入≥0的数值!"));
UpdateData(FALSE);
}
else
{
UpdateData(TRUE);
pDataManage->SetTreeOffset(_tstof(m_csOffset));
}
}
}
else
{
UpdateData(TRUE);
pDataManage->SetTreeOffset(_tstof(m_csOffset));
}
}
}
}
void CSinglePlaceTreeDlg::UpdateControlState()
{
GetDlgItem(IDC_CHK_RAND_SIZE)->EnableWindow(m_iDrawStyle == 0 || m_iDrawStyle == 3);
//GetDlgItem(IDC_BUT_OFFSET)->EnableWindow(m_iDrawStyle == 1 || m_iDrawStyle == 2);
GetDlgItem(IDC_EDT_OFFSET)->EnableWindow(m_iDrawStyle == 1 || m_iDrawStyle == 2);
}