// 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 listBindWinid, idlist; //modify by xlc on 110311 解决崩溃问题(GetOpeningIdList()长度是变化的) //int nLength = pWall->GetOpeningIdList().Length(); //for (int i=0; iGetOpeningIdList().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; jGetWallId(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; iGetWallNum(); for (int j=0; jGetWallId(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 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 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; iSetHeight(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"), 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 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 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 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 vTemp(g_bAxisWall,TRUE); // aSearch.CreateWalls(FALSE); // // ss.Erase(); // } //}