431 lines
14 KiB
C++
431 lines
14 KiB
C++
#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<XFloorData> 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; j<g_pGroupFloorDlg->m_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<BOOL> tVar(g_bInElevProcess, nExpMethod);
|
|
XPushMemVar<BOOL> tVar1(g_bExplodeMesh, nExpMethod);
|
|
XPoint ptInsert;
|
|
XString sDwgPrefix;
|
|
VERIFY(xg_getvar(_T("DWGPREFIX"), sDwgPrefix)==RTNORM);
|
|
for(int i=0; i<g_pGroupFloorDlg->m_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<int> 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; i<lstLayers.Length(); i++) {
|
|
TCHAR *pszLay=lstLayers[i];
|
|
if (ads_wcmatch(pszLay, sLayers)==RTNORM) {
|
|
ads_command(RTSTR, _T("-LAYER"), RTSTR, _T("F"),
|
|
RTSTR, (const TCHAR *)sLayers,
|
|
RTSTR, _T(""), RTNONE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
XString sLayers1(1024);
|
|
//Xref图层
|
|
sLayers1 << _T("*|_3D*,*|3D*,*|_3T*,*|3T*") ;
|
|
XSymbolList lstLayers1(_T("LAYER"), sLayers1);
|
|
for(i=0; i<lstLayers1.Length(); i++)
|
|
AssureLayer(lstLayers1[i], LAYSTAT_ON|LAYSTAT_THAW);
|
|
} else {
|
|
PickSet ssTch(SS_FREE);
|
|
//if (GetEntByDxf(ssTch, _T("TCH_*"), 1)==Acad::eOk) // modify on 2003/10/16
|
|
if (ssTch.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TCH_*"),NULL))==RTNORM)
|
|
ssTch.Erase();
|
|
|
|
//Add on 2003/6/4, 分解图块中的上华对象
|
|
AcDbBlockTable *pNewBlockTab=NULL;
|
|
VERIFY(acdbCurDwg()->getSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk);
|
|
ASSERT(pNewBlockTab);
|
|
AcDbBlockTableIterator *pIterator=NULL;
|
|
Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator);
|
|
pNewBlockTab->close();
|
|
if (es1==Acad::eOk && pIterator) {
|
|
XPushMemVar<BOOL> 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<lstLayers.Length(); i++)
|
|
AssureLayer(lstLayers[i], LAYSTAT_FREEZE);
|
|
XSymbolList lstLayers1(_T("LAYER"), _T("3D*"));
|
|
for(i=0; i<lstLayers1.Length(); i++)
|
|
AssureLayer(lstLayers1[i], LAYSTAT_ON|LAYSTAT_THAW);
|
|
ads_command(RTSTR, _T(".PURGE"), RTSTR, _T("ALL"), RTSTR, _T(""), RTSTR, _T("N"), RTNONE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
////////////////////////////////////////////////
|
|
// 炸碎自定义的三维模型
|
|
void ExplodeCustomModel3d(PickSet &ss, BOOL bExcludeIWall, BOOL bHideLevelLine)
|
|
{
|
|
extern BOOL Select3DFacesByLayer(AcDbVoidPtrArray &entSet, AcDbVoidPtrArray &faceSet, TCHAR *szLayer);
|
|
extern GEOAPI XPface * ConstructPolyFace(const AcDbVoidPtrArray &entSet);
|
|
|
|
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE);
|
|
DocSetLevelLine(!bHideLevelLine);
|
|
PickSet ssDel(SS_FREE|SS_CREATE);
|
|
long lCount=ss.Length();
|
|
for(long i=0L; i<lCount; i++) {
|
|
AcDbVoidPtrArray entSet0;
|
|
Entity ent=ss[i];
|
|
TCHAR szLay[256]=_T("");
|
|
ent.GetData(8, szLay);
|
|
|
|
XDbObject obj(ent, AcDb::kForRead);
|
|
if (!obj) continue;
|
|
AcDbEntity *pEnt=AcDbEntity::cast(obj.m_pObject);
|
|
ASSERT(pEnt);
|
|
if (pEnt->isKindOf(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<nLen; n++) {
|
|
AcDbEntity *pEnt=(AcDbEntity *)entSet[n];
|
|
AddToModelSpace(pEnt, Adesk::kTrue);
|
|
}
|
|
}
|
|
ReleaseEntSet(entSet);
|
|
}
|
|
int nLen=entSet0.length();
|
|
for(int n=0; n<nLen; n++) {
|
|
AcDbEntity *pEnt=(AcDbEntity *)entSet0[n];
|
|
AddToModelSpace(pEnt, Adesk::kTrue);
|
|
}
|
|
|
|
}
|
|
ssDel.Erase();
|
|
}
|
|
|
|
|
|
|