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

638 lines
15 KiB
C++

// LineWallDlg.cpp : implementation file
//
#include "stdafx.h"
#include "LineWallDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// [2010-3-16 wubo] 移植到新Geo库
// extern GEOAPI double g_nExtWidth;
// extern GEOAPI double g_nIntWidth;
// extern GEOAPI double g_nIntWallWidth;
extern int TARCH_IMPEXP g_nRunMode;
extern GEOAPI BOOL g_bAxisWall;
static ads_real minLenWall = 200.0*_UNIT_SCALE;
BOOL CLineWallDlg::g_bNoDeleteBase = FALSE;
double CLineWallDlg::m_nExtWidth = 100;
double CLineWallDlg::m_nIntWidth = 100;
double CLineWallDlg::m_nIntWallWidth = 200;
CString CLineWallDlg::m_csWallHeight = _T("当前层高");
double CLineWallDlg::m_dWallElev = 0;
int CLineWallDlg::m_iSelStyle = 2;
int CLineWallDlg::m_iAxisOrLine = 0;
CLineWallDlg::CLineWallDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CLineWallDlg::IDD, pParent)
{
m_nIntWidth = _AS_SYS_UNIT(g_nIntWidth);
m_nExtWidth = _AS_SYS_UNIT(g_nExtWidth);
m_nIntWallWidth = _AS_SYS_UNIT(g_nIntWallWidth);
}
void CLineWallDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDT_INWIDTH, m_nIntWidth);
DDX_Control(pDX, IDC_SPIN_IN, m_spinInt);
DDX_Text(pDX, IDC_EDT_OUTWIDTH, m_nExtWidth);
DDX_Control(pDX, IDC_SPIN_OUT, m_spinExt);
DDX_Text(pDX, IDC_CMB_INTERWALL, m_nIntWallWidth);
DDX_Check(pDX, IDC_NO_DELETE, g_bNoDeleteBase);
// DDX_Check(pDX, IDC_AXISWALL, g_bAxisWall);
DDX_Radio(pDX, IDC_RAD_AXISWALL, m_iAxisOrLine);
DDX_CBString(pDX, IDC_CMB_HEIGHT, m_csWallHeight);
DDX_CBIndex(pDX, IDC_CMB_MATERIAL, m_iSelStyle);
DDX_Text(pDX, IDC_CMB_ELEV, m_dWallElev);
if (pDX->m_bSaveAndValidate)
{
g_nIntWidth = _AS_MM(m_nIntWidth);
g_nExtWidth = _AS_MM(m_nExtWidth);
g_nIntWallWidth = _AS_MM(m_nIntWallWidth);
}
// GetDlgItem(IDC_NO_DELETE)->ShowWindow(g_bAxisWall?SW_HIDE:SW_SHOW);
GetDlgItem(IDC_NO_DELETE)->ShowWindow(m_iAxisOrLine==0?SW_HIDE:SW_SHOW);
}
BEGIN_MESSAGE_MAP(CLineWallDlg, CModelessDialog)
//{{AFX_MSG_MAP(CModelessDialog)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_RAD_AXISWALL, OnAxisWall)
ON_BN_CLICKED(IDC_RAD_LINE, OnLine)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CLineWallDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
UpdateData(TRUE);
// 编辑框中的数值范围
m_spinInt.SetRange(-1000, 1000);
m_spinExt.SetRange(-1000, 1000);
// 设置编辑增量
UDACCEL accel;
accel.nSec = 0;
accel.nInc = 10;
m_spinInt.SetAccel((short)1, &accel);
m_spinExt.SetAccel((short)1, &accel);
CComboBox *pBox = (CComboBox*)GetDlgItem(IDC_CMB_MATERIAL);
pBox->ResetContent();
pBox->AddString(WALLMATE_Concrete);
pBox->AddString(WALLMATE_Concrete1);
pBox->AddString(WALLMATE_Brick);
pBox->AddString(WALLMATE_Brick1);
pBox->AddString(WALLMATE_Rocket);
pBox->AddString(WALLMATE_Rocket1);
pBox->AddString(WALLMATE_Fill);
pBox->AddString(WALLMATE_Fill1);
pBox->AddString(WALLMATE_Fill2);
pBox->AddString(WALLMATE_Divider);
pBox->AddString(WALLMATE_Curtain);
pBox->SetCurSel(m_iSelStyle);
UpdateData(FALSE);
return TRUE;
}
void CLineWallDlg::OnClose()
{
acedPostCommand(_T("\33"));
}
// 轴网生墙
void CLineWallDlg::OnAxisWall()
{
UpdateData();
if (m_iAxisOrLine == 0)
{
g_bAxisWall = TRUE;
}
}
// 单线变墙
void CLineWallDlg::OnLine()
{
UpdateData();
// modify by xly on 100902 说明:m_iAxisOrLine=0是轴网生墙,m_iAxisOrLine=1是单线变墙,
/*if (m_iAxisOrLine == 0)
{
g_bAxisWall = TRUE;
}*/
if (m_iAxisOrLine == 1)
{
g_bAxisWall = FALSE;
}
}
// 获得当前选择的材料类型
TWallData::TWallStyle CLineWallDlg::GetStyle(CString &sT20Mat)
{
UpdateData(TRUE);
TWallData::TWallStyle st = TWallData::kBrick; // 砖墙
st = TWallData::kBrick;
switch(m_iSelStyle)
{
case 0:
sT20Mat = WALLMATE_Concrete;
st = TWallData::kConcrete;
break;
case 1:
sT20Mat = WALLMATE_Concrete1;
st = TWallData::kConcrete;
break;
case 2:
sT20Mat = WALLMATE_Brick;
st = TWallData::kBrick;
break;
case 3:
sT20Mat = WALLMATE_Brick1;
st = TWallData::kBrick;
break;
case 4:
sT20Mat = WALLMATE_Rocket;
st = TWallData::kRocket;
break;
case 5:
sT20Mat = WALLMATE_Rocket1;
st = TWallData::kRocket;
break;
case 6:
sT20Mat = WALLMATE_Fill;
st = TWallData::kFill;
break;
case 7:
sT20Mat = WALLMATE_Fill1;
st = TWallData::kFill1;
break;
case 8:
sT20Mat = WALLMATE_Fill2;
st = TWallData::kFill2;
break;
case 9:
sT20Mat = WALLMATE_Divider;
st = TWallData::kDivider;
break;
case 10:
sT20Mat = WALLMATE_Curtain;
st = TWallData::kCurtain;
break; }
return st;
}
// 获得当前选择的高度
double CLineWallDlg::GetHeight()
{
UpdateData(TRUE);
if (m_csWallHeight == _T("当前层高"))
{
return DocGetLHeight();
}
return _tstof(m_csWallHeight);
}
// 获得当前选择的底高
double CLineWallDlg::GetElev()
{
UpdateData(TRUE);
return m_dWallElev;
}
// modify by xly on 110411 支持设置墙体到指定的图层
// 墙转化为玻璃幕墙
//bool Wall2Curtain(Entity entWall)
bool Wall2Curtain(Entity entWall, CString csLayer = _T(""));
bool Wall2Curtain(Entity entWall, CString csLayer)
{
XDbObject obj(entWall, AcDb::kForWrite);
if (!obj)
return false;
TDbWall *pWall = TDbWall::cast(obj.m_pObject);
if (pWall == NULL)
return false;
AcDbObjectId idSurf = pWall->GetLayerSurf2d();
if (!idSurf.isValid())
pWall->SetLayerSurf2d(InitLayer(LAY_SURFACE));
AcDbCurve *pCv = pWall->GetAcDbCurve(0);
if (pCv == NULL)
return false;
// 幕墙
TDbWall *pCWall = (TDbWall*)TDbCurtainWall::desc()->create();
if (pCWall == NULL)
return false;
pCWall->SetFromCurve((*pCv));
pCWall->copyFrom(pWall);
DList<AcDbSoftPointerId> listBindWinid, idlist;
//modify by xlc on 110311 解决崩溃问题(GetOpeningIdList()长度是变化的)
//int nLength = pWall->GetOpeningIdList().Length();
//for (int i=0; i<nLength; i++)
for (int i=0; i<pWall->GetOpeningIdList().Length(); i++)
{
AcDbEntity *pEnt = NULL;
AcDbSoftPointerId id = pWall->GetOpeningIdList()[i];
Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead);
if (pEnt == NULL)
continue;
if (pEnt->isKindOf(TDbBandWin::desc())) // 判断是否是带形窗
{
TDbBandWin *pBandWin = TDbBandWin::cast(pEnt);
if (pBandWin != NULL)
{
long nNum = pBandWin->GetWallNum();
for (int j=0; j<nNum; j++)
{
AcDbObjectId idTem = pBandWin->GetWallId(j);
if (idTem == pWall->objectId())
{
pWall->RemoveReferenceOpening(id);
i--;
}
}
}
listBindWinid.Append(&id);
}
pEnt->close();
}
pWall->MoveOpeningTo(*pCWall);
pWall->MovePatchTo(*pCWall);
pCWall->ChangeElevation(pWall->GetElevation(), FALSE);
pCWall->SetHeight(pWall->GetHeight());
pCWall->SetWidth(0, pWall->GetWidth(0));
pCWall->SetWidth(1, pWall->GetWidth(1));
pCWall->SetStyle(TWallData::kCurtain);
pCWall->SetUsageFlag(pWall->GetUsageFlag());
TDbCurtainWall *pCurtinWall = (TDbCurtainWall*)pCWall;
pCurtinWall->SetLayerGlass3d(InitLayer(LAY_3DGLASS));
pCurtinWall->SetLayerCol3d(InitLayer(LAY_3DFRAME));
pCurtinWall->SetLayerRow3d(InitLayer(LAY_3DFRAME));
// add by xly on 101101 玻璃幕墙的竖挺截面长度是普通的墙体的左宽+右宽
double dColV = pWall->GetWidth(0)+pWall->GetWidth(1);
pCurtinWall->SetColV(dColV);
// add by xly on 110323 设置墙体的宽度
pCurtinWall->SetWidth(0, pWall->GetWidth(0));
pCurtinWall->SetWidth(1, pWall->GetWidth(1));
AcDbObjectId idNew = pCurtinWall->AddToMSpace(Adesk::kTrue),
idOld = pWall->objectId();
for (i=0; i<listBindWinid.Length(); i++)
{
AcDbEntity *pEnt = NULL;
AcDbSoftPointerId id = *listBindWinid[i];
Acad::ErrorStatus es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite);
if (pEnt == NULL)
continue;
TDbBandWin *pBandWin = TDbBandWin::cast(pEnt);
if (pBandWin != NULL)
{
long nNum = pBandWin->GetWallNum();
for (int j=0; j<nNum; j++)
{
AcDbObjectId idTem = pBandWin->GetWallId(j);
if (idTem == idOld)
{
pBandWin->SetWallId(j, idNew);
}
}
}
pEnt->close();
}
// add by xly on 110412 修改玻璃幕墙所在的图层
if (!csLayer.IsEmpty())
{
AcDbEntity *pNewEnt = NULL;
if ( acdbOpenAcDbEntity(pNewEnt,idNew,AcDb::kForWrite) == Acad::eOk)
{
pNewEnt->setLayer(csLayer);
pNewEnt->close();
}
}
pWall->erase();
return true;
}
//////////////////////////////
// 命令函数:单线变墙
//////////////////////////////
// modified by xly 100602,根据8.5需求,增加墙体材料、底高、高度控件
void SDWall()
{
CAcModuleResourceOverride vTemp;
CLineWallDlg dlg;
dlg.Create(IDD_LINEWALL,acedGetAcadFrame());
acedGetAcadFrame()->SetFocus();
PickSet ssAxis(SS_FREE); // 基线选择集
RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE,LWPOLYLINE,POLYLINE"), NULL);
g_ssPickFirst.Free();
int nRet = SelectEntities(_T("\n选择要变成墙体的直线、圆弧或多段线:"), ssAxis, mask);
if (nRet != RTNORM) // 命令结束
{
if (dlg.GetSafeHwnd() != NULL)
{
dlg.DestroyWindow();
}
return;
}
dlg.UpdateData();
PickSet ss(SS_FREE|SS_CREATE);
// if (g_bAxisWall)
if (dlg.m_iAxisOrLine == 0) // 轴网生墙
{
// 获得轴线层上的线
ssAxis.BaseFilter(RBList(8, LAY_AXIS, NULL));
if (ssAxis.Length() < 1) // 选择失败,命令结束
{
adsout << _T("\n轴线变墙需要选择轴线图层上的线!");
if (dlg.GetSafeHwnd() != NULL)
{
dlg.DestroyWindow();
}
return;
}
// 将用户拾取的轴线,copy一份放在ss选择集中
ss.IncludeBegin();
{
XPushVar<int> osmode(_T("OSMODE"), 0);
ads_command(RTSTR, _T(".COPY"), RTPICKS, (TLong_ptr *)ssAxis, RTSTR, _T(""),
RT3DPOINT, org_point, RT3DPOINT, org_point, NULL);
}
ss.IncludeEnd();
}
else // 单线变墙
{
// modify by xly on 100902 解决单线变墙是多出一行“Dangerous TPickEntSet = !”的提示
//ss = ssAxis;
ss += ssAxis;
}
// 找出多段线
PickSet ssPoly(SS_FREE|SS_CREATE);
long lLength = ss.Length(),
i = 0;
for (i=0; i<lLength; i++)
{
Entity ent = ss[i];
if (ent.Is(_T("LWPOLYLINE")) || ent.Is(_T("POLYLINE")))
{
ssPoly += ent;
}
}
ss.BaseExclude(RBList(RTDXF0, _T("LWPOLYLINE,POLYLINE"), NULL));
// 分解多段线
//PickSet ssNew(SS_FREE);
ss.IncludeBegin();
//ssNew.IncludeBegin();
lLength = ssPoly.Length();
for (i=0; i<lLength; i++)
{
Entity ent = ssPoly[i];
XPoly2D poly(ent);
long lLen = poly.Length(),
j = 0;
for (j=0; j<lLen; j++)
{
XCurveSegment seg;
poly.Nth(j, seg);
seg.Make();
}
}
//ssNew.IncludeEnd();
ss.IncludeEnd();
lLength = ss.Length();
if (lLength < 1) // 选择失败,命令结束
{
if (dlg.GetSafeHwnd() != NULL)
{
dlg.DestroyWindow();
}
return;
}
adsout << _T("\n处理重线...");
HandleCurveDup(ss);
adsout << _T("\n处理交线...");
HandleCurveInters(ss, minLenWall);
adsout << _T("\n识别外墙...");
// XLY add 100602,监测这段代码将生成的墙对象保存
PickSet ssWall(SS_FREE);
ssWall.IncludeBegin();
{
// 获得柱子对象
DList<AcDbObjectId> lstColus;
if (!g_nRunMode)
{
GetEntFromBlockByDxf(lstColus, _T("TCH_COLUMN"));
}
XSearchSpaceFromWall aSearch;
try
{
aSearch.InitStart(ss, lstColus);
}
catch(...)
{
adsout << /*UMSG*/_T("\n发生例外情况!");
ss.Erase();
if (dlg.GetSafeHwnd() != NULL)
{
dlg.DestroyWindow();
}
return;
}
if (aSearch.SearchSpaces())
{
aSearch.SetDefaultWidth();
}
aSearch.CreateWalls(!g_bAxisWall);
}
ssWall.IncludeEnd();
// 删除基线
if (g_bAxisWall || !CLineWallDlg::g_bNoDeleteBase)
{
ss.Erase();
ssPoly.Erase();
}
else
{
ssPoly.Erase();
}
// 获取对话框中的参数
double dHeight = dlg.GetHeight();
double dElev = dlg.GetElev();
CString sT20Mat;
TWallData::TWallStyle style = dlg.GetStyle(sT20Mat);
// 打开新生成的普通墙对象,修改其属性
lLength = ssWall.Length();
for (i = 0; i<lLength; i++)
{
OPENOBJ_BEGIN(ssWall[i], AcDb::kForWrite, TDbWall, pWall);
if (pWall != NULL)
{
pWall->SetHeight(dHeight); // 设置墙高度
pWall->SetElevation(dElev); // 设置墙底高
pWall->SetStyle(style); // 设置墙材料
pWall->SetT20WallMat(sT20Mat);
pWall->setLayer(InitLayer(pWall->GetDefaultLayer())); // 设置墙所属的图层
pWall->UpdateWallWidth();
}
OPENOBJ_END();
}
// 将墙对象变成玻璃幕墙
if (style == TWallData::kCurtain)
{
for (i = 0; i<ssWall.Length(); i++)
{
Entity entWall = ssWall[i];
if (Wall2Curtain(entWall))
{
ssWall -= entWall;
i--;
}
}
}
if (dlg.GetSafeHwnd() != NULL)
{
dlg.DestroyWindow();
}
}
// 单线变三维
// 必须在WCS下
//void SDWall()
//{
// // AsureWCS();
// if (SetWallWidth() != RTNORM)
// return; //处理命令参数, 如(C:SDWall n1 n2 n3)
//
// PickSet ss(SS_FREE);
// RBList mask=ads_buildlist(RTDXF0, _T("LINE,ARC,CIRCLE"), -4, _T("<NOT"), 8, LAY_AXIS, -4, _T("NOT>"), NULL);
// g_ssPickFirst.Free();
// if (SelectEntities(_T("\n选择待转成墙体的简单曲线(LINE,ARC,CIRCLE):"), ss, mask)==RTNORM)
// {
// adsout << _T("\n处理重线...");
// HandleCurveDup(ss);
// adsout << _T("\n处理交线...");
// HandleCurveInters(ss, minLenWall);
// adsout << _T("\n识别外墙...");
// DList<AcDbObjectId> lstColus;
// if (!g_nRunMode)
// GetEntFromBlockByDxf(lstColus, _T("TCH_COLUMN"));
//
// XSearchSpaceFromWall aSearch;
// try {
// aSearch.InitStart(ss, lstColus);
// } catch(...) {
// adsout << _T("\n发生例外情况!");
// return;
// }
//
// if (aSearch.SearchSpaces()) {
// aSearch.SetDefaultWidth();
// }
// aSearch.CreateWalls();
// ss.Erase();
// }
//}
// 轴线变墙体
// 必须在WCS下
//void AxisWall()
//{
// //AsureWCS();
// if (SetWallWidth() != RTNORM)
// return; //处理命令参数, 如(C:SDWall n1 n2 n3)
//
// PickSet ssAxis(SS_FREE);
// RBList mask(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, LAY_AXIS, NULL);
// g_ssPickFirst.Free();
// if (SelectEntities(_T("\n选择要变成墙体的轴线:"), ssAxis, mask) == RTNORM) {
// PickSet ss(SS_FREE|SS_CREATE);
// //XPushVarStr vTemp(_T("CLAYER"), LAY_WALLS);
// ss.IncludeBegin();
// {
// XPushVar<int> osmode(_T("OSMODE"), 0);
// ads_command(RTSTR, _T(".COPY"), RTPICKS, (long *)ssAxis, RTSTR, _T(""),
// RT3DPOINT, org_point, RT3DPOINT, org_point, NULL);
// }
// ss.IncludeEnd();
//
// adsout << _T("\n处理重线...");
// HandleCurveDup(ss);
// adsout << _T("\n处理交线...");
// HandleCurveInters(ss, minLenWall);
// adsout << _T("\n识别外墙...");
//
// DList<AcDbObjectId> lstColus;
// if (!g_nRunMode)
// GetEntFromBlockByDxf(lstColus, _T("TCH_COLUMN"));
// XSearchSpaceFromWall aSearch;
// try {
// aSearch.InitStart(ss, lstColus);
// } catch(...) {
// adsout << /*UMSG*/_T("\n发生例外情况!");
// ss.Erase();
// return;
// }
//
// if (aSearch.SearchSpaces()) {
// aSearch.SetDefaultWidth();
// }
// XPushMemVar<BOOL> vTemp(g_bAxisWall,TRUE);
// aSearch.CreateWalls(FALSE);
//
// ss.Erase();
// }
//}