#include "stdafx.h" #include "resource.h" #include "GroupBuilding.h" //extern TARCH_IMPEXP BOOL g_bInElevProcess; // extern GEOAPI BOOL g_bExplodeMesh; extern BOOL ExplodeWithinBlock(AcDbBlockTableRecord *pRec, BOOL bExp3d); void ExplodeCustomModel3d(PickSet &ss1, BOOL bExcludeIWall, BOOL bHideLevelLine); // extern GEOAPI int ExpInsertDwg(const TCHAR *pszDwg, XPoint ptInsert); // extern GEOAPI AcDbPolyline *AsPolyline(const AcDbEntity *pEntity); // extern TARCH_IMPEXP void MdiOpenDwgFile(const TCHAR *pszFile, const TCHAR *pszCmdStr); extern BOOL RemoveTchSolidData(AcDbBlockTableRecord *pRec); IMPLEMENT_DYNAMIC(CGroupFloorDlg, CModelessDialog) //////////////////////////////////////////////////////////////////////////// CGroupFloorDlg::CGroupFloorDlg(CWnd* pParent /*=NULL*/) : CModelessDialog(IDD_GROUP_BUILDING, pParent) { //{{AFX_DATA_INIT(CGroupFloorDlg) m_nExpWall=0; m_bExcludeIWall=0; m_bAsXRef=0; m_bHideLevelLine=!DocGetLevelLine(); //}}AFX_DATA_INIT m_bDeleteMe=TRUE; } void CGroupFloorDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGroupFloorDlg) DDX_Radio(pDX, IDC_WALL2SOLID, m_nExpWall); DDX_Check(pDX, IDC_EXCLUDE_IWALL, m_bExcludeIWall); DDX_Check(pDX, IDC_ASXREF, m_bAsXRef); DDX_Check(pDX, IDC_HIDE_LEVEL_LINE, m_bHideLevelLine); //}}AFX_DATA_MAP if (!pDX->m_bSaveAndValidate) { GetDlgItem(IDC_WALL2SOLID)->EnableWindow(!m_bAsXRef); GetDlgItem(IDC_WALL2MESH)->EnableWindow(!m_bAsXRef); } } BEGIN_MESSAGE_MAP(CGroupFloorDlg, CModelessDialog) //{{AFX_MSG_MAP(CGroupFloorDlg) ON_WM_CLOSE() ON_BN_CLICKED(IDC_ASXREF, OnAsxref) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CGroupFloorDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); DList lstFloors; GetFloorData(lstFloors); if (HasFloorInFrame(lstFloors)) GetDlgItem(IDC_ASXREF)->EnableWindow(FALSE); return TRUE; } void CGroupFloorDlg::OnClose() { CModelessDialog::OnClose(); if (::IsWindow(m_hWnd)) DestroyWindow(); } void CGroupFloorDlg::OnCancel() { CModelessDialog::OnCancel(); if (::IsWindow(m_hWnd)) DestroyWindow(); } void CGroupFloorDlg::OnAsxref() { UpdateData(TRUE); UpdateData(FALSE); } void CGroupFloorDlg::OnOK() { m_bDeleteMe=FALSE; CModelessDialog::OnOK(); if (::IsWindow(m_hWnd)) DestroyWindow(); m_lstFloors.Reset(); if (GetFloorData(m_lstFloors)!=RTNORM || CheckFloorData(m_lstFloors)!=RTNORM) return; XString sElevDwg; xg_getvar(_T("DWGPREFIX"), sElevDwg); if (GetFileDia(sElevDwg, 1, _T("dwg"), _T("输入要生成的三维文件"))!=RTNORM) return; XString sTemplate; //sTemplate << g_sAppPath << _T("acad.dwt"); if (!FindFile(_T("acad.dwt"), sTemplate) || !CopyFile(sTemplate, sElevDwg, FALSE)) { adsout << _T("\n无法创建该文件, 检查是否有其他程序在使用该文件!"); return ; } //VERIFY(acDocManager->appContextOpenDocument((const char *)sElevDwg)==Acad::eOk); XString sCmd; sCmd << _T("(C:") << GetFullCmdName(_T("_IGroupFloor")) << _T(")\n"); MdiOpenDwgFile(sElevDwg, sCmd); //acedPostCommand(_T("(C:_IGroupFloor)\n")); } static CGroupFloorDlg *g_pGroupFloorDlg=NULL; void CGroupFloorDlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class if (m_bDeleteMe) { delete g_pGroupFloorDlg; g_pGroupFloorDlg=NULL; } else { CModelessDialog::PostNcDestroy(); } } ////////////////////////////////////////////////// // Command: 楼层组合 void GroupFloor() { if (g_project.IsEmpty()) { AfxMessageBox(_T("请打开或新建一个工程项目,并在工程数据库中建立楼层表!")); CString sCmd=GetFullCmdName(_T("TProjectBar")); acedPostCommand(sCmd+_T("\n")); return; } if (g_pGroupFloorDlg) { delete g_pGroupFloorDlg; g_pGroupFloorDlg=NULL; } g_pGroupFloorDlg=new CGroupFloorDlg(acedGetAcadFrame()); CGroupFloorDlg &dlg=*g_pGroupFloorDlg; CAcModuleResourceOverride temp; dlg.Create(IDD_GROUP_BUILDING, acedGetAcadFrame()); } // Command: 楼层组合, 配合GroupFloor void IGroupFloor() { if (!g_pGroupFloorDlg) return; DocSetDrawMode(DRAW_3D); ads_command(RTSTR, _T(".VPOINT"), RTSTR, _T("-1,-1,1"), RTNONE); int nExpMethod=g_pGroupFloorDlg->m_nExpWall; BOOL bAsXRef=g_pGroupFloorDlg->m_bAsXRef; if (bAsXRef && g_pGroupFloorDlg->m_bExcludeIWall) { DocSetInt3DWallVisible(FALSE); } if (bAsXRef) DocSetLevelLine(!g_pGroupFloorDlg->m_bHideLevelLine); double nElev=0.0; for(int j=0; jm_lstFloors.Length(); j++) { if (g_pGroupFloorDlg->m_lstFloors[j]->m_nIndex<0) nElev -= g_pGroupFloorDlg->m_lstFloors[j]->m_nHeight; } RBList mask(RTDXF0, _T("TCH_*,INSERT,3DSOLID,LINE,ARC,CIRCLE,POLYLINE,*POLYLINE,3DFACE"), NULL); RBList mask1(68, 1, NULL); //XPushMemVar tVar(g_bInElevProcess, nExpMethod); XPushMemVar tVar1(g_bExplodeMesh, nExpMethod); XPoint ptInsert; XString sDwgPrefix; VERIFY(xg_getvar(_T("DWGPREFIX"), sDwgPrefix)==RTNORM); for(int i=0; im_lstFloors.Length(); i++) { XFloorData* pFloor=g_pGroupFloorDlg->m_lstFloors[i]; const TCHAR *pDwgFileName=pFloor->m_sDwgFile; ptInsert.z=nElev; if (bAsXRef) { XPathParser parser(pDwgFileName); const TCHAR *szXRef=pDwgFileName; XString sPrefix; sPrefix << parser.m_sDrive << parser.m_sDir; if (_tcsicmp(sPrefix, sDwgPrefix)==0) szXRef=parser.m_sFileName; XPushVar vOsMode(_T("OSMODE"), 0); if (ads_command(RTSTR, _T(".XREF"), RTSTR, _T("A"), RTSTR, szXRef, RT3DPOINT, &ptInsert, RTREAL, 1.0, RTREAL, 1.0, RTREAL, 0.0, RTNONE)!=RTNORM) return; } else { PickSet ssNew(SS_FREE); ssNew.IncludeBegin(); if (pFloor->m_bFloorInFrame) { if (ExpInsertDwg(pDwgFileName,pFloor->m_ptBase,pFloor->m_ptMin,pFloor->m_ptMax,ptInsert)!=RTNORM) { adsout << _T("\n无法插入") << pDwgFileName; break; } } else { if (ExpInsertDwg(pDwgFileName, ptInsert)!=RTNORM) { adsout << _T("\n无法插入") << pDwgFileName; break; } } ssNew.IncludeEnd(); PickSet ssInclude(SS_FREE); ssInclude += ssNew; ssInclude.BaseFilter(mask); ssInclude.BaseExclude(mask1); ssNew -= ssInclude; ssNew.Erase(); RBList tchFilter=ads_buildlist(RTDXF0, _T("TCH_*"), NULL); ssInclude.BaseFilter(tchFilter); // ZJQ add here on 2003/6/17 ExplodeCustomModel3d(ssInclude, g_pGroupFloorDlg->m_bExcludeIWall, g_pGroupFloorDlg->m_bHideLevelLine); } nElev += pFloor->m_nHeight; } delete g_pGroupFloorDlg; g_pGroupFloorDlg=NULL; if (bAsXRef) { //关闭二维图层 XString sLayers(1024); //Xref图层 sLayers << _T("*|_2D*,*|2D*") << _T(",*|") << LAY_BORDER << _T(",*|") << LAY_DIMAX << _T(",*|") << LAY_DIM << _T(",*|") << LAY_OTHER_DIM << _T(",*|") << LAY_COORD_DIM << _T(",*|") << LAY_INDEX_DIM << _T(",*|") << LAY_ELEV_DIM << _T(",*|") << LAY_AXIS_TEXT << _T(",*|") << LAY_HATCH << _T(",*|") << LAY_TEXT << _T(",*|") << LAY_SHEET << _T(",*|") << LAY_ERRORMSG << _T(",*|") << LAY_VIEW << _T(",*|") << LAY_OPENING_DIM //<< _T(",*|") << LAY_SPACE << _T(",*|") << LAY_AXIS; XSymbolList lstLayers(_T("LAYER")); for(int i=0; igetSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk); ASSERT(pNewBlockTab); AcDbBlockTableIterator *pIterator=NULL; Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator); pNewBlockTab->close(); if (es1==Acad::eOk && pIterator) { XPushMemVar vTemp(XExplodeStream::m_bFullExplode, TRUE); for(pIterator->start(); !pIterator->done(); pIterator->step()) { AcDbBlockTableRecord *pRec=NULL; if (pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec) { // Modified on 2003/10/16 if (!pRec->isFromExternalReference()) { const TCHAR *rName=NULL; pRec->getName(rName); BOOL bMspace=(_tcsicmp(rName, ACDB_MODEL_SPACE)==0); if (!bMspace) { ExplodeWithinBlock(pRec, FALSE); } else { RemoveTchSolidData(pRec); } } pRec->close(); } } delete pIterator; } XString sLayersFilter(1024); //Xref图层 sLayersFilter << _T("_2D*,2D*") << _T(",") << LAY_DIMAX << _T(",") << LAY_DIM << _T(",") << LAY_OTHER_DIM << _T(",") << LAY_COORD_DIM << _T(",") << LAY_INDEX_DIM << _T(",") << LAY_ELEV_DIM << _T(",") << LAY_AXIS_TEXT << _T(",") << LAY_HATCH << _T(",") << LAY_TEXT << _T(",") << LAY_SHEET << _T(",") << LAY_ERRORMSG << _T(",") << LAY_VIEW << _T(",") << LAY_OPENING_DIM //<< _T(",") << LAY_SPACE << _T(",") << LAY_AXIS; XSymbolList lstLayers(_T("LAYER"), sLayersFilter); for(int i=0; i vTemp(XExplodeStream::m_bFullExplode, TRUE); DocSetLevelLine(!bHideLevelLine); PickSet ssDel(SS_FREE|SS_CREATE); long lCount=ss.Length(); for(long i=0L; iisKindOf(AcDbCurve::desc())) { AcDbPolyline *pline=AsPolyline(pEnt); if (pline && pline->thickness()<_DIST_SNAP) { ssDel += ent; delete pline; continue; } if (pline) delete pline; } TDbEntity *pEnt1=TDbEntity::cast(pEnt); TDbCurveEntity *pEnt2=TDbCurveEntity::cast(pEnt); XExplodeStream dc(entSet0); dc.SetPropertiesFrom(pEnt); if (pEnt1) { ssDel += ent; if (bExcludeIWall && pEnt1->isKindOf(TDbOpening::desc())) { TDbOpening *pWin=(TDbOpening *)pEnt1; AcDbObjectId idWall=pWin->GetWallId(); if (!!idWall) { OPENOBJ_BEGIN(idWall, AcDb::kForRead, TDbWall, pWall); if (pWall && !pWall->IsExternal(OFFSET_LEFT) && !pWall->IsExternal(OFFSET_RIGHT)) continue; OPENOBJ_END(); } } pEnt1->ExplodeOrDraw3d(dc); } else if (pEnt2) { ssDel += ent; if (bExcludeIWall && pEnt2->isA()==TDbWall::desc()) { //Modify on 2004/1/2,解决玻璃幕墙被隐藏的问题 TDbWall *pWall=(TDbWall *)pEnt2; if (!pWall->IsExternal(OFFSET_LEFT) && !pWall->IsExternal(OFFSET_RIGHT)) continue; } pEnt2->ExplodeOrDraw3d(dc); } else if (pEnt->isA()==TDbBlockInsert::desc() && pEnt->explode(entSet0)==Acad::eOk) { ssDel += ent; } AcDbVoidPtrArray entSet; TCHAR szLayer[256]=_T(""); while(Select3DFacesByLayer(entSet0, entSet, szLayer)) { if (_tcscmp(szLayer, _T("0"))==0) _tcscpy(szLayer, szLay); int nLen=entSet.length(); XPface *pMesh=ConstructPolyFace(entSet); if (pMesh) { pMesh->Make(szLayer); delete pMesh; } else { for(int n=0; n