#include "stdafx.h" #include "resource.h" #include "SlopeRoofDlg.h" #include "SearchRangeDlg.h" #include "buildingArea.h" #include "rxregsvc.h" #include "SpaceProperty.h" #include "Inputpoly.h" #define _SPACE_DIST_SNAP 0.1 // sg add 081208 // TARCH_IMPEXP void SearchSpace(PickSet &ssWalls,const DList &lstColu,DList &res); #define AS_LAY2D(s) ((const TCHAR *)XString(_T("2D_%s"), (const TCHAR *)s)) extern TARCH_IMPEXP BOOL g_bBlaconyHalf; static ads_real nSanShuiDist = 600.0, nRoofDist = 600.0, nElevDiffDist = 0.0; // [2/19/2008 nsh] static double nElevMove = 24000.0; //static double nElevDiff = 600.0; void MakeWallSet(PickSet &ssWalls) { if (!ssWalls) return; PickSet ssOpenings; ssOpenings += ssWalls; RBList maskOpening(RTDXF0,_T("TCH_OPENING"),NULL); ssOpenings.BaseFilter(maskOpening); ssWalls -= ssOpenings; long lCount=ssOpenings.Length(); for(long idx=0L; idxGetWallId(); if (!!idWall) ssWalls += idWall; } OPENOBJ_END(); } //过滤隔断 add by fxj 090629 PickSet ssDiv; for(long i=0;iGetStyle()==TWallData::kDivider&&pWall->GetUsageFlag()==TWallData::kApartment) ssDiv+=ent; } OPENOBJ_END(); } ssWalls-=ssDiv; } // 自动把门窗所在的墙加进选择集中 void MakeWallSet1(PickSet &ssWalls) { if (!ssWalls) return; PickSet ssOpenings; ssOpenings += ssWalls; RBList maskOpening(RTDXF0,_T("TCH_OPENING"),NULL); ssOpenings.BaseFilter(maskOpening); long lCount=ssOpenings.Length(); for (long idx=0L; idxGetWallId(); if (!!idWall) ssWalls += idWall; } OPENOBJ_END(); } } // 屋顶线/散水/室内外高差 // nFlag: 0--屋顶; 1--散水; 2--室内外高差; int OffsetExtSpace(int nFlag) { PickSet ssWalls(SS_FREE); //adsout << ; g_ssPickFirst.Free(); if (SelectEntities(_T("\n请选择构成一完整建筑物的所有墙体(或门窗):"), ssWalls, RBList(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING"), NULL))!=RTNORM) return RTNORM; MakeWallSet(ssWalls); DList lstColu; GetEntFromBlockByDxf(lstColu, _T("TCH_COLUMN")); XSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } catch(...) { adsout << /*UMSG*/_T("\n发生例外情况!"); return RTERROR; } XAecSpaceCell * extCell = aSearch.SearchSpaces(); if (extCell) { aSearch.UpdateWallFlags(); XPoly2D poly(1); extCell->InternalPoly2D(poly, 0, 0); // UCS to WCS XPoly2D polyShow(1); polyShow=poly; polyShow.TransUCS(Groups(0), Groups(1)); polyShow.SetElevation(0); poly.SetElevation(0); XScreenDc dc(1,1); dc << polyShow; double &nDist=nFlag==1? nSanShuiDist : (nFlag==0? nRoofDist : nElevDiffDist); int nRet = GetDist(_T("\n偏移外皮距离"), nDist); if (nRet==RTNORM || nRet==RTNONE) { XPoly2D dest(1); poly.Compress(); if (poly.PathArea()>0.0) //顺时针的Poly poly.Reverse(); //nDist = -nDist; if (fabs(nDist)<_DIST_SNAP) dest=poly; // sg modify 110117,解决生成屋顶线产生自交的错误问题 // if (fabs(nDist)<_DIST_SNAP || // poly.Offset(nDist, dest)==RTNORM) if (fabs(nDist)<_DIST_SNAP || poly.QuickOffset(nDist, dest)==RTNORM) { if (nFlag==2) { // 室内外高差 double nElevDiff=DocGetElevDiff(); if (GetDist(_T("\n室内外高差"), nElevDiff, RSG_NONEG|RSG_NOZERO)!=RTCAN) { TDbSlab *pSlab=new TDbSlab; pSlab->SetOutline(dest); pSlab->SetThickness(-nElevDiff); pSlab->SetVisibilityAll(FALSE); pSlab->setLayer(InitLayer(LAY_GROUND, FALSE)); AddToModelSpace(pSlab, Adesk::kTrue); } DocSetElevDiff(nElevDiff); } else { // 屋顶 AcDbPolyline *pline=new AcDbPolyline; PolyConvert(dest, *pline); pline->setLayer(InitLayer(AS_LAY2D(nFlag==0? LAY_ROOF : LAY_GROUND), TRUE)); AddToModelSpace(pline, Adesk::kTrue); if (nFlag==1) { // 散水 for(int i=0; im_ptLocation=pt; } else { pt.y-=m_tdbtext->GetHeight(FALSE)/2; m_tdbtext->SetLocation(pt); } return Adesk::kTrue; } AcDbEntity *TDragDbTextJig::entity() const { return m_tdbtext!=NULL?(AcDbEntity*)m_tdbtext:(AcDbEntity*)m_tdspace; } void TDragDbTextJig::SetPrompt(const TCHAR *pTemp) { m_szPrompt=pTemp; acutPrintf(m_szPrompt); } int TDragDbTextJig::GetRetCode() const { int ret = m_iRetCode; if (ret == AcEdJig::kCancel) ret = RTCAN; else if (ret == AcEdJig::kNull) ret = RTNONE; else if (ret == AcEdJig::kNormal) ret = RTNORM; else { ret = RTKWORD; } return ret; } //----------------------------end---------------------------- // add by fxj 080624 套内面积对话框 // sg modify 081119 增加有关填充部分的设置 class CHouseAreaDlg : public CModelessDialog { public: CHouseAreaDlg(CWnd* pParent = NULL); // standard constructor // remove by lgh, 采用了字符串类型的code数据,因此该数据相关的函数以及变量废弃 // void SetCode(int nCode); // modified by fxj 080819 // modified by lgh 100810 // void GetData(int &nCode, CString &sName, BOOL &bShowArea, BOOL &bMask, // BOOL &bShowUnit, BOOL &bShowOutline/*, BOOL &bHalArea*/); void GetData(CString &sCode, CString &sName, BOOL &bShowArea, BOOL &bMask, BOOL &bShowUnit, BOOL &bShowOutline, BOOL &bShowCode, BOOL &bShowName/*, BOOL &bHalArea*/); // add by ligh; CString GetCode(); CString GetName(); // modify by xly on 100909 支持真彩色 // sg add 081121,获取填充部分的数据,包括样式、颜色、比例、转角 // void GetHatch(BOOL &bHatch, CString &csStyle, int &nColor, // double &dScale, double &dAngle); void GetHatch(BOOL &bHatch, CString &csStyle, AcCmColor &nColor, double &dScale, double &dAngle); enum { IDD = IDD_HOUSE_SPACE }; CListBox m_listTexts; // int m_nCode; static CString m_csName;//modified by fxj 090605 套型编号改为有记忆功能的 static BOOL m_bMask; static BOOL m_bShowArea; static BOOL m_bShowUnit; static BOOL m_bShowOutline; static BOOL m_bCheckCode; // 是否标注户号 static BOOL m_bCheckName; // 是否标注套型编号 // static BOOL m_bHalArea; // delete by fxj 080819 // sg add 081119,与填充相关内容的数据 static BOOL m_bShowHatch; // 是否使用填充 static CString m_csHatch; // 填充样式 CHatchPreviewCtrl m_wndHatch; // Zyu modify on 100322,CAcUiColorComboBox换成CAcUiTrueColorComboBox控件 // Begin #if (ADS < 16) CAcUiColorComboBox m_ctlColor; #else CAcUiTrueColorComboBox m_ctlColor; #endif // End // modify by xly on 100909 支持真彩色 // static int m_nColor; // 填充颜色索引号 static AcCmColor m_cColor; // 填充颜色 static double m_dHatchScale; // 填充比例 static int m_nHatchAngle; // 填充转角 // sg add 090121 CSpinButtonCtrl m_angleSpin; // 角度 public: // sg add 081120 virtual BOOL DestroyWindow(); void UpdatePreview(); // 设置当前code为prevCode,用来做后续解析 void SetPrevCode(CString prevCode); // add by lgh // 移动下一个code void NextCode(); // add by lgh 100728 protected: virtual void DoDataExchange(CDataExchange* pDX); virtual void PostNcDestroy(); // sg add 081120 // 处理户号字符串返回下一个户号。 // 规则如下: // 纯数字:+1。 // XX-*:“-”后边如果只有一个字符,该字符+1,加到Z为止,“-”后边跟的如果是数字,数字+1 // 其他情况不处理(返回原输入) static CString DealNextCode(CString sCode); /// add by lgh on 100728 // 修改sCode,去除字符串前后的空格,去除横线两端的空格 static CString CheckCode(CString sCode); protected: virtual BOOL OnInitDialog(); afx_msg void OnClose(); // sg add 081120 afx_msg void OnClickHatch(); // 是否使用填充 afx_msg void OnStaticStyle(); // 选择填充效果 afx_msg void OnSelchangeComboColor(); // 切换填充颜色 // sg add 081202 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); // sg add 090122 afx_msg void OnChangeEditSpaceAngle(); afx_msg void OnKillFocusScale();//add by fxj 090426 afx_msg void OnClickArea(); //是否显示面积 add by fxj 090514 afx_msg void OnBnClickedChkCode(); afx_msg void OnBnClickedChkName(); DECLARE_MESSAGE_MAP() private: // 私有变量,Add by lgh static CString m_sPrevCode; // 先前的户号值,该值用来初始化当前的户号 }; BOOL CHouseAreaDlg::m_bMask = TRUE; BOOL CHouseAreaDlg::m_bShowArea = TRUE; // BOOL CHouseAreaDlg::m_bShowUnit = FALSE; // sg modify 081203 BOOL CHouseAreaDlg::m_bShowUnit = TRUE; BOOL CHouseAreaDlg::m_bShowOutline = TRUE; // BOOL CHouseAreaDlg::m_bHalArea = FALSE; // delete by fxj 080819 BOOL CHouseAreaDlg::m_bShowHatch = FALSE; // sg add 081120 CString CHouseAreaDlg::m_csHatch = _T("SOLID"); // sg add 081121 // add by xly on 10909 真彩色 //int CHouseAreaDlg::m_nColor = 256; // 默认Bylayer AcCmColor CHouseAreaDlg::m_cColor; // 默认Bylayer int CHouseAreaDlg::m_nHatchAngle = 0; double CHouseAreaDlg::m_dHatchScale = 100; CString CHouseAreaDlg::m_csName = _T("1-A");//add by fxj 090605 BOOL CHouseAreaDlg::m_bCheckCode = TRUE; // 默认的都标注,add by lgh BOOL CHouseAreaDlg::m_bCheckName = TRUE; CString CHouseAreaDlg::m_sPrevCode = _T("100");// 初始化 CHouseAreaDlg::CHouseAreaDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(CHouseAreaDlg::IDD, pParent) { // m_nCode = 101; } void CHouseAreaDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); // DDX_Text(pDX, IDC_CODE, m_nCode); DDX_Text(pDX, IDC_NAME, m_csName); DDX_Check(pDX, IDC_SPACE_MASK, m_bMask); DDX_Check(pDX,IDC_CHECK_DIMAREA, m_bShowArea); DDX_Check(pDX,IDC_CHECK_AREAUNIT, m_bShowUnit); DDX_Check(pDX, IDC_SHOW_OUTLINE, m_bShowOutline); // DDX_Check(pDX, IDC_HALAREA,m_bHalArea); // delete by fxj 080819 // sg add 081120 DDX_Check(pDX, IDC_CHECK_HATCH, m_bShowHatch); DDX_Control(pDX, IDC_STATIC_STYLE, m_wndHatch); DDX_Control(pDX, IDC_COMBO_COLOR, m_ctlColor); DDX_Text(pDX, IDC_EDIT_SCALE , m_dHatchScale); DDX_Text(pDX, IDC_EDIT_ANGLE, m_nHatchAngle); DDX_Control(pDX, IDC_SPIN_ANGLE, m_angleSpin); // sg add 090122 DDX_Check(pDX, IDC_CHK_NAME, m_bCheckName); DDX_Check(pDX, IDC_CHK_CODE, m_bCheckCode); } BEGIN_MESSAGE_MAP(CHouseAreaDlg, CModelessDialog) //{{AFX_MSG_MAP(CHouseAreaDlg) ON_WM_CLOSE() ON_BN_CLICKED(IDC_CHECK_HATCH, OnClickHatch) // sg add 081120 ON_BN_CLICKED(IDC_STATIC_STYLE, OnStaticStyle) ON_CBN_SELCHANGE(IDC_COMBO_COLOR, OnSelchangeComboColor) // sg add 081125 ON_WM_SETCURSOR() // sg add 081202 ON_EN_CHANGE(IDC_EDIT_ANGLE, OnChangeEditSpaceAngle) // sg add 090122 ON_EN_KILLFOCUS(IDC_EDIT_SCALE, OnKillFocusScale)//add by fxj 090426 ON_BN_CLICKED(IDC_CHECK_DIMAREA, OnClickArea)//add by fxj 090514 ON_BN_CLICKED(IDC_CHK_CODE, OnBnClickedChkCode) ON_BN_CLICKED(IDC_CHK_NAME, OnBnClickedChkName) //}}AFX_MSG_MAP END_MESSAGE_MAP() /* void CHouseAreaDlg::SetCode(int nCode) { m_nCode = nCode; UpdateData(FALSE); } */ ///////////////////////////////////////////////////////////////////////////// // CSpaceProperty message handlers BOOL CHouseAreaDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); m_angleSpin.SetRange(0, 360); // sg add 090122 XString sAngle = Angle2Str(m_nHatchAngle); // sg add 081215,角度精确度受控制 GetDlgItem(IDC_EDIT_ANGLE)->SetWindowText(sAngle); OnClickHatch(); // sg add 081120,设置“填充”部分是否可用 // 问题描述:选择颜色时只支持索引颜色一种,希望可以像CAD一样增加对真彩色和配色系统的支持。(TT10) // 解决方法:把CAcUiColorComboBox换成CAcUiTrueColorComboBox,并替换相应的函数 // 修改人,修改时间:Zyu modify on 100322 // Begin #if (ADS < 16) // modify by xly 真彩色的兼容,兼容为一个变量 // sg add 081121,设置“填充颜色” //int nItem = m_ctlColor.FindItemByColorIndex(m_nColor); int nTempColor = m_cColor.colorIndex(); int nItem = m_ctlColor.FindItemByColorIndex(nTempColor); #else // modify by xly on 100909 真彩色使用 /*AcCmColor clrTemp; clrTemp.setColorIndex(m_nColor); int nItem = m_ctlColor.FindItemByColor(clrTemp);*/ int nItem = m_ctlColor.FindItemByColor(m_cColor); #endif if (nItem < 0) { #if (ADS < 16) // modify by xly 真彩色的兼容,兼容为一个变量 //m_ctlColor.AddColorToMRU(m_nColor); //nItem = m_ctlColor.FindItemByColorIndex(m_nColor); m_ctlColor.AddColorToMRU(nTempColor); nItem = m_ctlColor.FindItemByColorIndex(nTempColor); #else // modify by xly on 100909 真彩色使用 /*m_ctlColor.AddColorToMRU(clrTemp); nItem = m_ctlColor.FindItemByColor(clrTemp);*/ m_ctlColor.AddColorToMRU(m_cColor); nItem = m_ctlColor.FindItemByColor(m_cColor); #endif } // End if (nItem >= 0) { m_ctlColor.SetCurSel(nItem); } // add by xly on 101213 设置房间对象的显示 TDbSpace Spce; Spce.SetSpaceDispMode(1); m_bCheckCode = Spce.IsDimCode(); m_bCheckName = Spce.IsDimName(); m_bShowArea = Spce.IsDimArea(); m_bShowUnit = Spce.IsDimUnit(); GetDlgItem(IDC_CODE)->SetWindowText(DealNextCode(m_sPrevCode)); // add by lgh on 100728 GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bShowArea);//add by fxj 090514 GetDlgItem(IDC_NAME)->EnableWindow(m_bCheckName); // add by lgh 100727 GetDlgItem(IDC_CODE)->EnableWindow(m_bCheckCode); // add by lgh 100727 UpdatePreview(); // sg add 081121,获取“填充样式” UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CHouseAreaDlg::OnClose() { if (m_bModeless) acedPostCommand(_T("\33\33")); else CModelessDialog::OnClose(); } // modified by fxj 080819 //void CHouseAreaDlg::GetData(int &nCode, CString &sName, BOOL &bShowArea, BOOL &bMask, // BOOL &bShowUnit, BOOL &bShowOutline/*, BOOL &bHalArea*/) void CHouseAreaDlg::GetData(CString &sCode, CString &sName, BOOL &bShowArea, BOOL &bMask, BOOL &bShowUnit, BOOL &bShowOutline, BOOL &bShowCode, BOOL &bShowName/*, BOOL &bHalArea*/) { UpdateData(TRUE); // nCode = m_nCode; GetDlgItem(IDC_CODE)->GetWindowText(sCode); sCode = CheckCode(sCode); sName = m_csName; bMask = m_bMask; bShowArea = m_bShowArea; bShowUnit = m_bShowUnit; bShowOutline = m_bShowOutline; // bHalArea = m_bHalArea; // delete by fxj 080819 bShowCode = m_bCheckCode; bShowName = m_bCheckName; } // add by ligh; CString CHouseAreaDlg::GetCode() { CString sCode; UpdateData(TRUE); GetDlgItem(IDC_CODE)->GetWindowText(sCode); return CheckCode(sCode); } CString CHouseAreaDlg::GetName() { UpdateData(TRUE); return m_csName; } // modify by xly 支持真彩色 // sg add 081121,获取填充部分的数据,包括样式、颜色、比例、转角 //void CHouseAreaDlg::GetHatch(BOOL &bHatch, CString &csStyle, int &nColor, // double &dScale, double &dAngle) void CHouseAreaDlg::GetHatch(BOOL &bHatch, CString &csStyle, AcCmColor &nColor, double &dScale, double &dAngle) { UpdateData(TRUE); // Zyu modify on 100322 // 把CAcUiColorComboBox换成CAcUiTrueColorComboBox后替换相应的函数 // Begin #if (ADS < 16) int nIndex = m_ctlColor.GetCurrentItemColorIndex(); // modify by xly 支持真彩色 nColor.setColorIndex(nIndex); #else // modify by xly 支持真彩色 //AcCmColor clrTemp; //m_ctlColor.GetCurrentItemColor(clrTemp); //int nIndex = clrTemp.colorIndex(); m_ctlColor.GetCurrentItemColor(nColor); #endif // End // modify by xly 支持真彩色 /*if (nIndex >= 0) { nColor = nIndex; }*/ bHatch = m_bShowHatch; csStyle = m_csHatch; dScale = m_dHatchScale; dAngle = m_nHatchAngle; } void CHouseAreaDlg::OnClickHatch() // sg add 081120,控制填充部分是否可编辑 { UpdateData(TRUE); GetDlgItem(IDC_STATIC_STYLE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_COMBO_COLOR)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_EDIT_SCALE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_EDIT_ANGLE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_SPIN_ANGLE)->EnableWindow(m_bShowHatch); // sg add 090122 UpdateData(FALSE); } void CHouseAreaDlg::OnClickArea()//add by fxj 090514 { m_bShowArea=!m_bShowArea; GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bShowArea); } void CHouseAreaDlg::OnStaticStyle() // sg add 081120,选择填充效果 { acDocManager->lockDocument(acDocManager->curDocument()); if (!AT_loaded(_T("tch_blklib"))) { int nRet = acrxLoadModule(_T("tch_blklib.arx"), Adesk::kTrue, true); if (!nRet) { acDocManager->unlockDocument(acDocManager->curDocument()); return; } } RBList rbCmd = ads_buildlist(RTSTR, _T("ITUAN"), RTSTR, (const TCHAR*)(m_csHatch), NULL); resbuf *rbRes = NULL; if (ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes) { if (rbRes && rbRes->restype==RTSTR) { m_csHatch = rbRes->resval.rstring; } ads_relrb(rbRes); } UpdatePreview(); acDocManager->unlockDocument(acDocManager->curDocument()); } void CHouseAreaDlg::UpdatePreview() // sg add 081120,填充效果预览 { if (m_csHatch.IsEmpty()) { m_csHatch = _T("SOLID"); } m_wndHatch.SetPattern(m_csHatch); // modify by xly on 10909 真彩色的使用 //m_wndHatch.SetColorPattern(m_nColor); m_wndHatch.SetColorPattern1(m_cColor); m_wndHatch.SetAngle(m_nHatchAngle); m_wndHatch.UpdateView(); } BOOL CHouseAreaDlg::DestroyWindow() { m_wndHatch.clearAll(); return CModelessDialog::DestroyWindow(); } void CHouseAreaDlg::PostNcDestroy() { m_wndHatch.clearAll(); CModelessDialog::PostNcDestroy(); } void CHouseAreaDlg::OnSelchangeComboColor() // sg add 081125,获取最新填充颜色,刷新m_nColor { UpdateData(TRUE); // Zyu modify on 100322 // 把CAcUiColorComboBox换成CAcUiTrueColorComboBox后替换相应的函数 // Begin #if ( ADS < 16 ) int nIndex = m_ctlColor.GetCurrentItemColorIndex(); // add by xly on 100909 真彩色使用 m_cColor.setColorIndex(nIndex); #else // modify by xly on 100909 真彩色使用 /*AcCmColor clrTemp; m_ctlColor.GetCurrentItemColor(clrTemp); int nIndex = clrTemp.colorIndex();*/ m_ctlColor.GetCurrentItemColor(m_cColor); #endif // End // modify by xly on 100909 真彩色使用,提前到(ADS < 16)使用 // GetCurrentItemColor不支持返回值,不做判断,都更新显示 //if (nIndex >= 0) //{ /*m_nColor = nIndex; m_wndHatch.SetColorPattern(m_nColor);*/ m_wndHatch.SetColorPattern1(m_cColor); m_wndHatch.UpdateView(); //} } BOOL CHouseAreaDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if (pWnd && (pWnd->m_hWnd == m_wndHatch.m_hWnd)) { CAcModuleResourceOverride vTemp; HCURSOR hIcon = AfxGetApp()->LoadCursor(IDC_CUR_PICK); SetCursor( hIcon ); return TRUE; } return CModelessDialog::OnSetCursor(pWnd, nHitTest, message); } void CHouseAreaDlg::OnChangeEditSpaceAngle() { CString csTemp; GetDlgItem(IDC_EDIT_ANGLE)->GetWindowText(csTemp); m_nHatchAngle = _ttoi(csTemp); UpdateData(FALSE); UpdatePreview(); } void CHouseAreaDlg::OnKillFocusScale()//add by fxj 090426 { UpdateData(TRUE); } void CHouseAreaDlg::OnBnClickedChkCode() { UpdateData(TRUE); GetDlgItem(IDC_CODE)->EnableWindow(m_bCheckCode); } void CHouseAreaDlg::OnBnClickedChkName() { UpdateData(TRUE); GetDlgItem(IDC_NAME)->EnableWindow(m_bCheckName); } // 设置当前code为prevCode,用来做后续解析 void CHouseAreaDlg::SetPrevCode(CString prevCode) { m_sPrevCode = prevCode; } void CHouseAreaDlg::NextCode() { GetDlgItem(IDC_CODE)->SetWindowText(DealNextCode(m_sPrevCode)); } CString CHouseAreaDlg::DealNextCode(CString sCode) { sCode.TrimLeft(); sCode.TrimRight(); if (sCode.IsEmpty()) return sCode; CString sRetString = sCode; int nLinePlace = sCode.Find(_T('-')); if (nLinePlace != -1) // 字符串中包含连字符 { if (nLinePlace < sCode.GetLength() - 1) // 不是最后一个数,才做处理 { CString strSuffixl = sCode.Mid(nLinePlace+1, sCode.GetLength() - nLinePlace); strSuffixl.TrimLeft(); // 去掉连字符左边的空格 if (IsDigital((LPCTSTR)strSuffixl)) { // 处理数字串的情况 int i = _ttoi(strSuffixl); strSuffixl.Format(_T("%d"), ++i); } else if (strSuffixl.GetLength() == 1) { const TCHAR &chNext = strSuffixl[0]; // 注意:这里没有处理 == Z的情况 if ( ((chNext >= 'a') && (chNext < 'z')) || ((chNext >= 'A') && (chNext < 'Z')) ) { strSuffixl = CString(TCHAR(chNext+1)); } } sRetString = sCode.Mid(0, nLinePlace) + _T("-") + strSuffixl; } } else { if (IsDigital((LPCTSTR)sCode)) // 纯数字 { int i = _ttoi(sCode); sRetString.Format(_T("%d"), ++i); } else { // 其他情况不处理 } } return CheckCode(sRetString); } // 处理连字符两侧的空格 CString CHouseAreaDlg::CheckCode(CString sCode) { sCode.TrimLeft(); sCode.TrimRight(); if (sCode.IsEmpty()) return _T(""); int nFind = sCode.Find(_T('-')); if (nFind > -1) { if (nFind == 0 || nFind == sCode.GetLength() - 1) return sCode; CString strPrefix = sCode.Mid(0, nFind); CString strSuffix = sCode.Mid (nFind + 1, sCode.GetLength()); strPrefix.TrimRight(); strSuffix.TrimLeft(); return strPrefix + _T("-") + strSuffix; } else return sCode; } // add by lgh. 该数值在拖动的时候,希望能够根据对话框更新数据 class TDragHouseAreaDbTextJig : public TDragDbTextJig { public: TDragHouseAreaDbTextJig(TDbSpace * space, CHouseAreaDlg *pDlg, BOOL bHole) ; virtual Adesk::Boolean update(); private: CHouseAreaDlg *m_pDlg; // add by lgh 100804, 用来实时更新当前的数据状态 BOOL m_bHole; }; TDragHouseAreaDbTextJig::TDragHouseAreaDbTextJig(TDbSpace * space, CHouseAreaDlg *pDlg, BOOL bHole) : TDragDbTextJig(space), m_pDlg(pDlg), m_bHole(bHole) { ASSERT(pDlg != NULL); } Adesk::Boolean TDragHouseAreaDbTextJig::update() { ASSERT(m_pDlg != NULL); ASSERT(m_tdbtext == NULL); ASSERT(m_tdspace != NULL); m_tdspace->m_ptLocation = m_ptPoint; m_pDlg->UpdateData(TRUE); CString sName, sCode; // delete by fxj 080819 BOOL bShowArea,bMask,bShowUnit,bShowOutline, bShowCode, bShowName/*,bHalArea*/; m_pDlg->GetData(sCode,sName,bShowArea,bMask,bShowUnit,bShowOutline, bShowCode, bShowName/*,bHalArea*/); BOOL bHatch; // sg add 081124 CString csHatch; AcCmColor cHatchColor; double dHatchAngle(0), dHatchScale(1); // modify by xly on 100909 真彩色的使用 // int nHatchColor(7); // m_pDlg->GetHatch(bHatch, csHatch, nHatchColor, dHatchScale, dHatchAngle); m_pDlg->GetHatch(bHatch, csHatch, cHatchColor, dHatchScale, dHatchAngle); if (m_bHole) { if (sName.Find(_T("含洞口"))==-1) sName+=_T("(含洞口)"); } m_tdspace->SetName(sName); m_tdspace->SetCode(sCode); m_tdspace->SetMask(bMask); m_tdspace->SetShowOutline(bShowOutline); // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 /* int nSpFlag = DocGetSpaceDispMode(); if (bShowArea) nSpFlag |= SPF_AREA; else nSpFlag &= ~SPF_AREA; if (bShowUnit) nSpFlag |= SPF_UNIT; else nSpFlag &= ~SPF_UNIT; if (bShowCode) nSpFlag |= SPF_CODE; else nSpFlag &= ~SPF_CODE; if (bShowName) nSpFlag |= SPF_NAME; else nSpFlag &= ~SPF_NAME; DocSetSpaceDispMode(nSpFlag); */ m_tdspace->SetDimNameAndCode(bShowName, bShowCode); m_tdspace->SetDimArea(bShowArea); m_tdspace->SetDimUnit(bShowUnit); m_tdspace->SetHasHatch(bHatch); // sg add 081124 m_tdspace->SetHatchStyle(csHatch); // modify by xly on 100909 支持真彩色 // m_tdspace->SetHatchColor(nHatchColor); m_tdspace->SetHatchTrueColor(cHatchColor); m_tdspace->SetHatchScale(dHatchScale); m_tdspace->SetHatchAngle(dHatchAngle*PI/180); return Adesk::kTrue; } ///////////////////////////////////////////////////// // 套内建筑面积 // by fxj void ApartmentArea() { //----------modified by fxj 080620------------- CAcModuleResourceOverride vTemp; CHouseAreaDlg dlg(acedGetAcadFrame()); if (!dlg.Create(CHouseAreaDlg::IDD, acedGetAcadFrame())) return; dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); PickSet ssSpace(SS_FREE); RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL); // int nCode = 101; while(1) { // dlg.SetCode(nCode); if (SelectEntities(_T("\n请选择同属一套住宅的所有房间面积对象与阳台面积对象:"), ssSpace, spaceMask)!=RTNORM) { dlg.DestroyWindow(); return; } //add by fxj ssSpace中找出阳台面积对象 PickSet ssBalcony(SS_FREE);//阳台 long n = ssSpace.Length(); for (long i=0; iGetType()==TDbSpace::kBalconyArea) ssBalcony += ent; OPENOBJ_END(); } long count = ssSpace.Length(); DualList lstWallId; // 套内墙体 for (i=0; im_lstWallEnclosure.Length(); i++) lstWallId.FindOrAddTail(*pSpace->m_lstWallEnclosure[i]); OPENOBJ_END(); } if (!lstWallId.IsEmpty()) // 得到套相关墙 { DList lstWalls; for (lstWallId.MoveToFirst();!lstWallId.IsOut();lstWallId.MoveToNext()) lstWalls.Append(new AcDbObjectId(lstWallId.GetCurData())); // 得到户墙上柱子 DualList lstColus; for (long i=0;iGetStartColumnId()); lstColus.FindOrAddTail(pWall->GetEndColumnId()); pWall->close(); // add by fxj 090222 } } DList lstColus1; for (lstColus.MoveToFirst();!lstColus.IsOut();lstColus.MoveToNext()) lstColus1.Append(new AcDbObjectId(lstColus.GetCurData())); // 找本户户墙的外轮廓 XSearchSpaceFromWall aSearch; try { aSearch.InitStart(lstWalls, lstColus1); } catch (...) { adsout << _T("\n搜索户墙外轮廓出现例外情况!"); continue; } //------------------------------------ XAecSpaceCell *extCell = aSearch.SearchSpaces(); if (extCell != NULL) // 成功找到户墙外轮廓 { // removed by lgh. 20101104 // 这些属性设置语句被删除掉,然后放到了jig中,可以达到实现更新的效果。 // CString sName, sCode; // delete by fxj 080819 // BOOL bShowArea,bMask,bShowUnit,bShowOutline/*,bHalArea*/; // dlg.UpdateData(TRUE);//add by fxj 090222 // dlg.GetData(nCode,sName,bShowArea,bMask,bShowUnit,bShowOutline/*,bHalArea*/); // dlg.GetData(sCode,sName,bShowArea,bMask,bShowUnit,bShowOutline,bShowOutline,bShowOutline/*,bHalArea*/); // BOOL bHatch; // sg add 081124 // CString csHatch; // int nHatchColor(7); // double dHatchAngle(0), dHatchScale(1); // modify by xly on 100909 真彩色的使用 //int nHatchColor(7); //dlg.GetHatch(bHatch, csHatch, nHatchColor, dHatchScale, dHatchAngle); // AcCmColor cHatchColor; // dlg.GetHatch(bHatch, csHatch, cHatchColor, dHatchScale, dHatchAngle); XPoly2D poly(1); extCell->GeomCenterPoly2D(poly); XPoint ptLoc; poly.Center(ptLoc); ptLoc.z = 0.0; TDbSpace *pDbSpace1 = new TDbSpace; //---------标注含洞口 by fxj 0900724--------- BOOL bHasHole=FALSE; for(long j=0;jGetType()==TDbSpace::kHoleArea) { bHasHole=TRUE; break; } OPENOBJ_END(); } // if (bHasHole) // { // if (sName.Find(_T("含洞口"))==-1) // sName+=_T("(含洞口)"); // } //-------------------------------------- // pDbSpace1->m_sName = sName; // CString sCode; // sCode.Format(_T("%d"),nCode); // pDbSpace1->m_sCode = sCode; pDbSpace1->SetType(TDbSpace::kHouseArea); // sg add 081226,增加房间类型 // pDbSpace1->SetMask(bMask); // pDbSpace1->SetHalfArea(bHalArea); // modifide by fxj 080702 // delete by fxj 080819 pDbSpace1->SetPathPoly(poly, AcGeVector3d::kZAxis); // add by fxj 080813 // pDbSpace1->SetHasHatch(bHatch); // sg add 081124 // pDbSpace1->SetHatchStyle(csHatch); // modify by xly on 100909 支持真彩色 //pDbSpace1->SetHatchColor(nHatchColor); // pDbSpace1->SetHatchTrueColor(cHatchColor); // pDbSpace1->SetHatchScale(dHatchScale); // pDbSpace1->SetHatchAngle(dHatchAngle*PI/180); AcDbObjectId idHatch = InitLayer(LAY_SPACE_HATCH); // modified by fxj 090609 pDbSpace1->SetHatchLayer(idHatch); // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 /* int nSpFlag = DocGetSpaceDispMode(); if (bShowArea) nSpFlag |= SPF_AREA; else nSpFlag &= ~SPF_AREA; if (bShowUnit) nSpFlag |= SPF_UNIT; else nSpFlag &= ~SPF_UNIT; if (dlg.IsDrawCode()) nSpFlag |= SPF_CODE; else nSpFlag &= SPF_CODE; if (dlg.IsDrawName()) nSpFlag |= SPF_NAME; else nSpFlag &= ~SPF_NAME; DocSetSpaceDispMode(nSpFlag);*/ // pDbSpace1->SetDimNameAndCode(dlg.m_bCheckName, dlg.m_bCheckCode); // pDbSpace1->SetDimArea(bShowArea); // pDbSpace1->SetDimUnit(bShowUnit); pDbSpace1->SetTextStyleId(InitTextStyle(TS_SPACE)); // pDbSpace1->SetRotation(Ucs2Wcs(0)); // ucs对齐 add by fxj 080813 pDbSpace1->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” pDbSpace1->setLayer(InitLayer(LAY_HOUSE_SPACE)); // pDbSpace1->SetShowOutline(bShowOutline); // ------add by fxj 080630---------------------------- // 更换为套内面积专用jig.达到实时更新的效果。 modify by lgh 20101104; // TDragDbTextJig jig(pDbSpace1); TDragHouseAreaDbTextJig jig(pDbSpace1, &dlg, bHasHole); jig.SetPrompt(_T("\n请点取面积标注位置<中心>:")); int iRet = jig.doIt(); AcDbObjectId id; if (iRet == RTNORM) { //pDbSpace1 = (TDbSpace*)jig.entity(); TDbSpace *pDbSpace2 = (TDbSpace*)jig.entity(); id=AddToModelSpace((TDbSpace*)(pDbSpace2->clone()),Adesk::kTrue); } else if (iRet == RTCAN) { if (pDbSpace1 != NULL) delete pDbSpace1; // add by fxj 080825 break; } else { TDbSpace *pDbSpace2 = (TDbSpace*)jig.entity(); pDbSpace2->m_ptLocation = ptLoc; id=AddToModelSpace((TDbSpace*)(pDbSpace2->clone()),Adesk::kTrue); } //---------------------------------- //add by fxj 090508 在阳台面积中记录其所属户的id,即套内面积的id if (id.isValid()) { for(long i=0;iSetHouseId(id); OPENOBJ_END(); } } // modify by lgh // 采用新的房号方式, // nCode++; dlg.SetPrevCode(dlg.GetCode()); dlg.NextCode(); } else { adsout << _T("\n这些墙不能构成封闭的区域!"); } } else//add by fxj 090223 break; } // add by fxj 080825 if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } //void ApartmentArea() //{ // PickSet ssWalls(SS_FREE); // //adsout << ; // g_ssPickFirst.Free(); // if (SelectEntities(_T("\n请选择构成一套房子的所有墙体(或门窗):"), ssWalls, RBList(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING"), NULL))!=RTNORM) // return; // MakeWallSet(ssWalls); // // DList lstColu; // GetEntFromBlockByDxf(lstColu, _T("TCH_COLUMN")); // // XSearchSpaceFromWall aSearch; // try { // aSearch.InitStart(ssWalls, lstColu); // }catch(...) { // adsout << /*UMSG*/_T("\n发生例外情况!"); // return ; // } // // XAecSpaceCell * extCell=aSearch.SearchSpaces(); // if (extCell) { // XPoly2D poly(1); // extCell->GeomCenterPoly2D(poly); // poly.SetElevation(0); // XScreenDc dc(1,1); // dc << poly; // // XString sText; // // //modified by whl on 061220,解决米单位绘图问题 // //sText<<_T("\n套内建筑面积(不含阳台)=") << _AS_SQMETER(poly.Area()); // sText<<_T("\n套内建筑面积(不含阳台)=") << _AS_SQMETER(poly.Area()); // // adsout<< sText; // if (YesNoQuestion(_T("\n是否生成封闭的多段线"))==Q_YES) // { // poly.Make(); // TDbText*pText=new TDbText; // sText<<_T("M^U2^U"); // pText->SetText(sText); // pText->SetHeight(3.5); // pText->SetStyleId(InitTextStyle(TS_SPACE)); // XPoint pt; // poly.Center(pt); // pText->SetLocation(pt); // pText->AddToCSpace(Adesk::kTrue); // } // } else { // adsout << _T("\n这些墙不能构成封闭的区域!"); // } // return ; //} // 面积累加 void PlusText() { RBList mask(RTDXF0, _T("TEXT,TCH_TEXT,TCH_SPACE"), NULL); PickSet ss(SS_FREE); if (SelectEntities(_T("\n请选择房间面积对象或面积数值文字:"), ss, mask)==RTNORM) { long lCount = ss.Length(); double nArea = 0.0; for (long i=0L; iisKindOf(AcDbText::desc())) nArea += _tstof(((AcDbText *)pEnt)->textString()); else if (pEnt->isKindOf(TDbText::desc())) nArea += _tstof(((TDbText *)pEnt)->GetText()); else if (pEnt->isKindOf(TDbSpace::desc())) { //modified by fxj 090414 TDbSpace *pSpace=(TDbSpace *)pEnt; if (pSpace!=NULL) { if (pSpace->IsHalfArea()) nArea += pSpace->m_nUseArea/2.0; else nArea += pSpace->m_nUseArea; //nArea += ((TDbSpace *)pEnt)->m_nUseArea; } } } OPENOBJ_END(); } // [11/15/2007 nsh] CString temp; temp.Format(_T("%.3f"),nArea); // -------------------------------- adsout << _T("\n共选中了") << lCount << _T("个对象, 求和结果=") << (LPTSTR)(LPCTSTR)temp;// [11/15/2007 nsh] // add by whl 0401001 PickSet ss(SS_FREE); ss.IncludeBegin(); XString sTemp; sTemp<<_T("面积总和=")<SetText(sTemp); pText->SetHeight(3.5); pText->SetStyleId(InitTextStyle(TS_SPACE)); pText->SetLocation(Ucs2Wcs(XPoint())); // [4/1/2008 nsh] pText->SetRotation(Ucs2Wcs(0)); // [4/1/2008 nsh] pText->AddToCSpace(Adesk::kTrue); ss.IncludeEnd(); extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal); if (DragMovePickSet(ss,_T("\n点取面积标注位置<退出>:"),XPoint(),XPoint())!=RTNORM) ss.Erase(); } } // 三维散水 void SanShui3d() { // sg modify 090225,支持M单位 // double nDist = fabs(nSanShuiDist); // double nElevDiff = DocGetElevDiff(); double nDist = _AS_SYS_UNIT(fabs(nSanShuiDist)); double nElevDiff = _AS_SYS_UNIT(DocGetElevDiff()); if (GetDist(_T("\n散水偏移外墙距离"), nDist, RSG_NOZERO|RSG_NONEG)==RTCAN || GetDist(_T("\n室内外高差"), nElevDiff, RSG_NONEG|RSG_NOZERO)==RTCAN) return; // DocSetElevDiff(nElevDiff); DocSetElevDiff(_AS_MM(nElevDiff)); // sg modify 090225 Entity ent; RBList mask(RTDXF0, _T("LWPOLYLINE,POLYLINE"), NULL); while(ent.FilterSelect(_T("\n选择一段二维散水线: "), mask)==RTNORM) { XPoly2D poly(ent); if (!poly || poly.TotalSegments()<1) { adsout << _T("\n请正确选择!"); } XPoint ptPick, ptRef = Wcs2Ucs(*poly.Head()); ads_getpoint(ptRef, _T("\n请点取最近的外墙的一侧: "), ptPick); ptPick = Ucs2Wcs(ptPick); XDirectionCurve cv; poly.Nth(0, cv); int nSide = cv.OnWhichSide(ptPick); double nFactor = nSide==OFFSET_RIGHT? 1.0 : -1.0; XPoly2D polyShape(1); XPoint ptVert; polyShape.AppendNode(ptVert); ptVert.x += nFactor*nDist; polyShape.AppendNode(ptVert); ptVert.y += 20*_UNIT_SCALE; polyShape.AppendNode(ptVert); ptVert.x = 0; ptVert.y = 10*_UNIT_SCALE; polyShape.AppendNode(ptVert); // TDbCurveMesh2 *pMesh = new TDbCurveMesh2; // poly.SetElevation(-nElevDiff); // pMesh->SetPathPoly(poly,pMesh->GetNormal()); // pMesh->SetShapePoly(polyShape); // pMesh->SetShapeBase(XPoint()); // pMesh->SetHas2D(TRUE); // pMesh->SetHasDivide2D(TRUE); // pMesh->SetHas3D(TRUE); // pMesh->setLayer(InitLayer(LAY_GROUND, FALSE)); // AddToModelSpace(pMesh, Adesk::kTrue); TDbApron *pApron = new TDbApron; // sg modify 090225,改用散水实体 poly.SetElevation(-nElevDiff); pApron->SetPathPoly(poly, pApron->GetNormal()); pApron->SetInHeight(_AS_SYS_UNIT(20)); pApron->SetOutHeight(_AS_SYS_UNIT(10)); pApron->SetAllDists(nDist); pApron->setLayer(InitLayer(LAY_GROUND, FALSE)); AddToModelSpace(pApron, Adesk::kTrue); ent.FreeGroups(); } } // Add by lcf on 20050822 // command:搜索房间 BOOL g_bGround = TRUE; BOOL g_bShield = TRUE; BOOL g_bBuildRoom = TRUE; // changed by fxj 080701 extern TARCH_IMPEXP BOOL g_bMakeExtSpace; extern TARCH_IMPEXP BOOL g_bIgnoreColumn; // modify by xly on 110413 支持字母数字连字符("-") //int g_nStartCode = 1001; CString g_csStartCode = _T("1001"); double g_dThick = 120; double g_dMinSpace = 0; // add by fxj 090617 最小面积 BOOL g_bMaxSpace = FALSE;// add by fxj 090617 有无最大面积限制 // modify by xly 100826 统一单位平方米 //double g_dMaxSpace = 90000000; // add by fxj 090617 最大面积 double g_dMaxSpace = 90; // add by fxj 090617 最大面积 class CSearchRoomDlg : public CModelessDialog { public: CSearchRoomDlg(CWnd* pParent = NULL); enum { IDD = IDD_SEARCH_ROOM }; CEdit m_editThick; CEdit m_editNumber; // BOOL m_bAreaUnit; // sg modify 081128 static BOOL m_bAreaUnit; // modify by xly on 101019 变为静态变量 //BOOL m_bDimArea; static BOOL m_bDimArea;// 是否标注面积 int m_nVisible; // modify by xly 0n 101101 变为静态变量 //BOOL m_bDimCode; // sg add 081118,是否标注房间编号、名称,替换原来的m_nVisible //BOOL m_bDimName; static BOOL m_bDimCode;// 是否标注房间编号 static BOOL m_bDimName;// 是否标注房间名 static BOOL m_bMarkWall; // sg add 081118,是否自动识别内外墙 protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() afx_msg void OnBnClickedCheckGround(); afx_msg void OnBnClickedExtSpace(); //del by fxj 090426 //afx_msg void OnEnChangeEditStartnumber(); //afx_msg void OnEnChangeEditThick();//add by fxj 090409 afx_msg void OnKillFocusThick();//add by fxj 090426 afx_msg void OnBnClickedCheckSpaceCode(); // sg add 081118 afx_msg void OnBnClickedCheckSpaceName(); afx_msg void OnClose();//add by fxj 090325 afx_msg void OnClickArea();//add by fxj 090519 }; BOOL CSearchRoomDlg::m_bMarkWall = TRUE; // sg add 081126 //changed by fxj 090601 BOOL CSearchRoomDlg::m_bAreaUnit = TRUE; // sg add 081128 // add by xly 0n 101019 为静态变量初始化 BOOL CSearchRoomDlg::m_bDimCode = FALSE; BOOL CSearchRoomDlg::m_bDimName = TRUE; BOOL CSearchRoomDlg::m_bDimArea = TRUE; CSearchRoomDlg::CSearchRoomDlg(CWnd* pParent) : CModelessDialog(CSearchRoomDlg::IDD, pParent) //, m_bAreaUnit(FALSE) // sg delete 081128,根据林工的意见修改默认值 //, m_bDimArea(TRUE) // delete by xly on 101101 房间面积为静态变量 , m_nVisible(0) { int nSpFlag = DocGetSpaceDispMode(); // delete by xly on 101101 房间面积为静态变量 // m_bDimArea = (nSpFlag&SPF_AREA)!=0; //// m_bAreaUnit = (nSpFlag&SPF_UNIT)!=0; // sg delete 081128 m_nVisible = (nSpFlag&SPF_CODE)!=0; //if ((nSpFlag&SPF_NAME_AND_CODE) != 0) // sg add 081118 //{ // m_bDimCode = TRUE; // m_bDimName = TRUE; //} //else if ((nSpFlag&SPF_CODE) != 0) //{ // m_bDimCode = TRUE; // m_bDimName = FALSE; //} //else //{ // m_bDimCode = FALSE; // m_bDimName = TRUE; //} } void CSearchRoomDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK_AREAUNIT, m_bAreaUnit); DDX_Check(pDX, IDC_CHECK_DIMAREA, m_bDimArea); DDX_Check(pDX, IDC_CHECK_GROUND, g_bGround); DDX_Check(pDX, IDC_EXT_SPACE, g_bMakeExtSpace); DDX_Check(pDX, IDC_CHECK_SHIELD, g_bShield); DDX_Check(pDX, IDC_NO_COLUMN, g_bIgnoreColumn); DDX_Radio(pDX, IDC_RADIO_NAME, m_nVisible); DDX_Control(pDX, IDC_EDIT_THICK, m_editThick); DDX_Text(pDX, IDC_EDIT_THICK, g_dThick); //DDX_Text(pDX, IDC_EDIT_STARTNUMBER, g_nStartCode); DDX_Text(pDX, IDC_EDIT_STARTNUMBER, g_csStartCode); DDX_Control(pDX, IDC_EDIT_STARTNUMBER, m_editNumber); DDX_Check(pDX, IDC_CHECK_SPACECODE, m_bDimCode); // sg add 081118 DDX_Check(pDX, IDC_CHECK_SPACENAME, m_bDimName); DDX_Check(pDX, IDC_CHECK_MARKWALL, m_bMarkWall); } BEGIN_MESSAGE_MAP(CSearchRoomDlg, CModelessDialog) ON_BN_CLICKED(IDC_CHECK_GROUND, OnBnClickedCheckGround) ON_BN_CLICKED(IDC_EXT_SPACE, OnBnClickedExtSpace) ON_BN_CLICKED(IDC_CHECK_SPACECODE, OnBnClickedCheckSpaceCode) // sg add 081118 ON_BN_CLICKED(IDC_CHECK_SPACENAME, OnBnClickedCheckSpaceName) //del by fxj 090426 //ON_EN_CHANGE(IDC_EDIT_STARTNUMBER, OnEnChangeEditStartnumber) //ON_EN_CHANGE(IDC_EDIT_THICK, OnEnChangeEditThick)//add by fxj 090409 ON_EN_KILLFOCUS(IDC_EDIT_THICK, OnKillFocusThick)//add by fxj 090426 ON_BN_CLICKED(IDC_CHECK_DIMAREA, OnClickArea)//add by fxj 090519 ON_WM_CLOSE()//add by fxj 090325 END_MESSAGE_MAP() extern int TARCH_IMPEXP g_nProductId; BOOL CSearchRoomDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); OnBnClickedCheckGround(); GetDlgItem(IDC_NO_COLUMN)->EnableWindow(g_bMakeExtSpace); // sg add 090319,节能软件中,强制识别内外 if (g_nProductId==kTBECN || g_nProductId==kTBECP) { m_bMarkWall = TRUE; GetDlgItem(IDC_CHECK_MARKWALL)->EnableWindow(FALSE); } // add by xly on 101210 设置房间对象的显示 TDbSpace Spce; Spce.SetSpaceDispMode(1); m_bDimCode = Spce.IsDimCode(); m_bDimName = Spce.IsDimName(); m_bDimArea = Spce.IsDimArea(); m_bAreaUnit = Spce.IsDimUnit(); GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bDimArea);//add by fxj 090519 UpdateData(FALSE); return TRUE; } void CSearchRoomDlg::OnBnClickedCheckGround() { CDataExchange dx(this, TRUE); DDX_Check(&dx, IDC_CHECK_GROUND, g_bGround); m_editThick.EnableWindow(g_bGround); } void CSearchRoomDlg::OnBnClickedExtSpace() { CDataExchange dx(this, TRUE); DDX_Check(&dx, IDC_EXT_SPACE, g_bMakeExtSpace); GetDlgItem(IDC_NO_COLUMN)->EnableWindow(g_bMakeExtSpace); } void CSearchRoomDlg::OnClickArea()//add by fxj 090519 { m_bDimArea=!m_bDimArea; GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bDimArea); } //void CSearchRoomDlg::OnEnChangeEditStartnumber() //{ // CString szText; // m_editNumber.GetWindowText(szText); // int nNumber = _ttoi(szText); // if (nNumber > 0) // g_nStartCode = nNumber; // else // {//add by fxj 090409 // this->MessageBox(_T("起始编号不能小于1!"),_T("AutoCAD"),MB_OK); // m_editNumber.SetFocus(); // } // CDataExchange dx1(this, FALSE); // DDX_Text(&dx1, IDC_EDIT_STARTNUMBER, g_nStartCode); //} //void CSearchRoomDlg::OnEnChangeEditThick()//add by fxj 090409 //{ // CString szText; // m_editThick.GetWindowText(szText); // double dThick = _tstof(szText); // if (dThick > 1E-6) // g_dThick = dThick; // else // { // this->MessageBox(_T("板厚需大于0!"),_T("AutoCAD"),MB_OK); // m_editThick.SetFocus(); // } // CDataExchange dx1(this, FALSE); // DDX_Text(&dx1, IDC_EDIT_THICK, g_dThick); //} void CSearchRoomDlg::OnKillFocusThick()//add by fxj 090426 { CString szText; m_editThick.GetWindowText(szText); double dThick = _tstof(szText); if (szText== _T("")||dThick<-1E-6) { //del by fxj 090513 //this->MessageBox(_T("板厚不能为空或负数!"),_T("AutoCAD"),MB_OK); //m_editThick.SetFocus(); } else g_dThick = dThick; CDataExchange dx1(this, FALSE); DDX_Text(&dx1, IDC_EDIT_THICK, g_dThick); } void CSearchRoomDlg::OnBnClickedCheckSpaceCode() // sg add 081118 { UpdateData(TRUE); // delete by xly 0n 101101 8.5需求房间名称和编号可以都不显示 /*if (!m_bDimCode) { m_bDimName = TRUE; }*/ UpdateData(FALSE); } void CSearchRoomDlg::OnBnClickedCheckSpaceName() // sg add 081118 { UpdateData(TRUE); // delete by xly 0n 101101 8.5需求房间名称和编号可以都不显示 /*if (!m_bDimName) { m_bDimCode = TRUE; }*/ UpdateData(FALSE); } void CSearchRoomDlg::OnClose()//add by fxj 090325 { if (m_bModeless) acedPostCommand(_T("\33")); else CModelessDialog::OnClose(); } //////////////////////////////////////////////// // 根据用户输入的房间编号csSpaceCode,分析判断编号规则,sg add 081209 // csFixed:编号中的固定部分 // nNum:可变数字部分,程序自动循环加1 // 特殊情况: // 1)最后1位是字母,如:101A,则固定部分在后,数字部分在前,设置bASCII为TRUE // 2)nNum部分首位有0,如:A001,则设置nZeroNum为对应的0的数量 void AnalysisSpaceCode(CString csSpaceCode, CString &csFixed, int &nNum, BOOL &bASCII, int &nZeroNum) { int nLeft(-1), // 固定部分长度 nLen = csSpaceCode.GetLength(); // 编号总长度 for (int i = nLen-1; i >= 0; i--) { if (!_istdigit(csSpaceCode.GetAt(i))) // 逆向查找,得到第1个非数字的位置 { bASCII = i == nLen-1; // 若最后1位是非数字,则bASCII为TRUE nLeft = bASCII?(i):(i+1); break; } } if (nLeft == -1) // 全部为数字,1001、1002、1003... { nLeft = 0; } else if (bASCII) // 数字部分在前,101A、102A、103A... { for (int j = 0; jm_ptLoc, ptLoc2 = space2->m_ptLoc; ads_matrix matRot; double dAngle = space1->m_dAngle; XPoint().GetRotationMatrix(dAngle, matRot); ptLoc1 = ptLoc1.TransformAs(matRot); // 坐标变化 ptLoc2 = ptLoc2.TransformAs(matRot); if (fabs(ptLoc1.y - ptLoc2.y) < _SPACE_DIST_SNAP) // Y坐标相等,比较X { if (fabs(ptLoc1.x - ptLoc2.x) < _SPACE_DIST_SNAP) // X坐标相等 { return 0; } if (ptLoc1.x > ptLoc2.x + _SPACE_DIST_SNAP) // X越大,编号越大 { return 1; } return -1; } if (ptLoc1.y > ptLoc2.y + _SPACE_DIST_SNAP) // Y坐标不等,只比较Y,Y越大,编号越大 { return 1; } return -1; } // 编号排序算法,sg add 081204 // ssSpace:待排序选择集,考虑方便“搜索房间”调用,使用选择集传入数据 // csCode:接收用户设置的编号,排序完成后,返回当前编号规则的下一编号,方便在同层、同楼分批排序 // dAnlge:X正向的角度,相当于设置了UCS // bYFirst:是否Y坐标优先于X坐标考虑,8.0不提供用户设置 // bXAxisSort、bYAxisSort:是否X、Y值越大,编号越大,8.0不提供用户设置 void SortSpace(PickSet &ssSpaces, CString &csCode, double dAngle = 0.0, BOOL bYFirst = TRUE, BOOL bXAxisSort = TRUE, BOOL bYAxisSort = TRUE) { DList lstSpaces; long lCount = ssSpaces.Length(); for (long l=0; lm_ptLocation; // sg add 090225,dAngle为当前坐标系,因此点应该转化为当前坐标系 pt = Wcs2Ucs(pt); AcDbObjectId id = pSpace->objectId(); TSpaceCode *pCodeSort = new TSpaceCode(-dAngle, id, pt); // 排序类 lstSpaces.Append(pCodeSort); // 1、构造排序链表 } OPENOBJ_END(); } lstSpaces.QuickSort(TSpaceCode::CompareYFistAndXYSort); // 2、排序 int nNum(0), // 编号中的数字部分,程序自动循环加1 nZeroNum(0); // nNum中开头部分0的数量 CString csFixed; // 编号中的固定部分 BOOL bASCII(FALSE); // 数字部分是否在固定部分之前 AnalysisSpaceCode(csCode, csFixed, nNum, bASCII, nZeroNum); // 3、分析用户输入的编号规则 int nCount = lstSpaces.Length(); for (int i=0; i<=nCount; i++) // 4、修改房间编号 { if (bASCII) // *1A、*2A、*3A...... { csCode = XString(_T("%d"), nNum++) + csFixed; } else // *1、*2、*3...... { switch(nZeroNum) { case 1: // *01、*02、*03...... csCode = csFixed + XString(_T("%02d"), nNum++); break; case 2: // *001、*002、*003...... csCode = csFixed + XString(_T("%03d"), nNum++); break; case 3: // *0001、*0002、*0003...... csCode = csFixed + XString(_T("%04d"), nNum++); break; default: csCode = csFixed + XString(_T("%d"), nNum++); break; } } if (i == nCount) { break; // 多循环一次,只为得到下一个编号 } AcDbObjectId id = lstSpaces[i]->m_id; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSpace, pSpace); if (pSpace != NULL) { pSpace->assertWriteEnabled(); // 通知实体可写 pSpace->SetCode(csCode); } OPENOBJ_END(); } } // command: 房间编号排序命令函数,sg add 081204 void SortSpaceCodeCmd() { g_ssPickFirst.Free(); double dAngle(0); // X轴的旋转角度 CString csFirstNum = _T("1001"); // 起始编号 RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL); while (1) { PickSet ssSpaces(SS_FREE); // 1、选择要排序的房间 if (SelectEntities(_T("\n请选择房间对象<退出>:"), ssSpaces, spaceMask) != RTNORM) { break; } PickSet ssOtherSpace(SS_FREE); // sg add 090225,仅保留普通房间对象进行排序 long count = ssSpaces.Length(); for (long i=0; iGetType(); // sg modify 090511,考虑节能需求,公摊面积、洞口面积参与排序 // if (nType != TDbSpace::kUseArea) if (nType!=TDbSpace::kUseArea && nType!=TDbSpace::kShareArea && nType!=TDbSpace::kHoleArea) ssOtherSpace += ent; } OPENOBJ_END(); } ssSpaces -= ssOtherSpace; XPoint ptBase; // UCS基点 CString csPrompt; // 2、获取X轴的旋转角度 int nRet = ads_getpoint(NULL, _T("\n指定UCS原点<使用当前坐标系>:"), ptBase); if (nRet == RTNORM) // 需要修改X轴的旋转角度,设置UCS { double dUserNum = dAngle; csPrompt.Format(_T("\n指定绕Z轴的旋转角度<%.0f>:"), dAngle*180/PI); // 角度制显示 nRet = ads_getangle(ptBase, csPrompt, &dUserNum); if ((nRet != RTNORM) && (nRet != RTNONE)) { break; } else if (nRet == RTNORM) { dAngle = dUserNum; } } else // 使用WCS { dAngle = 0; } XString sCode; csPrompt.Format(_T("\n起始编号<%s>:"), csFirstNum); nRet = acedGetString(TRUE, csPrompt, sCode); // 3、获取用户设置的房间编号 if (nRet != RTNORM) { break; } else if (sCode != _T("")) { csFirstNum = sCode; } // 8.5在此处增加用户设置X、Y坐标优先级,及排序原则等的询问 SortSpace(ssSpaces, csFirstNum, dAngle, TRUE, TRUE, TRUE); // 4、排序 } } int GetMaxCodeInOldSpaces() { RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL); PickSet ssSpaces(SS_FREE); // sg add 081226,首先搜索房间中,已有房间,获取最大编号 ssSpaces.Get(_T("X"), NULL, NULL, spaceMask); int nMaxNum(1000); long count = ssSpaces.Length(); for (long i=0; iGetCode(), csFixed; int nCurrentNum(0), nZeroNum(0); AnalysisSpaceCode(csCode, csFixed, nCurrentNum, bASCII, nZeroNum); if (nMaxNum < nCurrentNum) { nMaxNum = nCurrentNum; } } OPENOBJ_END(); } return ++nMaxNum; } // add by xly on 10413 添加解析房间编号的函数,支持字母数字连字符 // 解析编号中最后几位的数字递增 CString AnalySpaceCode(CString csCode) { int nSelf(0); CString csTemp(_T("")); if (IsDigital(csCode)) { nSelf = _ttoi(csCode); nSelf ++; csTemp.Format(_T("%d"),nSelf); return csTemp; } int nLen = csCode.GetLength(); CString csRet = _T(""), csLeft = _T(""), csRight = _T(""); int nFix(0); int nNum(0); // 倒遍历字符串,找到最后一组数字 for (int n=nLen-1;n>=0;n--) { TCHAR sChar = csCode.GetAt(n); if (sChar>=_T('0')&&sChar<=_T('9')) { if (nNum>0) { if (nFix-n==1) { nFix = n; csRet += sChar; nNum++; } } else { nFix = n; csRet += sChar; nNum++; } } } // 导致字符串 csRet.MakeReverse(); // 获得左右字符串 csLeft = csCode.Left(nFix); csRight = csCode.Right(nLen-csLeft.GetLength()-csRet.GetLength()); // 将尾部的数字数组递增 nSelf = _ttoi(csRet); nSelf ++; csTemp.Format(_T("%d"),nSelf); // 拼合字符串 csRet = csLeft; csRet += csTemp; csRet += csRight; return csRet; } //////////////////////////////////////////////// // command: 自动标房间面积 // 必须在WCS下 // TARCH_IMPEXP void SpaceArea() { // 一、add by fxj 090617,从文件中,获取最大、最小允许面积 XString sTchSpace; if (FindFile(_T("tchspace.ini"), sTchSpace)) { INI_struct *inis = NULL; if (CT_get_INIs(sTchSpace, _T("Space"), &inis)) { TCHAR *pMinSpace = CT_get_INI2(inis, _T("MinSpace")); if (pMinSpace) g_dMinSpace = _tstof(pMinSpace); TCHAR *pMaxSpace = CT_get_INI2(inis, _T("MaxSpace")); if (pMaxSpace) { CString sMaxSpace = pMaxSpace; if (sMaxSpace == _T("infinite")) // 不限制 g_bMaxSpace = FALSE; else { g_bMaxSpace = TRUE; g_dMaxSpace = _tstof(pMaxSpace); } } CT_free_INIs(inis); } } // modify by xly on 110413 支持字母数字连字符 // 二、sg add 081226,首先搜索房间中,已有房间,获取最大编号 //g_nStartCode = GetMaxCodeInOldSpaces(); g_csStartCode.Format(_T("%d"),GetMaxCodeInOldSpaces()); // 三、初始化对话框 CSearchRoomDlg dlg(acedGetAcadFrame()); { CAcModuleResourceOverride vTemp; if ( !dlg.Create(dlg.IDD, acedGetAcadFrame()) ) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); // 四、清空选择集,准备开始选择 g_ssPickFirst.Free(); RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL), // 该过滤表实际上未使用 wallMask(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING,TCH_SPACE"), NULL); PickSet ssSpaces(SS_FREE), ssWalls(SS_FREE), ssAllSpaces(SS_FREE); // sg add 081209,全部房间对象,包括选中的,和新生成的 { // sg add 100825,为提高搜索房间质量,强制将墙基线打开 int nVal = g_bShowBase; if (nVal == 0) // 双线 { DocSetShowBase(1); // 单双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } // modify by xly on 101104 修改搜索房间的命令行提示,与需求文档一致 // 说明第一次搜索的时候有<退出>,再次选择的时候没有; /*if (SelectEntities(_T("\n请选择构成一完整建筑物的所有墙体(或门窗): "), ssWalls, wallMask) != RTNORM) { dlg.DestroyWindow(); return; }*/ SelectEnts(_T("\n请选择构成一完整建筑物的所有墙体(或门窗)<退出>:"), _T("\n请选择构成一完整建筑物的所有墙体(或门窗):"), ssWalls, wallMask); if (ssWalls.Length()<1) { dlg.DestroyWindow(); // add by xly on 1026 解决搜索房间墙线不显示,如果退出搜索恢复墙体显示 if (nVal == 0) // 恢复双线显示 { DocSetShowBase(0); // 双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } return; } if (nVal == 0) // 恢复双线显示 { DocSetShowBase(0); // 双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } } // 五、过滤掉选中的“套内面积” PickSet ssOtherSpace(SS_FREE); long count = ssWalls.Length(); for (long i=0; iGetType(); // 获取房间类型 // chenged by fxj 090420 ssotherspace为套内面积 // if (nType!=TDbSpace::kUseArea && nType!=TDbSpace::kTotalArea) if (nType == TDbSpace::kHouseArea) ssOtherSpace += ent; else ssSpaces += ent; } OPENOBJ_END(); } if (ssSpaces.Length() > 0) // sg add 081209,获取选中的房间对象 { ssAllSpaces += ssSpaces; ssWalls -= ssSpaces; } if (ssOtherSpace.Length() > 0) // sg add 090225,过滤选中的套内面积 { ssWalls -= ssOtherSpace; } // 六、获取门窗所在墙,并过滤点矮墙和隔墙 MakeWallSet(ssWalls); // 七、更新对话框中的数据 dlg.UpdateData(); BOOL bDimArea = dlg.m_bDimArea; BOOL bAreaUnit = dlg.m_bAreaUnit; BOOL bGround = g_bGround; BOOL bShield = g_bShield; //int nVisible = dlg.m_nVisible;// delete by xly on 101111 没有使用 double dThick = g_dThick; BOOL bMarkWall = dlg.m_bMarkWall; // sg add 081118,增加识别内外 BOOL bDimCode = dlg.m_bDimCode; BOOL bDimName = dlg.m_bDimName; CString csFirstNum; // modify by xly on 110413 支持字母数字连字符 //csFirstNum.Format(_T("%d"), g_nStartCode); csFirstNum = g_csStartCode; dlg.DestroyWindow(); // 八、获得所有柱子对象 DList lstColu; GetEntFromBlockByDxf(lstColu, _T("TCH_COLUMN")); // add by xly on 100831,多轮廓搜索房间时,保存其他轮廓的墙体 PickSet ssOther(SS_FREE); // add by xly on 101012,修改当柱子在墙中时出现死循环提示,设置计数 int iNum = 1; // add by xly on 101104 用于记录用户是否在过程中,选择了放弃产生建筑面积对象; bool bDimTotalArea = true; // add by xly on 110302 增加变量控制是否为多轮廓 bool bHasOtherSpace(false); // 九、开始循环取得所有的闭合裁剪区域 // sg modify 100830,搜索区域内如果有被柱子完全遮挡的“小短墙”,自动从选择集中过滤掉 // 注:此处没有想出更好的办法,只能使用GOTO语句 SEARCHSPACE_LAB_BEGIN: XSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } catch(TSearchException e) { if (e.m_nHowToDo == HF_DELETE || e.m_nHowToDo == HF_MARK || e.m_nHowToDo == HF_NONE) { ssWalls -= e.m_idObj; // 从选择集中过滤掉“小短墙” goto SEARCHSPACE_LAB_BEGIN; } return; } catch(...) { adsout << /*UMSG*/_T("\n发生例外情况!"); return; } // 十、得到所有的闭合区域,extCell为最外轮廓 XAecSpaceCell *extCell = aSearch.SearchSpaces(); // modify by xly on 100901 对于多轮廓生成房间时,不管是否忽略柱子、是否生成建筑面积仍然区分多轮廓 XPoly2D polyOut; /* if (extCell!=NULL && g_bMakeExtSpace && g_bIgnoreColumn) { extCell->InternalPoly2D(polyOut, 0); } */ if (extCell!=NULL && g_bMakeExtSpace) // 生成建筑轮廓 { if (g_bIgnoreColumn) // 忽略柱子 { extCell->InternalPoly2D(polyOut, 0, 0); } else // 不忽略柱子 { extCell->InternalPoly2D(polyOut, 2); } } else if (!g_bMakeExtSpace) // 不生成建筑外轮廓 { extCell->InternalPoly2D(polyOut, 0, 0); } // 十一、 add by xly on 100831 添加多轮廓搜索房间 { ssOtherSpace.Free(); // 获得所有房间对象 int nLenSpaces = aSearch.spaces.Length(); // 房间对象的个数 for (int n = 0; nCenterPoly2D(polySpace); // 外轮廓与房间的轮廓做布尔交集运算,结果保存在lstPolyRest中 TDPtrList lstPolyRest; TchSubExport::Intersect(polyOut, polySpace, lstPolyRest); // 判断lstPolyRest的长度,如果长度为零,不存在交集属于两个轮廓 int nRetLen = lstPolyRest.Length(); if (nRetLen < 1) // 没有交集 { // 获得组成房间pSpace的所有的墙体 int nLenth = pSpace->Length(); for(int j = 0; jGetAt(j); ssOtherSpace += pSpaceWall->m_ent; } } } // 如果存在其他轮廓,重新搜索 nLenSpaces = ssOtherSpace.Length(); if (nLenSpaces > 0) { // 保存其他轮廓 ssOther += ssOtherSpace; // 删除不属于该轮廓的墙体 ssWalls -= ssOtherSpace; // modify by xly on 101012 修改当柱子在墙中时出现死循环提示 // goto SEARCHSPACE_LAB_BEGIN; if (ssWalls.Length() > 0) { goto SEARCHSPACE_LAB_BEGIN; } else // ssWalls中为空时,把本次添加都图面,然后跳出 { iNum++; if (iNum > 2) { return; } } } // 不生成建筑轮廓时,polyOut是空的 if (!g_bMakeExtSpace) { polyOut = NULL; } } // 十二、识别内外,add by whl on 060206 if (extCell!=NULL && bMarkWall) { aSearch.UpdateWallFlags(); XPoly2D poly(1); extCell->InternalPoly2D(poly, 0, 0); poly.SetElevation(0.0); // sg add 081118,全部墙的数组,识别内外用 AcDbObjectIdArray idWalls; ssWalls.AsIdArray(idWalls); // ssSpaces.Get(_T("X"), NULL, NULL, spaceMask); for (long i=0; iIsExternal()) { XCurveSegment lCurve, rCurve; pWall->GetSideCurve(lCurve, rCurve, 0.0, TRUE); XPoint ptMid = lCurve.MidPoint(); ptMid.z = 0; int iRet = ptMid&poly; if (iRet == PR_EDGE) // 左外 { pWall->SetExternal(0, TRUE); pWall->SetExternal(1, FALSE); } else // 右外 { pWall->SetExternal(0, FALSE); pWall->SetExternal(1, TRUE); } } pWall->close(); } } TArchCmdReactor::ResetAll(); } else if (bMarkWall) { adsout << _T("\n没有判别出内外墙!请使用指定内墙、指定外墙命令手动指定。"); } // 十三、处理普通房间对象,创建或更新几何关系 for (int n=0; n2) polySpace = polyOut; else pSpace->CenterPoly2D(polySpace); polySpace.SetElevation(0.0); // 投影到z=0的平面上 long lCount = !ssSpaces ? 0L : ssSpaces.Length(); PickSet ssInCell(SS_FREE|SS_CREATE); // 在当前SpaceCell中的DbSpace实体 // del by fxj 090610 套内面积内的非套内面积对象要进行更新 //-------------add by fxj 090420-------套内面积不进行更新 //BOOL bHouseArea=FALSE; //long lCountOther = !ssOtherSpace? 0L : ssOtherSpace.Length(); //for(long j=0L; jm_ptLocation; // ptLoc.z = 0.0; // if (pSpace == extCell) // 室外 // { // if ((ptLoc&polySpace) == PR_OUTSIDE) // { // bHouseArea=TRUE; // break; // } // } // else // { // if ((ptLoc&polySpace) == PR_INSIDE) // { // bHouseArea=TRUE; // break; // } // } //} //if (bHouseArea) // continue; //------------------------------------------------------ // add by xly 100830 与最大最小面积比较的时候用内墙的面积; // 房间的几何更新时,如果内墙面积小于最小值时删除不符合的标注 // 注:在最大值比较时,遵循原有情况:只提示,仍标出 // 如果房间面积有最大值限制,内墙面积大于最大面积,弹出提示“面积太大,越界!”可以标出面积 XPoly2D polySpaceInWall(1); pSpace->InternalPoly2D(polySpaceInWall, 1); polySpaceInWall.SetElevation(0.0); double dArea = polySpaceInWall.Area(); // add by xly 100826 统一单位平方米 dArea = _AS_SQMETER(dArea); // 保存房间更新时插上的不符合的房间对象 PickSet ssDel(SS_FREE); for (long i=0L; im_ptLocation; ptLoc.z = 0.0; if (pSpace == extCell) // 室外 { if ((ptLoc&polySpace) == PR_OUTSIDE) ssInCell += e; } else // 室内 { if ((ptLoc&polySpace) == PR_INSIDE) ssInCell += e; } } if (ssInCell.Length() == 1) // 更新房间的几何参数 { Entity e = ssInCell[0L]; XDbObject obj(e, AcDb::kForWrite); ASSERT(!!obj); // add by xly 100830 与最大最小面积比较的时候用内墙的面积; // 房间的几何更新时,如果面积小于最小临界值时删除不符合的标注,大于最大值是提示 if (dArea - g_dMinSpace < -1E-6) { ssDel += e; } if (g_bMaxSpace) { if (dArea - g_dMaxSpace > 1E-6) { AfxMessageBox(_T("面积太大,越界!")); } } TDbSpace *pDbSpace = TDbSpace::cast(obj.m_pObject); ASSERT(pDbSpace); pDbSpace->assertWriteEnabled(); // New Update // add by xly on 110303 更新房间对象是设置分数层为0 pDbSpace->SetStuccoThickness(0.0); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell && polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut, AcGeVector3d::kZAxis); } else // 创建房间 { if (ssInCell.Length()) // 找到不止一个符合更新条件的房间对象 ssInCell.Erase(); // delete by xly 100830 提到前面定义,方便房间更新几何参数时使用 // modify by xly 100827 与最大最小面积比较的时候用内墙的面积 // -------add by fxj 090617 面积太小过滤,面积太大给提示 // double dArea=polySpace.Area(); // double dArea = polySpaceInWall.Area(); // add by xly 100826 统一单位平方米 // dArea = _AS_SQMETER(dArea); // 创建房间时,如果面积小于最小临界值时不创建,大于最大值是提示 if (dArea - g_dMinSpace < -1E-6) continue; if (g_bMaxSpace) { if (dArea - g_dMaxSpace > 1E-6) { AfxMessageBox(_T("面积太大,越界!")); } } //------------------------------- // 创建新的房间对象 TDbSpace *pDbSpace = new TDbSpace(); XPoint ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; if ((ptLoc&polySpace) != PR_INSIDE) { XPoly polyTemp; polySpace.MapToPolygon(polyTemp, 20); if (!!polyTemp) { XPolygonEx polyTri(polyTemp); DList lstTri; if (polyTri.Trianglize(lstTri, TRUE)==RTNORM && !!lstTri) { XTriangle *pTri = lstTri[0]; ptLoc.x = (pTri->vertex1.x+pTri->vertex2.x+pTri->vertex3.x)/3.0; ptLoc.y = (pTri->vertex1.y+pTri->vertex2.y+pTri->vertex3.y)/3.0; } } } if (pSpace == extCell) // 建筑面积 { pDbSpace->m_sCode = _T("0"); // pDbSpace->m_sName =_T("建筑轮廓"); // _T("建筑面积"); //chenged by fxj 080620 pDbSpace->m_sName =_T("建筑面积"); // sg modify 090603,按照林工提出的意见,恢复建筑面积的名称 pDbSpace->SetHas3D(FALSE); // pDbSpace->SetRotation(Ucs2Wcs(0)); // [3/19/2008 nsh] pDbSpace->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” pDbSpace->SetType(TDbSpace::kTotalArea); // sg add 081226,设置房间类型 } else // 普通房间对象 { pDbSpace->m_sName = _T("房间"); // modify by xly on 110413 支持字母数字连字符 //pDbSpace->m_sCode = XString(_T("%d"), g_nStartCode); pDbSpace->m_sCode = g_csStartCode; pDbSpace->SetHas3D(bGround); pDbSpace->SetMask(bShield); pDbSpace->SetFloorThick(dThick); // pDbSpace->SetRotation(Ucs2Wcs(0)); // [3/19/2008 nsh] pDbSpace->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 //int nSpFlag = DocGetSpaceDispMode(); //if (bDimArea) // nSpFlag |= SPF_AREA; //else // nSpFlag &= ~SPF_AREA; //if (bAreaUnit) // nSpFlag |= SPF_UNIT; //else // nSpFlag &= ~SPF_UNIT; //// if (nVisible == 0) // sg modify 081118 //// nSpFlag &= ~SPF_CODE; //// else //// nSpFlag |= SPF_CODE; //if (bDimCode && bDimName) // 同时标注 //{ // nSpFlag &= ~SPF_CODE; // nSpFlag |= SPF_NAME_AND_CODE; //} //else //{ // nSpFlag &= ~SPF_NAME_AND_CODE; // if (bDimCode) // 标编号 // nSpFlag |= SPF_CODE; // else // 标名称 // nSpFlag &= ~SPF_CODE; //} //DocSetSpaceDispMode(nSpFlag); pDbSpace->SetDimNameAndCode(bDimName, bDimCode); pDbSpace->SetDimArea(bDimArea); pDbSpace->SetDimUnit(bAreaUnit); // modify by xly on 110413 支持字母数字连字符 //g_nStartCode ++; g_csStartCode = AnalySpaceCode(g_csStartCode); } pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); pDbSpace->SetHatchLayer(InitLayer(LAY_SPACE_HATCH)); // moidfied by fxj 090609,设置填充图层 pDbSpace->AddToMSpace(Adesk::kFalse); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace == extCell) // add by fxj 080630,设置图层 { pDbSpace->setLayer(InitLayer(LAY_BUILDING_SPACE)); } if (pSpace==extCell && polyOut.Length()>2) { pDbSpace->SetPathPoly(polyOut, AcGeVector3d::kZAxis); } pDbSpace->close(); if (pSpace != extCell) // sg add 081209,获取新生成的房间对象,过滤“建筑轮廓”,用于房间编号排序 { Entity entLast; entLast.GetLast(); ssAllSpaces += entLast; } } // add by xly 100830 与最大最小面积比较的时候用内墙的面积; // 房间的几何更新时,如果面积小于或者大于临界值时删除不符合的标注 ssDel.Erase(); } // 十四、房间编号排序 SortSpace(ssAllSpaces, csFirstNum); // 十五、add by xly on 100831 存在多轮廓搜索房间时,调整到整图显示,点选建筑轮廓的位置 if (ssOther.Length()>0 && g_bMakeExtSpace)// 存在多轮廓并且生成建筑面积 { bHasOtherSpace = true; // modify by xly on 110406 距中心位置比较大时zoom不正确 // // 对所有的框选对象整图显示 // PickSet ssTemp(SS_FREE); // ssTemp += ssWalls; // // // modify by xly on 101229 解决04以下平台ZOOM不支持o的操作 //#if (ADS == 16 || ADS == 15) // GEOAPI double g_nAcadVer; // if (g_nAcadVer>16.07)// 16版本中的05 06支持zoom对象 // { // acedCommand(RTSTR, _T("zoom"), RTSTR, _T("o"), RTPICKS, ssTemp.name, RTSTR, _T(""), RTNONE); // } // else // { // // 获得最后一个添加导数据库的对象,即房间对象 // ads_name ssName; // if(acdbEntLast(ssName) == RTNORM) // { // // 打开对象 // AcDbObjectId id; // acdbGetObjectId(id, ssName); // OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSpace, pSpace); // if (pSpace != NULL) // { // // 获得房间对象的轮廓 // XPoly2D polyPath; // AcGeVector3d normal; // pSpace->GetPathPoly(polyPath,normal); // // // 获得轮廓的外包盒 // XPoint ptL,ptUp; // polyPath.GetExtend(ptL, ptUp); // // // 调整到对象显示 // acedCommand(RTSTR, _T("zoom"), RTSTR, _T("w"), RT3DPOINT, &ptL, RT3DPOINT, &ptUp, RTNONE); // } // OPENOBJ_END(); // } // } //#else // acedCommand(RTSTR, _T("zoom"), RTSTR, _T("o"), RTPICKS, ssTemp.name, RTSTR, _T(""), RTNONE); //#endif // // add by xly on 101213 标注建筑面积的轮廓时,把红色虚线范围放大到全屏的0.7左右 // acedCommand(RTSTR, _T("zoom"), RTSTR, _T("s"), RTSTR, _T(".7x"), RTNONE); { if (extCell!=NULL ) { XAecSpaceCell *pSpace = extCell; XPoly2D polySpace(1); if (pSpace==extCell && polyOut.Length()>2) polySpace = polyOut; else pSpace->CenterPoly2D(polySpace); polySpace.SetElevation(0.0); // 投影到z=0的平面上 XPoint ptL,ptUp; polySpace.GetExtend(ptL, ptUp); ArxZoom(ptL, ptUp); acedCommand(RTSTR, _T("zoom"), RTSTR, _T("s"), RTSTR, _T(".7x"), RTNONE); } } } // 十六、产生建筑轮廓对象 // modify by xly on 101104 用户是否取消生成建筑面积 //if (extCell!=NULL && g_bMakeExtSpace) if (extCell!=NULL && g_bMakeExtSpace && bDimTotalArea) { XAecSpaceCell *pSpace = extCell; XPoly2D polySpace(1); if (pSpace==extCell && polyOut.Length()>2) polySpace = polyOut; else pSpace->CenterPoly2D(polySpace); polySpace.SetElevation(0.0); // 投影到z=0的平面上 long lCount = !ssSpaces? 0L : ssSpaces.Length(); PickSet ssInCell(SS_FREE|SS_CREATE); // 在当前SpaceCell中的DbSpace实体 for (long i=0L; im_ptLocation; ptLoc.z = 0.0; if (pSpace == extCell) // 室外 { // modified by fxj 090430 解决建筑轮廓线外面积对象丢失问题 if ((ptLoc&polySpace) == PR_OUTSIDE) { if (pDbSpace->GetType()==TDbSpace::kTotalArea) ssInCell += e; } } else // 室内 { if ((ptLoc&polySpace) == PR_INSIDE) ssInCell += e; } } if (ssInCell.Length() == 1) // 更新房间的几何参数 { Entity e = ssInCell[0L]; XDbObject obj(e, AcDb::kForWrite); ASSERT(!!obj); TDbSpace *pDbSpace = TDbSpace::cast(obj.m_pObject); ASSERT(pDbSpace); pDbSpace->assertWriteEnabled(); // New Update // add by xly on 110310 更新建筑面积设置粉刷层为0 pDbSpace->SetStuccoThickness(0.0); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell && polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut, AcGeVector3d::kZAxis); } else // 创建房间或建筑轮廓面积对象 { if (ssInCell.Length()) // 符合更新条件的面积对象不止一个的时候 ssInCell.Erase(); // -------add by fxj 090617 面积太小过滤,面积太大给提示 double dArea = polySpace.Area(); // add by xly 100826 统一单位平方米 dArea = _AS_SQMETER(dArea); if (dArea - g_dMinSpace < -1E-6) { // add by xly on 101213 解决标注完成后门窗对象虚显,更新显示 PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TCH_OPENING"), NULL)); UpdateGraphic(ss); return; } if (g_bMaxSpace) { if (dArea - g_dMaxSpace > 1E-6) { AfxMessageBox(_T("面积太大,越界!")); } } //------------------------------- XPoint ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; { // 凹房间,中心点不在区域内 int nCodeOfInput = RTNORM; XPoint extMin, extMax; polySpace.GetExtend(extMin, extMax); // extMin = Wcs2Ucs(extMin); // extMax = Wcs2Ucs(extMax); XTempZoomWindow vTemp1(extMin, extMax); ads_redraw(NULL,0); XScreenDc dc(1, 1); XPoly2D polyTemp; if (polyOut.Length() > 2) polyTemp = polyOut; else pSpace->InternalPoly2D(polyTemp, 2); polyTemp.TransUCS(Groups(0), Groups(1)); dc << polyTemp; while(1) { int nExpectRelation = (pSpace==extCell)? PR_OUTSIDE:PR_INSIDE; adsout << (pSpace!=extCell? _T("\n加亮的空间:") : _T("\n请点取建筑面积")) <<_T("的标注位置<退出>: "); nCodeOfInput = ads_getpoint(NULL, _T(""), ptLoc); ptLoc.z = 0.0; ptLoc = Ucs2Wcs(ptLoc); if (nCodeOfInput == RTNORM) { if ((ptLoc&polySpace) != nExpectRelation) { adsout << _T("\n请在空间区域内部点取!"); } else break; } else break; } // modify by xly on 101104 用户是否取消生成建筑面积 if (nCodeOfInput != RTNORM) //return; { if (ssOther.Length()>0) { bDimTotalArea = false; goto SEARCHSPACE_LAB_BEGIN; } // add by xly on 101213 解决标注完成后门窗对象虚显,更新显示 PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TCH_OPENING"), NULL)); UpdateGraphic(ss); return; } } // 创建建筑面积对象 TDbSpace *pDbSpace = new TDbSpace(); pDbSpace->m_sCode=_T("0"); // pDbSpace->m_sName = _T("建筑轮廓"); // _T("建筑面积"); // chenged by fxj 080620 pDbSpace->m_sName =_T("建筑面积"); // sg modify 090603,按照林工提出的意见,恢复建筑面积的名称 pDbSpace->SetHas3D(FALSE); pDbSpace->SetType(TDbSpace::kTotalArea); // sg add 081226,设置房间类型 pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); // pDbSpace->SetRotation(Ucs2Wcs(0)); // [3/19/2008 nsh] pDbSpace->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” pDbSpace->AddToMSpace(Adesk::kFalse); pDbSpace->setLayer(InitLayer(LAY_BUILDING_SPACE)); // add by fxj 080620 pDbSpace->SetHatchLayer(InitLayer(LAY_SPACE_HATCH)); // modified by fxj 090609 pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell && polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut, AcGeVector3d::kZAxis); pDbSpace->close(); Entity entLast; // sg add 081209 entLast.GetLast(); ssAllSpaces += entLast; } } // add by xly on 100831 存在多轮廓,继续搜索房间 if (ssOther.Length()>0) { ssWalls.Free(); ssWalls += ssOther; ssOther.Free(); // 清空排序选择集,每个轮廓中的房间独立排序 ssAllSpaces.Free(); goto SEARCHSPACE_LAB_BEGIN; } // modify by xly on 110302 修在多房间搜索时屏幕跳动的问题 //// add by xly on 101213 解决标注完成最后一个记住面积后调整到整体显示 // 获得最后一个添加导数据库的对象,即房间对象 //acedCommand(RTSTR,_T("zoom"),RTSTR,_T("e"),RTNONE); ads_name ssName; if (bHasOtherSpace) { if(acdbEntLast(ssName) == RTNORM) { // 打开对象 AcDbObjectId id; acdbGetObjectId(id, ssName); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbSpace, pSpace); if (pSpace != NULL) { // 获得房间对象的轮廓 XPoly2D polyPath; AcGeVector3d normal; pSpace->GetPathPoly(polyPath,normal); // 获得轮廓的外包盒 XPoint ptL,ptUp; polyPath.GetExtend(ptL, ptUp); // 调整到对象显示 acedCommand(RTSTR, _T("zoom"), RTSTR, _T("w"), RT3DPOINT, &ptL, RT3DPOINT, &ptUp, RTNONE); acedCommand(RTSTR, _T("zoom"), RTSTR, _T("s"), RTSTR, _T(".7x"), RTNONE); } OPENOBJ_END(); } } // add by xly on 101213 解决标注完成后门窗对象虚显,更新显示 PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TCH_OPENING"), NULL)); UpdateGraphic(ss); } // 节能专用 void SpaceArea1() { XPushMemVar vMem(g_bIgnoreColumn,FALSE); CSearchRoomDlg dlg(acedGetAcadFrame()); { CAcModuleResourceOverride vTemp; if ( !dlg.Create(IDD_SEARCH_ROOM1, acedGetAcadFrame()) ) return; } dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); g_ssPickFirst.Free(); PickSet ssSpaces(SS_FREE), ssWalls(SS_FREE); RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL), wallMask(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING,TCH_SPACE"), NULL); if (SelectEntities(_T("\n请选择构成一完整建筑物的所有墙体(或门窗):"), ssWalls, wallMask)!=RTNORM) { dlg.DestroyWindow(); return; } long count=ssWalls.Length(); for(long i=0;i lstColu; XPoly2D polyOut; XSearchSpaceFromWall aSearch; try { GetEntFromBlockByDxf(lstColu, _T("TCH_COLUMN")); aSearch.InitStart(ssWalls, lstColu); } catch(...) { adsout << /*UMSG*/_T("\n发生例外情况!"); return; } XAecSpaceCell * extCell=aSearch.SearchSpaces(); if (extCell!=NULL&&g_bMakeExtSpace&&g_bIgnoreColumn) extCell->InternalPoly2D(polyOut,0,0); for(int n=0; n2) polySpace=polyOut; else pSpace->CenterPoly2D(polySpace); polySpace.SetElevation(0.0); //投影到z=0的平面上 long lCount=!ssSpaces? 0L : ssSpaces.Length(); PickSet ssInCell(SS_FREE|SS_CREATE); //在当前SpaceCell中的DbSpace实体 for(long i=0L; im_ptLocation; ptLoc.z = 0.0; if (pSpace==extCell) { //室外 if ((ptLoc&polySpace)==PR_OUTSIDE) ssInCell += e; } else { if ((ptLoc&polySpace)==PR_INSIDE) ssInCell += e; } } if (ssInCell.Length()==1) { //更新房间的几何参数 Entity e=ssInCell[0L]; XDbObject obj(e, AcDb::kForWrite); ASSERT(!!obj); TDbSpace *pDbSpace=TDbSpace::cast(obj.m_pObject); ASSERT(pDbSpace); pDbSpace->assertWriteEnabled(); // New Update pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell&&polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut,AcGeVector3d::kZAxis); } else { //创建房间 if (ssInCell.Length()) ssInCell.Erase(); TDbSpace *pDbSpace = new TDbSpace(); XPoint ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; if ((ptLoc&polySpace)!=PR_INSIDE) { XPoly polyTemp; polySpace.MapToPolygon(polyTemp, 20); if (!!polyTemp) { XPolygonEx polyTri(polyTemp); DList lstTri; if (polyTri.Trianglize(lstTri, TRUE)==RTNORM && !!lstTri) { XTriangle *pTri=lstTri[0]; ptLoc.x=(pTri->vertex1.x+pTri->vertex2.x+pTri->vertex3.x)/3.0; ptLoc.y=(pTri->vertex1.y+pTri->vertex2.y+pTri->vertex3.y)/3.0; } } } if (pSpace==extCell) { pDbSpace->m_sCode=_T("0"); pDbSpace->m_sName = _T("外墙轮廓"); pDbSpace->SetHas3D(FALSE); } else { pDbSpace->m_sName = _T("房间"); // modify by xly on 110413 支持字母数字连字符 //pDbSpace->m_sCode=XString(_T("%d"), g_nStartCode); pDbSpace->m_sCode=g_csStartCode; pDbSpace->SetHas3D(bGround); pDbSpace->SetMask(bShield); pDbSpace->SetFloorThick(dThick); int nSpFlag=DocGetSpaceDispMode(); if (bDimArea) nSpFlag |= SPF_AREA; else nSpFlag &= ~SPF_AREA; if (bAreaUnit) nSpFlag |= SPF_UNIT; else nSpFlag &= ~SPF_UNIT; if (nVisible == 0) nSpFlag &= ~SPF_CODE; else nSpFlag |= SPF_CODE; DocSetSpaceDispMode(nSpFlag); // modify by xly on 110413 支持字母数字连字符 //g_nStartCode ++; g_csStartCode = AnalySpaceCode(g_csStartCode); } pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); pDbSpace->AddToMSpace(Adesk::kFalse); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell&&polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut,AcGeVector3d::kZAxis); pDbSpace->close(); } } if (extCell!=NULL&&g_bMakeExtSpace) { XAecSpaceCell *pSpace=extCell; XPoly2D polySpace(1); if (pSpace==extCell&&polyOut.Length()>2) polySpace=polyOut; else pSpace->CenterPoly2D(polySpace); polySpace.SetElevation(0.0); //投影到z=0的平面上 long lCount=!ssSpaces? 0L : ssSpaces.Length(); PickSet ssInCell(SS_FREE|SS_CREATE); //在当前SpaceCell中的DbSpace实体 for(long i=0L; im_ptLocation; ptLoc.z = 0.0; if (pSpace==extCell) { //室外 if ((ptLoc&polySpace)==PR_OUTSIDE) ssInCell += e; } else { if ((ptLoc&polySpace)==PR_INSIDE) ssInCell += e; } } if (ssInCell.Length()==1) { //更新房间的几何参数 Entity e=ssInCell[0L]; XDbObject obj(e, AcDb::kForWrite); ASSERT(!!obj); TDbSpace *pDbSpace=TDbSpace::cast(obj.m_pObject); ASSERT(pDbSpace); pDbSpace->assertWriteEnabled(); // New Update pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell&&polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut,AcGeVector3d::kZAxis); } else { //创建房间 if (ssInCell.Length()) ssInCell.Erase(); XPoint ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; { //凹房间,中心点不在区域内 int nCodeOfInput=RTNORM; XPoint extMin, extMax; polySpace.GetExtend(extMin, extMax); extMin=Wcs2Ucs(extMin); extMax=Wcs2Ucs(extMax); XTempZoomWindow vTemp1(extMin, extMax); ads_redraw(NULL,0); XScreenDc dc(1, 1); XPoly2D polyTemp; if (polyOut.Length()>2) polyTemp=polyOut; else pSpace->InternalPoly2D(polyTemp,2); polyTemp.TransUCS(Groups(0), Groups(1)); dc << polyTemp; while(1) { int nExpectRelation=(pSpace==extCell)? PR_OUTSIDE:PR_INSIDE; adsout << (pSpace!=extCell? _T("\n加亮的空间:") : _T("\n请点取外墙轮廓")) <<_T("的标注位置<退出>: "); nCodeOfInput=ads_getpoint(NULL, _T(""), ptLoc); ptLoc.z = 0.0; ptLoc=Ucs2Wcs(ptLoc); if (nCodeOfInput==RTNORM) { if ((ptLoc&polySpace)!=nExpectRelation) { adsout << _T("\n请在空间区域内部点取!"); } else break; } else break; } if (nCodeOfInput!=RTNORM) return; } TDbSpace *pDbSpace = new TDbSpace(); pDbSpace->m_sCode=_T("0"); pDbSpace->m_sName = _T("外墙轮廓"); pDbSpace->SetHas3D(FALSE); pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); pDbSpace->AddToMSpace(Adesk::kFalse); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace==extCell&&polyOut.Length()>2) pDbSpace->SetPathPoly(polyOut,AcGeVector3d::kZAxis); pDbSpace->close(); } } //识别内外,add by whl on 060206 if (extCell) { aSearch.UpdateWallFlags(); XPoly2D poly(1); extCell->InternalPoly2D(poly, 0, 0); poly.SetElevation(0.0); //对所有外墙设置内外特征 for(long i=0;iIsExternal()) { XCurveSegment lCurve,rCurve; pWall->GetSideCurve(lCurve,rCurve,0.0,TRUE); XPoint ptMid=lCurve.MidPoint(); ptMid.z=0; int iRet=ptMid&poly; if (iRet==PR_EDGE)//左外 { pWall->SetExternal(0,TRUE); pWall->SetExternal(1,FALSE); } else//右外 { pWall->SetExternal(0,FALSE); pWall->SetExternal(1,TRUE); } } pWall->close(); } } TArchCmdReactor::ResetAll(); } else adsout << _T("\n没有判别出内外墙!请使用指定内墙、指定外墙命令手动指定。"); } // Add by lcf on 20050823 // command:查询面积 struct tbButtom { UINT tbID; int BitmapID; int Style; }; // sg modify 081124增加有关填充部分的设置 class CSearchAreaDlg : public CModelessDialog { public: CSearchAreaDlg(CWnd* pParent = NULL); public: enum { IDD = IDD_SEARCH_AREA }; CEdit m_editThick; // BOOL m_bAreaUnit; // sg modify 081128 static BOOL m_bAreaUnit; // modify by xly on 101101支持编号和名称都不显示,设置为静态变量 // BOOL m_bDimArea; static BOOL m_bDimArea; // 是否标注面积 int m_nVisible; static int s_iMode; // add by fxj BOOL m_bUseEsc; // add by fxj // modify by xly on 101101支持编号和名称都不显示,设置为静态变量 // sg add 081119,是否标注房间编号、名称,替换原来的m_nVisible // BOOL m_bDimCode; // BOOL m_bDimName; static BOOL m_bDimCode; // 是否标注房间编号 static BOOL m_bDimName; // 是否标注房间名称 // add by lgh 100804,是否计一半面积 BOOL m_bHalfArea; // 当前界面值 static BOOL m_bHalfAreaBal; // 阳台当前值,默认勾选 static BOOL m_bHalfAreaOther; // 房间封闭曲线以及任意多边形采用这个默认值,默认不勾选 // sg add 081124,与填充相关内容的数据 static BOOL m_bShowHatch; // 是否使用填充 static CString m_csHatch; // 填充样式 CHatchPreviewCtrl m_wndHatch; // Zyu modify on 100322,CAcUiColorComboBox换成CAcUiTrueColorComboBox控件 // Begin #if (ADS < 16) CAcUiColorComboBox m_ctlColor; #else CAcUiTrueColorComboBox m_ctlColor; #endif // End // modify by xly on 100909 // 支持真彩颜色使用 //static int m_nColor; // 填充颜色索引号 static AcCmColor m_cColor; // 填充颜色 static double m_dHatchScale; // 填充比例 static int m_nHatchAngle; // 填充转角 // sg add 090121 CSpinButtonCtrl m_angleSpin; // 角度 public: CToolBarCtrl m_toolbar; tbButtom tbButtm[4]; public: // sg add 081124 virtual BOOL DestroyWindow(); void UpdatePreview(); protected: virtual void DoDataExchange(CDataExchange* pDX); virtual void PostNcDestroy(); // sg add 081124 virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() afx_msg void OnBnClickedCheckGround(); afx_msg void OnBnClickedCheckSpace(); afx_msg void OnClose(); //--------add by fxj--------- afx_msg void OnButtonRoom(); afx_msg void OnButtonPline(); afx_msg void OnButtonBalcony(); afx_msg void OnButtonDraw();//add by fxj 090206 afx_msg BOOL OnToolTipText( UINT, NMHDR * pNMHDR, LRESULT * pResult ); afx_msg void OnBnClickedCheckSpaceCode(); // sg add 081119 afx_msg void OnBnClickedCheckSpaceName(); // sg add 081120 afx_msg void OnClickHatch(); // 是否使用填充 afx_msg void OnStaticStyle(); // 选择填充效果 afx_msg void OnSelchangeComboColor(); // 切换填充颜色 afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); // sg add 081202 afx_msg void OnChangeEditSpaceAngle(); // sg add 090122 afx_msg void OnKillFocusScale();//add by fxj 090426 afx_msg void OnClickArea();//add by fxj 090514 afx_msg void OnKillFocusThick();//add by fxj 090521 afx_msg void OnBnClickedCheckHalfarea(); // add by lgh 100727 private: BOOL IsBalconyMode() {return s_iMode == 2;} }; int CSearchAreaDlg::s_iMode = 0; BOOL CSearchAreaDlg::m_bShowHatch = FALSE; // sg add 081124 CString CSearchAreaDlg::m_csHatch = _T("SOLID"); // sg add 081124 // modify by xly on 100909真彩色 //int CSearchAreaDlg::m_nColor = 256; // 默认Bylayer AcCmColor CSearchAreaDlg::m_cColor; // 默认Bylayer double CSearchAreaDlg::m_dHatchScale = 100; BOOL CSearchAreaDlg::m_bAreaUnit = TRUE; // sg add 081128 int CSearchAreaDlg::m_nHatchAngle = 0; // add by xly on 101101 初始化静态变量 BOOL CSearchAreaDlg::m_bDimName = TRUE; BOOL CSearchAreaDlg::m_bDimCode = FALSE; BOOL CSearchAreaDlg::m_bDimArea = TRUE; BOOL CSearchAreaDlg::m_bHalfAreaBal = TRUE; BOOL CSearchAreaDlg::m_bHalfAreaOther = FALSE; CSearchAreaDlg::CSearchAreaDlg(CWnd* pParent) : CModelessDialog(CSearchAreaDlg::IDD, pParent) //, m_bAreaUnit(FALSE) // sg delete 081128 //, m_bDimArea(TRUE) // delete by xly on 101101 静态变量 , m_nVisible(0) //, m_bHalfArea(FALSE) { int nSpFlag = DocGetSpaceDispMode(); // delete by xly on 101101 转化为静态变量 //m_bDimArea = (nSpFlag&SPF_AREA)!=0; // m_bAreaUnit = (nSpFlag&SPF_UNIT)!=0; m_nVisible = (nSpFlag&SPF_CODE)!=0; //-----------add by fxj-------- m_bUseEsc = TRUE; tbButtm[0].tbID = ID_ROOM_AREA; tbButtm[0].BitmapID = 0; tbButtm[0].Style = TBSTYLE_CHECKGROUP; tbButtm[1].tbID = ID_PLINE_AREA; tbButtm[1].BitmapID = 1; tbButtm[1].Style = TBSTYLE_CHECKGROUP; tbButtm[2].tbID = ID_BALCONY_AREA; tbButtm[2].BitmapID = 2; tbButtm[2].Style = TBSTYLE_CHECKGROUP; //add by fxj 090206 tbButtm[3].tbID = ID_DRAW_AREA; tbButtm[3].BitmapID = 3; tbButtm[3].Style = TBSTYLE_CHECKGROUP; // delete by xly on 101101 转化为静态变量 //if ((nSpFlag&SPF_NAME_AND_CODE) != 0) // sg add 081119 //{ // m_bDimCode = TRUE; // m_bDimName = TRUE; //} //else if ((nSpFlag&SPF_CODE) != 0) //{ // m_bDimCode = TRUE; // m_bDimName = FALSE; //} //else //{ // m_bDimCode = FALSE; // m_bDimName = TRUE; //} } void CSearchAreaDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK_AREAUNIT, m_bAreaUnit); DDX_Check(pDX, IDC_CHECK_DIMAREA, m_bDimArea); DDX_Check(pDX, IDC_CHECK_GROUND, g_bGround); DDX_Check(pDX, IDC_CHECK_SHIELD, g_bShield); DDX_Check(pDX, IDC_CHECK_BUILDROOM, g_bBuildRoom); DDX_Radio(pDX, IDC_RADIO_NAME, m_nVisible); DDX_Control(pDX, IDC_EDIT_THICK, m_editThick); DDX_Text(pDX, IDC_EDIT_THICK, g_dThick); if (!pDX->m_bSaveAndValidate) { m_toolbar.CheckButton(ID_ROOM_AREA, s_iMode==0); m_toolbar.CheckButton(ID_PLINE_AREA, s_iMode==1); m_toolbar.CheckButton(ID_BALCONY_AREA, s_iMode==2); m_toolbar.CheckButton(ID_DRAW_AREA, s_iMode==3); } DDX_Check(pDX, IDC_CHECK_SHOWAREACODE, m_bDimCode); // sg add 081119 DDX_Check(pDX, IDC_CHECK_SHOWAREANAME, m_bDimName); DDX_Check(pDX, IDC_CHECK_HATCH, m_bShowHatch); // sg add 081124 DDX_Control(pDX, IDC_STATIC_STYLE, m_wndHatch); DDX_Control(pDX, IDC_COMBO_COLOR, m_ctlColor); DDX_Text(pDX, IDC_EDIT_SCALE , m_dHatchScale); DDX_Text(pDX, IDC_EDIT_AREAANGLE, m_nHatchAngle); DDX_Control(pDX, IDC_SPIN_SPACEANGLE, m_angleSpin); // sg add 090122 DDX_Check(pDX, IDC_CHECK_HALFAREA, m_bHalfArea); } BEGIN_MESSAGE_MAP(CSearchAreaDlg, CModelessDialog) ON_BN_CLICKED(IDC_CHECK_GROUND, OnBnClickedCheckGround) ON_BN_CLICKED(IDC_CHECK_BUILDROOM,OnBnClickedCheckSpace) ON_WM_ACTIVATE() ON_WM_CLOSE() // ----add by fxj--------- ON_COMMAND(ID_ROOM_AREA, OnButtonRoom) ON_COMMAND(ID_PLINE_AREA, OnButtonPline) ON_COMMAND(ID_BALCONY_AREA, OnButtonBalcony) ON_COMMAND(ID_DRAW_AREA, OnButtonDraw)//add by fxj 090206 ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) ON_BN_CLICKED(IDC_CHECK_SHOWAREACODE, OnBnClickedCheckSpaceCode) // sg add 081119 ON_BN_CLICKED(IDC_CHECK_SHOWAREANAME, OnBnClickedCheckSpaceName) ON_BN_CLICKED(IDC_CHECK_HATCH, OnClickHatch) // sg add 081120 ON_BN_CLICKED(IDC_STATIC_STYLE, OnStaticStyle) ON_CBN_SELCHANGE(IDC_COMBO_COLOR, OnSelchangeComboColor) ON_WM_SETCURSOR() // sg add 081202 ON_EN_CHANGE(IDC_EDIT_AREAANGLE, OnChangeEditSpaceAngle) ON_EN_KILLFOCUS(IDC_EDIT_SCALE, OnKillFocusScale)//add by fxj 090426 ON_BN_CLICKED(IDC_CHECK_DIMAREA, OnClickArea)//add by fxj 090514 ON_EN_KILLFOCUS(IDC_EDIT_THICK, OnKillFocusThick)//add by fxj 090521 ON_BN_CLICKED(IDC_CHECK_HALFAREA, OnBnClickedCheckHalfarea) END_MESSAGE_MAP() BOOL CSearchAreaDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); m_angleSpin.SetRange(0, 360); // sg add 090122 XString sAngle = Angle2Str(m_nHatchAngle); // sg add 081215,角度精确度受控制 GetDlgItem(IDC_EDIT_AREAANGLE)->SetWindowText(sAngle); OnBnClickedCheckGround(); OnBnClickedCheckSpace(); // --------------add by fxj-------------- CAcModuleResourceOverride vTmp; m_toolbar.Create( WS_VISIBLE | WS_CHILD |CCS_BOTTOM| TBSTYLE_TOOLTIPS | CCS_ADJUSTABLE ,CRect(0,0,0,0),this, IDR_SEARCH_AREA); TBBUTTON *pIndex, *pRTF_Button = new TBBUTTON[4]; pIndex = pRTF_Button; for (long lIndex = 0; lIndex < 4; lIndex++) { memset(pIndex ,NULL, sizeof(TBBUTTON)); pIndex->iBitmap= tbButtm[lIndex].BitmapID; pIndex->idCommand = tbButtm[lIndex].tbID; pIndex->fsStyle = tbButtm[lIndex].Style; pIndex->fsState = TBSTATE_ENABLED; pIndex++; } CSize size(16, 15); m_toolbar.SetButtonSize(size); m_toolbar.AddButtons(4, pRTF_Button); delete[] pRTF_Button; m_toolbar.AddBitmap(4, IDR_SEARCH_AREA); m_toolbar.AutoSize(); m_wndToolTip.Create(this); m_wndToolTip.Activate(true); OnClickHatch(); // sg add 081124,设置“填充”部分是否可用 // 问题描述:选择颜色时只支持索引颜色一种,希望可以像CAD一样增加对真彩色和配色系统的支持。(TT10) // 解决方法:把CAcUiColorComboBox换成CAcUiTrueColorComboBox,并替换相应的函数 // 修改人,修改时间:Zyu modify on 100322 // Begin #if (ADS < 16) // modify by xly on 100909 真彩色的兼容,兼容为一个变量 // sg add 081124,设置“填充颜色” //int nItem = m_ctlColor.FindItemByColorIndex(m_nColor); int nTempClor = m_cColor.colorIndex(); int nItem = m_ctlColor.FindItemByColorIndex(nTempClor); #else /*AcCmColor clrTemp; clrTemp.setColorIndex(m_nColor); int nItem = m_ctlColor.FindItemByColor(clrTemp);*/ int nItem = m_ctlColor.FindItemByColor(m_cColor); #endif if (nItem < 0) { #if (ADS < 16) // modify by xly 真彩色的兼容,兼容为一个变量 //m_ctlColor.AddColorToMRU(m_nColor); //nItem = m_ctlColor.FindItemByColorIndex(m_nColor); m_ctlColor.AddColorToMRU(nTempClor); nItem = m_ctlColor.FindItemByColorIndex(nTempClor); #else // modify by xly on 100908 真彩色的使用 // m_ctlColor.AddColorToMRU(clrTemp); // nItem = m_ctlColor.FindItemByColor(clrTemp); m_ctlColor.AddColorToMRU(m_cColor); nItem = m_ctlColor.FindItemByColor(m_cColor); #endif } // End if (nItem >= 0) { m_ctlColor.SetCurSel(nItem); } m_bHalfArea = IsBalconyMode() ? m_bHalfAreaBal : m_bHalfAreaOther; // add by lgh 100804 UpdatePreview(); // sg add 081124,获取“填充样式” // add by xly on 101213 设置房间对象的显示 TDbSpace Spce; Spce.SetSpaceDispMode(1); m_bDimCode = Spce.IsDimCode(); m_bDimName = Spce.IsDimName(); m_bDimArea = Spce.IsDimArea(); m_bAreaUnit = Spce.IsDimUnit(); GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bDimArea);//add by fxj 090514 GetDlgItem(IDC_CHECK_HALFAREA)->EnableWindow(m_bDimArea);//add by lgh 100727 UpdateData(FALSE); return TRUE; } void CSearchAreaDlg::OnKillFocusThick()//add by fxj 090521 { CString szText; m_editThick.GetWindowText(szText); double dThick = _tstof(szText); if (szText== _T("")||dThick<-1E-6) { } else g_dThick = dThick; CDataExchange dx1(this, FALSE); DDX_Text(&dx1, IDC_EDIT_THICK, g_dThick); } void CSearchAreaDlg::OnBnClickedCheckSpace() { CDataExchange dx(this, TRUE); DDX_Check(&dx, IDC_CHECK_BUILDROOM, g_bBuildRoom); GetDlgItem(IDC_CHECK_SHOWAREANAME)->EnableWindow(g_bBuildRoom);//modified by fxj 090326 GetDlgItem(IDC_CHECK_SHOWAREACODE)->EnableWindow(g_bBuildRoom);//modified by fxj 090326 GetDlgItem(IDC_CHECK_HATCH)->EnableWindow(g_bBuildRoom);//add by fxj 090401 GetDlgItem(IDC_CHECK_GROUND)->EnableWindow(g_bBuildRoom); // GetDlgItem(IDC_CHECK_SHIELD)->EnableWindow(g_bBuildRoom);//add by lxb on 2011/11/25 GetDlgItem(IDC_EDIT_THICK)->EnableWindow(g_bBuildRoom&&g_bGround); //add by fxj 090512 GetDlgItem(IDC_STATIC_STYLE)->EnableWindow(g_bBuildRoom && m_bShowHatch); GetDlgItem(IDC_COMBO_COLOR)->EnableWindow(g_bBuildRoom && m_bShowHatch); GetDlgItem(IDC_EDIT_SCALE)->EnableWindow(g_bBuildRoom && m_bShowHatch); GetDlgItem(IDC_EDIT_AREAANGLE)->EnableWindow(g_bBuildRoom && m_bShowHatch); GetDlgItem(IDC_SPIN_SPACEANGLE)->EnableWindow(g_bBuildRoom && m_bShowHatch); } void CSearchAreaDlg::OnBnClickedCheckGround() { CDataExchange dx(this, TRUE); DDX_Check(&dx, IDC_CHECK_GROUND, g_bGround); m_editThick.EnableWindow(g_bGround); } void CSearchAreaDlg::OnClickArea()//add by fxj 090514 { m_bDimArea=!m_bDimArea; GetDlgItem(IDC_CHECK_AREAUNIT)->EnableWindow(m_bDimArea); GetDlgItem(IDC_CHECK_HALFAREA)->EnableWindow(m_bDimArea); // add by lgh 100727 } void CSearchAreaDlg::OnClose() { m_bUseEsc = TRUE; if (m_bModeless) acedPostCommand(_T("\33\33")); else CModelessDialog::OnClose(); } void CSearchAreaDlg::OnButtonRoom() { if (s_iMode == 0) return; UpdateData(TRUE); s_iMode = 0; m_bHalfArea = m_bHalfAreaOther; UpdateData(FALSE); m_bUseEsc = FALSE; acedPostCommand(_T("\33")); } void CSearchAreaDlg::OnButtonPline() { if (s_iMode == 1) return; UpdateData(TRUE); s_iMode = 1; m_bHalfArea = m_bHalfAreaOther; UpdateData(FALSE); m_bUseEsc = FALSE; acedPostCommand(_T("\33")); } void CSearchAreaDlg::OnButtonBalcony() { if (s_iMode == 2) return; UpdateData(TRUE); s_iMode = 2; m_bHalfArea = m_bHalfAreaBal; UpdateData(FALSE); m_bUseEsc = FALSE; acedPostCommand(_T("\33")); } void CSearchAreaDlg::OnButtonDraw() { if (s_iMode == 3) return; UpdateData(TRUE); s_iMode = 3; m_bHalfArea = m_bHalfAreaOther; UpdateData(FALSE); m_bUseEsc = FALSE; acedPostCommand(_T("\33")); } BOOL CSearchAreaDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult) { ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // if there is a top level routing frame then let it handle the message if (GetRoutingFrame() != NULL) return FALSE; // to be thorough we will need to handle UNICODE versions of the message also !! TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; // TCHAR szFullText[512]; CString strTipText; // Zyu modify on 100723,消除64位编译警告 //UINT nID = pNMHDR->idFrom; UINT nID = (UINT)pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { return FALSE; } if (nID != 0) // will be zero on a separator { { CAcModuleResourceOverride vTmp; strTipText.LoadString(nID); // =szFullText; } #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) { lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); } else { _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #else if (pNMHDR->code == TTN_NEEDTEXTA) { _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText)); } else { lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); } #endif *pResult = 0; // bring the tooltip window above other popup windows ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE| SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; } return TRUE; } void CSearchAreaDlg::OnBnClickedCheckSpaceCode() // sg add 081119 { UpdateData(TRUE); // delete by xly on 101101 8.5需求支持房间编号和名称都不显示 /*if (!m_bDimCode) { m_bDimName = TRUE; }*/ UpdateData(FALSE); } void CSearchAreaDlg::OnBnClickedCheckSpaceName() // sg add 081119 { UpdateData(TRUE); // delete by xly on 101101 8.5需求支持房间编号和名称都不显示 /*if (!m_bDimName) { m_bDimCode = TRUE; }*/ UpdateData(FALSE); } void CSearchAreaDlg::OnClickHatch() // sg add 081124,sg add 090122,控制填充部分是否可编辑 { UpdateData(TRUE); GetDlgItem(IDC_STATIC_STYLE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_COMBO_COLOR)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_EDIT_SCALE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_EDIT_AREAANGLE)->EnableWindow(m_bShowHatch); GetDlgItem(IDC_SPIN_SPACEANGLE)->EnableWindow(m_bShowHatch); UpdateData(FALSE); } void CSearchAreaDlg::OnStaticStyle() // sg add 081124,选择填充效果 { acDocManager->lockDocument(acDocManager->curDocument()); if (!AT_loaded(_T("tch_blklib"))) { int nRet = acrxLoadModule(_T("tch_blklib.arx"), Adesk::kTrue, true); if (!nRet) { acDocManager->unlockDocument(acDocManager->curDocument()); return; } } RBList rbCmd = ads_buildlist(RTSTR, _T("ITUAN"), RTSTR, (const TCHAR*)(m_csHatch), NULL); resbuf *rbRes = NULL; if (ads_invoke(rbCmd, &rbRes)==RTNORM && rbRes) { if (rbRes && rbRes->restype==RTSTR) { m_csHatch = rbRes->resval.rstring; } ads_relrb(rbRes); } UpdatePreview(); acDocManager->unlockDocument(acDocManager->curDocument()); } void CSearchAreaDlg::UpdatePreview() // sg add 081124,填充效果预览 { if (m_csHatch.IsEmpty()) { m_csHatch = _T("SOLID"); } m_wndHatch.SetPattern(m_csHatch); // modify by xly on 100908 真彩色的设置 //m_wndHatch.SetColorPattern(m_nColor); m_wndHatch.SetColorPattern1(m_cColor); m_wndHatch.SetAngle(m_nHatchAngle); m_wndHatch.UpdateView(); } BOOL CSearchAreaDlg::DestroyWindow() { m_wndHatch.clearAll(); return CModelessDialog::DestroyWindow(); } void CSearchAreaDlg::PostNcDestroy() { m_wndHatch.clearAll(); CModelessDialog::PostNcDestroy(); } void CSearchAreaDlg::OnSelchangeComboColor() // sg add 081124,获取最新填充颜色,刷新m_nColor { UpdateData(TRUE); // Zyu modify on 100322 // 把CAcUiColorComboBox换成CAcUiTrueColorComboBox后替换相应的函数 // Begin #if ( ADS < 16 ) // modify by xly on 100909 真彩色的设置兼容到一个变量m_cColor int nIndex = m_ctlColor.GetCurrentItemColorIndex(); m_cColor.setColorIndex(nIndex); #else // modify by xly on 100908 真彩色的设置 /*AcCmColor clrTemp; m_ctlColor.GetCurrentItemColor(clrTemp); int nIndex = clrTemp.colorIndex();*/ m_ctlColor.GetCurrentItemColor(m_cColor); #endif // End // modify by xly on 100908 真彩色的设置,提前到(ADS < 16)使用 // GetCurrentItemColor不支持返回值,不做判断,都更新显示 //if (nIndex >= 0) //{ /*m_nColor = nIndex; m_wndHatch.SetColorPattern(m_nColor);*/ m_wndHatch.SetColorPattern1(m_cColor); m_wndHatch.UpdateView(); //} } BOOL CSearchAreaDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if (pWnd && (pWnd->m_hWnd == m_wndHatch.m_hWnd)) { CAcModuleResourceOverride vTemp; HCURSOR hIcon = AfxGetApp()->LoadCursor(IDC_CUR_PICK); SetCursor( hIcon ); return TRUE; } return CModelessDialog::OnSetCursor(pWnd, nHitTest, message); } void CSearchAreaDlg::OnChangeEditSpaceAngle() { CString csTemp; GetDlgItem(IDC_EDIT_AREAANGLE)->GetWindowText(csTemp); m_nHatchAngle = _ttoi(csTemp); UpdateData(FALSE); UpdatePreview(); } void CSearchAreaDlg::OnKillFocusScale()//add by fxj 090426 { UpdateData(TRUE); } // add by lgh 100727 void CSearchAreaDlg::OnBnClickedCheckHalfarea() { UpdateData(TRUE); if (IsBalconyMode()) m_bHalfAreaBal = m_bHalfArea; else m_bHalfAreaOther = m_bHalfArea; } // add by lgh. 该数值在拖动的时候,希望能够根据对话框更新数据 class TDragSearchAreaDbTextJig : public TDragDbTextJig { public: TDragSearchAreaDbTextJig(TDbText * text, CSearchAreaDlg *pDlg, double dArea); TDragSearchAreaDbTextJig(TDbSpace * space, CSearchAreaDlg *pDlg); CSearchAreaDlg *m_pDlg; // add by lgh 100804, 用来实时更新当前的数据状态 double m_dArea; // 当前的全面积,用于拖动时,实时更新 Adesk::Boolean update(); }; TDragSearchAreaDbTextJig::TDragSearchAreaDbTextJig(TDbSpace * space, CSearchAreaDlg *pDlg) : TDragDbTextJig(space), m_pDlg(pDlg) { ASSERT(pDlg != NULL); } TDragSearchAreaDbTextJig::TDragSearchAreaDbTextJig(TDbText * text, CSearchAreaDlg *pDlg, double dArea) : TDragDbTextJig(text), m_pDlg(pDlg), m_dArea(dArea) { ASSERT(pDlg != NULL); } Adesk::Boolean TDragSearchAreaDbTextJig::update() { XPoint pt; pt = m_ptPoint; if (m_tdbtext==NULL) { m_tdspace->m_ptLocation=pt; m_tdspace->SetHalfArea(m_pDlg->m_bHalfArea); } else { XString sArea(256); double dHalf = m_pDlg->m_bHalfArea ? 0.5 : 1.0; // sArea << XString(_T("%.2f"), _AS_SQMETER(m_dArea * dHalf)); sArea << XString(_T("%.*f"), DocGetSpaceAreaPrecision(), _AS_SQMETER(m_dArea * dHalf));//add by lxb on 2011//11//28 if (m_pDlg->m_bAreaUnit) sArea << _T("m^U2^U"); pt.y-=m_tdbtext->GetHeight(FALSE)/2; m_tdbtext->SetLocation(pt); m_tdbtext->SetText(sArea); } return Adesk::kTrue; } // Add by lcf On 20050824 #include "edjigex.h" extern TARCH_IMPEXP BOOL g_bFindExtSpace; // 建筑面积不计算柱子 void SearchSpaceEx(PickSet &ssWalls,const DList &lstColu,DList &res) { //add by lgy 20120223 当图中存在完全包含在柱内的短墙时,查询面积命令无法正常执行 //此处添加一goto语句的标记 SEARCHSPACE_LAB_BEGIN: XSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } //add by lgy 20120223 当图中存在完全包含在柱内的短墙时,查询面积命令无法正常执行 catch(TSearchException e) { if (e.m_nHowToDo == HF_DELETE || e.m_nHowToDo == HF_MARK || e.m_nHowToDo == HF_NONE) { ssWalls -= e.m_idObj; // 从选择集中过滤掉“小短墙” goto SEARCHSPACE_LAB_BEGIN; } return ; } catch (...) { adsout << /*UMSG*/_T("\n发生例外情况!"); return; } XAecSpaceCell *extCell = aSearch.SearchSpaces(); TDbSpace *pDbExtSpace = NULL; for (int n=0; nCenterPoly2D(polySpace); polySpace.SetElevation(0.0); //投影到z=0的平面上 XPoint ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; if ((ptLoc&polySpace) != PR_INSIDE) { XPoly polyTemp; polySpace.MapToPolygon(polyTemp, 20); if (!!polyTemp) { XPolygonEx polyTri(polyTemp); DList lstTri; if ( polyTri.Trianglize(lstTri, TRUE)==RTNORM && !!lstTri) { XTriangle *pTri = lstTri[0]; ptLoc.x = (pTri->vertex1.x+pTri->vertex2.x+pTri->vertex3.x)/3.0; ptLoc.y = (pTri->vertex1.y+pTri->vertex2.y+pTri->vertex3.y)/3.0; } } } TDbSpace *pDbSpace = new TDbSpace; pDbSpace->m_sName = _T("房间"); pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); pDbSpace->UpdateFrom(*pSpace, pSpace==extCell); if (pSpace == extCell) { pDbExtSpace = pDbSpace; // pDbExtSpace->m_sName = _T("建筑轮廓"); // 建筑面积-〉建筑轮廓 changed by fxj 080620 pDbExtSpace->m_sName =_T("建筑面积"); // sg modify 090603,按照林工提出的意见,恢复建筑面积的名称 pDbExtSpace->SetType(TDbSpace::kTotalArea); // sg add 081226,设置房间类型 pDbExtSpace->setLayer(InitLayer(LAY_BUILDING_SPACE)); // add by fxj 080620 pDbExtSpace->m_sCode = _T("0"); XPoly2D polyExt; extCell->InternalPoly2D(polyExt, 0, 0); pDbExtSpace->SetPathPoly(polyExt, AcGeVector3d::kZAxis); } else res.Append(pDbSpace); } if (pDbExtSpace != NULL) res.Append(pDbExtSpace); } //////////////////////////////////////////////////////////////// // 查询面积 class TAskSpAreaJig : public TSymbEdJig { public: DList m_allSpace; TDbSpace m_space; long m_iCurSpace; BOOL m_bESC; CSearchAreaDlg *m_pDlg; // sg add 090226 public: // TAskSpAreaJig(); // sg modify 090226 TAskSpAreaJig(CSearchAreaDlg *pDlg); virtual DragStatus GetPoint(XPoint &pt); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const{return (AcDbEntity*)&m_space;}//ok const TDbSpace* GetPickSpace()const{return !m_allSpace?NULL:&m_allSpace[m_iCurSpace];}//ok }; // TAskSpAreaJig::TAskSpAreaJig() // sg modify 090226 TAskSpAreaJig::TAskSpAreaJig(CSearchAreaDlg *pDlg) :m_pDlg(pDlg) { m_bESC = FALSE; // add by fxj RBList wallMask(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL"), NULL); PickSet ssWalls(SS_FREE); // modify by xlc on 071225 // 添加搜索范围 // ssWalls.Get(_T("X"), NULL, NULL, wallMask); // CAcModuleResourceOverride vTemp; // CSearchRangeDlg dlg; // dlg.m_strType = _T("TCH_WALL,TCH_CURTAIN_WALL"); // if (dlg.DoModal()== IDOK) // { // ssWalls += dlg.m_ssEnt; // } { // xly add 100826,为提高搜索房间质量,强制将墙基线打开 int nVal = g_bShowBase; if (nVal == 0) // 双线 { DocSetShowBase(1); // 单双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } // [12/26/2007 nsh] // ------------------------------begin---------------------------- adsout << _T("\n提示: 空选即为全选!"); int r = SelectEntities(_T("\n请选择查询面积的范围:"),ssWalls, wallMask); //modified by fxj 090224 if (r == RTCAN) // modified by fxj 090426 { m_bESC = TRUE; // add by xly on 1026 解决搜索房间墙线不显示,如果退出搜索恢复墙体显示 if (nVal == 0) // 恢复双线显示 { DocSetShowBase(0); // 双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } return; } else if (r != RTNORM) { ssWalls.Get(_T("X"), NULL, NULL, wallMask); } //-------------------------------end----------------------------- if (nVal == 0) // 恢复双线显示 { DocSetShowBase(0); // 双线显示 PickSet ssTmpWall(SS_FREE); if (GetEntByDxf(ssTmpWall, _T("TCH_WALL,TCH_CURTAIN_WALL"), 1) == Acad::eOk) { UpdateGraphic(ssTmpWall); } } } //过滤隔断 add by fxj 090629 PickSet ssDiv; for(long i=0;iGetStyle()==TWallData::kDivider&&pWall->GetUsageFlag()==TWallData::kApartment) ssDiv+=ent; } OPENOBJ_END(); } ssWalls-=ssDiv; DList lstColu; GetEntFromBlockByDxf(lstColu, _T("TCH_COLUMN")); SearchSpaceEx(ssWalls,lstColu,m_allSpace); m_iCurSpace = m_allSpace.Length()-1; m_space.setColorIndex(1); m_space.SetShowOutline(TRUE); m_space.SetTextStyleId(InitTextStyle(TS_SPACE)); } // 反馈 AcEdJig::DragStatus TAskSpAreaJig::GetPoint(XPoint &pt) { return acquirePoint(pt); } // 更新实体数据 Adesk::Boolean TAskSpAreaJig::update() { XPoint ptPick = m_ptResult; m_space.m_ptLocation = m_ptResult; m_pDlg->UpdateData(TRUE); m_space.SetHasHatch(m_pDlg->m_bShowHatch); // sg add 090226 // modify by xly 支持真彩色的使用 //m_space.SetHatchColor(m_pDlg->m_nColor); m_space.SetHatchTrueColor(m_pDlg->m_cColor); m_space.SetHatchStyle(m_pDlg->m_csHatch); m_space.SetHatchScale(m_pDlg->m_dHatchScale); m_space.SetHatchAngle(m_pDlg->m_nHatchAngle*PI/180); m_space.SetHalfArea(m_pDlg->m_bHalfArea); AcDbObjectId idHatch = InitLayer(LAY_SPACE_HATCH);//modified by fxj 090609 m_space.SetHatchLayer(idHatch); double minArea = -1; for (long i=0;iGetPathPoly(poly,vt); if ((ptPick&poly) == PR_INSIDE) { if (minArea<0 || poly.Area():"); // // int nCode; // nCode=ads_getpoint(NULL, _T(""), ptStart); // // if (nCode==RTNORM) // break; // else // return nCode; // // } // // // XPoint pt2; // XScreenDc dc; // dc.m_nDrawMode=1; // DStack aStack; // aStack.Push(new XPoint(ptStart)); // while(1) // { // XPoint &ptFrom=*aStack.Top(); // if (aStack.Length()>=3) // adsout << _T("\n下一点或 [回退(U)]<封闭>: "); // else // adsout << _T("\n下一点或 [回退(U)]<退出>: "); // int rc; // INITGET_BEG(0, _T("U")); // rc=ads_getpoint(ptFrom, _T(""), pt2); // INITGET_END(); // if (rc==RTCAN) // { // aStack.Reset(); // return rc; // } // else if (rc==RTKWORD) // { // if (*aStack.Top() != ptStart) {// Not on first state // XPoint *pPt2 = aStack.Pop(); // XPoint *pPt1 = aStack.Top(); // dc.SetColor(-1); // dc << XLine(*pPt1, *pPt2); // delete pPt2; // // } // } // else // { // if (rc==RTNONE) // { // if (aStack.Length()<3) // return RTERROR; // else // pt2=ptStart; // } // XLine ln(*aStack.Top(), pt2); // if (ln.Length()>_DIST_SNAP) // { // dc.SetColor(7); // dc << ln; // if (!(rc==RTNONE)) // aStack.Push(new XPoint(pt2)); // else break; // } // } // } // poly2d.Reset(); // XPoint *ptCur=NULL; // while((ptCur=aStack.Pop())!=NULL) // { // poly2d.AppendNode(*ptCur); // delete ptCur; // } // poly2d.Compress(); // if (!poly2d || poly2d.Length()<3) // return RTERROR; // // // for(long i=0;iSetFocus(); while(1) // add by fxj { dlg.UpdateData(); dlg.m_bUseEsc = TRUE; // add by fxj // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 // int nSpFlag = DocGetSpaceDispMode(); // if (dlg.m_bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (dlg.m_bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // //// if (dlg.m_nVisible == 0) // sg modify 081119 //// nSpFlag &= ~SPF_CODE; //// else //// nSpFlag |= SPF_CODE; // if (dlg.m_bDimCode && dlg.m_bDimName) // 同时标注 // { // nSpFlag &= ~SPF_CODE; // nSpFlag |= SPF_NAME_AND_CODE; // } // else // { // nSpFlag &= ~SPF_NAME_AND_CODE; // if (dlg.m_bDimCode) // 标编号 // nSpFlag |= SPF_CODE; // else // 标名称 // nSpFlag &= ~SPF_CODE; // } // DocSetSpaceDispMode(nSpFlag); if (dlg.s_iMode == 0) { // TAskSpAreaJig jig(); // sg modify 090226 TAskSpAreaJig jig(&dlg); if (jig.m_bESC) { if (dlg.m_bUseEsc) break; else continue; } BOOL bDistub = FALSE; // add by fxj 080702 while(1) //add by fxj 080702 { jig.SetPrompt(_T("\n请在屏幕上点取一点<返回>:")); // jig.m_space.SetRotation(Ucs2Wcs(0)); // add by fxj 080813 与ucs对齐 jig.m_space.SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” int nRet = jig.DoIt(/*&nKeyIdx*/); dlg.UpdateData(TRUE); if (nRet == RTNORM) { const TDbSpace* pDbSpacePick = jig.GetPickSpace(); XPoint ptPick = jig.GetPickPoint(); if (pDbSpacePick != NULL) { double dHalf = dlg.m_bHalfArea ? 0.5 : 1.0; adsout << _T("\n面积=") << (pDbSpacePick->m_nUseArea * dHalf)<< _T(" 平方米"); if (g_bBuildRoom) { TDbSpace *pDbSpace1 = new TDbSpace; CopyObject(*pDbSpacePick,*pDbSpace1); // modify by xly on 110413 支持字母数字连字符 //pDbSpace1->m_sCode = XString(_T("%d"), g_nStartCode); pDbSpace1->m_sCode = g_csStartCode; pDbSpace1->SetHas3D(g_bGround); pDbSpace1->SetMask(g_bShield); pDbSpace1->SetFloorThick(g_dThick); // add by lgh 100804, 增加设置一半面积 pDbSpace1->SetHalfArea(dlg.m_bHalfArea); pDbSpace1->SetHasHatch(dlg.m_bShowHatch); // sg add 081124 //modify by xly on 100909 真彩色使用 //pDbSpace1->SetHatchColor(dlg.m_nColor); pDbSpace1->SetHatchTrueColor(dlg.m_cColor); pDbSpace1->SetHatchStyle(dlg.m_csHatch); pDbSpace1->SetHatchScale(dlg.m_dHatchScale); pDbSpace1->SetHatchAngle(dlg.m_nHatchAngle*PI/180); AcDbObjectId idHatch = InitLayer(LAY_SPACE_HATCH); //modified by fxj 090609 pDbSpace1->SetHatchLayer(idHatch); // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 // int nSpFlag = DocGetSpaceDispMode(); // if (dlg.m_bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (dlg.m_bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // //// if (dlg.m_nVisible == 0) // sg modify 081119 //// nSpFlag &= ~SPF_CODE; //// else //// nSpFlag |= SPF_CODE; // if (dlg.m_bDimCode && dlg.m_bDimName) // 同时标注 // { // nSpFlag &= ~SPF_CODE; // nSpFlag |= SPF_NAME_AND_CODE; // } // else // { // nSpFlag &= ~SPF_NAME_AND_CODE; // if (dlg.m_bDimCode) // 标编号 // nSpFlag |= SPF_CODE; // else // 标名称 // nSpFlag &= ~SPF_CODE; // } // DocSetSpaceDispMode(nSpFlag); pDbSpace1->SetDimNameAndCode(dlg.m_bDimName, dlg.m_bDimCode); pDbSpace1->SetDimArea(dlg.m_bDimArea); pDbSpace1->SetDimUnit(dlg.m_bAreaUnit); // pDbSpace1->SetRotation(Ucs2Wcs(0)); // ucs对齐 add by fxj 080813 pDbSpace1->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” pDbSpace1->m_ptLocation = ptPick; pDbSpace1->SetTextStyleId(InitTextStyle(TS_SPACE)); // --------modified by fxj 080630------ CString sName = pDbSpace1->m_sName; pDbSpace1->AddToMSpace(Adesk::kFalse); // if (sName == _T("建筑轮廓")) if (sName == _T("建筑面积")) // sg modify 090603,按照林工提出的意见,恢复建筑面积的名称 { pDbSpace1->setLayer(InitLayer(LAY_BUILDING_SPACE, FALSE)); pDbSpace1->SetType(TDbSpace::kTotalArea); // sg add 081226,设置房间类型 } pDbSpace1->close(); // --------------------------- // modify by xly on 110413 支持字母数字连字符 //g_nStartCode++; g_csStartCode = AnalySpaceCode(g_csStartCode); } else { if (dlg.m_bDimArea) { AcDbObjectId idStyle = InitTextStyle(TS_SPACE); double nTextSize = 3.5; TDbText *pText = new TDbText; pText->SetHeight(nTextSize); pText->SetStyleId(idStyle); pText->SetAlignment(XExplodeDraw::kMiddleCenter); ptPick.y -= pText->GetHeight(FALSE)/2; pText->SetRotation(Ucs2Wcs(0)); // ucs对齐 add by fxj 080813 pText->SetLocation(ptPick); XString sArea(256); double dHalf = dlg.m_bHalfArea ? 0.5 : 1.0; // sArea << XString(_T("%.2f"), pDbSpacePick->m_nUseArea * dHalf); sArea << XString(_T("%.*f"), DocGetSpaceAreaPrecision(), pDbSpacePick->m_nUseArea * dHalf);//add by lxb on 2011//11//28 if (dlg.m_bAreaUnit) sArea << _T("m^U2^U"); pText->SetText(sArea); pText->setLayer(InitLayer(LAY_SPACE, FALSE)); pText->SetMaskFlag(g_bShield);//add by lxb on 2011/12/01 AddToModelSpace(pText, Adesk::kTrue); } } } else adsout<<_T("请正确点取!"); } else if (nRet == RTCAN) { if (dlg.m_bUseEsc) { bDistub = TRUE; } else { bDistub = FALSE; } break; } else if (nRet == RTNONE) // add by fxj 080815 { break; } } if (bDistub) // add by fxj 080702 break; else continue; } else // 选择多段线或阳台 { XPoly2D poly; if (dlg.s_iMode == 1) { Entity ent; int nRetP = ent.UserSelect(_T("\n选择闭合多段线或圆<退出>:")); if (nRetP == RTCAN) { if (dlg.m_bUseEsc) break; else continue; } else if (nRetP == RTNORM) { if (!(ent.Is(_T("CIRCLE")) || ent.Is(_T("LWPOLYLINE")) || ent.Is(_T("POLYLINE")))) { adsout<<_T("请正确选择!"); continue; } } else break; poly = XPoly2D(ent); } else if (dlg.s_iMode == 2) { RBList mask(RTDXF0, _T("TCH_BALCONY"),NULL); Entity ent; int nRetB = ent.UserSelect(_T("\n选择阳台<退出>:")); if (nRetB == RTCAN) { if (dlg.m_bUseEsc) break; else continue; } else if (nRetB == RTNORM) { if (!ent.Is(_T("TCH_BALCONY"))) { adsout<<_T("请正确选择!"); continue; } } else break; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbBalcony, pBalcony) if (pBalcony == NULL) continue; poly = pBalcony->GetOutline(); OPENOBJ_END() } else//add by fxj 090206 { // int nRet=DrawPoly(poly); int nRet; XPoint ptStart; nRet = ads_getpoint(NULL, _T("\n多边形起点<退出>: "), ptStart); XPoly2D poly2dRet; if (nRet == RTNORM) { ptStart=Ucs2Wcs(ptStart); int nOsMode=0; xg_getvar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |=OS_INT; XPushVar vOsMode(_T("OSMODE"), nOsMode); nRet=DragInputPoly(ptStart, poly2dRet); } else if (nRet==RTCAN) { if (dlg.m_bUseEsc) break; else continue; } else break; //if (nRet == RTCAN) //{ // if (dlg.m_bUseEsc) // break; // else // continue; //} //else if (nRet == RTERROR) //{ // // continue; // //} //else if (nRet != RTNORM) // break; if (nRet != RTNORM) break; poly=poly2dRet; poly.SetFlag(1); poly.Make(); } poly.SetFlag(1); // 强制封闭 poly.SetElevation(0); poly.Compress(); double nArea = poly.Area(); double dHalf = dlg.m_bHalfArea ? 0.5 : 1.0; // adsout << _T("\n面积=") << _AS_SQMETER(nArea) << _T(" 平方米"); adsout << _T("\n面积=") << _AS_SQMETER(nArea * dHalf)<< _T(" 平方米"); XPoint ptLoc; poly.Center(ptLoc); ptLoc.z = 0.0; dlg.UpdateData(TRUE);//add by fxj 090309 if (g_bBuildRoom) { TDbSpace *pDbSpace1 = new TDbSpace; pDbSpace1->m_sName = dlg.s_iMode==2?_T("阳台"):_T("房间");//modified by fxj 090209 // modify by xly on 110413 支持字母数字连字符 //pDbSpace1->m_sCode = XString(_T("%d"), g_nStartCode); pDbSpace1->m_sCode = g_csStartCode; // pDbSpace1->m_nUseArea = _AS_SQMETER(nArea); pDbSpace1->SetPathPoly(poly, AcGeVector3d::kZAxis); pDbSpace1->SetHas3D(g_bGround); pDbSpace1->SetMask(g_bShield); pDbSpace1->SetFloorThick(g_dThick); pDbSpace1->SetBalcony(TRUE); // add by lgh 100804, 设置是否标志一半面积 pDbSpace1->SetHalfArea(dlg.m_bHalfArea); pDbSpace1->SetHasHatch(dlg.m_bShowHatch); // sg add 081124 //pDbSpace1->SetHatchColor(dlg.m_nColor); pDbSpace1->SetHatchTrueColor(dlg.m_cColor); pDbSpace1->SetHatchStyle(dlg.m_csHatch); pDbSpace1->SetHatchScale(dlg.m_dHatchScale); pDbSpace1->SetHatchAngle(dlg.m_nHatchAngle*PI/180); AcDbObjectId idHatch = InitLayer(LAY_SPACE_HATCH); //modified by fxj 090609 pDbSpace1->SetHatchLayer(idHatch); // add by fxj 080620 if (dlg.s_iMode==2) { pDbSpace1->setLayer(InitLayer(LAY_BALCONY_SPACE));//modified by fxj 090521 (增加InitLayer) pDbSpace1->SetType(TDbSpace::kBalconyArea); // sg add 081226,房间类型 // add by lgh 100804 // 新添加了针对所有情况的设置一半面积 // pDbSpace1->SetHalfArea(g_bBlaconyHalf);//modified by fxj 090625 是否按一半面积计算受全局变量控制 } else pDbSpace1->setLayer(InitLayer(LAY_SPACE));//modified by fxj 090521 // modify by xly on 101111根据8.5需求修改该房间对象,支持房间名和面积都不标注 // int nSpFlag = DocGetSpaceDispMode(); // if (dlg.m_bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (dlg.m_bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // //// if (dlg.m_nVisible == 0) // sg modify 081119 //// nSpFlag &= ~SPF_CODE; //// else //// nSpFlag |= SPF_CODE; // if (dlg.m_bDimCode && dlg.m_bDimName) // 同时标注 // { // nSpFlag &= ~SPF_CODE; // nSpFlag |= SPF_NAME_AND_CODE; // } // else // { // nSpFlag &= ~SPF_NAME_AND_CODE; // if (dlg.m_bDimCode) // 标编号 // nSpFlag |= SPF_CODE; // else // 标名称 // nSpFlag &= ~SPF_CODE; // } // DocSetSpaceDispMode(nSpFlag); pDbSpace1->SetDimNameAndCode(dlg.m_bDimName, dlg.m_bDimCode); pDbSpace1->SetDimArea(dlg.m_bDimArea); pDbSpace1->SetDimUnit(dlg.m_bAreaUnit); pDbSpace1->SetTextStyleId(InitTextStyle(TS_SPACE)); // pDbSpace1->SetRotation(Ucs2Wcs(0)); // ucs对齐 add by fxj 080813 pDbSpace1->SetLayoutRotation(Ucs2Wcs(0)); // sg modify 090602,8.0的正式版起,将“文字转角”并入“布局转角” // [3/6/2008 nsh] // -------------------------begin------------------------- //TDragDbTextJig jig(pDbSpace1, &dlg); TDragSearchAreaDbTextJig jig(pDbSpace1, &dlg); jig.SetPrompt(_T("\n请点取面积标注位置<中心>:")); int iRet = jig.doIt(); if (iRet == RTNORM) { TDbSpace *pDbSpace2 = (TDbSpace*)jig.entity(); AddToModelSpace((TDbSpace*)(pDbSpace2->clone()),Adesk::kTrue); } else if (iRet == RTCAN) // add by fxj { if (dlg.m_bUseEsc) break; else continue; } else {//moidfid by fxj 解决标注位置在中心时阳台面积图层不正确问题 TDbSpace *pDbSpace2 = (TDbSpace*)jig.entity(); pDbSpace2->m_ptLocation = ptLoc; AddToModelSpace((TDbSpace*)(pDbSpace2->clone()),Adesk::kTrue); // pDbSpace1->m_ptLocation = ptLoc; // pDbSpace1->AddToMSpace(Adesk::kTrue); } //-------------------------end----------------------------- // modify by xly on 110413 支持字母数字连字符 //g_nStartCode++; g_csStartCode = AnalySpaceCode(g_csStartCode); } else { if (dlg.m_bDimArea) { AcDbObjectId idStyle = InitTextStyle(TS_SPACE); double nTextSize = 3.5; TDbText *pText = new TDbText; pText->SetHeight(nTextSize); pText->SetStyleId(idStyle); pText->SetAlignment(XExplodeDraw::kMiddleCenter); XString sArea(256); // sArea << XString(_T("%.2f"), _AS_SQMETER(nArea)); // add by lgh 100804 double dHalf = dlg.m_bHalfArea ? 0.5 : 1.0; // sArea << XString(_T("%.2f"), _AS_SQMETER(nArea * dHalf)); sArea << XString(_T("%.*f"), DocGetSpaceAreaPrecision(), _AS_SQMETER(nArea * dHalf));//add by lxb on 2011//11//28 if (dlg.m_bAreaUnit) sArea << _T("m^U2^U"); pText->SetText(sArea); pText->setLayer(InitLayer(LAY_SPACE, FALSE)); pText->SetRotation(Ucs2Wcs(0)); // ucs对齐 add by fxj 080813 pText->SetMaskFlag(g_bShield);//add by lxb on 2011/12/01 // [12/26/2007 nsh] //------------------------------------begin---------------------------------- // modify by lgh 100804 //TDragDbTextJig jig(pText, &dlg, nArea); TDragSearchAreaDbTextJig jig(pText, &dlg, nArea); jig.SetPrompt(_T("\n请点取面积标注位置<中心>:")); int iRet = jig.doIt(); if (iRet == RTNORM) { TDbText *pDbText = (TDbText*)jig.entity(); AddToModelSpace((TDbText*)(pDbText->clone()),Adesk::kTrue); } else if (iRet == RTCAN) // add by fxj { if (dlg.m_bUseEsc) break; else continue; } else { pText->SetLocation(ptLoc); AddToModelSpace((TDbText*)pText->clone(),Adesk::kTrue); } //------------------------------------end------------------------------------ } } } } if (::IsWindow(dlg.m_hWnd)) dlg.DestroyWindow(); } void ShareArea() { PickSet ssSpaces(SS_FREE); RBList spaceMask(RTDXF0, _T("TCH_SPACE"), NULL); if (SelectEntities(_T("\n请选择房间面积对象<退出>:"), ssSpaces, spaceMask)!=RTNORM) { return; } // delete by xly on 100827 根据8.5需求,去掉公摊面积类型的设置 /*TCHAR skword[1024]=_T(""); int nRet; INITGET_BEG(0,_T("A B")) nRet=acedGetKword(_T("\n指定公摊类型 [本层公摊(A)/全楼公摊(B)]:"),skword); INITGET_END() BOOL bAllBudShare=FALSE; if (nRet==RTNORM&&skword[0]==_T('B')) { bAllBudShare=TRUE; } else if ((nRet==RTNORM && skword[0]==_T('A'))|| nRet==RTNONE) bAllBudShare=FALSE; else return;*/ BOOL bAllBudShare=FALSE; for(long i=0;im_sName; if (bAllBudShare) { if (sName.Find(_T("全楼公摊"))==-1)//add by fxj 080708 sName+=_T("(全楼公摊)"); } else {//add by fxj 080708 if (sName.Find(_T("(全楼公摊)"))!=-1) sName.Replace(_T("(全楼公摊)"),_T("")); } if (pSpace->upgradeOpen() != Acad::eOk) continue; pSpace->assertWriteEnabled(); pSpace->SetType(TDbSpace::kShareArea);//add by fxj 090416设置类型 pSpace->setLayer(InitLayer(LAY_SHARE_SPACE)); pSpace->m_sName=sName; pSpace->downgradeOpen(); //--------------------------------- } OPENOBJ_END(); } return; } //void AskSpArea() //{ // extern TARCH_IMPEXP BOOL g_bFindExtSpace; // CSearchAreaDlg dlg(acedGetAcadFrame()); // { // CAcModuleResourceOverride vTemp; // if ( !dlg.Create(dlg.IDD, acedGetAcadFrame()) ) // return; // } // dlg.ShowWindow(SW_SHOW); // acedGetAcadDwgView()->SetFocus(); // // TAskSpAreaJig jig; // jig.SetKeyword(_T("P B")); // jig.SetPrompt(_T("\n请在屏幕上点取一点或 [查询闭合PLINE面积(P)/查询阳台面积(B)]<退出>:")); // while(1) // { // int nKeyIdx; // int nRet = jig.DoIt(&nKeyIdx); // // dlg.UpdateData(); // BOOL bDimArea = dlg.m_bDimArea; // BOOL bAreaUnit = dlg.m_bAreaUnit; // BOOL bGround = g_bGround; // BOOL bShield = g_bShield; // BOOL bBuildRoom = g_bBuildRoom; // int nVisible = dlg.m_nVisible; // double dThick = g_dThick; // // int nSpFlag=DocGetSpaceDispMode(); // if (bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // // if (nVisible == 0) // nSpFlag &= ~SPF_CODE; // else // nSpFlag |= SPF_CODE; // DocSetSpaceDispMode(nSpFlag); // // if (nRet == RTNORM) // { // const TDbSpace* pDbSpacePick=jig.GetPickSpace(); // XPoint ptPick=jig.GetPickPoint(); // // if (pDbSpacePick!=NULL) // { // // adsout << _T("\n面积=") << pDbSpacePick->m_nUseArea<< _T(" 平方米"); // // if (bBuildRoom) // { // TDbSpace *pDbSpace1 = new TDbSpace; // CopyObject(*pDbSpacePick,*pDbSpace1); // pDbSpace1->m_sCode=XString(_T("%d"), g_nStartCode); // pDbSpace1->SetHas3D(bGround); // pDbSpace1->SetMask(bShield); // pDbSpace1->SetFloorThick(dThick); // int nSpFlag=DocGetSpaceDispMode(); // if (bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // // if (nVisible == 0) // nSpFlag &= ~SPF_CODE; // else // nSpFlag |= SPF_CODE; // DocSetSpaceDispMode(nSpFlag); // // pDbSpace1->m_ptLocation = ptPick; // pDbSpace1->SetTextStyleId(InitTextStyle(TS_SPACE)); // pDbSpace1->AddToMSpace(Adesk::kTrue); // // g_nStartCode++; // } // else // { // if (bDimArea) // { // AcDbObjectId idStyle=InitTextStyle(TS_SPACE); // double nTextSize=3.5; // TDbText *pText=new TDbText; // pText->SetHeight(nTextSize); // pText->SetStyleId(idStyle); // pText->SetAlignment(XExplodeDraw::kMiddleCenter); // ptPick.y-=pText->GetHeight(FALSE)/2; // pText->SetLocation(ptPick); // XString sArea(256); // sArea << XString(_T("%.2f"), pDbSpacePick->m_nUseArea); // if (bAreaUnit) // sArea << _T("m^U2^U"); // pText->SetText(sArea); // pText->setLayer(InitLayer(LAY_SPACE, FALSE)); // AddToModelSpace(pText, Adesk::kTrue); // } // } // } // else // adsout<<_T("请正确点取!"); // } // else if (nRet == RTKWORD) // { // XPoly2D poly; // if (nKeyIdx == 0) // { // RBList mask(RTDXF0, _T("CIRCLE,LWPOLYLINE,POLYLINE"),NULL); // Entity ent; // if (ent.FilterSelect(_T("\n选择闭合多段线或圆<返回>:"),mask)!=RTNORM) // continue; // poly=XPoly2D(ent); // } // else if (nKeyIdx==1) // { // RBList mask(RTDXF0, _T("TCH_BALCONY"),NULL); // Entity ent; // if (ent.FilterSelect(_T("\n选择阳台<返回>:"),mask)!=RTNORM) // continue; // OPENOBJ_BEGIN(ent,AcDb::kForRead,TDbBalcony,pBalcony) // if (pBalcony==NULL) // continue; // poly=pBalcony->GetOutline(); // OPENOBJ_END() // } // // poly.flag=1;//强制封闭 // poly.SetElevation(0); // poly.Compress(); // // if (nKeyIdx == 0 ||nKeyIdx== 1) // { // double nArea=poly.Area(); // // //adsout << _T("\n面积=") << _AS_SQMETER(nArea) << _T(" 平方米"); // adsout << _T("\n面积=") << _AS_SQMETER(nArea) << _T(" 平方米"); // // XPoint ptLoc; // poly.Center(ptLoc); // ptLoc.z = 0.0; // if (bBuildRoom) // { // TDbSpace *pDbSpace1 = new TDbSpace; // pDbSpace1->m_sName = nKeyIdx==0?_T("房间"):_T("阳台"); // pDbSpace1->m_sCode=XString(_T("%d"), g_nStartCode); // //pDbSpace1->m_nUseArea = _AS_SQMETER(nArea); // pDbSpace1->SetPathPoly(poly, AcGeVector3d::kZAxis); // pDbSpace1->SetHas3D(bGround); // pDbSpace1->SetMask(bShield); // pDbSpace1->SetFloorThick(dThick); // pDbSpace1->SetBalcony(TRUE); // int nSpFlag=DocGetSpaceDispMode(); // if (bDimArea) // nSpFlag |= SPF_AREA; // else // nSpFlag &= ~SPF_AREA; // // if (bAreaUnit) // nSpFlag |= SPF_UNIT; // else // nSpFlag &= ~SPF_UNIT; // // if (nVisible == 0) // nSpFlag &= ~SPF_CODE; // else // nSpFlag |= SPF_CODE; // DocSetSpaceDispMode(nSpFlag); // pDbSpace1->SetTextStyleId(InitTextStyle(TS_SPACE)); // // [3/6/2008 nsh] // //-------------------------begin------------------------- // TDragDbTextJig jig(pDbSpace1); // jig.SetPrompt(_T("\n请点取面积标注位置<中心>:")); // int iRet=jig.doIt(); // if (iRet==RTNORM) // { // TDbSpace *pDbSpace2=(TDbSpace*)jig.entity(); // AddToModelSpace((TDbSpace*)(pDbSpace2->clone()),Adesk::kTrue); // } // else // { // pDbSpace1->m_ptLocation = ptLoc; // pDbSpace1->AddToMSpace(Adesk::kTrue); // } // //-------------------------end----------------------------- // g_nStartCode++; // } // else // { // if (bDimArea) // { // AcDbObjectId idStyle=InitTextStyle(TS_SPACE); // double nTextSize=3.5; // TDbText *pText=new TDbText; // pText->SetHeight(nTextSize); // pText->SetStyleId(idStyle); // pText->SetAlignment(XExplodeDraw::kMiddleCenter); // XString sArea(256); // //sArea << XString(_T("%.2f"), _AS_SQMETER(nArea)); // sArea << XString(_T("%.2f"), _AS_SQMETER(nArea)); // if (bAreaUnit) // sArea << _T("m^U2^U"); // pText->SetText(sArea); // pText->setLayer(InitLayer(LAY_SPACE, FALSE)); // // [12/26/2007 nsh] // //------------------------------------begin---------------------------------- // TDragDbTextJig jig(pText); // jig.SetPrompt(_T("\n请点取面积标注位置<中心>:")); // int iRet=jig.doIt(); // if (iRet==RTNORM) // { // TDbText *pDbText=(TDbText*)jig.entity(); // AddToModelSpace((TDbText*)(pDbText->clone()),Adesk::kTrue); // } // else // { // pText->SetLocation(ptLoc); // AddToModelSpace((TDbText*)pText->clone(),Adesk::kTrue); // } // //------------------------------------end------------------------------------ // // // } // } // } // } // else // { // if (::IsWindow(dlg.m_hWnd)) // dlg.DestroyWindow(); // return; // } // } // if (::IsWindow(dlg.m_hWnd)) // dlg.DestroyWindow(); //} ////only for AskArea,add by whl //int XGetPoint1(const ads_point ref, const char *prompt, ads_point res,bool &bPLine) //{ // char prmt[256]=_T(""); // if (!prompt) strcpy(prmt, _T("\n请在屏幕上点取一点")); // else strcpy(prmt, prompt); // XString prmt1(256); // prmt1 << prmt << _T("或{查询闭合PLINE面积[P]/参考点[R]}<退出>:"); // // int rt=RTKWORD; // // XPoint refPt; // const ads_real *base=ref; // char buf[256]; // while(rt==RTKWORD) // { // INITGET_BEG(0, _T("P R")); // rt=ads_getpoint(base, prmt1, res); // INITGET_END(); // // if (rt==RTKWORD) // { // acedGetInput(buf); // if (buf[0]==_T('P')) // { // bPLine=true; // return RTNORM; // } // else // { // int rc=ads_getpoint(NULL, _T("\n参考点: "), refPt); // if (rc==RTCAN) return rc; // else if (rc==RTNORM) // base=&refPt.x; // } // } // } // return rt; //} //// Command: 查询面积 //void AskSpArea() //{ // extern TARCH_IMPEXP BOOL g_bFindExtSpace; // // XPoint ptPick; // bool bPLine=false; // while(XGetPoint1(NULL, _T("\n请指定房间内一点"), ptPick,bPLine)==RTNORM) // {//modified by whl // if (bPLine) // { // bPLine=false; // RBList mask(RTDXF0, _T("LWPOLYLINE,POLYLINE"),70,1,NULL); // Entity ent; // if (ent.FilterSelect(_T("\n选择闭合多段线<返回>:"),mask)!=RTNORM) // continue; // XPoly2D poly(ent); // double nArea=poly.Area(); // adsout << _T("\n房间面积=") << _AS_SQMETER(nArea) << _T(" 平方米"); // // int nSpFlag=DocGetSpaceDispMode(); // if (nSpFlag&SPF_AREA) // { // AcDbObjectId idStyle=InitTextStyle(TS_SPACE); // double nTextSize=3.5; // TDbText *pText=new TDbText; // pText->SetHeight(nTextSize); // pText->SetStyleId(idStyle); // pText->SetAlignment(XExplodeDraw::kMiddleCenter); // XPoint ptCenter; // poly.Center(ptCenter); // pText->SetLocation(ptCenter); // XString sArea(256); // sArea << XString(_T("%.2f"), _AS_SQMETER(nArea)); // if (nSpFlag&SPF_UNIT) // sArea << _T("m^U2^U"); // pText->SetText(sArea); // pText->setLayer(InitLayer(LAY_SPACE, FALSE)); // AddToModelSpace(pText, Adesk::kTrue); // } // } // else // { // ptPick=Ucs2Wcs(ptPick); // XPoly2D polySpace(1); // if (GenSpacePoly(ptPick, polySpace)==RTNORM) // { // XScreenDc dc(1,1); // XPoly2D polyTemp(polySpace); // XPoint ptMin, ptMax; // polyTemp.GetExtend(ptMin, ptMax); // AssureOnScreen(ptMin, ptMax); // polyTemp.TransUCS(Groups(0), Groups(1)); // dc << polyTemp; // // XPoly poly; // polyTemp.MapToPolygon(poly); // RBList rbPolygon=poly.Polygon(); // RBList rbColuMask(RTDXF0, _T("TCH_COLUMN"), NULL); // PickSet ss(SS_FREE); // double nArea=polySpace.Area(); // if (!g_bFindExtSpace && ss.Get(_T("WP"), rbPolygon, NULL, rbColuMask)==RTNORM) { // long lCount=ss.Length(); // for(long lIndex=0L; lIndexGetOutline(polyColu); // if (!!polyColu) { // dc << polyColu; // nArea -= polyColu.Area(); // } // } // } // adsout << _T("\n房间面积=") << _AS_SQMETER(nArea) << _T(" 平方米"); // // int nSpFlag=DocGetSpaceDispMode(); // if (nSpFlag&SPF_AREA) // { // AcDbObjectId idStyle=InitTextStyle(TS_SPACE); // double nTextSize=3.5; // TDbText *pText=new TDbText; // pText->SetHeight(nTextSize); // pText->SetStyleId(idStyle); // pText->SetAlignment(XExplodeDraw::kMiddleCenter); // pText->SetLocation(ptPick); // XString sArea(256); // sArea << XString(_T("%.2f"), _AS_SQMETER(nArea)); // if (nSpFlag&SPF_UNIT) // sArea << _T("m^U2^U"); // pText->SetText(sArea); // pText->setLayer(InitLayer(LAY_SPACE, FALSE)); // AddToModelSpace(pText, Adesk::kTrue); // } // } // else // adsout << _T("\n请正确选择!"); // } // } //} ////////////////////////////////////// // Command: 生成房间轮廓线 // 必须在WCS下 void SpOutline() { XPoint ptPick; while(XGetPoint(NULL, _T("\n请指定房间内一点"), ptPick)==RTNORM) { ptPick=Ucs2Wcs(ptPick); XPoly2D polySpace(1); if (GenSpacePoly(ptPick, polySpace)==RTNORM) { XScreenDc dc(1,1); XPoly2D polyTemp(polySpace); polyTemp.TransUCS(Groups(0), Groups(1)); dc << polyTemp; if (YesNoQuestion(_T("\n是否生成封闭的多段线"))==Q_YES) polySpace.Make(); ads_redraw(NULL, 0); } else { adsout << _T("\n请正确选择!"); } } } //int PLineToFace(Entity &entPline, Entity &entPface); /////////////////////////////////////////// // Command: 坡屋顶 // 必须在WCS下 void ConvertRoof() { //修改静态变量的初始化,来适应米单位绘图 // [11/8/2007 nsh] nSanShuiDist=_AS_SYS_UNIT(600.0); nRoofDist=_AS_SYS_UNIT(600.0); //----------------------------------- Entity ent; RBList rbMask(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 1, NULL); if (SelectEntity(_T("\n选择一封闭的多段线<退出>:"), ent, rbMask)==RTNORM) { XPoly2D poly(ent); if (!!poly) { double nElevOrg=poly[0]->z; double nThick=0.0; ent.GetData(39, &nThick); nElevOrg += nThick; double nSlant=30.0; adsout << _T("\n请输入坡度角 <") << AS_INT(nSlant) << _T(">: "); ads_initget(RSG_NONEG|RSG_NOZERO, NULL); int nRet=ads_getreal(_T(""), &nSlant); if (nRet==RTERROR || nRet==RTCAN) return; if (nSlant>89.999) { adsout << _T("\n坡度范围为0~90度!"); return; } if (GetDist(_T("\n出檐长"), nRoofDist, RSG_NONEG)==RTCAN) return; double nElevMove=-nRoofDist*tan(nSlant*PI/180); if (poly.PathArea()>0) {//确保逆时针 poly.Reverse(); } poly.Compress(); XPoly2D polyDest(1); poly.Disperse(polyDest); polyDest.SetElevation(nElevOrg+nElevMove); TDbSlopeRoof *pRoof = new TDbSlopeRoof; pRoof->InitEqualSlope(polyDest, nSlant*PI/180.0); if (fabs(nThick)<_DIST_SNAP) { int bDelObj; VERIFY(xg_getvar(_T("DELOBJ"), &bDelObj)==RTNORM); if (bDelObj) ent.Delete(); } pRoof->AddToMSpace(Adesk::kTrue); } } } // [2/19/2008 nsh] //------------------begin--------------------- void ConvertRoof2() { //修改静态变量的初始化,来适应米单位绘图 // [11/8/2007 nsh] nSanShuiDist=_AS_SYS_UNIT(600.0); nElevMove=_AS_SYS_UNIT(24000.0); //----------------------------------- Entity ent; RBList rbMask(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 1, NULL); if (SelectEntity(_T("\n选择一封闭的多段线<退出>:"), ent, rbMask)==RTNORM) { XPoly2D poly(ent); if (!!poly) { double nElevOrg=poly[0]->z; double nThick=0.0; ent.GetData(39, &nThick); nElevOrg += nThick; double nSlant=30.0; adsout << _T("\n请输入坡度角 <") << AS_INT(nSlant) << _T(">: "); ads_initget(RSG_NONEG|RSG_NOZERO, NULL); int nRet=ads_getreal(_T(""), &nSlant); if (nRet==RTERROR || nRet==RTCAN) return; if (nSlant>89.999) { adsout << _T("\n坡度范围为0~90度!"); return; } if (GetDist(_T("\n底标高"), nElevMove,RSG_NONEG)==RTCAN) return; if (poly.PathArea()>0) {//确保逆时针 poly.Reverse(); } poly.Compress(); XPoly2D polyDest(1); poly.Disperse(polyDest); polyDest.SetElevation(nElevMove);// [2/20/2008 nsh] TDbSlopeRoof *pRoof = new TDbSlopeRoof; pRoof->InitEqualSlope(polyDest, nSlant*PI/180.0); if (fabs(nThick)<_DIST_SNAP) { int bDelObj; VERIFY(xg_getvar(_T("DELOBJ"), &bDelObj)==RTNORM); if (bDelObj) ent.Delete(); } pRoof->AddToMSpace(Adesk::kTrue); } } } //--------------------------end------------------------- //////////////////////////////////////////////////////// // Command: 生成房间地面 void SpGround() { XPoint ptPick; while(XGetPoint(NULL, _T("\n请指定房间内一点"), ptPick)==RTNORM) { ptPick=Ucs2Wcs(ptPick); XPoly2D polySpace(1); if (GenSpacePoly(ptPick, polySpace)==RTNORM) { XScreenDc dc(1,1); XPoly2D polyTemp(polySpace); polyTemp.TransUCS(Groups(0), Groups(1)); dc << polyTemp; if (YesNoQuestion(_T("\n是否生成房间地面"))==Q_YES) { TDbSlab *pGround= new TDbSlab; pGround->setLayer(InitLayer(LAY_GROUND, FALSE)); pGround->SetOutline(polySpace); pGround->SetThickness(-200.0); for(int i=0; iSetVisibilityAt(i, FALSE); AddToModelSpace(pGround, Adesk::kTrue); } ads_redraw(NULL,0); } else { adsout << _T("\n请正确选择!"); } } } // Debug only void TestSpace() { XPoint pt; if (ads_getpoint(NULL, _T("\nPick a point: "), pt)!=RTNORM) return; TDbSpace space; if (GenSpaceInfo(pt, space)==1) { XScreenDc dc; dc << space.m_outline; } }