// ConvertTchDlg.cpp : implementation file // #include "stdafx.h" #include "resource.h" #include "ConvertTchDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CConvertTchDlg dialog CConvertTchDlg::CConvertTchDlg(CWnd* pParent /*=NULL*/) : GlwCAcUiDialog(CConvertTchDlg::IDD, pParent) { //{{AFX_DATA_INIT(CConvertTchDlg) m_csDoorHeight = _T("2100"); m_csMaxWallWidth = _T("500"); m_csWallHeight = _T(""); m_csWinHeight = _T("1500"); m_csWinSill = _T("800"); m_bPartConvert=FALSE; //}}AFX_DATA_INIT m_csWallHeight.Format(_T("%d"), AS_INT(DocGetLHeight())); } void CConvertTchDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CConvertTchDlg) DDX_Text(pDX, IDC_DOOR_HEIGHT, m_csDoorHeight); if (_tstof(m_csDoorHeight)<_DIST_SNAP) pDX->Fail(); DDX_Text(pDX, IDC_MAX_WALL_WIDTH, m_csMaxWallWidth); if (_tstof(m_csMaxWallWidth)<_DIST_SNAP) pDX->Fail(); DDX_Text(pDX, IDC_WALL_HEIGHT, m_csWallHeight); if (_tstof(m_csWallHeight)<_DIST_SNAP) pDX->Fail(); DDX_Text(pDX, IDC_WIN_HEIGHT, m_csWinHeight); if (_tstof(m_csWinHeight)<_DIST_SNAP) pDX->Fail(); DDX_Text(pDX, IDC_WIN_SILL, m_csWinSill); if (_tstof(m_csWinSill)<_DIST_SNAP) pDX->Fail(); DDX_Check(pDX,IDC_PART,m_bPartConvert); //}}AFX_DATA_MAP //modified by whl on 060524 //if (_tstof(m_csWallHeight)<_DIST_SNAP+max(_tstof(m_csDoorHeight), _tstof(m_csWinHeight)+_tstof(m_csWinSill))) if (pDX->m_bSaveAndValidate&&_tstof(m_csWallHeight)<_DIST_SNAP+max(_tstof(m_csDoorHeight), _tstof(m_csWinHeight)+_tstof(m_csWinSill))) pDX->Fail(); } BEGIN_MESSAGE_MAP(CConvertTchDlg, GlwCAcUiDialog) //{{AFX_MSG_MAP(CConvertTchDlg) // NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CConvertTchDlg message handlers // Command: 转换旧图 void ConvertTch() { if (g_nArchType==4) {//学习版 adsout << _T("\n学习版不支持,欢迎购买正式版!"); return; } extern void tch0(double nVal); CConvertTchDlg dlg(acedGetAcadFrame()); { CAcModuleResourceOverride vTemp; if (dlg.DoModal()!=IDOK) return; } AsureWCS(); GEOAPI void MakeVisible(PickSet &ss, bool bTrue); //add by whl PickSet ssSub(SS_FREE); if (dlg.m_bPartConvert) { PickSet ssPart; if (SelectEntities(_T("\n选择需要转化的图元<退出>"),ssPart,RBList())!=RTNORM) return; ssSub.Get(_T("X")); ssSub-=ssPart; //ssSub.Delete(); MakeVisible(ssSub,false); } double nSill=_tstof(dlg.m_csWinSill); double nWinHeight=_tstof(dlg.m_csWinHeight); double nDoorHeight=_tstof(dlg.m_csDoorHeight); DocSetLHeight(_tstof(dlg.m_csWallHeight)); adsout << _T("\n第一阶段的处理..."); //modified by whl on 060323 //ads_command(RTSTR, _T("-LAYER"), RTSTR, _T("F"), RTSTR, _T("*"), // RTSTR, _T("T"), RTSTR, _T("WALL*,DOTE,WINDOW"), RTSTR, _T(""), NULL); XString sLayer; sLayer<<_T("WALL*,DOTE,WINDOW,")< lstColuBound; XString sLayerColu; sLayerColu<<_T("COLUMN,")<SetLocation(ptInsert); pColu->SetOutlinePoly(poly2d); pColu->SetSectionShape(_tcsicmp(szBlkName, _T("_FZH"))==0? TColumnData::kRect : TColumnData::kCircle); pColu->SetLayerHatch2d(InitLayer(LAY_HATCH, FALSE)); pColu->AddToMSpace(Adesk::kTrue); lstColuBound.Append(new XPoly2D(poly2d)); } } } ssColuNew.IncludeEnd(); PickSet ssWall(SS_FREE), ssWallNew(SS_FREE); ssWallNew.IncludeBegin(); if (ssWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC"), 8, _T("TDOTE"), NULL))==RTNORM) { long lCount=ssWall.Length(); for(long i=0L; ixData(_T("TDOTE")); if (rbXData) { resbuf *pNext=rbXData->rbnext; if (pNext && pNext->restype==1040 && pNext->rbnext && pNext->rbnext->restype==1040) { double nLeftWidth=pNext->resval.rreal; double nRightWidth=pNext->rbnext->resval.rreal; XCurveSegment segCurve(ent); BOOL bCreateWall=TRUE; if (nLeftWidth+nRightWidth<_DIST_SNAP) bCreateWall=FALSE; if (bCreateWall) for(int n=0; nSetLayerHatch2d(InitLayer(LAY_HATCH, FALSE)); (XCurveSegment &)*pWall=segCurve; pWall->SetWidth(0, nLeftWidth); pWall->SetWidth(1, nRightWidth); pWall->AddToMSpace(Adesk::kTrue); } } ads_relrb(rbXData); } } OPENOBJ_END(); } } ssWallNew.IncludeEnd(); PickSet ssWin(SS_FREE), ssWinNew(SS_FREE); ssWinNew.IncludeBegin(); XString sLayerWin; sLayerWin<<_T("WINDOW,")<xData(_T("WTHICK")); if (rbXData) { resbuf *rbNext=rbXData->rbnext; if (rbNext && rbNext->restype==1040) { TDbOpening *pWin=new TDbOpening; pWin->InitHardPointerId(); double nThick=fabs(rbNext->resval.rreal); AcGeScale3d scales=pInsert->scaleFactors(); BOOL bDoor=(fabs(nThick-fabs(scales[1]))>_DIST_SNAP); BOOL bLift=(_tcsicmp(szBlkName, _T("_LIFTD"))==0); pWin->SetKind(bDoor? TOpeningData::OP_DOOR : TOpeningData::OP_WINDOW); if (bLift) pWin->m_nOpStyle |= OPS_LIFTDOOR; pWin->SetHeight(bDoor? nDoorHeight : nWinHeight); pWin->SetWidth(fabs(scales[0])); pWin->SetThickness(nThick); pWin->m_ptLocation=pInsert->position(); if (bNormal) pWin->m_ptLocation = Ecs2Wcs(pWin->m_ptLocation, vtWin); pWin->SetSill((bDoor || bLift)? 0.0 : nSill); pWin->m_nRotation = pInsert->rotation(); pWin->m_nIdStyle2d = pInsert->blockTableRecord(); pWin->m_ptLabel=pWin->GetDefaultLabPos(); TCHAR szBlock[256]=_T(""); const TCHAR *pszBlock3d=NULL; if (bLift) pszBlock3d=SYS_LDOOR3D; else if (bDoor) pszBlock3d=SYS_DOOR3D; else pszBlock3d= SYS_WIN3D; if (LoadDwbBlock(XString(_T("%s%s"), (const TCHAR *)g_sDwbPath, pszBlock3d), szBlock)==RTNORM) { pWin->m_nIdStyle3d = InitBlock(szBlock); } Entity entAttr; if (entAttr.GetNext(ent)==RTNORM && entAttr.Is(_T("ATTRIB"))) { TCHAR szLabel[256]=_T(""); if (entAttr.GetData(1, szLabel)==RTNORM) { pWin->SetLabel(szLabel); } XPoint ptPos; if (entAttr.GetData(10, &ptPos)==RTNORM) { XVector3D vtNormal(0,0,1); if (entAttr.GetData(210, &vtNormal)==RTNORM) { ptPos=Ecs2Wcs(ptPos, vtNormal); } double nRot=0.0; double nHeight=3.0; VERIFY(entAttr.GetData(40, &nHeight)==RTNORM); VERIFY(entAttr.GetData(50, &nRot)==RTNORM); AcDbObjectId idStyle; OPENOBJ_BEGIN(entAttr, AcDb::kForRead, AcDbAttribute, pAttr); ASSERT(pAttr); idStyle=pAttr->textStyle(); OPENOBJ_END(); TDbText text; text.SetAlignment(XExplodeDraw::kMiddleCenter); text.SetHeight(nHeight, FALSE); text.SetRotation(nRot); text.SetText(szLabel); text.SetStyleId(idStyle); XPoint ptMidCen=text.Base2Align(ptPos, text.GetExtents()); // 开启方向 pWin->m_ptLabel = ptMidCen; } } pWin->AddToMSpace(Adesk::kFalse); resbuf *xdata=ads_buildlist(1001, _T("TDOTE"), 1010, &XPoint(scales[0], scales[1], pInsert->rotation()),NULL); if (!XSymbolTable(_T("APPID"), _T("TDOTE"))) ads_regapp(_T("TDOTE")); pWin->setXData(xdata); ads_relrb(xdata); pWin->close(); } ads_relrb(rbXData); } } OPENOBJ_END(); } } ssWinNew.IncludeEnd(); // 文字 RBList maskText(RTDXF0, _T("TEXT"), NULL); PickSet ssText(SS_FREE); if (ssText.Get(_T("X"), NULL, NULL, maskText)==RTNORM) { //add by whl on 060324 if (dlg.m_bPartConvert) ssText-=ssSub; long lCount=ssText.Length(); for(long i=0; iConvertFrom(pText)) { AddToCurrentSpace(pNewText, Adesk::kTrue); pText->erase(); } else { delete pNewText; } } OPENOBJ_END(); } } // 尺寸 RBList maskDim(RTDXF0, _T("DIMENSION"), NULL); PickSet ssDim(SS_FREE); if (ssDim.Get(_T("X"), NULL, NULL, maskDim)==RTNORM) { //add by whl on 060324 if (dlg.m_bPartConvert) ssDim-=ssSub; long lCount=ssDim.Length(); for(long i=0; i lstAllWall; long nWallNum=ssWallNew.Length(); for(long k=0L; kValidateContainership(lstAllWall); //验证和墙的配属关系 OPENOBJ_END(); } // 建立柱子和墙体之间的关系 XSearchSpaceFromWall aSearch; DList lstColu; long nColuNum=ssColuNew.Length(); for(k=0L; kassertWriteEnabled(); pWall->CalSideParameters(ent, GetAllSortWalls()); } OPENOBJ_END(); } for(i=0L; iassertWriteEnabled(); pWall->CalSideParameters1(); } OPENOBJ_END(); } aSearch.UpdateColuLinkage(); } catch(...) { adsout << /*UMSG*/ _T("\n出现了例外情况!"); } //TArchCmdReactor::ResetAll(); DocSetIsDwgBegin(bOldVar); //add by whl if (dlg.m_bPartConvert) MakeVisible(ssSub,true); //ssSub.Delete(); } void TestConv() { CConvertTchDlg dlg(acedGetAcadFrame()); { CAcModuleResourceOverride vTemp; if (dlg.DoModal()!=IDOK) return; } double nSill=_tstof(dlg.m_csWinSill); double nWinHeight=_tstof(dlg.m_csWinHeight); double nDoorHeight=_tstof(dlg.m_csDoorHeight); DocSetLHeight(_tstof(dlg.m_csWallHeight)); PickSet ssColu(SS_FREE); DList lstColuBound; if (ssColu.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 2, _T("_FZH,_YZH"), 8, LAY_COLU, NULL))==RTNORM) { long lCount=ssColu.Length(); for(long i=0L; iSetLocation(ptInsert); pColu->SetOutlinePoly(poly2d); pColu->SetSectionShape(_tcsicmp(szBlkName, _T("_FZH"))==0? TColumnData::kRect : TColumnData::kCircle); pColu->AddToMSpace(Adesk::kTrue); lstColuBound.Append(new XPoly2D(poly2d)); } } } PickSet ss(SS_FREE), ssWall(SS_FREE); //if (SelectEntities(_T("\n选择待转化的图形对象: "), ss, RBList())!=RTNORM) // return; if (ssWall.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("LINE,ARC"), 8, _T("TDOTE"), NULL))==RTNORM) { long lCount=ssWall.Length(); for(long i=0L; ixData(_T("TDOTE")); if (rbXData) { resbuf *pNext=rbXData->rbnext; if (pNext && pNext->restype==1040 && pNext->rbnext && pNext->rbnext->restype==1040) { double nRightWidth=pNext->resval.rreal; double nLeftWidth=pNext->rbnext->resval.rreal; XCurveSegment segCurve(ent); BOOL bCreateWall=TRUE; for(int n=0; nSetWidth(0, nLeftWidth); pWall->SetWidth(1, nRightWidth); pWall->AddToMSpace(Adesk::kTrue); } } ads_relrb(rbXData); } } OPENOBJ_END(); } } PickSet ssWin(SS_FREE); if (ssWin.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT"), 8, LAY_WIN, NULL))==RTNORM) { long lCount=ssWin.Length(); for(long i=0L; ixData(_T("WTHICK")); if (rbXData) { resbuf *rbNext=rbXData->rbnext; if (rbNext && rbNext->restype==1040) { TDbOpening *pWin=new TDbOpening; pWin->InitHardPointerId(); double nThick=fabs(rbNext->resval.rreal); AcGeScale3d scales=pInsert->scaleFactors(); BOOL bDoor=(fabs(nThick-fabs(scales[1]))>_DIST_SNAP); BOOL bLift=(_tcsicmp(szBlkName, _T("_LIFTD"))==0); pWin->SetKind(bDoor? TOpeningData::OP_DOOR : TOpeningData::OP_WINDOW); if (bLift) pWin->m_nOpStyle |= OPS_LIFTDOOR; pWin->SetHeight(bDoor? nDoorHeight : nWinHeight); pWin->SetWidth(fabs(scales[0])); pWin->SetThickness(nThick); pWin->m_ptLocation=pInsert->position(); pWin->SetSill((bDoor || bLift)? 0.0 : nSill); pWin->m_nRotation = pInsert->rotation(); pWin->m_nIdStyle2d = pInsert->blockTableRecord(); pWin->m_ptLabel=pWin->GetDefaultLabPos(); TCHAR szBlock[256]=_T(""); const TCHAR *pszBlock3d=NULL; if (bLift) pszBlock3d=SYS_LDOOR3D; else if (bDoor) pszBlock3d=SYS_DOOR3D; else pszBlock3d= SYS_WIN3D; if (LoadDwbBlock(XString(_T("%s%s"), (const TCHAR *)g_sDwbPath, pszBlock3d), szBlock)==RTNORM) { pWin->m_nIdStyle3d = InitBlock(szBlock); } Entity entAttr; if (entAttr.GetNext(ent)==RTNORM && entAttr.Is(_T("ATTRIB"))) { TCHAR szLabel[256]=_T(""); if (entAttr.GetData(1, szLabel)==RTNORM) { pWin->SetLabel(szLabel); } XPoint ptPos; if (entAttr.GetData(10, &ptPos)==RTNORM) { double nRot=0.0; double nHeight=3.0; VERIFY(entAttr.GetData(40, &nHeight)==RTNORM); VERIFY(entAttr.GetData(50, &nRot)==RTNORM); AcDbObjectId idStyle; OPENOBJ_BEGIN(entAttr, AcDb::kForRead, AcDbAttribute, pAttr); ASSERT(pAttr); idStyle=pAttr->textStyle(); OPENOBJ_END(); TDbText text; text.SetAlignment(XExplodeDraw::kMiddleCenter); text.SetHeight(nHeight, FALSE); text.SetRotation(nRot); text.SetText(szLabel); text.SetStyleId(idStyle); XPoint ptMidCen=text.Base2Align(ptPos, text.GetExtents()); // 开启方向 pWin->m_ptLabel = ptMidCen; } } pWin->AddToMSpace(Adesk::kFalse); resbuf *xdata=ads_buildlist(1001, _T("TDOTE"), 1010, &XPoint(scales[0], scales[1], pInsert->rotation()),NULL); if (!XSymbolTable(_T("APPID"), _T("TDOTE"))) ads_regapp(_T("TDOTE")); pWin->setXData(xdata); ads_relrb(xdata); pWin->close(); } ads_relrb(rbXData); } } OPENOBJ_END(); } } // 文字 RBList maskText(RTDXF0, _T("TEXT"), NULL); PickSet ssText(SS_FREE); if (ssText.Get(_T("X"), NULL, NULL, maskText)==RTNORM) { long lCount=ssText.Length(); for(long i=0; iConvertFrom(pText)) { AddToCurrentSpace(pNewText, Adesk::kTrue); pText->erase(); } else { delete pNewText; } } OPENOBJ_END(); } } // 尺寸 RBList maskDim(RTDXF0, _T("DIMENSION"), NULL); PickSet ssDim(SS_FREE); if (ssDim.Get(_T("X"), NULL, NULL, maskDim)==RTNORM) { long lCount=ssDim.Length(); for(long i=0; i