#include "stdafx.h" #include "resource.h" #include "TArchCmdReactor.h" #include "InsDoorWinDlg.h" #include "BayWindowDlg.h" #include "RectHoleDlg.h" #include "ArcWindowDlg.h" #include "DoorWinDlg.h" #include "TwoDoorDlg.h" #include "PolyHoleDlg.h" #include #include "OpeningLabelData.h" #include "utility.h" #include "wall_xdata_key.h" void InsOpening(TOpeningData::OpeningKind opFlag); bool CheckDoorWinLabel(CString strName); int GetSequenceNum(CString strlabel); // 门窗编号同类型检测函数组: enum ESameLabelTypeIndex {eSameLabelDoor = 0, eSameLabelWin, eSameLabelMLC, eSameLabelZMM, eSameLabelHC, eSameLabelZHMC, eSameLableHole, eSameLabelTC, eSameLabelCornerWin, eSameLabelBanWin, eSameLabelDormer, eSameLabelOpBanWin, eSameLabelNum}; // 1、大类型相同,2、具体门窗要求子类相同 // 门或者窗是否可以采用同一编号 bool CanSameLabelDoorOrWin(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if ((pOpeningTemp1->GetKind() == TDbOpening::OP_DOOR && pOpeningTemp2->GetKind() == TDbOpening::OP_DOOR) || (pOpeningTemp1->GetKind() == TDbOpening::OP_WINDOW && pOpeningTemp2->GetKind() == TDbOpening::OP_WINDOW)) {// 宽、高、二维样式、三维样式 XString xStyle2d1, xStyle2d2, xStyle3d1, xStyle3d2; pOpeningTemp1->GetStyle2dName(xStyle2d1); pOpeningTemp1->GetStyle3dName(xStyle3d1); pOpeningTemp2->GetStyle2dName(xStyle2d2); pOpeningTemp2->GetStyle3dName(xStyle3d2); return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (xStyle2d1 == xStyle2d2) && (xStyle3d1 == xStyle3d2) && (pOpeningTemp1->GetSubKind().Compare(pOpeningTemp2->GetSubKind()) == 0)); } } return false; } // 门连窗 bool CanSameLabelMLC(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if (pOpeningTemp1->GetKind() == TDbOpening::OP_DOORWIN && pOpeningTemp2->GetKind() == TDbOpening::OP_DOORWIN) {// 总宽、门宽、门高、窗高、门的三维样式、窗的三维样式 XString xStyle2d1, xStyle2d2, xStyle3d1, xStyle3d2; pOpeningTemp1->GetStyle2dName(xStyle2d1); pOpeningTemp1->GetStyle3dName(xStyle3d1); pOpeningTemp2->GetStyle2dName(xStyle2d2); pOpeningTemp2->GetStyle3dName(xStyle3d2); return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (xStyle2d1 == xStyle2d2) && (xStyle3d1 == xStyle3d2) && (fabs(pOpeningTemp1->m_nDoorWidth - pOpeningTemp2->m_nDoorWidth) < 1e-6) && (fabs(pOpeningTemp1->m_nWinHeight - pOpeningTemp2->m_nWinHeight) < 1e-6)); } } return false; } // 子母门 bool CanSameLabelZMM(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if (pOpeningTemp1->GetKind() == TDbOpening::OP_TWODOOR && pOpeningTemp2->GetKind() == TDbOpening::OP_TWODOOR) {// 总宽、大门宽、门高、大门的三维样式、小门的三维样式 XString xStyle2d1, xStyle2d2, xStyle3d1, xStyle3d2; pOpeningTemp1->GetStyle2dName(xStyle2d1); pOpeningTemp1->GetStyle3dName(xStyle3d1); pOpeningTemp2->GetStyle2dName(xStyle2d2); pOpeningTemp2->GetStyle3dName(xStyle3d2); return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (xStyle2d1 == xStyle2d2) && (xStyle3d1 == xStyle3d2) && (fabs(pOpeningTemp1->m_nDoorWidth - pOpeningTemp2->m_nDoorWidth) < 1e-6)); } } return false; } // 弧窗 bool CanSameLabelHC(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if (pOpeningTemp1->GetKind() == TDbOpening::OP_ARCWIN && pOpeningTemp2->GetKind() == TDbOpening::OP_ARCWIN) {// 宽、高、类型 CString strSubKind1 = pOpeningTemp1->GetSubKind(); CString strSubKind2 = pOpeningTemp2->GetSubKind(); return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (strSubKind1.CompareNoCase(strSubKind2) == 0)); } } return false; } // 组合门窗、矩形洞 bool CanSameLabelZHMC(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if ((pOpeningTemp1->GetKind() == TDbOpening::OP_GROUP && pOpeningTemp2->GetKind() == TDbOpening::OP_GROUP) || (pOpeningTemp1->GetKind() == TDbOpening::OP_HOLE && pOpeningTemp2->GetKind() == TDbOpening::OP_HOLE)) {// 宽、高 return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6)); } } return false; } // 凸窗 bool CanSameLabelTC(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if ((pOpeningTemp1->GetKind() == TDbOpening::OP_PROWIN && pOpeningTemp2->GetKind() == TDbOpening::OP_PROWIN)) {// 型式、宽、高、凸出宽、梯形宽 XBayWindow *pBayWin1 = pOpeningTemp1->m_pBayWin; XBayWindow *pBayWin2 = pOpeningTemp2->m_pBayWin; return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (pBayWin1 != NULL && pBayWin2 != NULL) && (pBayWin1->m_nStyle == pBayWin2->m_nStyle) && (fabs(pBayWin1->m_nProtrude - pBayWin2->m_nProtrude) < 1e-6) && fabs(pBayWin1->m_nTrapezia - pBayWin2->m_nTrapezia) < 1e-6); } } return false; } bool CanSameLabelOpBandWin(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *pOpeningTemp1 = TDbOpening::cast(pOpening1); TDbOpening *pOpeningTemp2 = TDbOpening::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; if ((pOpeningTemp1->GetKind() == TDbOpening::OP_CORNWIN && pOpeningTemp2->GetKind() == TDbOpening::OP_CORNWIN)) {// 宽、高、二维样式、三维样式 XString xStyle2d1, xStyle2d2, xStyle3d1, xStyle3d2; pOpeningTemp1->GetStyle2dName(xStyle2d1); pOpeningTemp1->GetStyle3dName(xStyle3d1); pOpeningTemp2->GetStyle2dName(xStyle2d2); pOpeningTemp2->GetStyle3dName(xStyle3d2); return ((fabs(pOpeningTemp1->GetWidth() - pOpeningTemp2->GetWidth()) < 1e-6) && (fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6) && (xStyle2d1 == xStyle2d2) && (xStyle3d1 == xStyle3d2) && (pOpeningTemp1->GetSubKind().Compare(pOpeningTemp2->GetSubKind()) == 0)); } } return false; } bool CanSameLabelCorWin(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbCornerWin::desc()) && pOpening2->isKindOf(TDbCornerWin::desc()) && !pOpening1->isKindOf(TDbBandWin::desc()) && !pOpening2->isKindOf(TDbBandWin::desc())) { TDbCornerWin *pOpeningTemp1 = TDbCornerWin::cast(pOpening1); TDbCornerWin *pOpeningTemp2 = TDbCornerWin::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; double dWholeWid1 = pOpeningTemp1->GetWidth1() + pOpeningTemp1->GetWidth2(); double dWholeWid2 = pOpeningTemp2->GetWidth1() + pOpeningTemp2->GetWidth2(); { TOpeningLabelData labelData; TOpeningLabelData::ECalWidthRule nRule = labelData.GetCalWidthRule(); if (nRule == TOpeningLabelData::kMiddle) { dWholeWid1 = dWholeWid1 + pOpeningTemp1->GetWallThick2()*0.5 + pOpeningTemp1->GetWallThick1()*0.5; dWholeWid2 = dWholeWid2 + pOpeningTemp2->GetWallThick2()*0.5 + pOpeningTemp2->GetWallThick1()*0.5; } else if (nRule == TOpeningLabelData::kOutboard) { dWholeWid1 = dWholeWid1 + pOpeningTemp1->GetWallThick2() + pOpeningTemp1->GetWallThick1(); dWholeWid2 = dWholeWid2 + pOpeningTemp2->GetWallThick2() + pOpeningTemp2->GetWallThick1(); } } // 总宽,高,出挑 if (pOpeningTemp1->IsProtrude() != pOpeningTemp2->IsProtrude()) return false; else if (pOpeningTemp1->IsProtrude()) { return (fabs(dWholeWid1 - dWholeWid2) < 1e-6 && fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6 && fabs(pOpeningTemp1->GetProtrude() - pOpeningTemp2->GetProtrude()) < 1e-6); } else { return (fabs(dWholeWid1 - dWholeWid2) < 1e-6 && fabs(pOpeningTemp1->GetHeight() - pOpeningTemp2->GetHeight()) < 1e-6); } } return false; } bool TestCanSameLabel(TDbBandWin *pBandWin, double dWid, double dHei); bool CanSameLabelBanWin(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbBandWin::desc()) && pOpening2->isKindOf(TDbBandWin::desc())) { TDbBandWin *pOpeningTemp1 = TDbBandWin::cast(pOpening1); TDbBandWin *pOpeningTemp2 = TDbBandWin::cast(pOpening2); if (pOpeningTemp1 == NULL || pOpeningTemp2 == NULL) return false; // sg modify 120514,根据9.0需求,带形窗宽度的测量改用中心线 //return TestCanSameLabel(pOpeningTemp1, pOpeningTemp2->GetWidth(), pOpeningTemp2->GetHeight()); return TestCanSameLabel(pOpeningTemp1, pOpeningTemp2->GetGeomCenterWidth(), pOpeningTemp2->GetHeight()); } return false; } bool TestCanSameLabel(TDbDormer *pDormer, double dWid, double dHei); bool CanSameLabelDormer(TDbEntity *pOpening1, TDbEntity *pOpening2) { if (pOpening1->isKindOf(TDbDormer::desc()) && pOpening2->isKindOf(TDbDormer::desc())) { TDbDormer *pOpeningTemp1 = TDbDormer::cast(pOpening1); TDbDormer *pOpeningTemp2 = TDbDormer::cast(pOpening2); const TDormerPar &dorPar = pOpeningTemp2->GetDormerPar(); double dWidOld = dorPar.GetWindowWidth(); double dHeiOld = dorPar.GetWindowHeight(); return TestCanSameLabel(pOpeningTemp1, dWidOld, dHeiOld); } return false; } typedef bool (*PFunCanSameLabel)(TDbEntity*, TDbEntity*); // {eSameLabelDoor = 0, eSameLabelWin, eSameLabelMLC, eSameLabelZMM, // eSameLabelHC, eSameLabelZHMC, eSameLableHole, eSameLabelTC, // eSameLabelCornerWin, eSameLabelBanWin, eSameLabelDormer, eSameLabelNum}; PFunCanSameLabel g_funSameLabel[eSameLabelNum] = { CanSameLabelDoorOrWin, CanSameLabelDoorOrWin, CanSameLabelMLC, CanSameLabelZMM, CanSameLabelHC, CanSameLabelZHMC, CanSameLabelZHMC, CanSameLabelTC, CanSameLabelCorWin, CanSameLabelBanWin, CanSameLabelDormer, CanSameLabelOpBandWin }; bool CanSameLabel(TDbEntity* pOpening1, TDbEntity *pOpening2) { if (pOpening1 == NULL || pOpening2 == NULL) return false; if (pOpening1->isKindOf(TDbOpening::desc()) && pOpening2->isKindOf(TDbOpening::desc())) { TDbOpening *p1 = TDbOpening::cast(pOpening1); TDbOpening *p2 = TDbOpening::cast(pOpening2); if (p1->GetKind() == TDbOpening::OP_DOOR && p2->GetKind() == TDbOpening::OP_DOOR) return g_funSameLabel[eSameLabelDoor](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_WINDOW && p2->GetKind() == TDbOpening::OP_WINDOW) return g_funSameLabel[eSameLabelWin](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_DOORWIN && p2->GetKind() == TDbOpening::OP_DOORWIN) return g_funSameLabel[eSameLabelMLC](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_TWODOOR && p2->GetKind() == TDbOpening::OP_TWODOOR) return g_funSameLabel[eSameLabelZMM](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_ARCWIN && p2->GetKind() == TDbOpening::OP_ARCWIN) return g_funSameLabel[eSameLabelHC](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_GROUP && p2->GetKind() == TDbOpening::OP_GROUP) return g_funSameLabel[eSameLabelZHMC](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_PROWIN && p2->GetKind() == TDbOpening::OP_PROWIN) return g_funSameLabel[eSameLabelTC](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_HOLE && p2->GetKind() == TDbOpening::OP_HOLE) return g_funSameLabel[eSameLableHole](pOpening1, pOpening2); else if (p1->GetKind() == TDbOpening::OP_CORNWIN && p2->GetKind() == TDbOpening::OP_CORNWIN) return g_funSameLabel[eSameLabelOpBanWin](pOpening1, pOpening2); } else if (pOpening1->isKindOf(TDbBandWin::desc()) && pOpening2->isKindOf(TDbBandWin::desc())) return g_funSameLabel[eSameLabelBanWin](pOpening1, pOpening2); else if (pOpening1->isKindOf(TDbCornerWin::desc()) && pOpening2->isKindOf(TDbCornerWin::desc())) return g_funSameLabel[eSameLabelCornerWin](pOpening1, pOpening2); else if (pOpening1->isKindOf(TDbDormer::desc()) && pOpening2->isKindOf(TDbDormer::desc())) return g_funSameLabel[eSameLabelDormer](pOpening1, pOpening2); return NULL; } void MirrorWin(BOOL bLeftRight) { RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); PickSet ss(SS_FREE); if (SelectEntities(_T("\n选择待翻转的门窗:"), ss, mask)==RTNORM) { long lCount=ss.Length(); for(long i=0L; iMirrorSelf(bLeftRight); } OPENOBJ_END(); } } } void MirWinIO() { MirrorWin(FALSE); } void MirWinLR() { MirrorWin(TRUE); } /////////////////////////////// // Command: 插窗 // 必须在WCS下 void InsWin() { InsOpening(TOpeningData::OP_WINDOW); } /////////////////////////////// // Command: 插窗 // 必须在WCS下 void InsHWin() { /* AsureWCS(); InitLayer(LAY_OPENING_DIM, TRUE); InsertOpening(TOpeningData::OP_HWINDOW); */ } /////////////////////////////////// // Command: 插门 // 必须在WCS下 void InsDoor() { InsOpening(TOpeningData::OP_DOOR); } // // //////////////////////////////////////////////// // // Command: 改门窗编号 // // 必须在WCS下 // void ChWinLab1() // { // RBList mask(RTDXF0, _T("TCH_OPENING"),-4,_T(""),NULL); // PickSet ss(SS_FREE); // XString sxLabel; // // // if (SelectEntities(_T("\n请选择需要改编号的门窗的范围:"), ss, mask)==RTNORM) // { // long lCount = ss.Length(); // BOOL flag = FALSE; // TOpeningData::OpeningKind opKind; // double nWidth, nHeight; // XString xsName2d, xsName3d, xsTmp2d, xsTmp3d; // for(long i=0L; iGetKind(); // nWidth = pOpening->GetWidth(); // nHeight = pOpening->GetHeight(); // pOpening->GetStyle2dName(xsName2d); // pOpening->GetStyle3dName(xsName3d); // } // else // { // xsTmp3d=_T(""); // xsTmp2d=_T(""); // pOpening->GetStyle2dName(xsTmp2d); // pOpening->GetStyle3dName(xsTmp3d); // if (pOpening->GetKind() != opKind // || xsTmp2d != xsName2d // || xsTmp3d != xsName3d // || fabs(pOpening->GetWidth() - nWidth) > 0.01 // || fabs(pOpening->GetHeight() - nHeight) > 0.01) // { // flag = TRUE;//包含不同类型的门窗 // break; // } // } // } // OPENOBJ_END(); // } // PickSet ssNew(SS_FREE); // if (flag)//包含不同类型的门窗 // { // Entity entTmp; // int nRet=RTNORM; // while(nRet==RTNORM) // { // TCHAR cRet; // nRet=SelectEntity(_T("\n请选择需要修改编号的样板门窗或 [自动编号(S)]:"), entTmp, mask,_T("S"),cRet); // ss.Redraw(4); // ssNew.Free(); // // if (nRet==RTKWORD) // { // for(long i=0;iassertWriteEnabled(); // // // modify by xly on 110224 增加bool变量 // //pOpening->SetLabel(pOpening->GetAutoLabel()); // bool bAddNum(true); // pOpening->SetLabel(pOpening->GetAutoLabel(bAddNum)); // } // OPENOBJ_END() // } // return; // } // // xsName3d=_T(""); // xsName2d=_T(""); // OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbOpening, pOpening); // if (pOpening) // { // opKind = pOpening->GetKind(); // nWidth = pOpening->GetWidth(); // nHeight = pOpening->GetHeight(); // pOpening->GetStyle3dName(xsName3d); // pOpening->GetStyle2dName(xsName2d); // } // OPENOBJ_END(); // for(long i=0L; iGetStyle3dName(xsTmp3d); // pOpening->GetStyle2dName(xsTmp2d); // if (pOpening->GetKind() != opKind // || xsTmp2d != xsName2d // || xsTmp3d != xsName3d // || fabs(pOpening->GetWidth() - nWidth) > 0.01 // || fabs(pOpening->GetHeight() - nHeight) > 0.01) // continue; // else // ssNew += ent; // } // OPENOBJ_END(); // } // // ssNew.Redraw(3); // } // } // else // ssNew += ss; // // if (ssNew.Length() == 0) // return; // // CString csNewName,csPrompt; // OPENOBJ_BEGIN(ssNew[0L],AcDb::kForRead,TDbOpening,pOpening) // if (pOpening!=NULL) // { // // modify by xly on 110224 增加bool变量 // //csNewName=pOpening->GetAutoLabel(); // bool bAddNum(true); // csNewName=pOpening->GetAutoLabel(bAddNum);; // } // OPENOBJ_END() // csPrompt.Format(_T("\n请输入新的门窗编号(删除编号请输入NULL)<%s>:"), csNewName);//modified by whl // adsout << (const TCHAR*)csPrompt; // // if (ads_getstring(0, _T(""), sxLabel)==RTCAN) // { // ssNew.Redraw(4); // return; // } // if (_tcsicmp(sxLabel, _T("")) == 0) // _tcscpy(sxLabel, (const TCHAR*)csNewName); // else if (_tcsicmp(sxLabel, _T("NULL")) == 0) // _tcscpy(sxLabel, _T("")); // for(i=0L; iassertWriteEnabled(); // pOpening->SetLabel(sxLabel); // } // } // TArchCmdReactor::ResetAll(); // } // lgh add 20110304,本ID数组内的数据亮显 void HighShowIdAry(AcDbObjectIdArray &idAry) { PickSet ss; for (int i = 0; i < (int)idAry.length(); i++) ss += idAry[i]; ss.Redraw(3); } // lgh add 20110304,本ID数组内的数据取消亮显 void UnHighShowIdAry(AcDbObjectIdArray &idAry) { PickSet ss; for (int i = 0; i < (int)idAry.length(); i++) ss += idAry[i]; ss.Redraw(4); } // lgh add 20110304,是否所有的数据,并且清空 void ReleaseIdGroup(CArray &aryIdGroup) { for (int i = 0; i <(int)aryIdGroup.GetSize(); i++) { delete aryIdGroup[i]; aryIdGroup[i] = NULL; } aryIdGroup.RemoveAll(); } // lgh add 20110304, 检测两个opening的编号类型是不是相同,需要比较kind和subKind bool TestOpeningKind(TDbOpening *pOp1, TDbOpening *pOp2) { if (pOp1->GetKind() != pOp2->GetKind()) return false; else if (pOp1->GetKind() == TDbOpening::OP_DOOR || pOp1->GetKind() == TDbOpening::OP_WINDOW || pOp1->GetKind() == TDbOpening::OP_ARCWIN) return pOp1->GetSubKind().CompareNoCase(pOp2->GetSubKind()) == 0; else return true; } // lgh add 20110304, 获得门的编号,需要pOp的类型是TDbOpening,TdbCornerWin,TdbBandWin, TDbDormer; CString GetOpeningLabel(TDbEntity *pOp) { if (pOp->isKindOf(TDbOpening::desc())) { return TDbOpening::cast(pOp)->GetLabel(); } else if (pOp->isKindOf(TDbDormer::desc())) { return TDbDormer::cast(pOp)->GetLabel(); } else if (pOp->isKindOf(TDbCornerWin::desc())) { return TDbCornerWin::cast(pOp)->GetLabel(); } else return _T(""); } // lgh add 20110304, 获得门的自动编号,需要pOp的类型是TDbOpening,TdbCornerWin,TdbBandWin, TDbDormer; CString GetOpeningAutoLabel(TDbEntity *pOp, bool &bReName) { if (pOp->isKindOf(TDbOpening::desc())) { return TDbOpening::cast(pOp)->GetAutoLabel(bReName); } else if (pOp->isKindOf(TDbDormer::desc())) { return TDbDormer::cast(pOp)->GetAutoLabel(bReName); } else if (pOp->isKindOf(TDbCornerWin::desc())) { return TDbCornerWin::cast(pOp)->GetAutoLabel(bReName); } else return _T(""); } // lgh add 20110304, 设置门的编号,需要pOp的类型是TDbOpening,TdbCornerWin,TdbBandWin, TDbDormer; void SetOpeningLabel(TDbEntity *pOp, CString strName) { pOp->assertWriteEnabled(); if (pOp->isKindOf(TDbOpening::desc())) { TDbOpening::cast(pOp)->SetLabel(strName); } else if (pOp->isKindOf(TDbDormer::desc())) { TDbDormer::cast(pOp)->SetLabel(strName); } else if (pOp->isKindOf(TDbCornerWin::desc())) { TDbCornerWin::cast(pOp)->SetLabel(strName); } } // lgh add 20110304, 检测编号类型是否相同,需要pOp的类型是TDbOpening,TdbCornerWin,TdbBandWin, TDbDormer; bool TestOpeningKind(TDbEntity *pEnt1, TDbEntity *pEnt2) { if (pEnt1->isKindOf(TDbOpening::desc()) && pEnt2->isKindOf(TDbOpening::desc())) { return TestOpeningKind(TDbOpening::cast(pEnt1), TDbOpening::cast(pEnt2)); } else if (pEnt1->isKindOf(TDbBandWin::desc()) && pEnt2->isKindOf(TDbBandWin::desc())) return true; else if (!pEnt1->isKindOf(TDbBandWin::desc()) && !pEnt2->isKindOf(TDbBandWin::desc()) && pEnt1->isKindOf(TDbCornerWin::desc()) && pEnt2->isKindOf(TDbCornerWin::desc())) return true; else if (pEnt1->isKindOf(TDbDormer::desc()) && pEnt2->isKindOf(TDbDormer::desc())) return true; else return false; } // lgh add 20110304, 查找,如果没有则返回-1,否则返回id在数组中的位置。 int FindIdInLst(DList &idList, const AcDbObjectId &id) { for (int i = 0; i < (int)idList.Length(); i++) { if (*(idList[i]) == id) return i; } return -1; } CString GetSequenceHead(CString strlabel); // 对门窗执行自动编号。 void AutoDoorWinLabel(CArray &aryIdGroup) { // 1、从当前图中读出所有的门窗, DList idList; GetEntFromBlockByDxf(idList, _T("TCH_OPENING")); GetEntFromBlockByDxf(idList, _T("TCH_CORNER_WINDOW")); GetEntFromBlockByDxf(idList, _T("TCH_DORMER")); // 2、从所有门窗中过滤掉aryIdGroup中的门窗 int i = 0, j = 0; for (i = 0; i < (int)aryIdGroup.GetSize(); i++) { AcDbObjectIdArray *pAry = aryIdGroup[i]; for (int j = 0; j < (int)pAry->length(); j++) { if (idList.Length() != 0) { int nPos = FindIdInLst(idList, (*pAry)[j]); if (nPos != -1) idList.Remove(nPos); } } } // 3、遍历aryIdGroup从原始数据中找出匹配的编号:并且检索顺序编号的最大值,或者根据尺寸编号。 for (i = 0; i < (int)aryIdGroup.GetSize(); i++) { AcDbObjectIdArray *pAry = aryIdGroup[i]; if (pAry != NULL && pAry->length() != 0) { AcDbObjectId id = (*pAry)[0]; // 查找跟他相匹配的编号 bool bReName = false; CString strAutoLabel; OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEntity, pEnt) { if (pEnt == NULL) continue; strAutoLabel = GetOpeningAutoLabel(pEnt, bReName); CString strHead; if (strAutoLabel.IsEmpty()) strHead = _T(""); else if (strAutoLabel.Right(1).CompareNoCase(_T("-")) == 0) strHead = strAutoLabel.Left(strAutoLabel.GetLength() - 1); else strHead = strAutoLabel; if (bReName) { int nBigNum = 1; for (j = 0; j < (int)idList.Length(); j++) { AcDbObjectId idInList = *(idList[j]); OPENOBJ_BEGIN(idInList, AcDb::kForRead, TDbEntity, pEntDWG) { CString sOldLabel = GetOpeningLabel(pEntDWG); if (!CheckDoorWinLabel(sOldLabel)) continue; // 不是顺序编号不做测试。 if (TestOpeningKind(pEnt, pEntDWG)) { // 同类型的编号 // 如果两者匹配,则使用直接使用它的编号。 if (CanSameLabel(pEntDWG, pEnt)) { strAutoLabel = sOldLabel; nBigNum = 0; break; } // 如果需要重命名,需要提取本类型的最大编号 int nSeq = GetSequenceNum(sOldLabel) + 1; nBigNum = nBigNum > nSeq ? nBigNum : nSeq; } else { // 不同类型编号的时候,要检测普通门窗的重名编号。(继承自TDBOpening) if (pEnt->isKindOf(TDbOpening::desc()) && pEntDWG->isKindOf(TDbOpening::desc())) { if (GetSequenceHead(sOldLabel).CompareNoCase(strHead) == 0) { // 两编号的前缀相同, int nSeq = GetSequenceNum(sOldLabel) + 1; nBigNum = nBigNum > nSeq ? nBigNum : nSeq; } } } } OPENOBJ_END() } // end for idlst; if (nBigNum > 0) strAutoLabel.Format(_T("%s%d"), strAutoLabel, nBigNum); } } OPENOBJ_END() // 执行编号设置,然后把这些东西追加到最后边 for (j = 0; j < (int)pAry->length(); j++ ) { AcDbObjectId id = (*pAry)[j]; OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbEntity, pEnt) if (pEnt == NULL) continue; SetOpeningLabel(pEnt, strAutoLabel); OPENOBJ_END() // 把这些ID追加到链表中, idList.Append(new AcDbObjectId(id)); } } } } // 获得默认编号, //如果当前是尺寸编号,则直接根据洞口尺寸编号。 // 如果当前是顺序编号,则需要查找当前图中的顺序编号,查找尺寸匹配的编号,否则取本类型和本同前缀(TDbOpening)编号最大的 CString GetDefaultLabel(CArray &aryIdGroupFilter, AcDbObjectId id) { // 1、从当前图中读出所有的门窗, DList idList; GetEntFromBlockByDxf(idList, _T("TCH_OPENING")); GetEntFromBlockByDxf(idList, _T("TCH_CORNER_WINDOW")); GetEntFromBlockByDxf(idList, _T("TCH_DORMER")); // 2、从所有门窗中过滤掉aryIdGroup中的门窗 int i = 0, j = 0; for (i = 0; i < (int)aryIdGroupFilter.GetSize(); i++) { AcDbObjectIdArray *pAry = aryIdGroupFilter[i]; for (int j = 0; j < (int)pAry->length(); j++) { if (idList.Length() != 0) { int nPos = FindIdInLst(idList, (*pAry)[j]); if (nPos != -1) idList.Remove(nPos); } } } OPENOBJ_BEGIN(id, AcDb::kForRead, TDbEntity, pEnt) { if (pEnt == NULL) return _T(""); bool bReLabel; CString strAutoLabel = GetOpeningAutoLabel(pEnt, bReLabel); CString strHead; if (strAutoLabel.IsEmpty()) strHead = _T(""); else if (strAutoLabel.Right(1).CompareNoCase(_T("-")) == 0) strHead = strAutoLabel.Left(strAutoLabel.GetLength() - 1); else strHead = strAutoLabel; if (bReLabel) { // 查找按照顺序的同类型编号,并且搜寻最大值 int nBigNum = 1; for (i = 0; i < (int)idList.Length(); i++) { AcDbObjectId idInList = *(idList[i]); OPENOBJ_BEGIN(idInList, AcDb::kForRead, TDbEntity, pEntDWG) { if (pEntDWG == NULL) continue; CString strOldLabel = GetOpeningLabel(pEntDWG); if (!CheckDoorWinLabel(strOldLabel)) continue; if (TestOpeningKind(pEnt, pEntDWG)) { if (CanSameLabel(pEntDWG, pEnt)) { return strOldLabel; } else { int nSeq = GetSequenceNum(strOldLabel) + 1; nBigNum = nBigNum > nSeq ? nBigNum : nSeq; } } else { if (pEnt->isKindOf(TDbOpening::desc()) && pEntDWG->isKindOf(TDbOpening::desc())) { if (strHead.CompareNoCase(GetSequenceHead(strOldLabel)) == 0) { int nSeq = GetSequenceNum(strOldLabel) + 1; nBigNum = nBigNum > nSeq ? nBigNum : nSeq; } } } } OPENOBJ_END() } // end for idLst; if (nBigNum > 0) strAutoLabel.Format(_T("%s%d"), strAutoLabel, nBigNum); return strAutoLabel; } else { return strAutoLabel; } } OPENOBJ_END() return _T(""); // 不可能到达 } void ChWinLab() { // 8.5版本的门窗编号添加对老虎窗和带形窗以及转角窗的支持 // sg modify 111018,修改过滤器,选择门窗时,只考虑门窗对象的类型,而不考虑图层 //RBList mask(RTDXF0, _T("TCH_OPENING,TCH_CORNER_WINDOW,TCH_DORMER"),-4,_T(""),NULL); RBList mask(RTDXF0, _T("TCH_OPENING,TCH_CORNER_WINDOW,TCH_DORMER"),NULL); PickSet ssAll(SS_FREE); if (SelectEntities(_T("\n请选择需要改编号的门窗的范围<退出>:"), ssAll, mask) != RTNORM) return; // 其他情况下一律退出。 CArray aryIdGroup; // ID分组,归类 // 对所有框选的实体执行分组。 int i = 0; for(i = 0; i<(int)ssAll.Length(); i++) { Entity ent = ssAll[(long)i]; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEntity, pOpening1); if (pOpening1) { if (pOpening1->isKindOf(TDbOpening::desc())) { CString strSubKind = TDbOpening::cast(pOpening1)->GetSubKind(); if (strSubKind.Compare(_T("隔断门")) == 0 || strSubKind.Compare(_T("电梯门")) == 0) continue;// 过滤隔断门和电梯门不执行自动编号。 // sg add 110309,过滤隔断门和电梯门 if ((TDbOpening::cast(pOpening1)->m_nOpStyle&OPS_LVTRY) || ( TDbOpening::cast(pOpening1)->m_nOpStyle&OPS_LIFTDOOR)) continue; } bool bAdd = false; for (int jGroup = 0; jGroup < (int)aryIdGroup.GetSize(); jGroup++) { AcDbObjectIdArray *pAry = aryIdGroup[jGroup]; OPENOBJ_BEGIN((*pAry)[0], AcDb::kForRead, TDbEntity, pOpeningGroup) { if (CanSameLabel(pOpening1, pOpeningGroup)) { pAry->append(pOpening1->id()); bAdd = true; break; } } OPENOBJ_END() } if (!bAdd) { AcDbObjectIdArray *pAryNew = new AcDbObjectIdArray; pAryNew->append(pOpening1->id()); aryIdGroup.Add(pAryNew); } } OPENOBJ_END(); } PickSet ssNew(SS_FREE); while (aryIdGroup.GetSize() > 0) // 具有分组 { int nCurSel = -1; // 所选择的分组。 if (aryIdGroup.GetSize() > 1) { Entity entTmp; int nRet=RTNORM; while(nRet==RTNORM) { TCHAR cRet; nRet=SelectEntity(_T("\n请选择需要修改编号的样板门窗或[自动编号(S)]<退出>:"), entTmp, mask,_T("S"),cRet); if (nRet == RTNORM) { // 正常选择,数据可能为空, OPENOBJ_BEGIN(entTmp, AcDb::kForRead, TDbEntity, pSelEnt) { if (pSelEnt == NULL) { if (nCurSel > -1 && nCurSel < (int)aryIdGroup.GetSize()) UnHighShowIdAry(*aryIdGroup[nCurSel]); nCurSel = -1; //清空显示 continue; } int nOldSel = nCurSel; nCurSel = -1; for (int iGroup = 0; iGroup < (int)aryIdGroup.GetSize(); iGroup++) { if ((*aryIdGroup[iGroup])[0] == pSelEnt->id()) { nCurSel = iGroup; break; } else { OPENOBJ_BEGIN(((*aryIdGroup[iGroup])[0]), AcDb::kForRead, TDbEntity, pGroupEnt) { if (CanSameLabel(pGroupEnt, pSelEnt)) { nCurSel = iGroup; break; } } OPENOBJ_END() } } if (nOldSel > -1 && nOldSel < (int)aryIdGroup.GetSize()) UnHighShowIdAry(*aryIdGroup[nOldSel]); if (nCurSel > -1 && nCurSel < (int)aryIdGroup.GetSize()) HighShowIdAry(*aryIdGroup[nCurSel]); } OPENOBJ_END() } else if (nRet == RTKWORD) { // 自动编号关键字 // 需要执行自动编号 AutoDoorWinLabel(aryIdGroup); nCurSel = -1; TArchCmdReactor::ResetAll(); } else if (nRet == RTCAN) { // 退出命令。 if (nCurSel > -1 && nCurSel < (int)aryIdGroup.GetSize()) UnHighShowIdAry(*aryIdGroup[nCurSel]); return; } else { // 如果已经有选择的门窗则开始编号: // break; } } } else { nCurSel = 0; HighShowIdAry(*aryIdGroup[nCurSel]); } if (nCurSel == -1) { ReleaseIdGroup(aryIdGroup); return; // 退出了。 } // 选中了nCurrSel,对他执行编号,当前这一组是亮显的 AcDbObjectIdArray &aryIdCurrSel = *aryIdGroup[nCurSel]; // 关于默认编号: // 如果是按照尺寸编号,则直接生产尺寸编号。作为默认值。 // 如果是按照顺序编号,则全局搜索,匹配同尺寸的编号,或者得出当前最大的顺序编号,对该编号执行新的编号 CString sAutoLabel = GetDefaultLabel(aryIdGroup, aryIdCurrSel[0]); CString sPrompt; XString sxLabel; sPrompt.Format(_T("\n请输入新的门窗编号或[删除编号(E)]<%s>:"), sAutoLabel); int nRet = 0; INITGET_BEG(0, _T("E")); nRet=ads_getstring(0, sPrompt, sxLabel); INITGET_END(); if (nRet == RTNORM) { // 正常编号,使用用户输入的字符串 // 使用sxLabel;; if (sxLabel == _T("")) sxLabel = sAutoLabel; else if (sxLabel == _T("E")) sxLabel = _T(""); } else if (nRet == RTKWORD) { // 按下了关键字,使用空编号 sxLabel = _T(""); } else if (nRet == RTNONE) { // 空,使用默认编号 sxLabel = sAutoLabel; } else { // 相当于取消处理 // 退出程序。 UnHighShowIdAry(aryIdCurrSel); ReleaseIdGroup(aryIdGroup); return; } for (i = 0; i < (int)aryIdCurrSel.length(); i++) { OPENOBJ_BEGIN(aryIdCurrSel[i], AcDb::kForWrite, TDbEntity, pEnt) { if (pEnt == NULL) continue; pEnt->assertWriteEnabled(); if (pEnt->isKindOf(TDbOpening::desc())) TDbOpening::cast(pEnt)->SetLabel(sxLabel); else if (pEnt->isKindOf(TDbCornerWin::desc())) TDbCornerWin::cast(pEnt)->SetLabel(sxLabel); else if (pEnt->isKindOf(TDbDormer::desc())) TDbDormer::cast(pEnt)->SetLabel(sxLabel); } OPENOBJ_END() } UnHighShowIdAry(aryIdCurrSel); delete aryIdGroup[nCurSel]; aryIdGroup.RemoveAt(nCurSel); TArchCmdReactor::ResetAll(); } ReleaseIdGroup(aryIdGroup); } //////////////////////////////////////////////// // Command: 改门窗宽度 // 必须在WCS下 void ChangeOpeningWidth() { //AsureWCS(); RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); PickSet ss(SS_FREE); if (SelectEntities(_T("\n请选择门窗: "), ss, mask)==RTNORM) { //取缺省宽度 Entity entFirst=ss[0L]; double nNewWidth=2100; OPENOBJ_BEGIN(entFirst, AcDb::kForRead, TDbOpening, pOpening); if (!pOpening) return; nNewWidth=pOpening->GetWidth(); OPENOBJ_END(); if (GetReal(_T("\n新的宽度"), nNewWidth, RSG_NONEG|RSG_NOZERO)==RTCAN) return; long lCount = ss.Length(); for(long i=0L; iassertWriteEnabled(); pOpening->SetWidth(nNewWidth); } OPENOBJ_END(); } } } //////////////////////////////////////////////// // Command: 互换窗和高窗, V1.1--Now Canceled // 必须在WCS下 void ChHWin() { RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); PickSet ss(SS_FREE); if (SelectEntities(_T("\n请选择窗:"), ss, mask)==RTNORM) { long lCount = ss.Length(); for(long i=0L; iassertWriteEnabled(); if (pOpening->IsHigh()) { pOpening->m_nOpStyle &= ~OPS_ATHIGH; //pOpening->setLinetype(_T("CONTINUOUS")); } else { pOpening->m_nOpStyle |= OPS_ATHIGH; //pOpening->setLinetype(_T("DASHED")); } OPENOBJ_END(); } } } // Command: 插入任意洞 V2.0 void PolyHole() { //AsureWCS(); RBList mask(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 1, NULL); Entity entWall; XPoint ptOnSide; double nDrt=0; if (SelectWallSide(entWall, ptOnSide, &nDrt)!=RTNORM) return; Entity entPline; g_ssPickFirst.Free(); if (entPline.FilterSelect(_T("\n选择墙面上洞口轮廓线的封闭多段线: "), mask)!=RTNORM) return; OPENOBJ_BEGIN(entWall, AcDb::kForRead, TDbWall, pWall); if (!pWall) return; if (pWall->Is(CURVE_ARC)) { adsout << _T("\n弧墙上不能开任意形状的洞口!"); return; } nDrt = pWall->Direction(ptOnSide); //Modify here by ZJQ XPoly2D poly0(entPline); if (!poly0 || !poly0.IsClosed() || (poly0.GetFlag() & 0x08)) { adsout << _T("\n无效的轮廓线!"); return; } CAcModuleResourceOverride vTemp; CPolyHoleDlg dlg(acedGetAcadFrame()); if (dlg.DoModal()!=IDOK) return; /* double nDepth = pWall->GetWidth(); if (GetDist(_T("\n洞深"), nDepth, RSG_NOZERO|RSG_NONEG)==RTCAN) return; static nAns=Q_YES; nAns = YesNoQuestion(_T("\n是否在视线上方"), nAns); if (nAns==RTCAN) return; */ //确定插入点和门窗的参数 XPoint ptCen, ptLow, ptUp; double nWidth, nHeight; poly0.GetExtend(ptLow, ptUp); Midpoint(ptLow, ptUp, ptCen); nWidth=ptUp.x-ptLow.x; nHeight=ptUp.y-ptLow.y; XPoint ptLoc=ptCen; ads_trans(ptCen, (resbuf *)&Groups(entPline.name), (resbuf *)&Groups(0), 0, ptLoc); ptLoc.z -= nHeight/2.0; OPENOBJ_BEGIN(entPline, AcDb::kForWrite, AcDbPolyline, pOutline); if (pOutline) { ads_matrix mat; ptLoc.GetRotationMatrix(-nDrt, mat); VERIFY(pOutline->transformBy(AsAcGeMatrix3d(mat))==Acad::eOk); } OPENOBJ_END(); PickSet ss(SS_FREE); ss += entPline; TCHAR szAnonymous[256]=_T("*U"); if (ss.MakeAnonymous(ptLoc, szAnonymous, FALSE)!=RTNORM) { //entPline.SetData(210, &vtOld); //entPline.Modify(); return; } // Restore //ss.Delete(); //Undelete //entPline.SetData(210, &vtOld); //entPline.Modify(); XDbBlockTableRec rec(szAnonymous, AcDb::kForWrite); //遍历块表记录,寻找轮廓的POLYLINE AcDbBlockTableRecordIterator* pBlockIterator=NULL; VERIFY(rec.m_pBlockTableRec->newIterator(pBlockIterator)==Acad::eOk && pBlockIterator); XString sOutlineEntHandle; for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEntity; VERIFY(pBlockIterator->getEntity(pEntity, AcDb::kForWrite, Adesk::kTrue)==Acad::eOk); ASSERT(pEntity->isKindOf(AcDbPolyline::desc()) || pEntity->isKindOf(AcDb2dPolyline::desc())); pEntity->setLayer(LAY_BOUNDARY); AcDbHandle entHandle; pEntity->getAcDbHandle(entHandle); #if (ADS > 19) entHandle.getIntoAsciiBuffer(sOutlineEntHandle, 1024); #else entHandle.getIntoAsciiBuffer(sOutlineEntHandle); #endif pEntity->close(); break; } delete pBlockIterator; resbuf *pXData=ads_buildlist(1001, TCHXD, 1040, nWidth, 1040, nHeight, 1005, (TCHAR *)sOutlineEntHandle, NULL); if (!XSymbolTable(_T("APPID"), TCHXD)) ads_regapp(TCHXD); VERIFY(rec.m_pBlockTableRec->setXData(pXData)==Acad::eOk); ads_relrb(pXData); AcDbObjectId idStyle3d=rec.m_pBlockTableRec->objectId(); rec.Close(); XPoint ptLoc1; if (!pWall->GetOpeningLocation(ptLoc, TOpeningData::OP_HOLE, nWidth, ptLoc1)) { //投影到墙心上 adsout << _T("\n插入后, 该墙上的门窗将发生干涉! 拒绝插入!"); return;; } ptLoc1.z=ptLoc.z; TDbOpening *pWin = new TDbOpening(pWall->objectId(), AcDbObjectId::kNull, idStyle3d); pWin->SetKind(TOpeningData::OP_HOLE); pWin->SetWidth(nWidth); pWin->SetHeight(nHeight); //pWin->SetThickness(nDepth); // add by xly on 110125 设置门窗对象的转角布局 pWin->SetLayoutRotation(Ucs2Wcs(0)); pWin->m_nOpStyle |= OPS_POLY_HOLE; pWin->m_ptLocation = ptLoc1; dlg.Dlg2Obj(*pWin); pWin->SetLabel(dlg.GetLabel(pWin)); dlg.AfterModelAdded(pWin); //if (nAns==Q_YES) // pWin->m_nOpStyle |= OPS_ATHIGH; //if (nDepthGetWidth()-_DIST_SNAP) { // pWin->m_nOpStyle |= OPS_NOT_BORE; if (!dlg.m_bBoreHole) { XCurveSegment segCen=pWall->OffsetGeomCenter(); int nSide=segCen.OnWhichSide(ptOnSide); pWin->m_nQuadrant = nSide==OFFSET_LEFT? 0:3; //Modify here by ZJQ } if (!pWall->CanInsertOpening(*pWin)) { delete pWin; return; } VERIFY(pWall->upgradeOpen()==Acad::eOk); //pWin->setLinetype(_T(_T("DASH"))); pWin->InitHardPointerId(); pWin->AddToMSpace(Adesk::kFalse); pWall->InsertOpening(pWin); pWin->close(); VERIFY(pWall->downgradeOpen()==Acad::eOk); OPENOBJ_END(); } //////////////////////////////////// //// Command: 制作门窗套 //// 必须在WCS下 //void OpSlot() //{ // //AsureWCS(); // PickSet ssOpening(SS_FREE); // RBList mask(RTDXF0, _T(_T("TCH_OPENING")), NULL); // if (SelectEntities(/*UMSG*/_T(_T("\n请选择外墙上的门窗: ")), ssOpening, mask)==RTNORM) { // static double h=200; //出墙长度 // static double d=200; //门窗套宽度 // if (GetReal(/*UMSG*/_T(_T("\n伸出墙的长度")), h, RSG_NONEG|RSG_NOZERO)==RTCAN || // GetReal(/*UMSG*/_T(_T("\n门窗套宽度")), d, RSG_NONEG|RSG_NOZERO)==RTCAN) // return; // // long lCount=ssOpening.Length(); // for(long idx=0L; idxGetWallId(); // if (!idWall) { // adsout << /*UMSG*/_T(_T("\n门窗没有在墙体内! ")); // continue; // } // XDbObject objWall(idWall, AcDb::kForRead); // TDbWall *pWall=TDbWall::cast(objWall.m_pObject); // ASSERT(pWall); // if (!pWall->IsExternal(OFFSET_LEFT) && !pWall->IsExternal(OFFSET_RIGHT)) { // XPoint ptBase=pOpening->m_ptLocation; // XPoint ptBaseUcs=Wcs2Ucs(ptBase); // XPoint ptSide; // if (ads_getpoint(ptBaseUcs, _T(_T("\n点取窗套所在的一侧:")), ptSide)!=RTNORM) // continue; // ptSide=Ucs2Wcs(ptSide); // XCurveSegment cvTemp=pWall->OffsetGeomCenter(); // int nSide=cvTemp.OnWhichSide(ptSide); // int nFlag=pWall->GetWallFlag(); // //nFlag |= WF_EXTERNAL; // if (nSide==OFFSET_LEFT) { // nFlag |= WF_LEFTEXT; // } else { // nFlag &= ~WF_LEFTEXT; // } // if (pWall->upgradeOpen()==Acad::eOk) { // pWall->assertWriteEnabled(); // pWall->SetWallFlag(nFlag); // pWall->downgradeOpen(); // } // } // objWall.Close(); // if (pOpening->GetKind()==TOpeningData::OP_CORNWIN) { // adsout << _T(_T("\n不能在转角窗上加门窗套!")); // continue; // } // if (pOpening->upgradeOpen()==Acad::eOk) { // pOpening->assertWriteEnabled(); // pOpening->SetSlot(h, d,rand()%2+1); // pOpening->downgradeOpen(); // } // } // } //} // Add by lcf on 20050725 // command:门窗套 class COpSlotDlg : public CModelessDialog { public: // modify by xly on 110110 /*COpSlotDlg(CWnd* pParent = NULL): CModelessDialog(COpSlotDlg::ID1, pParent) , m_nAdd(0), m_dLength(200), m_dWidth(200){}*/ COpSlotDlg(CWnd* pParent = NULL); //enum { IDD = IDD_DIALOG_OPSLOT, ID1 = IDD_DIALOG_OPSLOT1 }; enum { IDD = IDD_DIALOG_OPSLOT}; /*BOOL m_nAdd; double m_dLength; double m_dWidth;*/ static BOOL m_bAdd; static double m_dLength; static double m_dWidth; // add by xly on 110110 static CString m_csMateral; // 记录材料 CImageDC m_imgPreview; // 幻灯片预览的DC public: // 获得门窗套材料的字符串 CString GetMateral(); // 获得门窗套材料的索引号,用于设置数据 int GetMateralIndex(AcDbObjectId idWall); protected: virtual void DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_Radio(pDX, IDC_RADIO_ADD, m_bAdd); DDX_Text(pDX, IDC_EDIT_LENGTH, m_dLength); DDX_Text(pDX, IDC_EDIT_WIDTH, m_dWidth); DDX_CBString(pDX, IDC_COMBO_MATERIAL, m_csMateral);// add by xly 材料控件 } virtual void OnOK() { UpdateData(); CModelessDialog::OnOK(); m_bAdd=0; } virtual void OnCancel() { UpdateData(); CModelessDialog::OnOK(); m_bAdd=1; } // 设置幻灯片显示 void SetPicture(); // add by xly on 110110 virtual BOOL OnInitDialog(); afx_msg void OnBnClickedAdd(); afx_msg void OnBnClickedDel(); afx_msg void OnSelMateral(); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; // add by xly on 110110 增加静态变量的初始化 CString COpSlotDlg::m_csMateral = _T("同相邻墙体"); BOOL COpSlotDlg::m_bAdd = 0; double COpSlotDlg::m_dLength = 200; double COpSlotDlg::m_dWidth = 200; BEGIN_MESSAGE_MAP(COpSlotDlg, CModelessDialog) //{{AFX_MSG_MAP(CModelessDialog) ON_BN_CLICKED(IDC_RADIO_ADD, OnBnClickedAdd)// 加门窗套 ON_BN_CLICKED(IDC_RADIO_DEL, OnBnClickedDel)// 消门窗套 ON_CBN_SELCHANGE(IDC_COMBO_MATERIAL, OnSelMateral) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() COpSlotDlg::COpSlotDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(COpSlotDlg::IDD, pParent) { //{{AFX_DATA_INIT(COpSlotDlg) //}}AFX_DATA_INIT } BOOL COpSlotDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); if (m_bAdd)// 消门窗套 { GetDlgItem(IDC_EDIT_LENGTH)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_WIDTH)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_MATERIAL)->EnableWindow(FALSE); } else { GetDlgItem(IDC_EDIT_LENGTH)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_WIDTH)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_MATERIAL)->EnableWindow(TRUE); } // 设置幻灯片 SetPicture(); // 控件提示工具 AddTip(IDC_STC_MATERAL, _T("采用保温材料的门窗套只有在墙体对应侧有保温时才可显示。")); UpdateData(FALSE); return TRUE; } // add by xly on 110110 点击“加门窗套” void COpSlotDlg::OnBnClickedAdd() { UpdateData(TRUE); GetDlgItem(IDC_EDIT_LENGTH)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_WIDTH)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_MATERIAL)->EnableWindow(TRUE); UpdateData(FALSE); } // add by xly on 110110 点击“消门窗套” void COpSlotDlg::OnBnClickedDel() { UpdateData(TRUE); GetDlgItem(IDC_EDIT_LENGTH)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_WIDTH)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_MATERIAL)->EnableWindow(FALSE); UpdateData(FALSE); } // 改变材料 void COpSlotDlg::OnSelMateral() { UpdateData(TRUE); SetPicture(); UpdateData(FALSE); } // 设置幻灯片显示 void COpSlotDlg::SetPicture() { XString sFilePath(256); CString csStyle = GetMateral(); if (csStyle==_T("同相邻墙体")) { sFilePath << _T("TArch(windset01)"); } else if (csStyle==_T("钢筋混凝土")) { sFilePath << _T("TArch(windset02)"); } else if (csStyle==_T("轻质材料")) { sFilePath << _T("TArch(windset03)"); } else if (csStyle==_T("保温材料")) { sFilePath << _T("TArch(windset04)"); } // 获得图片控件 CWnd* pWndBmp = GetDlgItem(IDC_PICTURE_OPSLOT); ASSERT(pWndBmp); // 获得图片区域 CDC *pDC = pWndBmp->GetDC(); CRect rect; pWndBmp->GetClientRect(rect); m_imgPreview.InitDC(pDC, rect, GetAcadBackColor()); m_imgPreview.PaintSlide(sFilePath); m_imgPreview.SetDC(NULL); pWndBmp->ReleaseDC(pDC); } // 窗口重绘消息 void COpSlotDlg::OnPaint() { CPaintDC dc(this); CRect rcClip, rcImage; dc.GetClipBox(&rcClip); CWnd *pImageBox = GetDlgItem(IDC_PICTURE_OPSLOT); if (pImageBox) { pImageBox->GetWindowRect(&rcImage); ScreenToClient(&rcImage); if (!rcImage.IntersectRect(&rcImage, &rcClip)) return; CDC *pDC = pImageBox->GetDC(); m_imgPreview.SetDC(pDC); m_imgPreview.Redraw(); m_imgPreview.SetDC(NULL); pImageBox->ReleaseDC(pDC); } } // 获得墙体材料 CString COpSlotDlg::GetMateral() { UpdateData(TRUE); return m_csMateral; } // 获得门窗套材料的索引号,用于设置数据 int COpSlotDlg::GetMateralIndex(AcDbObjectId idWall) { if (m_csMateral == _T("同相邻墙体")) { return 0; } else if (m_csMateral == _T("钢筋混凝土")) { OPENOBJ_BEGIN(idWall, AcDb::kForRead, TDbWall, pWall); if (pWall != NULL) { if (pWall->GetStyle() == TDbWall::kConcrete) // 判断相邻墙体如果也是“钢筋混凝土”,则按照“同相邻墙体”处理 { return 0; } } OPENOBJ_END(); return 1; } else if (m_csMateral == _T("轻质材料")) { return 2; } return 3; } void OpSlot() { // delete by xly on 110110 /*static double h = 200; static double d = 200; static BOOL bAdd= 0;*/ CAcModuleResourceOverride vTemp; COpSlotDlg dlg(acedGetAcadFrame()); //delete by xly on 110110 /*dlg.m_dLength = h; dlg.m_dWidth = d; dlg.m_nAdd=bAdd;*/ RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); PickSet ss(SS_FREE); ss = g_ssPickFirst; ss.BaseFilter(mask); // modify by xly on 110110不管右键命令和屏幕菜单命令一致 /*if (ss.Length() > 0) { if (dlg.DoModal() != IDOK) return; } else { if ( !dlg.Create(dlg.IDD, acedGetAcadFrame()) ) return; dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); if (SelectEntities(_T("\n请选择外墙上的门窗: "), ss, mask)!=RTNORM) { dlg.DestroyWindow(); return; } dlg.UpdateData(); }*/ if ( !dlg.Create(dlg.IDD, acedGetAcadFrame()) ) return; dlg.ShowWindow(SW_SHOW); acedGetAcadDwgView()->SetFocus(); if (SelectEntities(_T("\n请选择外墙上的门窗: "), ss, mask)!=RTNORM) { dlg.UpdateData(); dlg.DestroyWindow(); return; } dlg.UpdateData(); double h(0.0), d(0.0); int nAdd = dlg.m_bAdd; h = dlg.m_dLength; d = dlg.m_dWidth; dlg.DestroyWindow(); if (nAdd == 0) // 添加 { AcDbObjectId eId; long lCount=ss.Length(); for(long idx=0L; idxGetWallId(); if (!idWall) { adsout << /*UMSG*/_T("\n门窗没有在墙体内! "); continue; } if (eId != idWall) { eId = idWall; XDbObject objWall(idWall, AcDb::kForRead); TDbWall *pWall=TDbWall::cast(objWall.m_pObject); // sg modify 110215,减少不必要的崩溃 // ASSERT(pWall); if (pWall == NULL) continue; if (!pWall->IsExternal(OFFSET_LEFT) && !pWall->IsExternal(OFFSET_RIGHT)) { XPoint ptBase = pOpening->m_ptLocation; XPoint ptBaseUcs = Wcs2Ucs(ptBase); XPoint ptSide; if (ads_getpoint(ptBaseUcs, _T("\n点取窗套所在的一侧:"), ptSide)!=RTNORM) return; ptSide = Ucs2Wcs(ptSide); XCurveSegment cvTemp = pWall->OffsetGeomCenter(); int nSide = cvTemp.OnWhichSide(ptSide); int nFlag = pWall->GetWallFlag(); //nFlag |= WF_EXTERNAL; if (nSide==OFFSET_LEFT) { nFlag |= WF_LEFTEXT; } else { nFlag &= ~WF_LEFTEXT; } if (pWall->upgradeOpen()==Acad::eOk) { pWall->assertWriteEnabled(); pWall->SetWallFlag(nFlag); pWall->downgradeOpen(); } } objWall.Close(); } if (pOpening->GetKind() == TOpeningData::OP_CORNWIN) { adsout << _T("\n不能在转角窗上加门窗套!"); continue; } if (pOpening->upgradeOpen() == Acad::eOk) { pOpening->assertWriteEnabled(); pOpening->SetSlot(h, d); pOpening->SetSlotMaterial(dlg.GetMateralIndex(idWall)); // sg add 110215,增加门窗套材料的设置 extern TARCH_IMPEXP double g_dSlotInsulateThick; extern TARCH_IMPEXP BOOL g_bSlotInsulateCap; pOpening->SetSlotInsulateThick(g_dSlotInsulateThick); // 设置门窗套默认保温厚 pOpening->SetSlotInsulateCap(g_bSlotInsulateCap); // 设置门窗套保温是否封口 pOpening->downgradeOpen(); } } } else // 删除 { long lCount = ss.Length(); for (long i=0L; iassertWriteEnabled(); pOpening->RemoveSlot(); } } } ////////////////////////////////// // Command: 取消门窗套 void DelOpSlot() { PickSet ss(SS_FREE); RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); if (SelectEntities(/*UMSG*/_T("\n请选择门窗: "), ss, mask)==RTNORM) { long lCount=ss.Length(); for(long i=0L; iassertWriteEnabled(); pOpening->RemoveSlot(); } } } ///////////////////////////////////// // Command: 复制上层门窗 void DupHLOpening() { PickSet ss(SS_FREE); RBList mask(RTDXF0, _T("TCH_OPENING"), NULL); adsout << _T("\n请选择门窗和洞!"); if (ss.Get(NULL, NULL, NULL, mask)!=RTNORM) return; static double nDist=3000; if (GetDist(_T("\n上下层的门窗下缘间距"), nDist, RSG_NONEG|RSG_NOZERO)==RTCAN) return; int nLevelNum=1; ads_initget(RSG_NOZERO|RSG_NONEG, NULL); adsout << _T("\n复制的层数<") << nLevelNum << _T(">: "); if (ads_getint(_T(""), &nLevelNum)==RTCAN) return; long lCount=ss.Length(); for(long i=0L; iGetWallId(); if (idWall) { OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbWall, pWall); if (pWall) { for(int j=0; jclone()); ASSERT(pClone); pClone->SetWallId(idWall); pClone->m_ptLocation.z += nDist*(j+1); pClone->m_nOpStyle |= OPS_HIGH_LEVEL; pClone->AddToMSpace(Adesk::kFalse); pWall->assertWriteEnabled(); pWall->AddOpeningId(pClone->objectId()); pClone->close(); } } OPENOBJ_END(); } } OPENOBJ_END(); } TArchCmdReactor::ResetAll(); } ///////////////////////////////////////// int EditOpeningInNewDlg(AcDbObjectId id, CString sCmd) { //return RTERROR; //wlw 2014版使用 //wlw mod 新建筑双击出新对话框 2013.5.7 return RTERROR; } //lgd 使用新界面编辑门窗 int EditOpening(AcDbObjectId idOpening) { OPENOBJ_BEGIN(idOpening, AcDb::kForWrite, TDbOpening, pOpening); if (!pOpening) return 0; OPENOBJ_END() OPENOBJ_BEGIN(idOpening, AcDb::kForRead, TDbOpening, pOpening); if (!pOpening) return 0; TOpeningData::OpeningKind opKind=pOpening->GetKind(); //lgd 140213 门、窗、门联窗、子母门的双击编辑使用新界面打开 //如果是凸窗或者墙洞,仍然使用老版本的双击编辑界面 if (TOpeningData::OP_DOOR==opKind || TOpeningData::OP_DOORWIN==opKind || TOpeningData::OP_TWODOOR==opKind) { if(EditOpeningInNewDlg(idOpening,_T("TGDoor\n")) == RTNORM) return RTNORM; } else if (TOpeningData::OP_WINDOW==opKind || TOpeningData::OP_ARCWIN==opKind) { if(EditOpeningInNewDlg(idOpening,_T("TGWindow\n")) == RTNORM ) return RTNORM; } if (opKind==TOpeningData::OP_CORNWIN) { double nElev=pOpening->GetLocation().z; double nHeight=pOpening->GetHeight(); if (GetDist(_T("\n新的高度"), nHeight, RSG_NONEG|RSG_NOZERO)==RTCAN) return RTERROR; if (GetDist(_T("\n新的标高"), nElev, 0)==RTCAN) return RTERROR; if (pOpening->upgradeOpen()==Acad::eOk) { pOpening->SetHeight(nHeight); pOpening->m_ptLocation.z = nElev; pOpening->downgradeOpen(); } return RTNORM; } else if (opKind==TOpeningData::OP_HOLE && (pOpening->m_nOpStyle&OPS_POLY_HOLE)) { CAcModuleResourceOverride vTemp; CPolyHoleDlg dlg(acedGetAcadFrame()); dlg.Obj2Dlg(*pOpening); if (dlg.DoModal()==IDOK) { if (pOpening->upgradeOpen()==Acad::eOk) { pOpening->assertWriteEnabled(); dlg.Dlg2Obj(*pOpening); pOpening->downgradeOpen(); } } return RTNORM; } { CAcModuleResourceOverride vTemp; CInsertOpeningDlg *pDlg=NULL; if (opKind==TOpeningData::OP_WINDOW || opKind==TOpeningData::OP_DOOR ) { //门/窗/门联窗 CDoorOrWinDlg *pDlg1=new CDoorOrWinDlg(opKind, acedGetAcadFrame()); pDlg=pDlg1; } else if (opKind==TOpeningData::OP_DOORWIN) { pDlg=new CDoorWinDlg(acedGetAcadFrame()); } else if (opKind==TOpeningData::OP_TWODOOR) { pDlg=new CTwoDoorDlg(acedGetAcadFrame()); } else if (opKind==TOpeningData::OP_PROWIN) { pDlg=new CBayWindowDlg(acedGetAcadFrame()); } else if (opKind==TOpeningData::OP_ARCWIN) { pDlg=new CArcWindowDlg(acedGetAcadFrame()); } else { pDlg=new CRectHoleDlg(acedGetAcadFrame()); } CInsertOpeningDlg &dlg=*pDlg; dlg.SetDlgParamFrom(*pOpening); if (dlg.DoModal()==IDOK) { //user edit 只能Read下进行 dlg.ModifyOpeningWithSameLabel(*pOpening, TRUE); } delete pDlg; } OPENOBJ_END(); return RTNORM; } // Command: 窗框展开 void ExpandWinFrame() { RBList mask=ads_buildlist(RTDXF0, _T("TCH_CORNER_WINDOW,TCH_OPENING"), NULL); Entity ent; if (SelectEntity(_T("\n选择窗: "), ent, mask)==RTNORM) { xg_setvar(_T("CLAYER"), _T("0")); AcDbVoidPtrArray entSetFix, entSetCustom; BOOL bContinue=FALSE; OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbEntity, pWin); if (pWin) { if (pWin->isKindOf(TDbOpening::desc())) { bContinue = ((TDbOpening *)pWin)->ExpandFrame(entSetFix, entSetCustom); } else if (pWin->isKindOf(TDbCornerWin::desc())) { ((TDbCornerWin *)pWin)->ExpandFrame(entSetFix, entSetCustom); bContinue=TRUE; } } OPENOBJ_END(); if (bContinue) { XPoint ptPos; if (ads_getpoint(NULL, _T("\n展开到位置<退出>:"), ptPos)==RTNORM) { ptPos=Ucs2Wcs(ptPos); AcDbObjectId idTemp=InitLayer(LAY_TEMP, FALSE); AcGeMatrix3d mat; mat.setToTranslation(ptPos); int nCount=entSetFix.length(); for(int n=0; nsetLayer(idTemp); pEnt->transformBy(mat); AddToModelSpace(pEnt, Adesk::kTrue); } nCount=entSetCustom.length(); for(n=0; ntransformBy(mat); AddToModelSpace(pEnt, Adesk::kTrue); } } } } } // Command: 窗框映射 void MapWinFrame() { RBList mask=ads_buildlist(RTDXF0, _T("TCH_CORNER_WINDOW,TCH_OPENING"), NULL); RBList maskCurve=ads_buildlist(RTDXF0, _T("LINE,ARC,CIRCLE"), 8, _T("0"), NULL); PickSet ssCurve(SS_FREE), ssWin(SS_FREE); if (SelectEntities(_T("\n选择待映射的窗: "), ssWin, mask)!=RTNORM) return; adsout << _T("\n提示:空选择则恢复原始默认的窗框!"); if (SelectEntities(_T("\n选择待映射的棱线: "), ssCurve, maskCurve)==RTCAN) return; long nCurveNum=ssCurve.Length(); XPoint ptBase; if (nCurveNum) { if (ads_getpoint(NULL, _T("\n基点<退出>:"), ptBase)!=RTNORM) return; ptBase=Ucs2Wcs(ptBase); } ads_matrix mat; ptBase.GetMoveMatrix(XPoint(), mat); DList lstCurves; for(long i=0L; iTransformBy(mat); lstCurves.Append(pSeg); } long nWinNum=ssWin.Length(); for(i=0L; iisKindOf(TDbOpening::desc())) { ((TDbOpening *)pWin)->SetFrameLines(lstCurves); } else if (pWin->isKindOf(TDbCornerWin::desc())) { ((TDbCornerWin *)pWin)->SetFrameMapping((nCurveNum!=0)); ((TDbCornerWin *)pWin)->SetFrameLines(lstCurves); } } OPENOBJ_END(); } } // command: 门窗名称复位 void ResetLabPos() { RBList mask=ads_buildlist(RTDXF0, _T("TCH_CORNER_WINDOW,TCH_OPENING"), NULL); PickSet ssWin(SS_FREE); // sg modify 120614,解决命令行提示错误 //if (SelectEntities(_T("\n选择名称待复位的窗: "), ssWin, mask)!=RTNORM) if (SelectEntities(_T("\n选择名称待复位的门窗: "), ssWin, mask)!=RTNORM) return; long nWinNum=ssWin.Length(); for(long i=0L; iisKindOf(TDbOpening::desc())) { TDbOpening *pWin=TDbOpening::cast(pEnt); ASSERT(pWin); XPoint ptPos=pWin->GetDefaultLabPos(); pWin->assertWriteEnabled(); pWin->SetLabelPos(ptPos); } else if (pEnt->isKindOf(TDbCornerWin::desc())) { TDbCornerWin *pWin=TDbCornerWin::cast(pEnt); ASSERT(pWin); pWin->UpdateLabelPos(); } } OPENOBJ_END(); } TArchCmdReactor::ResetAll(); } //编号后缀 void LabelFix() { RBList mask=ads_buildlist(RTDXF0, _T("TCH_CORNER_WINDOW,TCH_OPENING"), NULL); PickSet ssWin(SS_FREE); // sg modify 120614,解决命令行提示错误 // if (SelectEntities(_T("\n选择需要在编号后加缀的窗:"), ssWin, mask)!=RTNORM) if (SelectEntities(_T("\n选择需要加编号后缀的门窗:"), ssWin, mask)!=RTNORM) return; extern TARCH_IMPEXP CString g_sWinLabelPostFix; static XString sFix=g_sWinLabelPostFix,sFix1; XString sPrompt; sPrompt<<_T("\n请输入需要加的门窗编号后缀<")<:"); if (acedGetString(FALSE,sPrompt,sFix1)==RTCAN) return; if (sFix1.Length()>0) sFix=sFix1; long nWinNum=ssWin.Length(); for(long i=0L; iisKindOf(TDbOpening::desc())) { TDbOpening *pWin=TDbOpening::cast(pEnt); ASSERT(pWin); //modify by xlc on 070719 //XString sLabel=pWin->GetLabel(); CString sLabel=pWin->GetLabel(); pWin->assertWriteEnabled(); //sLabel<SetLabel(sLabel); } else if (pEnt->isKindOf(TDbCornerWin::desc())) { TDbCornerWin *pWin=TDbCornerWin::cast(pEnt); ASSERT(pWin); //modify by xlc on 070719 //XString sLabel=pWin->GetLabel(); //sLabel << sFix; CString sLabel=pWin->GetLabel(); sLabel += sFix; pWin->SetLabel(sLabel); } } OPENOBJ_END(); } TArchCmdReactor::ResetAll(); } struct SWallFillGroup { // 墙体 TDbWall *pWall; // 要拆分的数组 CArray aryFillOpening; }; // 门窗填墙.lgh add 20110324 void FillOpening() { TPickEntSet ss; CString strPrompt1 = _T("\n请选择需删除的门窗<退出>: "); CString strPrompt2 = _T("\n请选择需删除的门窗: "); CString strPrompt3 = _T("\n请选择需填补的墙体材料:[填充墙(0)/加气块(1)/空心砖(2)/砖墙(3)/耐火砖(4)/无(5)]<%d>: "); static int nDefault = 0; strPrompt3.Format(strPrompt3, nDefault); // 1、提示用户选择需要删除的门窗 CString szNullKey = _T(""); TCHAR chDumpRet; if (SelectEnts(strPrompt1, strPrompt2, TRBList(RTDXF0, _T("TCH_OPENING"), NULL), ss, szNullKey, chDumpRet) != RTNORM) return; // 2、提示用户选择用填充的墙的类型 TCHAR sRetKey[100]; int nRetCode; INITGET_BEG(0, _T("0 1 2 3 4 5")); nRetCode = ads_getkword(strPrompt3, sRetKey); INITGET_END(); ss.Redraw(4); // unhilight ent .参考acedRedraw函数 int nStyle = 0; if (nRetCode == RTNORM) { if (CString("0").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了0")); nStyle = 0; } // else if (CString("1").CompareNoCase(sRetKey) == 0) // { // // ads_printf(_T("\n您选择了1")); // nStyle = 1; // } else if (CString("1").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了2")); nStyle = 1; } else if (CString("2").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了3")); nStyle = 2; } else if (CString("3").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了4")); nStyle = 3; } else if (CString("4").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了5")); nStyle = 4; } else if (CString("5").CompareNoCase(sRetKey) == 0) { // ads_printf(_T("\n您选择了5")); nStyle = 5; } else { // ads_printf(_T("\n您取消了命令")); return; } nDefault = nStyle; } else if (nRetCode == RTNONE) { // ads_printf(_T("\n你选择了默认值!")); nStyle = nDefault; } else return; // 前边完成了门窗的选择,下面开始进行门窗的填充。 AcDbObjectIdArray idAry; ss.AsIdArray(idAry); for (int i = 0; i < (int)idAry.length(); i++) { AcDbObjectId idWall, idNewWall; XPoint ptDoorWin1, ptDoorWin2; OPENOBJ_BEGIN(idAry[i], AcDb::kForWrite, TDbOpening, pOpening) if (pOpening == NULL) continue; pOpening->GetSidePointsOnBase(ptDoorWin1, ptDoorWin2); idWall = pOpening->GetWallId(); pOpening->erase();// 删除掉这个门窗 OPENOBJ_END() // end open this door.. OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbWall, pWall) { if (pWall == NULL) { continue; } XPoint startPoint = pWall->StartPoint(); XPoint ptStartBreak = ptDoorWin1,ptEndBreak = ptDoorWin2; pWall->ProjectToMe(ptStartBreak, ptDoorWin1); pWall->ProjectToMe(ptEndBreak, ptDoorWin2); double disStart = ptDoorWin1.Distance(startPoint); double disEnd = ptDoorWin2.Distance(startPoint); if (disStart < disEnd) { ptStartBreak = ptDoorWin1; ptEndBreak = ptDoorWin2; } else { ptStartBreak = ptDoorWin2; ptEndBreak = ptDoorWin1; } XPoint endPoint = pWall->EndPoint(); if (endPoint.Distance2d(ptEndBreak) > 1e-6) { pWall->assertWriteEnabled(); pWall->BreakAt(ptEndBreak, AcDbObjectId()); // 把后边的一段分出去 } if (startPoint.Distance2d(ptStartBreak) > 1e-6) { (pWall->BreakAt(ptStartBreak, idNewWall)); } else idNewWall = idWall; } OPENOBJ_END() // end open wall; OPENOBJ_BEGIN(idNewWall, AcDb::kForWrite, TDbWall, pWall) { if (pWall == NULL) continue; AcDbObjectId idSurf=pWall->GetLayerSurf2d(); if (!idSurf.isValid()) pWall->SetLayerSurf2d(InitLayer(LAY_SURFACE));//add 090216 TWallData::TWallStyle st = pWall->GetStyle(); CString sT20Mat = WALLMATE_Fill; //lgd add 140428 switch(nStyle) { // //Xx kDivider, kFill, kFill1, kFill2, kBrick; // case 1: // st = TWallData::kDivider; // pWall->setLayer(InitLayer(LAY_WALL_DIVIDER)); // break; case 0: { st = TWallData::kFill; sT20Mat = WALLMATE_Fill; } break; case 1: { st = TWallData::kFill1; sT20Mat = WALLMATE_Fill1; } break; case 2: { st = TWallData::kFill2; sT20Mat = WALLMATE_Fill2; } break; case 3: { st = TWallData::kBrick; sT20Mat = WALLMATE_Brick; } break; case 4: { st = TWallData::kBrick; sT20Mat = WALLMATE_Brick1; } break; case 5: break; } if (nStyle != 5) { pWall->SetStyle(st); pWall->SetT20WallMat(sT20Mat); #if (ADS > 16) std::vector< std::pair > materialName; utility::ReadHatchMaterialConfigFile(_T("墙-墙体材料"), materialName); std::vector< std::pair >::iterator iter = materialName.begin(); for (;iter!=materialName.end();++iter) if(iter->first == sT20Mat) { pWall->GetSpecialtyData()->SetAt(sKEY_WALL_HATCH_PATTERN, iter->second); break; } #endif } else pWall->erase(); } OPENOBJ_END() // end for open new wall; } TArchCmdReactor::UpdateCorners(); TArchCmdReactor::ResetAll(); actrTransactionManager->flushGraphics(); acedUpdateDisplay(); }