Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/GroupBuilding.cpp
T
2026-09-28 15:28:50 +08:00

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();
}