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

305 lines
8.5 KiB
C++

#include "stdafx.h"
#include "acestext.h"
#include "resource.h"
extern TARCH_IMPEXP AcDbObjectId g_idPubWall;
extern GEOAPI int g_nProductId;
// extern GEOAPI XPface * ConstructPolyFace(const AcDbVoidPtrArray &entSet);
class TExplodeSet: public AcDbVoidPtrArray {
public:
TMasterProperties m_prop;
};
void RemoveTchSolidData(AcDbEntity *pEnt)
{
resbuf* pRb = pEnt->xData(TCH_SOLID_APPNAME);
if (!pRb)
return;
RBList rb(pRb);
AcDbObjectId idDict = pEnt->extensionDictionary();
if (!idDict.isValid())
return ;
BOOL bClear = FALSE;
pRb = acutBuildList(1001, TCH_SOLID_APPNAME, 0);
RBList rbNew(pRb);
AcDbObject* pPart = NULL;
AcDbDictionary* pDict = NULL;
OPENOBJ_BEGIN(idDict, AcDb::kForRead, AcDbDictionary, pDict);
if (pDict == NULL)
return;
AcDbObject *pObj=NULL;
if (pDict->getAt(TCH_SOLID_PART, pObj, AcDb::kForWrite) != Acad::eOk)
return ;
if (pObj) {
pObj->erase();
pObj->close();
}
OPENOBJ_END();
pEnt->setXData(pRb);
pEnt->releaseExtensionDictionary();
}
//把pface加入图块
BOOL AddToBlockTableRecord(const XPface &rMesh, const TMasterProperties &prop, const TCHAR *szLay, AcDbBlockTableRecord *pRec)
{
ASSERT(pRec && szLay);
AcDbPolyFaceMesh *pMesh=new AcDbPolyFaceMesh;
pMesh->setDatabaseDefaults(pRec->database());
//prop.SetTo(pMesh);
pMesh->setLayer(prop.m_idLayer);
pMesh->setLinetype(prop.m_idLineType);
pMesh->setColorIndex(prop.m_nColor);
#if ADS>16
pMesh->setMaterial(prop.m_idMaterial);
#endif
if (szLay && _tcscmp(szLay, _T("0"))!=0)
pMesh->setLayer(GetLayerIdFromString(szLay, pRec->database()));
VERIFY(pRec->appendAcDbEntity(pMesh)==Acad::eOk);
for(int i=0; i<rMesh.Length(); i++) {
AcDbPolyFaceMeshVertex *pVertex=new AcDbPolyFaceMeshVertex(rMesh[i]);
pVertex->setPropertiesFrom(pMesh);
VERIFY(pMesh->appendVertex(pVertex)==Acad::eOk);
pVertex->close();
}
for(i=0; i<rMesh.faces.Length(); i++) {
const XPolyFacet &rFace=rMesh.faces[i];
AcDbFaceRecord *pFaceRec=new AcDbFaceRecord(rFace.vt1, rFace.vt2, rFace.vt3, rFace.vt4);
pFaceRec->setPropertiesFrom(pMesh);
Acad::ErrorStatus es=pMesh->appendFaceRecord(pFaceRec);
assert(es==Acad::eOk);
pFaceRec->close();
}
pMesh->close();
return TRUE;
}
// 从集合中筛选出同一层的3DFACE放入另外一个集合,并从原集会中扣除
// entSet(I/O) -- 原集合
// faceSet(O)--目标集合
// szLayer(O) --图层
BOOL Select3DFacesByLayer(AcDbVoidPtrArray &entSet, AcDbVoidPtrArray &faceSet, TCHAR *szLayer)
{
int nLen=entSet.length();
//AcDbIntArray indexArray;
BOOL bFirstCase=TRUE;
for(int i=0; i<nLen; i++) {
AcDbEntity *pEnt=(AcDbEntity *)entSet[i];
if (pEnt->isA()==AcDbFace::desc()) {
TCHAR *pLayer=pEnt->layer();
ASSERT(pLayer);
if (bFirstCase) {
_tcscpy(szLayer, pLayer);
faceSet.append(pEnt);
entSet.removeAt(i);
i--;
nLen--;
//indexArray.append(i);
bFirstCase=FALSE;
} else if (_tcsicmp(szLayer, pLayer)==0) {
faceSet.append(pEnt);
entSet.removeAt(i);
i--;
nLen--;
//indexArray.append(i);
}
acutDelString(pLayer);
}
}
return !bFirstCase;
}
//在图块内分解上华对象
BOOL RemoveTchSolidData(AcDbBlockTableRecord *pRec)
{
AcDbBlockTableRecordIterator *pRecIter=NULL;
if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
} else
return FALSE;
//对块表记录中的对象进行分解
//AcDbVoidPtrArray entSetNew;
DList<TExplodeSet> lstNewSet;
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
AcDbEntity *pEnt=NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
ASSERT(pEnt);
if (_tcsicmp(pEnt->isA()->dxfName(), _T("3DSOLID"))==0) {
RemoveTchSolidData(pEnt);
}
pEnt->close();
}
}
delete pRecIter;
return TRUE;
}
//在图块内分解上华对象
BOOL ExplodeWithinBlock(AcDbBlockTableRecord *pRec, BOOL bExp3d)
{
AcDbBlockTableRecordIterator *pRecIter=NULL;
if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
} else
return FALSE;
//对块表记录中的对象进行分解
//AcDbVoidPtrArray entSetNew;
DList<TExplodeSet> lstNewSet;
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
AcDbEntity *pEnt=NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
ASSERT(pEnt);
if (pEnt->isKindOf(TDbEntity::desc()) ||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
pEnt->isKindOf(TDbBlockInsert::desc())) {
//分解对象
TExplodeSet *pNewSet=new TExplodeSet;
pEnt->explode(*pNewSet);
pNewSet->m_prop.m_idLayer=pEnt->layerId();
pNewSet->m_prop.m_idLineType=pEnt->linetypeId();
pNewSet->m_prop.m_nColor=pEnt->colorIndex();
#if ADS>16
pNewSet->m_prop.m_idMaterial=pEnt->materialId();
#endif
lstNewSet.Append(pNewSet);
} else if (_tcsicmp(pEnt->isA()->dxfName(), _T("3DSOLID"))==0) {
RemoveTchSolidData(pEnt);
}
pEnt->close();
}
}
//对块表中的上华对象进行删除
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
AcDbEntity *pEnt=NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
ASSERT(pEnt);
if (pEnt->isKindOf(TDbEntity::desc()) ||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
pEnt->isKindOf(TDbBlockInsert::desc())) {
pEnt->erase(); //删除对象
}
pEnt->close();
}
}
for(int idx=0; idx<lstNewSet.Length(); idx++) {
TExplodeSet &entSetNew=*lstNewSet[idx];
if (bExp3d) {
AcDbVoidPtrArray entSetFace;
TCHAR szLayer[256]=_T("");
while(Select3DFacesByLayer(entSetNew, entSetFace, szLayer)) {
//if (_tcscmp(szLayer, _T("0"))==0)
// strcpy(szLayer, szLay);
int nLen=entSetFace.length();
XPface *pMesh=ConstructPolyFace(entSetFace);
if (pMesh) {
AddToBlockTableRecord(*pMesh, entSetNew.m_prop, szLayer, pRec);
delete pMesh;
ReleaseEntSet(entSetFace);
} else {
for(int n=0; n<nLen; n++) {
AcDbEntity *pNewEnt=(AcDbEntity *)entSetFace[n];
pRec->appendAcDbEntity(pNewEnt);
pNewEnt->close();
}
}
}
}
//加入新转换的对象
int num=entSetNew.length();
for(int n=0; n<num; n++) {
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
VERIFY(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk);
pNewEnt->close();
}
}
delete pRecIter;
return TRUE;
}
// 取多个文件
BOOL GetDwgFilesDia(XStringList &lstFiles, CWnd *pParent, const TCHAR *pszDir,
const TCHAR *pszTitle)
{
const TCHAR *pszFilter = _T("DWG Files (*.dwg)|*.dwg||");
CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter, pParent);
TCHAR szFileName[4056] = _T("");
const TCHAR * szDlgTitle = pszTitle;
int maxChar = 4055;
dlg.m_ofn.lpstrFile = szFileName;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = szDlgTitle;
dlg.m_ofn.lpstrInitialDir = pszDir;
if (dlg.DoModal() !=IDOK )
return FALSE;
//strcpy(pszDir, dlg.GetPathName());
POSITION pos = dlg.GetStartPosition();
while(pos!=NULL) {
CString csPath = dlg.GetNextPathName(pos);
lstFiles.Append(tstrnew(csPath));
}
return TRUE;
}
void TestAppId()
{
XString sFile;
if (GetFileDia(sFile, 0, _T("dwg"), _T("Test file"))!=RTNORM)
return;
AcDbDatabase db(false, true);
#if ADS < 21
if (db.readDwgFile(sFile, _SH_DENYNO, false)!=Acad::eOk)
#else
if (db.readDwgFile(sFile, AcDbDatabase::kForReadAndAllShare, false)!=Acad::eOk)
#endif
return;
AcDbRegAppTable *pAppTab=NULL;
VERIFY(db.getSymbolTable(pAppTab, AcDb::kForWrite)==Acad::eOk);
if (!pAppTab->has(_T("WTHICK"))) {
AcDbRegAppTableRecord *pRec=new AcDbRegAppTableRecord;
pRec->setName(_T("WTHICK"));
VERIFY(pAppTab->add(pRec)==Acad::eOk);
pRec->close();
}
pAppTab->close();
AcDbObjectId idMSpace=GetMSpaceId(&db);
if (!idMSpace.isValid())
return;
OPENOBJ_BEGIN(idMSpace, AcDb::kForRead, AcDbBlockTableRecord, pRec);
if (pRec) {
AcDbBlockTableRecordIterator *pRecIter=NULL;
if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter) {
for(pRecIter->start(); !pRecIter->done(); pRecIter->step()) {
AcDbEntity *pEnt=NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForWrite)==Acad::eOk) {
ASSERT(pEnt);
XDbObject autoClose1(pEnt);
if (pEnt->isKindOf(TDbWall::desc())) {
RBList xd=ads_buildlist(1001, _T("WTHICK"), 1040, 200.0, NULL);
pEnt->setXData(xd);
}
}
}
delete pRecIter;
}
}
OPENOBJ_END();
db.saveAs(_T("d:\\temp\\abc.dwg"));
}