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

3580 lines
93 KiB
C++

#include "stdafx.h"
#include "acestext.h"
#include "resource.h"
#include "dbgroup.h"
#include "dbobjptr.h"
#include "dbxutil.h"
#include "TDbColumn.h"
#include "TDbBlockInsert.h"
#include "TArchCmdReactor.h"
#include "TExportFileDlg.h"
#include "BatchSaveAsFileForFolder.h"
extern TARCH_IMPEXP AcDbObjectId g_idPubWall;
extern TARCH_IMPEXP int g_nProductId;
//extern GEOAPI XPface * ConstructPolyFace(const AcDbVoidPtrArray &entSet);
//extern inline BOOL IsPaperSpace();
void EraseWrongHatchEnt(AcDbDatabase *pDb);
void AddToGroup(AcDbDatabase *pDb,CString groupName,AcDbObjectId obj);
void AddXdata(AcDbObjectId eId,CString appName,CString resString);
void GetGroupNameFromXData(AcDbObjectId entityId,CString appName,CString &groupName);
void DelXdata(AcDbObjectId eId,CString appName);
void HideTchObject(AcDbDatabase *pDb);
void AddGroupNameToXData(AcDbDatabase *pDb);
void DelXDataFromGroup(AcDbDatabase *pDb);
// sg add 120502,判断一个对象是否在_TCH_HIDE_GROUP组内
bool IsTchHideGroupObj(AcDbObjectId objId, AcDbObjectId &groupId);
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;
}
// 自动把门窗所在的墙加进选择集中
void MakeWallSet1(PickSet &ssWalls)
{
if (!ssWalls)
return;
PickSet ssOpenings;
ssOpenings += ssWalls;
RBList maskOpening(RTDXF0,_T("ATS_OPENING"),NULL);
ssOpenings.BaseFilter(maskOpening);
long lCount=ssOpenings.Length();
for (long idx=0L; idx<lCount; idx++)
{
Entity ent = ssOpenings[idx];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbOpening, pWin);
if (pWin)
{
AcDbObjectId idWall = pWin->GetWallId();
if (!!idWall)
ssWalls += idWall;
}
OPENOBJ_END();
}
}
// sg add 120217,封装一个根据传入的版本号,保存成CAD不同版本格式图纸的函数
Acad::ErrorStatus SaveAsAppointedCADVer(AcDbDatabase *pDb, const TCHAR* fileName, int nVer)
{
if (pDb == NULL)
return Acad::eInvalidInput;
Acad::ErrorStatus es = Acad::eOk;
AcDb::AcDbDwgVersion nDwgVer = AcDb::kDHL_CURRENT;
#if (ADS < 15) // 14及以下程序,只能保存成14
es = acdbSaveAsR14(pDb, fileName);
return es;
#endif
// 15以上可以选择保存成其他版本
switch (nVer)
{
case 14: // 保存14版本
#if (ADS == 16)
es = acdbSaveAs2000(pDb, fileName); // 16平台下根本不支持保存成R14
#else
es = acdbSaveAsR14(pDb, fileName);
#endif
break;
case 15: // 保存15版本
#if (ADS == 15)
es = pDb->saveAs(fileName); // 当前版本是15
#else
es = acdbSaveAs2000(pDb, fileName);
#endif
break;
#if (ADS > 15)
case 16: // 保存16版本
#if (ADS == 16)
es = pDb->saveAs(fileName); // 当前版本是16
#else
es = acdbSaveAs2004(pDb, fileName);
#endif
break;
#endif
#if (ADS > 16)
case 17: // 保存17版本
#if (ADS == 17)
es = pDb->saveAs(fileName); // 当前版本是17
#else
nDwgVer = AcDb::kDHL_1021;
es = pDb->saveAs(fileName, false, nDwgVer);
#endif
break;
#endif
#if (ADS > 17)
case 18: // 保存18版本
nDwgVer = AcDb::kDHL_1024;
es = pDb->saveAs(fileName, false, nDwgVer);
break;
#endif
#if (ADS > 18)
case 19: // 保存19版本
nDwgVer = AcDb::kDHL_1027;
es = pDb->saveAs(fileName, false, nDwgVer);
break;
#endif
}
return es;
}
// 当前图另存旧版(处理同旧版的兼容性)
int SaveCurDwgAsTArch3(const TCHAR *szFileName)
{
//extern void MakeWallSet1(PickSet &ssWalls);
PickSet ssAll(SS_FREE), ss(SS_FREE); //ss--上华对象, ssAll--AutoCAD对象
int nRet=ssAll.Get(_T("X"), NULL, NULL, NULL);
if(nRet!=RTNORM)
return nRet;
AcDbObjectId idPubWall=InitLayer(LAY_THICK_LINE);
XPushMemVar<AcDbObjectId> vTempId(g_idPubWall, idPubWall);
BOOL bExp3d=IsExplode3D();
ssAll.BaseExclude(RBList(67,1,NULL));
ss += ssAll;
RBList mask(RTDXF0, _T("TCH_*"), NULL);
ss.BaseFilter(mask);
if(!bExp3d)
ssAll -= ss; //二维分解时候,才划分AutoCAD对象和上华对象
acdbCurDwg()->setDimstyleData(acdbCurDwg()->dimstyle());
if(!XSymbolTable(_T("APPID"), _T("WTHICK")))
VERIFY(ads_regapp(_T("WTHICK"))==RTNORM);
InitTextStyle(TS_DIMFONT); //建立DIMFONT
AcDbVoidPtrArray entitySet;
if(!bExp3d)
{ //二维分解的时候才,提前处理
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE);
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
long lCount=ss.Length();
for(long i=0L; i<lCount; i++)
{
Entity ent=ss[i];
TCHAR szLay[256]=_T("");
ent.GetData(8, szLay);
XDbObject obj(ent, AcDb::kForRead);
if(!obj) continue;
((AcDbEntity *)obj.m_pObject)->explode(entitySet);
}
}
long lNum=entitySet.length();
AcDbBlockTableRecord *pTempBlock=NULL;
AcDbObjectId idBlock;
pTempBlock=new AcDbBlockTableRecord;
pTempBlock->setName(_T("*U"));
idBlock=AddBlock(pTempBlock, FALSE);
if(!idBlock)
{
delete pTempBlock;
ReleaseEntSet(entitySet);
return RTERROR;
}
if(!bExp3d)
{ //二维分解的时候,需要加入新对象
for(long j=0L; j<lNum; j++)
{
AcDbEntity *pEnt=(AcDbEntity *)entitySet[j];
AcDbObjectId idLast;
VERIFY(pTempBlock->appendAcDbEntity(idLast, pEnt)==Acad::eOk);
pEnt->close();
}
}
pTempBlock->close();
AcDbObjectIdArray objectIds;
long lCount=ssAll.Length();
objectIds.setPhysicalLength(lCount);
for(long i=0L; i<lCount; i++)
{
Entity ent=ssAll[i];
AcDbObjectId id;
if(acdbGetObjectId(id, ent.name)==Acad::eOk)
objectIds.append(id);
}
if(lCount)
{//把模型空间的其他AutoCAD对象也复制到临时图块
AcDbIdMapping idMap;
acdbCurDwg()->deepCloneObjects(objectIds, idBlock, idMap, false);
}
AcDbBlockTable *pNewBlockTab=NULL;
AcDbDatabase *pNewDb=NULL;
Acad::ErrorStatus es=acdbCurDwg()->wblock(pNewDb, idBlock);
if(es!=Acad::eOk)
{
adsout << _T("\n无法生成文件: ") << acadErrorStatusText(es);
return RTERROR;
}
// 分解pNewDb中的块表
pNewDb->getSymbolTable(pNewBlockTab, AcDb::kForRead);
AcDbBlockTableIterator *pIterator=NULL;
Acad::ErrorStatus es1=pNewBlockTab->newIterator(pIterator);
pNewBlockTab->close();
if(es1==Acad::eOk && pIterator)
{
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
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)
{
if(!pRec->isFromExternalReference())
{
const TCHAR *rName=NULL;
pRec->getName(rName);
BOOL bMspace=(_tcsicmp(rName, ACDB_MODEL_SPACE)==0);
if(!bExp3d)
{ // 2D
if(!bMspace)//分解图块中的对象
ExplodeWithinBlock(pRec, FALSE);
else
RemoveTchSolidData(pRec);
}
else
ExplodeWithinBlock(pRec, bMspace? TRUE : FALSE); //如果不是模型空间,则不转化3dface为pface
}
pRec->close();
}
}
delete pIterator;
}
TDbConfig*pConfig=GetDwgGlobal(AcDb::kForRead,pNewDb);
if(pConfig!=NULL)
{
if(pConfig->upgradeOpen()==Acad::eOk)
pConfig->erase();
pConfig->close();
}
_tremove(szFileName);
/*
#if (ADS>15)
if(acdbSaveAs2000(pNewDb, szFileName)!=Acad::eOk)
{
#else
if(acdbSaveAsR14(pNewDb, szFileName)!=Acad::eOk)
{
#endif
*/
// sg modify 120217,根据全局设置,保存图纸格式
int nCadVer = g_nDownGradeSaveCadVer + 14;
#if (ADS == 16)
nCadVer++; // 16平台,无法保存成R14格式
#endif
if (SaveAsAppointedCADVer(pNewDb, szFileName, nCadVer) != Acad::eOk)
{
delete pNewDb;
adsout << _T("\n无法覆盖生成文件") << szFileName;
return RTERROR;
}
else
adsout << _T("\n成功的生成文件") << szFileName;
delete pNewDb;
TArchCmdReactor::ResetAll();
return RTNORM;
}
// pDbSrc将被修改
//modified by whl on 090212,提供导出调用接口
int TARCH_IMPEXP SaveAsTArch3(AcDbDatabase *pDbSrc, const TCHAR *szDest, int nCADVer, bool bDeleteDim)
{
InitTextStyle(TS_DIMFONT, pDbSrc); //建立DIMFONT
AcDbObjectId idPubWall=GetLayerIdFromString(LAY_THICK_LINE, pDbSrc);
if(!idPubWall.isValid())
{
AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
pLayerTableRecord->setName(LAY_THICK_LINE);
AcCmColor color;
color.setColorIndex(9);
pLayerTableRecord->setColor(color);
idPubWall=AddLayer(pLayerTableRecord, Adesk::kTrue, pDbSrc);
if(!idPubWall.isValid())
{
delete pLayerTableRecord;
return RTERROR;
}
}
XPushMemVar<AcDbObjectId> vTempWall(g_idPubWall, idPubWall);
pDbSrc->setDimstyleData(pDbSrc->dimstyle());
AcDbRegAppTable *pAppTab=NULL;
VERIFY(pDbSrc->getSymbolTable(pAppTab, AcDb::kForWrite)==Acad::eOk);
if(!pAppTab->has(_T("WTHICK")))
{
AcDbRegAppTableRecord *pRec=new AcDbRegAppTableRecord;
pRec->setName(_T("WTHICK"));
if(pAppTab->add(pRec)==Acad::eOk)
pRec->close();
}
pAppTab->close();
AcDbBlockTable *pNewBlockTab = NULL;
pDbSrc->getSymbolTable(pNewBlockTab, AcDb::kForRead);;
AcDbBlockTableIterator *pIterator = NULL;
Acad::ErrorStatus es1 = pNewBlockTab->newIterator(pIterator);
pNewBlockTab->close();
if (es1!=Acad::eOk || !pIterator)
return RTERROR;
AcDbObjectId idWinLay=GetLayerIdFromString(LAY_WIN, pDbSrc);
AcDbObjectId idDoorLay=GetLayerIdFromString(LAY_DOOR, pDbSrc);
// sg add 120502,对轴网编号进行特殊处理
AcDbObjectId idAxiso = InitBlock(_T("_AXISO"), pDbSrc);
// 图块中的上华对象不做旧版兼容转换
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
XPushMemVar<BOOL> vTemp2(XExplodeStream::m_bFullExplode, TRUE);
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
AcDbBlockTableRecord *pRec = NULL;
if (pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec)
{
const TCHAR *rName = NULL;
pRec->getName(rName);
if (!pRec->isFromExternalReference()) // 不处理外部参照
{
RemoveTchSolidData(pRec);
AcDbBlockTableRecordIterator *pRecIter = NULL;
if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter)
{
// 对块表记录中的对象进行分解
// AcDbVoidPtrArray entSetNew;//modify by xlc on 070524
CString groupName;
for (pRecIter->start(); !pRecIter->done(); pRecIter->step())
{
AcDbObjectId entityId;
pRecIter->getEntityId(entityId);
GetGroupNameFromXData(entityId, _T("TCH_GROUP"), groupName);
AcDbEntity *pEnt=NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForRead)==Acad::eOk)
{
if (pEnt!=NULL &&
pEnt->isKindOf(TDbEntity::desc()) ||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
pEnt->isKindOf(TDbBlockInsert::desc()) ||
pEnt->isKindOf(CWireDim::desc())||
pEnt->isKindOf(CLampDim::desc()))
{
if (bDeleteDim && (pEnt->isKindOf(TDbDimension2::desc()) || pEnt->isKindOf(TDbDimension::desc())))
{
pEnt->close();
continue;
}
AcDbVoidPtrArray entSetNew;
pEnt->explode(entSetNew);
pEnt->close();
// modify by xlc on 070524
// 加入新转换的对象
int num = entSetNew.length();
for (int n=0; n<num; n++)
{
AcDbEntity *pNewEnt = (AcDbEntity *)entSetNew[n];
if (pRec->appendAcDbEntity(pNewEnt) == Acad::eOk)
{
if (pNewEnt->isA()==AcDbBlockReference::desc() &&
(pNewEnt->layerId()==idWinLay||pNewEnt->layerId()==idDoorLay))
{
// 没有对属性进行进一步判断,确定是门窗与否
AcDbBlockReference *pInsert=AcDbBlockReference::cast(pNewEnt);
AcGeScale3d factors=pInsert->scaleFactors();
double w=factors[2];
RBList xd=ads_buildlist(1001, _T("WTHICK"), 1040, w, NULL);
pInsert->setXData(xd);
factors[2]=factors[0];
pInsert->setScaleFactors(factors);
}
AcDbObjectId id = pNewEnt->objectId();
pNewEnt->close();
if (!groupName.IsEmpty())
{
AddToGroup(pDbSrc, groupName, id);
// sg add 120502,对门窗编号和轴网编号特殊处理
if (pNewEnt->isA() == AcDbBlockReference::desc())
{
AcDbBlockReference *pBRef = (AcDbBlockReference*)pNewEnt;
AcDbObjectId idBKRecord = pBRef->blockTableRecord();
if ((idAxiso.isValid() && idAxiso==idBKRecord) ||
(pNewEnt->layerId()==idWinLay || pNewEnt->layerId()==idDoorLay))
{
AcDbObjectIterator* attribIter = pBRef->attributeIterator();
if (attribIter != NULL)
{
while (attribIter->done() == false)
{
AddToGroup(pDbSrc, groupName, attribIter->objectId());
attribIter->step();
}
delete attribIter;
}
}
}
}
}
else
delete pNewEnt;
}
}
else
{
AcDbObjectId id = pEnt->objectId();
pEnt->close();
if (!groupName.IsEmpty())
{
AddToGroup(pDbSrc,groupName,id); //添加到组
DelXdata(id,_T("TCH_GROUP")); //删除扩展数据
}
}
}
}
// 对块表中的上华对象进行删除
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(TDbEntity::desc()) ||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
pEnt->isKindOf(TDbBlockInsert::desc()) ||
pEnt->isKindOf(CWireDim::desc()) ||
pEnt->isKindOf(CLampDim::desc()))
{
pEnt->erase();
}
pEnt->close();
}
}
//加入新转换的对象
/* int num=entSetNew.length();
for(int n=0; n<num; n++)
{
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
if(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk)
{
if(pNewEnt->isA()==AcDbBlockReference::desc() && pNewEnt->layerId()==idWinLay)
{
//没有对属性进行进一步判断,确定是门窗与否
AcDbBlockReference *pInsert=AcDbBlockReference::cast(pNewEnt);
AcGeScale3d factors=pInsert->scaleFactors();
double w=factors[2];
RBList xd=ads_buildlist(1001, _T("WTHICK"), 1040, w, NULL);
pInsert->setXData(xd);
factors[2]=factors[0];
pInsert->setScaleFactors(factors);
}
// pNewEnt->close();
AcDbObjectId id=pNewEnt->objectId();
pNewEnt->close();
AddToGroup(pDbSrc,groupName,id);
}
else
delete pNewEnt;
}
*/
delete pRecIter;
}
}
pRec->close();
}
}
delete pIterator;
// add by xlc on 070713
// 删除坏的hatch,解决无面积特性的hatch在上华3崩溃的问题
#if ADS >16
// 对于一些坏图,有问题,暂不使用,removed by whl on 090331
// EraseWrongHatchEnt(pDbSrc);
#endif
// add by xlc on 070525
HideTchObject(pDbSrc); // 隐藏_TCH_HIDE_GROUP组内的对象
TDbConfig*pConfig = GetDwgGlobal(AcDb::kForRead, pDbSrc);
if (pConfig != NULL)
{
if (pConfig->upgradeOpen() == Acad::eOk)
pConfig->erase();
pConfig->close();
}
// 删除水暖中的TDbPsConfig对象,否则使用纯cad打开时,会提示代理图形错误
AcDbDictionary *pDict=NULL;
pDbSrc->getNamedObjectsDictionary(pDict, AcDb::kForRead);
if (pDict != NULL)
{
AcDbObjectId objId;
if(pDict->getAt (_T("TCH_DBPSCONFIG"),objId)==Acad::eOk)
{
AcDbObject *pObj=NULL;
if(acdbOpenObject(pObj, objId, AcDb::kForWrite)==Acad::eOk)
{
if (pObj!=NULL)
{
pObj->erase();
pObj->close ();
}
}
}
pDict->close();
}
/*
#if (ADS==16)
Acad::ErrorStatus es=acdbSaveAs2000(pDbSrc, szDest);
#else
Acad::ErrorStatus es=acdbSaveAsR14(pDbSrc, szDest);
#endif
*/
// sg modify 120217,根据全局设置,保存图纸格式
Acad::ErrorStatus es = SaveAsAppointedCADVer(pDbSrc, szDest, nCADVer);
return (es==Acad::eOk? RTNORM : RTERROR);
}
//add by xlc on 081225
class CEntStyle
{
public:
AcDbVoidPtrArray entSet;
BOOL bEarse;
CString strGroupName;
AcDbObjectId idObj;
};
// 把当前图另存旧版自定义对象格式
// pDb将被修改
// version:5,6,7,8
int SaveAs(AcDbDatabase *pDb, const TCHAR *szDest,int version, int nCADVer)
{
XPushMemVar<int> vSave(g_nSaveTArchVer, version);
ASSERT(pDb && szDest);
AcDbObjectId idSpaceStyle=GetTextStyleId(_T("_TCH_SPACE"), pDb);
if (idSpaceStyle.isValid())
{
OPENOBJ_BEGIN(idSpaceStyle, AcDb::kForWrite, AcDbTextStyleTableRecord, pStyle);
if (pStyle)
pStyle->setTextSize(5.0);
OPENOBJ_END();
}
AcDbObjectId idWinTextStyle=GetTextStyleId(_T("_TCH_WINDOW"), pDb);
if (idWinTextStyle.isValid())
{
OPENOBJ_BEGIN(idWinTextStyle, AcDb::kForWrite, AcDbTextStyleTableRecord, pStyle);
if (pStyle)
pStyle->setTextSize(3.5);
OPENOBJ_END();
}
int nDrawMode=IsExplode3D();
if (nDrawMode==1)
nDrawMode=DRAW_3D;
else
nDrawMode=DRAW_2D;
// 全部导出的情况
AcDbBlockTable *pNewBlockTab = NULL;
VERIFY(pDb->getSymbolTable(pNewBlockTab, AcDb::kForRead)==Acad::eOk);
ASSERT(pNewBlockTab);
AcDbBlockTableIterator *pIterator=NULL;
Acad::ErrorStatus es1 = pNewBlockTab->newIterator(pIterator);
pNewBlockTab->close();
if (es1!=Acad::eOk || !pIterator)
{
delete pDb;
return RTERROR;
}
for (pIterator->start(); !pIterator->done(); pIterator->step())
{
AcDbBlockTableRecord *pRec = NULL;
if (!(pIterator->getRecord(pRec, AcDb::kForWrite)==Acad::eOk && pRec))
continue;
XDbObject vAutoClose(pRec);
if (pRec->isFromExternalReference())
continue;
AcDbBlockTableRecordIterator *pRecIter = NULL;
if (pRec->newIterator(pRecIter)==Acad::eOk && pRecIter)
{
Array<CEntStyle> entStyleArray;
// 对块表记录中的对象进行分解
// AcDbVoidPtrArray entSetNew;
AcDbObjectIdArray eraseArray;
for (pRecIter->start(); !pRecIter->done(); pRecIter->step())
{
AcDbVoidPtrArray entSetNew; // modify by xlc on 070828
// add by xlc on 070524
AcDbObjectId entityId;
pRecIter->getEntityId(entityId);
CString groupName;
GetGroupNameFromXData(entityId,_T("TCH_GROUP"),groupName);
AcDbEntity *pEnt = NULL;
if (pRecIter->getEntity(pEnt, AcDb::kForWrite) == Acad::eOk)
{
XDbObject autoClose1(pEnt);
BOOL bErase = FALSE; // modify by xlc on 070524
if (pEnt->isKindOf(TDbEntity::desc()))
{
pEnt->assertWriteEnabled();
// add by xlc on 100416 图纸中有网架不合法(杆件为0)时从图纸移除
TDbNetshelf *pNetshelf = TDbNetshelf::cast(pEnt);
if (pNetshelf && (!pNetshelf->IsValid()))
{
eraseArray.append(pNetshelf->objectId());
continue;
}
TDbEntity *tEnt = TDbEntity::cast(pEnt);
// add begin
CString sName = tEnt->isA()->name();
if( 0==sName.CompareNoCase(_T("TDbFloorPipe")) && version<10 )
{
if( Acad::eOk == tEnt->Explode(entSetNew) )
{
CEntStyle entStyle;
entStyle.bEarse = bErase;
entStyle.strGroupName = groupName;
entStyle.entSet = entSetNew;
entStyle.idObj = pEnt->objectId();
entStyleArray.AddTail(entStyle);
eraseArray.append(tEnt->objectId());
continue;
}
}
// add end by cq 150819 盘管实体导出到T9以下(含T9)平台时 炸开
tEnt->DownGradeSave(nDrawMode, entSetNew, &bErase);
if (bErase)
eraseArray.append(tEnt->objectId());
//modify by xlc on 081225
CEntStyle entStyle;
entStyle.bEarse=bErase;
entStyle.strGroupName=groupName;
entStyle.entSet=entSetNew;
entStyle.idObj=pEnt->objectId();
entStyleArray.AddTail(entStyle);
}
else if (pEnt->isKindOf(TDbCurveEntity::desc()))
{
pEnt->assertWriteEnabled();
TDbCurveEntity *tEnt=TDbCurveEntity::cast(pEnt);
// BOOL bErase=FALSE; //modify by xlc on 070524
tEnt->DownGradeSave(nDrawMode, entSetNew, &bErase);
if(bErase)
eraseArray.append(tEnt->objectId());
// modify by xlc on 081225
CEntStyle entStyle;
entStyle.bEarse=bErase;
entStyle.strGroupName=groupName;
entStyle.entSet=entSetNew;
entStyle.idObj=pEnt->objectId();
entStyleArray.AddTail(entStyle);
}
else if (!groupName.IsEmpty()) // sg add 120502,解决普通对象丢失问题
{
pEnt->close();
AddToGroup(pDb, groupName, pEnt->objectId()); // 添加到组
DelXdata(pEnt->objectId(), _T("TCH_GROUP")); // 删除扩展数据
}
//add by xlc on 070524
//实体添加到组中
//if(!groupName.IsEmpty())//modify by xlc on 070828
//modify by xlc on 081225解决图形导出对象指向自己死循环的问题
//{
// if(bErase) //分解实体
// {
// int num=entSetNew.length();//新添加的数目
// for(int n=0; n<num; n++)
// {
// AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
// if(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk)
// {
// AcDbObjectId id=pNewEnt->objectId();
// pNewEnt->close();
// if(!groupName.IsEmpty())
// {
// AddToGroup(pDb,groupName,id);
// }
// }
// else
// delete pNewEnt;
// }
// }
// else //未分解实体
// {
// AcDbObjectId id=pEnt->objectId();
// pEnt->close();
// if(!groupName.IsEmpty())
// {
// AddToGroup(pDb,groupName,id); //添加到组
// DelXdata(id,_T("TCH_GROUP")); //删除扩展数据
// }
// }
//}
}
}
delete pRecIter;
// 删除旧的
for (int n=0; n<eraseArray.length(); n++)
{
AcDbObjectId id = eraseArray[n];
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt)
pEnt->erase();
OPENOBJ_END();
}
// 加入新转换的对象
/*
int num=entSetNew.length();
for(n=0; n<num; n++)
{
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[n];
VERIFY(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk);
pNewEnt->close();
//窗还要插入墙
TDbOpening*pWin=TDbOpening::cast(pNewEnt);
if(pWin!=NULL)
{
AcDbObjectId idWall=pWin->GetWallId();
OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbWall, pWall);
if(pWall)
pWall->AddOpeningId(pWin->objectId());
OPENOBJ_END();
}
}
*/
// modify by xlc on 081225
for (n=0; n<entStyleArray.GetLength(); n++)
{
CString strName = entStyleArray[n].strGroupName;
AcDbVoidPtrArray entSetNew = entStyleArray[n].entSet;
// sg delete 110907,为了保证图纸导出后的门窗显示正确,恢复到和8.5B2版本一致
// AcDbObjectId idOld = entStyleArray[n].idObj;
int num = entSetNew.length();//新添加的数目
if (strName.IsEmpty())
{
for(int i=0;i<num;i++)
{
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[i];
VERIFY(pRec->appendAcDbEntity(pNewEnt)==Acad::eOk);
// sg delete 110907,为了保证图纸导出后的门窗显示正确,恢复到和8.5B2版本一致
/*
//add by xlc on 110408 提取保温线时防止id丢失
CString str= pNewEnt->isA()->name();
if (str.CompareNoCase(_T("TDbWall")) == 0
||str.CompareNoCase(_T("TDbColumn")) == 0
||str.CompareNoCase(_T("TDbWallPatch")) == 0)
{
pNewEnt->swapIdWith(idOld);
}
*/
pNewEnt->close();
// 窗还要插入墙
TDbOpening *pWin = TDbOpening::cast(pNewEnt);
if (pWin != NULL)
{
AcDbObjectId idWall = pWin->GetWallId();
OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbWall, pWall);
if (pWall)
pWall->AddOpeningId(pWin->objectId());
OPENOBJ_END();
}
}
}
else
{
if (entStyleArray[n].bEarse)
{
for (int i=0; i<num; i++)
{
AcDbEntity *pNewEnt=(AcDbEntity *)entSetNew[i];
if (pRec->appendAcDbEntity(pNewEnt) == Acad::eOk)
{
AcDbObjectId id = pNewEnt->objectId();
pNewEnt->close();
AddToGroup(pDb,strName,id);
//窗还要插入墙
TDbOpening*pWin = TDbOpening::cast(pNewEnt);
if (pWin != NULL)
{
AcDbObjectId idWall = pWin->GetWallId();
OPENOBJ_BEGIN(idWall, AcDb::kForWrite, TDbWall, pWall);
if (pWall)
pWall->AddOpeningId(pWin->objectId());
OPENOBJ_END();
}
}
else
delete pNewEnt;
}
}
else
{
AcDbObjectId id=entStyleArray[n].idObj;
AddToGroup(pDb,strName,id); // 添加到组
DelXdata(id,_T("TCH_GROUP")); // 删除扩展数据
}
}
}
}
}
delete pIterator;
//add by xlc on 070525
HideTchObject(pDb); //隐藏_TCH_HIDE_GROUP组内的对象
if (FindFile(szDest))
_tremove(szDest);
/*
#if (ADS>15)
Acad::ErrorStatus ees=acdbSaveAs2000(pDb, szDest);
#else
Acad::ErrorStatus ees=pDb->saveAs(szDest);
#endif
*/
// sg modify 120217,根据全局设置,保存图纸格式
Acad::ErrorStatus es = SaveAsAppointedCADVer(pDb, szDest, nCADVer);
if (es != Acad::eOk)
return RTERROR;
return RTNORM;
}
//获得克隆块的新ID //add by xlc on 091102
AcDbObjectId WblockCloneObjects(AcDbObjectId idOldBlock,AcDbDatabase *pDb)
{
AcDbObjectIdArray list;
list.append(idOldBlock); // 将实体ID存入数组
AcDbIdMapping idMap;
acdbCurDwg()->wblockCloneObjects(list,pDb->blockTableId(),idMap,AcDb::kDrcReplace);//复制块到当前打开的文档
AcDbIdPair idPair;
idPair.setKey(idOldBlock);
idMap.compute(idPair);
AcDbObjectId idNewBlock=idPair.value();
return idNewBlock;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 存成旧版入口函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void SaveAsOldVer()
{
static int idx = -1;
XString sFileDefault;
xg_getvar(_T("DWGPREFIX"), sFileDefault); // H:\Tangent\TArchDev9.0\Bin\sys18\
TCHAR szDwgName[250]=_T("");
AT_GetCurDwg(szDwgName); // 当前图纸名称
// sg modify 111206,分别给建筑、设备专业增加导出T9、T8的功能
bool bArch(g_nProductId == kTARCH);
if (idx == -1) idx = bArch ? 8 : 7;
sFileDefault << szDwgName << _T(".dwg");
/*
switch(idx)
{
case 8:
sFileDefault << szDwgName << (bArch ? _T("_t3.dwg") : _T(".dwg"));
break;
case 7:
sFileDefault << szDwgName << (bArch ? _T("_t5.dwg") : _T("_t3.dwg"));
break;
case 6:
sFileDefault << szDwgName << (bArch ? _T("_t6.dwg") : _T("_t5.dwg"));
break;
case 5:
sFileDefault << szDwgName << (bArch ? _T("_t7.dwg") : _T("_t6.dwg"));
break;
case 4:
sFileDefault << szDwgName << (bArch ? _T("_t8.dwg") : _T("_t7.dwg"));
break;
case 3:
sFileDefault << szDwgName << (bArch ? _T("_t9.dwg") : _T("_t8.dwg"));
break;
case 2:
sFileDefault << szDwgName << (bArch ? _T("_t20V2.dwg") : _T("_t9.dwg"));
break;
case 1:
sFileDefault << szDwgName << (bArch ? _T("_t20V3.dwg") : _T("_t20V2.dwg"));
break;
}*/
CTemporaryResourceOverride vTemp;
CTArchFileDialog dlg(sFileDefault, idx); // 弹出对话框
if (dlg.DoModal() != IDOK)
return;
if (!XSymbolTable(_T("APPID"), _T("WTHICK")))
VERIFY(ads_regapp(_T("WTHICK")) == RTNORM);
InitTextStyle(TS_DIMFONT); // 建立DIMFONT
if (g_nFilterType==2 || g_nFilterType==3) // 结构基础条件图或结构平面条件图,创建梁图层
InitLayer(LAY_BEAM);
XString sFile;
sFile = (const TCHAR *)dlg.GetPathName(); // 获得保存文件的完整路径和名称
AcDbDatabase *pDb = NULL;
// 删除过多的图层过滤器,否则速度过慢
AcDbLayerTable *pLayertable = NULL;
acdbCurDwg()->getLayerTable(pLayertable, AcDb::kForRead);
if (pLayertable != NULL)
{
AcDbObjectId idExtDict = pLayertable->extensionDictionary();
AcDbDictionary *pDict = NULL;
acdbOpenObject(pDict, idExtDict, AcDb::kForRead);
if (pDict != NULL)
{
AcDbObject *pObj = NULL;
pDict->getAt(_T("ACAD_LAYERFILTERS"),pObj,AcDb::kForWrite);
if (pObj != NULL)
{
AcDbDictionary *pFilters = AcDbDictionary::cast(pObj);
if (pFilters!=NULL && pFilters->numEntries()>200)
{
adsout<<_T("图层过滤器过多!已删除。");
pObj->erase();
}
pObj->close();
}
pDict->close();
}
pLayertable->close();
}
if (g_nFilterType==1 || (dlg.GetSaveVersion()==3&&IsExplode3D())) // 三维模型
{
int nDrawMode = DocGetDrawMode();
DocSetDrawMode(DRAW_3D);
SaveCurDwgAsTArch3(sFile);
DocSetDrawMode(nDrawMode);
return;
}
// 不稳定问题解决方案
//PickSet ssNewDim(SS_FREE);
PickSet ssOldDim(SS_FREE);
AcDbObjectIdArray aryNewDimId;
if (dlg.GetSaveVersion() == 3)
{
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE);
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
ssOldDim.Get(_T("X"),NULL,NULL,RBList(RTDXF0,_T("ATS_DIMENSION,ATS_DIMENSION2"),NULL));
long lCount = ssOldDim.Length();
//ssNewDim.IncludeBegin();
for (long i=0L; i<lCount; i++)
{
Entity ent = ssOldDim[i];
//TCHAR szLay[256] = _T(""); // TEST
//ent.GetData(8, szLay);
XDbObject obj(ent, AcDb::kForRead);
if (!obj)
continue;
AcDbObjectId ownerId = obj.m_pObject->ownerId();
// sg add 120502,判断该尺寸对象是否在_TCH_HIDE_GROUP组内
AcDbObjectId groupId;
bool bInHideGroup = ::IsTchHideGroupObj(obj.m_pObject->objectId(), groupId);
AcDbVoidPtrArray entitySet;
if (((AcDbEntity *)obj.m_pObject)->explode(entitySet) != Acad::eOk)
continue;
int nCount = entitySet.length();
for (int j=0; j<nCount; j++)
{
AcDbEntity *pNewEnt = (AcDbEntity *)entitySet[j];
// modify by xlc on 070717
// 解决了在图纸空间操作丢失标注的问题
if (ownerId != NULL)
{
AcDbBlockTableRecordPointer pBlockTableRecord(ownerId, AcDb::kForWrite);
if( pBlockTableRecord.openStatus() == Acad::eOk)
{
if (pBlockTableRecord->appendAcDbEntity(pNewEnt) == Acad::eOk)
{
pNewEnt->close();
}
else
{
delete pNewEnt;
}
}
else
{
delete pNewEnt;
continue;
}
}
else
{
AddToCurrentSpace(pNewEnt, Adesk::kTrue);
}
// sg add 120502,判断原来的尺寸对象在_TCH_HIDE_GROUP组内,将炸开后的对象也放到组内
aryNewDimId.append(pNewEnt->objectId());
if (bInHideGroup)
{
OPENOBJ_BEGIN(groupId, AcDb::kForWrite, AcDbGroup, pGroup);
if (pGroup != NULL)
{
pGroup->append(pNewEnt->objectId());
pGroup->close();
}
OPENOBJ_END();
}
}
}
//ssNewDim.IncludeEnd();
ssOldDim.Delete();//临时删除
}
// add by xlc on 070524
{
// sg modify 120504,根据9.0需求,为了提高速度,临时关闭了数据库反应器
TPushMemVar<BOOL> pushVar(g_bMonitorDbAction, FALSE);
AddGroupNameToXData(acdbCurDwg()); // 组内实体创建扩展数据记录组名
}
XString sUcsName;
xg_getvar(_T("UCSNAME"),sUcsName);
int nTileMode = 0;
xg_getvar(_T("TILEMODE"), &nTileMode);
PickSet ssViewPort(SS_FREE);
ssViewPort.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("VIEWPORT"), NULL));
DList<TViewportTableData> lstVPData; // 获得当前视口信息
BOOL bIsWcs = IsWCS();
if (nTileMode == 0) // 当前是图纸空间
{
long lCount = ssViewPort.Length();
for (long l=0L; l<lCount; l++)
{
int nViewPortNum = 1;
Entity ent = ssViewPort[l];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbViewport, pViewport);
if (pViewport != NULL)
{
nViewPortNum = pViewport->number();
if (nViewPortNum < 2)
continue;
TViewportTableData data;
data.m_nVPNum = nViewPortNum;
data.m_ptCen = pViewport->centerPoint();
pViewport->getUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
lstVPData.Append(new TViewportTableData(data.m_ptCen, data.m_ptOrg, data.m_vtX, data.m_vtY, data.m_nVPNum));
}
OPENOBJ_END();
if (nViewPortNum != 1)
{
SHads_command(RTSTR, _T("_MSPACE"), RTNONE);
acedSetCurrentVPort(nViewPortNum);
SHads_command(RTSTR, _T("UCS"), RTSTR, _T(""), RTNONE);
}
}
}
else if (!bIsWcs) // 模型空间,UCS
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T(""), RTNONE);
}
Acad::ErrorStatus es = acdbCurDwg()->wblock(pDb);
#if ADS>16
extern TARCH_IMPEXP double g_nAcadVer;
if (TchGeLib::g_nAcadVer > 17.01) // 2008,解决2008平台轴号导出丢失问题
{
AcDbObjectId idAxisBlk=InitBlock(_T("_AXISO"));
if (idAxisBlk.isValid())
{
AcDbObjectIdArray ids;
ids.append(idAxisBlk);
acdbCurDwg()->wblock(pDb,ids,AcGePoint3d::kOrigin,AcDb::kDrcIgnore);
}
}
#endif
if (nTileMode == 0) // 图纸空间
{
DList<AcDbObjectId> idList;
GetEntityFromDatabase(idList, *pDb, _T("VIEWPORT"), 0, ACDB_PAPER_SPACE);
int nCount = lstVPData.Length(),
nVPNums = idList.Length();
for (int nVP=0; nVP<nCount; nVP++)
{
TViewportTableData data = *lstVPData[nVP];
SHads_command(RTSTR, _T("_MSPACE"), RTNONE);
acedSetCurrentVPort(data.m_nVPNum);
SHads_command(RTSTR, _T("UCS"), RTSTR, _T("P"), RTNONE);
for (int nNewVP=0; nNewVP<nVPNums; nNewVP++)
{
OPENOBJ_BEGIN(*idList[nNewVP], AcDb::kForRead, AcDbViewport, pViewport);
if (pViewport != NULL)
{
if (pViewport->centerPoint().distanceTo(data.m_ptCen) < _DIST_SNAP)
{
if (pViewport->upgradeOpen() == Acad::eOk)
{
pViewport->assertWriteEnabled();
pViewport->setUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
pViewport->downgradeOpen();
break;
}
}
}
OPENOBJ_END();
}
}
SHads_command(RTSTR, _T("_PSPACE"), RTNONE);
acedSetCurrentVPort(1);
}
else if (!bIsWcs) // UCS
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T("P"), RTNONE);
}
// add by xlc on 070524
{
// sg modify 120504,根据9.0需求,为了提高速度,临时关闭了数据库反应器
TPushMemVar<BOOL> pushVar(g_bMonitorDbAction, FALSE);
DelXDataFromGroup(acdbCurDwg()); // 删除组内实体扩展数据
}
// 不稳定问题解决方案
if (dlg.GetSaveVersion() == 3)
{
ssOldDim.Delete(); // undelete
//ssNewDim.Delete();
int nNewDimCount = aryNewDimId.logicalLength();
for (int nIndex=0; nIndex<nNewDimCount; nIndex++)
{
OPENOBJ_BEGIN(aryNewDimId[nIndex], AcDb::kForWrite, AcDbEntity, pAcDbEntity);
if (pAcDbEntity != NULL)
{
pAcDbEntity ->erase();
}
OPENOBJ_END();
}
//int m = ssOldDim.Length(); // TEST
//int n = ssNewDim.Length();
}
if (es != Acad::eOk)
{
adsout << acadErrorStatusText(es);
return;
}
// 文字样式表复制
{
AcDbTextStyleTable *pTable = NULL;
acdbOpenObject(pTable, acdbCurDwg()->textStyleTableId(), AcDb::kForRead);
if (pTable != NULL)
{
AcDbTextStyleTableIterator *pIter = NULL;
pTable->newIterator(pIter);
pTable->close();
if (pIter != NULL)
{
AcDbObjectIdArray idArray;
for (pIter->start(); !pIter->done(); pIter->step())
{
AcDbObjectId id;
pIter->getRecordId(id);
if (!id.isNull())
idArray.append(id);
}
delete pIter;
AcDbIdMapping idMap;
acdbCurDwg()->wblockCloneObjects(idArray, pDb->textStyleTableId(), idMap, AcDb::kDrcReplace);
}
}
}
// 视口复制
{
acedVports2VportTableRecords();
DList<TViewportTableData> lstData; // 获得当前视口信息
AcDbViewportTable *pVpCurTable = NULL;
if (acdbCurDwg()->getViewportTable(pVpCurTable, AcDb::kForRead)==Acad::eOk && pVpCurTable!=NULL)
{
AcDbViewportTableIterator *pVPIter = NULL;
pVpCurTable->newIterator(pVPIter);
pVpCurTable->close();
if (pVPIter != NULL)
{
for (pVPIter->start(); !pVPIter->done(); pVPIter->step())
{
AcDbViewportTableRecord *pRecord = NULL;
if (pVPIter->getRecord(pRecord, AcDb::kForRead)==Acad::eOk && pRecord!=NULL)
{
TViewportTableData data;
data.m_ptCen.x = pRecord->centerPoint().x;
data.m_ptCen.y = pRecord->centerPoint().y;
pRecord->getUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
lstData.Append(new TViewportTableData(data.m_ptCen, data.m_ptOrg, data.m_vtX, data.m_vtY));
pRecord->close();
}
}
delete pVPIter;
}
}
AcDbViewportTable *pVpNewTable = NULL;
if (pDb->getViewportTable(pVpNewTable, AcDb::kForRead)==Acad::eOk && pVpNewTable!=NULL)
{
AcDbViewportTableIterator *pVPNewIter = NULL;
pVpNewTable->newIterator(pVPNewIter);
pVpNewTable->close();
if (pVPNewIter != NULL)
{
for (pVPNewIter->start(); !pVPNewIter->done(); pVPNewIter->step())
{
AcDbViewportTableRecord *pRecord = NULL;
if (pVPNewIter->getRecord(pRecord, AcDb::kForWrite)==Acad::eOk && pRecord!=NULL)
{
AcGePoint2d ptCen = pRecord->centerPoint();
int nVtNums = lstData.Length();
for (int nN=0; nN<nVtNums; nN++)
{
TViewportTableData data = *lstData[nN];
AcGePoint2d ptCurCen(data.m_ptCen.x, data.m_ptCen.y);
if (ptCurCen.distanceTo(ptCen) < _DIST_SNAP)
{
pRecord->setUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
}
}
pRecord->close();
}
}
delete pVPNewIter;
}
}
}
// Ucs复制
{
AcDbUCSTable *pTable = NULL;
acdbOpenObject(pTable,acdbCurDwg()->UCSTableId(), AcDb::kForRead);
if (pTable != NULL)
{
AcDbUCSTableIterator *pIter = NULL;
pTable->newIterator(pIter);
pTable->close();
if (pIter != NULL)
{
AcDbObjectIdArray idArray;
for (pIter->start(); !pIter->done(); pIter->step())
{
AcDbObjectId id;
pIter->getRecordId(id);
if (!id.isNull())
idArray.append(id);
}
delete pIter;
AcDbIdMapping idMap;
acdbCurDwg()->wblockCloneObjects(idArray, pDb->UCSTableId(), idMap, AcDb::kDrcReplace);
}
}
}
// 线型复制
{
AcDbLinetypeTable *pTable=NULL;
acdbOpenObject(pTable,acdbCurDwg()->linetypeTableId(),AcDb::kForRead);
if(pTable!=NULL)
{
AcDbLinetypeTableIterator *pIter=NULL;
pTable->newIterator(pIter);
pTable->close();
if(pIter!=NULL)
{
AcDbObjectIdArray idArray;
for(pIter->start();!pIter->done();pIter->step())
{
AcDbObjectId id;
pIter->getRecordId(id);
if(!id.isNull())
idArray.append(id);
}
delete pIter;
AcDbIdMapping idMap;
acdbCurDwg()->wblockCloneObjects(idArray,pDb->linetypeTableId(),idMap,AcDb::kDrcReplace);
}
}
}
CSaveFilter::PreSave(pDb);
////复制TDbConfig,有[多重从属]警告,不用
//TDbConfig *pDC=GetDwgGlobal(AcDb::kForRead);
//if(pDC!=NULL)
//{
// AcDbObjectIdArray idArray;
// AcDbIdMapping idMap;
// idArray.append(pDC->objectId());//DICT:ATS_DBCONFIG
// pDC->close();
// AcDbDictionary *pNameDict=NULL;
// pDb->getNamedObjectsDictionary(pNameDict, AcDb::kForRead);
// if(pNameDict!=NULL)
// {
// AcDbObjectId idNameDict=pNameDict->id();
// pNameDict->close();
// acdbCurDwg()->wblockCloneObjects(idArray,idNameDict,idMap,AcDb::kDrcIgnore);
// }
//}
//复制TDbConfig
{
AcDbDictionary *pDict1=NULL;
pDb->getNamedObjectsDictionary(pDict1, AcDb::kForWrite);
TDbConfig *p0 =GetDwgGlobal(AcDb::kForRead);
if(p0!=NULL&&pDict1!=NULL)
{
TDbConfig *p1=TDbConfig::cast(p0->clone());
if(p1!=NULL)
{
p1->SetHatchDividerId(AcDbObjectId::kNull);
p1->SetHatchFillId(AcDbObjectId::kNull);
p1->SetHatchFill1Id(AcDbObjectId::kNull);
p1->SetHatchFill2Id(AcDbObjectId::kNull);
//add by xlc on 091102 解决线图案填充不导出的问题
if(p0->IsDividerLineHatch())
{
p1->SetHatchDividerId(WblockCloneObjects(p0->GetHatchDividerId(),pDb));
}
if(p0->IsFillLineHatch())
{
p1->SetHatchFillId(WblockCloneObjects(p0->GetHatchFillId(),pDb));
}
if(p0->IsFill1LineHatch())
{
p1->SetHatchFill1Id(WblockCloneObjects(p0->GetHatchFill1Id(),pDb));
}
if(p0->IsFill2LineHatch())
{
p1->SetHatchFill2Id(WblockCloneObjects(p0->GetHatchFill2Id(),pDb));
}
p1->SetHatchBrickId(AcDbObjectId::kNull);
p1->SetHatchRocketId(AcDbObjectId::kNull);
p1->SetHatchConcreteId(AcDbObjectId::kNull);
p1->SetHatchSteelId(AcDbObjectId::kNull);
p1->SetLinetypeDote(GetLinetypeIdFromString(_T("DOTE"),pDb));
p1->SetLinetypeDash(GetLinetypeIdFromString(_T("DASH"),pDb));
// sg add 090519,导出T7、T6后,应该将文字距基线系数,转化为文字距基线距离
double dText2BaseRatio = p0->GetText2BaseRatio();
// sg modify 090527,将文字距离基线距离与系数间的换算关系由0.3精确到0.286
// dText2BaseRatio /= 0.3;
dText2BaseRatio /= 0.286;
p1->SetText2Base(dText2BaseRatio);
AcDbObjectId id;
if(pDict1->setAt(_T("ATS_DBCONFIG"),p1,id)==Acad::eOk)
p1->close();
else
delete p1;
}
}
//add by xlc on 090521 水暖专业配置信息
AcDbDictionary *pDict2=NULL;
acdbCurDwg()->getNamedObjectsDictionary(pDict2,AcDb::kForRead);
if (pDict2!=NULL&&pDict1!=NULL)
{
AcDbObjectId objId;
if(pDict2->getAt (_T("TCH_DBPSCONFIG"),objId)==Acad::eOk)
{
AcDbObject *pObj=NULL;
if(acdbOpenObject(pObj, objId, AcDb::kForRead)==Acad::eOk)
{
if (pObj!=NULL)
{
AcDbObject *p2=AcDbObject::cast(pObj->clone());
if (p2!=NULL)
{
AcDbObjectId id;
if(pDict1->setAt(_T("TCH_DBPSCONFIG"),p2,id)==Acad::eOk)
p2->close();
else
delete p2;
}
pObj->close ();
}
}
}
}
if (NULL != pDict2)
pDict2->close();
if(pDict1!=NULL)
pDict1->close();
if(p0!=NULL)
p0->close();
}
// 复制组
// add by xlc on 070522
{
AcDbDictionary *pGroupDictOld = NULL;
AcDbDictionary *pGroupDictNew = NULL;
pDb->getGroupDictionary(pGroupDictNew, AcDb::kForWrite);
if( acdbCurDwg()->getGroupDictionary(pGroupDictOld, AcDb::kForRead) == Acad::eOk )
{
AcDbDictionaryIterator *pIter = pGroupDictOld->newIterator();
pGroupDictOld->close();
for(; !pIter->done(); pIter->next())
{
AcDbObjectId id = pIter->objectId();
if (id != NULL)
{
AcDbGroup *pGroup = new AcDbGroup();
AcDbObjectId idGroup;
es = pGroupDictNew->setAt(pIter->name(), pGroup, idGroup);
if (Acad::eOk != es )
{
delete pGroup;
}
else
{
XString name = pIter->name();
pGroup->setName(name);
pGroup->close();
}
}
}
delete pIter;
}
if(pGroupDictNew != NULL)
pGroupDictNew->close();
}
// sg modify 111206,分别增加导出T9、T8的功能
// Begin
int nCadVer = g_nDownGradeSaveCadVer + 14;
#if (ADS == 16)
nCadVer++; // 16平台,无法保存成R14格式
#endif
int nSaveVer(dlg.GetSaveVersion());
switch (nSaveVer)
{
case 3://TArch3
idx = bArch ? 8 : 7;
break;
case 5://TArch5
idx = bArch ? 7 : 6;
break;
case 6://TArch6
idx = bArch ? 6 : 5;
break;
case 7: //TArch7
idx = bArch ? 5 : 4;
break;
case 8://TArch8
idx = bArch ? 4 : 3;
break;
case 9://TArch9
idx = bArch ? 3 : 2;
break;
case 10://20V2
idx = bArch ? 2 : 1;
break;
case 11://20V3
idx = 1;
break;
default:
idx = 1;
break;
}
bool bSuccess(false);
if (nSaveVer > 3)
bSuccess = (SaveAs(pDb, sFile,nSaveVer, nCadVer)==RTNORM);
else // T3 特殊处理
{
BOOL bLineWeight=DocGetIsLineWeight();
if(g_nFilterType>0&&bLineWeight)
DocSetIsLineWeight(FALSE);
// modify by gjm 2012/09/06 true -> false
bSuccess = (SaveAsTArch3(pDb, sFile, nCadVer, false)==RTNORM);
if(g_nFilterType>0&&bLineWeight)
DocSetIsLineWeight(TRUE);
}
//再增加版本,需要特殊处理,目前20V3版本是11
if (nSaveVer == 10) // 先这样处理,看将来大版本号如何改动,再做修改。
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << _T("T20V2文件: ") << sFile;
else if (nSaveVer == 11) // 先这样处理,看将来大版本号如何改动,再做修改。
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << _T("T20V3文件: ") << sFile;
else
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << nSaveVer << _T("文件: ") << sFile;
// End
delete pDb;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//add by xlc on 07/04/18
int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if(uMsg == BFFM_INITIALIZED)
{
LPCTSTR lpInitDir = (LPCTSTR)lpData;
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE,
reinterpret_cast<LONG_PTR>(lpInitDir));
}
else if(uMsg == BFFM_SELCHANGED)
{
}
return 0;
}
//从目录树中选取一个目录
BOOL GetFolderDia(XString &sFolder, CWnd *pParent, const TCHAR *pszTitle)
{
LPMALLOC pMalloc;
if (::SHGetMalloc(&pMalloc)!= NOERROR)
return FALSE;
BROWSEINFO bInfo;
LPITEMIDLIST pidl;
ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));
if (0) {
OLECHAR olePath[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
HRESULT hr;
LPSHELLFOLDER pDesktopFolder;
//
// Get a pointer to the Desktop's IShellFolder interface.
//
if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))) {
//
// IShellFolder::ParseDisplayName requires the file name be in Unicode.
//
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (const char *)(_AS(sFolder)), -1,
olePath, MAX_PATH);
//
// Convert the path to an ITEMIDLIST.
//
hr = pDesktopFolder->ParseDisplayName(NULL,
NULL,
olePath,
&chEaten,
&pidl,
&dwAttributes);
if (FAILED(hr)) {
pMalloc ->Free (pidl);
pMalloc ->Release ();
return FALSE;
}
bInfo.pidlRoot = pidl;
}
}
TCHAR szPath[256]=_T("");
_tcscpy(szPath, sFolder);
bInfo.hwndOwner = pParent->GetSafeHwnd();
bInfo.pszDisplayName = szPath;
bInfo.lpszTitle = pszTitle;
//modify by xlc on 07/04/18
//bInfo.ulFlags = BIF_RETURNONLYFSDIRS;
//bInfo.lpfn = NULL; //BrowseCtrlCallback; // address of callback function
//bInfo.lParam = NULL; //(LPARAM)this; // pass address of object to callback function
#if ADS<16
#define BIF_NEWDIALOGSTYLE 0x0040
#endif
bInfo.ulFlags = BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
bInfo.lpfn = BrowseCtrlCallback; //NULL; // address of callback function
bInfo.lParam = (LPARAM)szPath; //(LPARAM)this; // pass address of object to callback function
if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL) {
pMalloc ->Release();
return FALSE;
}
if (::SHGetPathFromIDList(pidl,szPath) == FALSE) {
pMalloc ->Free(pidl);
pMalloc ->Release();
return FALSE;
}
_tcscat(szPath, _T("\\"));
sFolder=szPath;
pMalloc ->Free(pidl);
pMalloc ->Release();
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command: 分解对象入口函数
// Modified on 2003/9/15:解决图纸空间对象分解后变成模型空间问题
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ExplCustEnt()
{
// extern void MakeWallSet1(PickSet &ssWalls);
PickSet ssAll(SS_FREE), ss(SS_FREE); //ss--上华对象, ssAll--AutoCAD对象
RBList mask(RTDXF0, _T("TCH_*"), NULL);
int nRet=ssAll.Get(NULL, NULL, NULL, mask);
if(nRet!=RTNORM)
return;
AcDbObjectId idPubWall=InitLayer(LAY_THICK_LINE);
XPushMemVar<AcDbObjectId> vTempId(g_idPubWall, idPubWall);
MakeWallSet1(ssAll);
ss += ssAll;
ss.BaseFilter(mask);
ssAll -= ss;
int nExplMode=IsExplode3D();
if(!XSymbolTable(_T("APPID"), _T("WTHICK")))
VERIFY(ads_regapp(_T("WTHICK"))==RTNORM);
InitTextStyle(TS_DIMFONT); //建立DIMFONT
acdbCurDwg()->setDimstyleData(acdbCurDwg()->dimstyle());
XPushMemVar<BOOL> vTemp(XExplodeStream::m_bFullExplode, TRUE);
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
long lCount=ss.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ss[i];
TCHAR szLay[256]=_T("");
ent.GetData(8, szLay);
XDbObject obj(ent, AcDb::kForRead);
if(!obj) continue;
if(nExplMode) {
AcDbVoidPtrArray entSet0;
((AcDbEntity *)obj.m_pObject)->explode(entSet0);
TMasterProperties prop;
prop.SetFrom((AcDbEntity *)obj.m_pObject);
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);
XDbBlockTableRec rec(TchExport::IsPaperSpace()? ACDB_PAPER_SPACE : ACDB_MODEL_SPACE, AcDb::kForWrite);
if(!!rec)
AddToBlockTableRecord(*pMesh, prop, szLayer, rec.m_pBlockTableRec);
delete pMesh;
ReleaseEntSet(entSet);
} else {
for(int n=0; n<nLen; n++) {
AcDbEntity *pEnt=(AcDbEntity *)entSet[n];
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
}
int nLen=entSet0.length();
for(int n=0; n<nLen; n++) {
AcDbEntity *pEnt=(AcDbEntity *)entSet0[n];
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
} else {
AcDbVoidPtrArray entitySet;
((AcDbEntity *)obj.m_pObject)->explode(entitySet);
int nCount=entitySet.length();
for(int j=0; j<nCount; j++)
{
AcDbEntity *pEnt=(AcDbEntity *)entitySet[j];
//modify by xlc on 100708 解决09以上平台分解对象后对齐标注和角度标注不显示的问题
if (TchGeLib::g_nAcadVer > 17.1
&& (pEnt->isKindOf(AcDbAlignedDimension::desc())
||pEnt->isKindOf(AcDb3PointAngularDimension::desc())))
{
AddToCurrentSpace(pEnt, Adesk::kFalse);
pEnt->transformBy(AcGeMatrix3d::kIdentity);
pEnt->draw();
pEnt->recordGraphicsModified();
pEnt->close();
}
else
{
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
}
}
ss.Erase();
ads_redraw(NULL, 1);
}
// 取多个文件
BOOL GetDwgFilesDia(XStringList &lstFiles, CWnd *pParent, const TCHAR *pszDir,
const TCHAR *pszTitle)
{
const TCHAR *pszFilter = _T("DWG Files (*.dwg)|*.dwg||");
// sg modify 111115,根据9.0需求,支持修改对话框大小
//CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY, pszFilter, pParent);
CFileDialog dlg(TRUE, _T("DWG"), NULL, OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY|OFN_ENABLESIZING, 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 BatchFolderSaveAsOldVer()
{
#if ADS<16
adsout<<_T("\n建议新建空白图执行本命令!其他注意事项请参考帮助文件\n");//add by whl
#endif
XString sFolder;
xg_getvar(_T("DWGPREFIX"), sFolder); // H:\Tangent\TArchDev9.0\Bin\sys18\
// sg add 120307,根据9.0需求,需要对批量转旧命令的对话框也进行一下修改,参考图形导出来做
CTemporaryResourceOverride vTemp;
TBatchSaveAsFileForFolderDlg dlg; // 选择要转化的文件
if (dlg.DoModal() != IDOK)
return;
std::vector<CString> vecSrc(0), vecDesc(0);
dlg.GetSrcFileLst(vecSrc);
dlg.GetDescFileLst(vecDesc);
int Ttype = dlg.GetTangentType();
int nCadVer = dlg.GetCadType();
bool bRelpace = dlg.IsReplace();
int nDrawMode=DocGetDrawMode();
if (Ttype==3)
DocSetDrawMode(DRAW_2D);
if (vecSrc.size() != vecDesc.size()) return;
for (size_t i = 0; i < vecSrc.size(); ++i)
{
AcDbDatabase db(false, true);
#if ADS < 21
Acad::ErrorStatus es=db.readDwgFile(vecSrc[i], _SH_DENYNO, false);
#else
Acad::ErrorStatus es=db.readDwgFile(vecSrc[i], AcDbDatabase::kForReadAndAllShare, false);
#endif
if(es!=Acad::eOk)
continue;
//add by xlc on 070525
AddGroupNameToXData(&db); //组内实体创建扩展数据记录组名
XPushMemVar<AcDbDatabase*> vTemp0(g_pCurrentDb,&db);
#if (ADS == 16)
nCadVer++; // 16平台,无法保存成R14格式
#endif
if(Ttype==10)
{
if(SaveAs(&db, vecDesc[i],10, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑20V2文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑20V2文件失败: ") << LPCTSTR(vecDesc[i]);
}
if(Ttype==9)
{
if(SaveAs(&db, vecDesc[i],9, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑9文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑9文件失败: ") << LPCTSTR(vecDesc[i]);
}
if(Ttype==8)
{
if(SaveAs(&db, vecDesc[i],8, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑8文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑8文件失败: ") << LPCTSTR(vecDesc[i]);
}
else if(Ttype==7)
{
if(SaveAs(&db, vecDesc[i],7, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑7文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑7文件失败: ") << LPCTSTR(vecDesc[i]);
}
else if(Ttype==6)
{
if(SaveAs(&db, vecDesc[i],6, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑6文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑6文件失败: ") << LPCTSTR(vecDesc[i]);
}
else if(Ttype==5)
{
if(SaveAs(&db, vecDesc[i],5, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑5文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑5文件失败: ") << LPCTSTR(vecDesc[i]);
}
else if(Ttype==3)
{
if(SaveAsTArch3(&db, vecDesc[i], nCadVer, false)==RTNORM)
adsout << _T("\n成功的转换上华建筑3文件: ") << LPCTSTR(vecDesc[i]);
else
adsout << _T("\n转换上华建筑3文件失败: ") << LPCTSTR(vecDesc[i]);
}
if (bRelpace)
{
if (::DeleteFile(vecSrc[i]))
_trename(vecDesc[i], vecSrc[i]);
}
}
if(Ttype==3)
DocSetDrawMode(nDrawMode);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 批量另存旧版, 转2D视图入口函数
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void BatchSaveAsOldVer()
{
#if ADS<16
adsout<<_T("\n建议新建空白图执行本命令!其他注意事项请参考帮助文件\n");//add by whl
#endif
XString sFolder;
xg_getvar(_T("DWGPREFIX"), sFolder); // H:\Tangent\TArchDev9.0\Bin\sys18\
// sg add 120307,根据9.0需求,需要对批量转旧命令的对话框也进行一下修改,参考图形导出来做
CTemporaryResourceOverride vTemp;
CTArchBatchSaveAsFileDialog dlg(sFolder, _T("请选择待转换的文件")); // 选择要转化的文件
if (dlg.DoModal() != IDOK)
return;
// if(!GetDwgFilesDia(lstFiles, acedGetAcadFrame(), sFolder, _T("请选择待转换的文件")))
// return;
XStringList lstFiles;
dlg.GetBatchSaveFiles(lstFiles); // 获得选到的文件
XString szFileFolder;
dlg.GetSelFileFolder(szFileFolder);
// if (!GetFolderDia(sFolder, acedGetAcadFrame(), _T("请选择转换后的文件夹"))) // 选择保存位置
if (!GetFolderDia(szFileFolder, acedGetAcadFrame(), _T("请选择转换后的文件夹"))) // 选择保存位置,默认保存与待转化的文件同目录
return;
// static int idx=3;
// adsout << _T("\n请选择输出类型: [TArch7文件(7)/TArch6文件(6)/TArch5文件(5)/TArch3文件(3)]<") << idx << _T(">: ");
// int nRet=RTNORM;
// INITGET_BEG(RSG_NONEG|RSG_NOZERO, _T("7 6 5 3"));
// nRet=ads_getint(_T(""), &idx); // 选择保存类型
// INITGET_END();
// if(nRet!=RTNORM && nRet!=RTNONE)
// return;
// if(idx!=3 && idx!=5 &&idx!=6&&idx!=7)
// return;
//static CString g_sPostFix3=_T("_t3");
//static CString g_sPostFix5=_T("_t5");
//static CString g_sPostFix6=_T("_t6");
//static CString g_sPostFix7=_T("_t7");
//XString sPostFix;
//if(idx==3)
// sPostFix=g_sPostFix3;
//else if(idx==5)
// sPostFix=g_sPostFix5;
//else if(idx==6)
// sPostFix=g_sPostFix6;
//else if(idx==7)
// sPostFix=g_sPostFix7;
// adsout << _T("\n请输入文件名后缀,或按ESC取消自动后缀<")<<sPostFix<<_T(">: ");
//sPostFix=_T("");
//nRet=acedGetString(TRUE,_T(""),sPostFix); // 处理自动增加的后缀问题
//if(nRet!=RTCAN)
//{
// if(sPostFix!=_T(""))
// {
// if(idx==3)
// g_sPostFix3=sPostFix;
// else if(idx==5)
// g_sPostFix5=sPostFix;
// else if(idx==6)
// g_sPostFix6=sPostFix;
// else if(idx==7)
// g_sPostFix7=sPostFix;
// }
// else
// {
// if(idx==3)
// sPostFix=g_sPostFix3;
// else if(idx==5)
// sPostFix=g_sPostFix5;
// else if(idx==6)
// sPostFix=g_sPostFix6;
// else if(idx==7)
// sPostFix=g_sPostFix7;
// }
//}
int idx = dlg.GetSaveVersion(); // 选择的上华版本号
XString sPostFix;
dlg.GetPostFixName(sPostFix); // 后缀名称
if (!XSymbolTable(_T("APPID"), _T("WTHICK")))
VERIFY(ads_regapp(_T("WTHICK"))==RTNORM);
int nDrawMode=DocGetDrawMode();
if (idx==3)
DocSetDrawMode(DRAW_2D);
for (int i=0; i<lstFiles.Length(); i++)
{
AcDbDatabase db(false, true);
#if ADS < 21
Acad::ErrorStatus es=db.readDwgFile(lstFiles[i], _SH_DENYNO, false);
#else
Acad::ErrorStatus es=db.readDwgFile(lstFiles[i], AcDbDatabase::kForReadAndAllShare, false);
#endif
if(es!=Acad::eOk)
continue;
//add by xlc on 070525
AddGroupNameToXData(&db); //组内实体创建扩展数据记录组名
XString sNewFile;
XPathParser parse(lstFiles[i]);
//sNewFile << sFolder << parse.m_sFileName;
sNewFile << szFileFolder << parse.m_sFileName;
XPushMemVar<AcDbDatabase*> vTemp0(g_pCurrentDb,&db);
sNewFile <<sPostFix<< _T(".dwg");
int nCadVer = g_nBatchSaveCadVer + 14;
#if (ADS == 16)
nCadVer++; // 16平台,无法保存成R14格式
#endif
if (idx == 10)
{
if(SaveAs(&db, sNewFile,10, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑t20V2文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑t20V2文件失败: ") << sNewFile;
}
if(idx==9)
{
if(SaveAs(&db, sNewFile,9, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑9文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑9文件失败: ") << sNewFile;
}
else if(idx==8)
{
if(SaveAs(&db, sNewFile,8, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑8文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑8文件失败: ") << sNewFile;
}
else if(idx==7)
{
if(SaveAs(&db, sNewFile,7, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑7文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑7文件失败: ") << sNewFile;
}
else if(idx==6)
{
if(SaveAs(&db, sNewFile,6, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑6文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑6文件失败: ") << sNewFile;
}
else if(idx==5)
{
if(SaveAs(&db, sNewFile,5, nCadVer)==RTNORM)
adsout << _T("\n成功的转换上华建筑5文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑5文件失败: ") << sNewFile;
}
else if(idx==3)
{
if(SaveAsTArch3(&db, sNewFile, nCadVer, false)==RTNORM)
adsout << _T("\n成功的转换上华建筑3文件: ") << sNewFile;
else
adsout << _T("\n转换上华建筑3文件失败: ") << sNewFile;
}
}
if(idx==3)
DocSetDrawMode(nDrawMode);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//add by xlc on 070522
//根据扩展数据得到组名
void GetGroupNameFromXData(AcDbObjectId entityId, //[in]实体ID
CString appName, //[in]扩展数据名称
CString &groupName //[out]组名
)
{
groupName = _T("");
AcDbObject* pObj = NULL;
Acad::ErrorStatus retStat;
if ((retStat = acdbOpenObject(pObj, entityId, AcDb::kForWrite))
!= Acad::eOk)
{
return;
}
struct resbuf *pRb = NULL;
pRb = pObj->xData(appName);
if (pRb != NULL)
{
groupName=pRb->rbnext->resval.rstring;
acutRelRb(pRb);
}
pObj->close();
}
//add by xlc on 070522
//向数据库pDb的groupName组中添加实体obj
void AddToGroup(AcDbDatabase *pDb, //[in]目标数据库
CString groupName, //[in]组名
AcDbObjectId obj //[in]添加对象ID
)
{
AcDbDictionary *pGroupDict = NULL; //组字典
pDb->getGroupDictionary(pGroupDict, AcDb::kForRead);
AcDbObjectId groupId; //组ID
pGroupDict->getAt(groupName, groupId);
AcDbObjectPointer <AcDbGroup> pGroup(groupId, AcDb::kForWrite);
Acad::ErrorStatus es = pGroup.openStatus();
if( es != Acad::eOk)
{
pGroupDict->close();
return ;
}
pGroup->append(obj);
pGroup->close();
pGroupDict->close();
return ;
}
//add by xlc on 070524
//添加扩展数据
void AddXdata(AcDbObjectId eId, //[in]对象ID
CString appName, //[in]扩展数据名称
CString resString //[in]添加扩展数据内容
)
{
AcDbObject* pObj = NULL;
Acad::ErrorStatus retStat;
if ((retStat = acdbOpenObject(pObj, eId, AcDb::kForRead)) != Acad::eOk)
{
return;
}
struct resbuf *pRb = NULL, *pTemp = NULL;
pRb = pObj->xData(appName);
if (pRb != NULL)//存在扩展数据,指向数据末尾
{
for (pTemp = pRb; pTemp->rbnext != NULL;
pTemp = pTemp->rbnext)
{ ; }
}
else//不存在扩展数据,创建
{
//modify by xlc on 120502 acdbRegApp函数只能用在当前数据库,
// 解决批量转旧中带局部隐藏时导出对象显示错误的问题
//acdbRegApp(appName);
AcDbDatabase *pDb = pObj->database();
if (pDb != acdbCurDwg())
{
AcDbRegAppTable* pRegAppTbl = NULL;
Acad::ErrorStatus es = pDb->getSymbolTable(pRegAppTbl, AcDb::kForRead);
if (es == Acad::eOk)
{
if (pRegAppTbl->has(appName) == false)
{
es = pRegAppTbl->upgradeOpen();
if (es == Acad::eOk)
{
AcDbRegAppTableRecord* pNewRec = new AcDbRegAppTableRecord;
es = pNewRec->setName(appName);
if (es == Acad::eOk)
{
es = pRegAppTbl->add(pNewRec);
if (es == Acad::eOk)
{
pNewRec->close();
}
else
{
delete pNewRec;
}
}
else
{
delete pNewRec;
}
}
}
pRegAppTbl->close();
}
}
else
{
acdbRegApp(appName);
}
pRb = acutNewRb(AcDb::kDxfRegAppName);
pTemp = pRb;
pTemp->resval.rstring
= (TCHAR*) malloc((_tcslen(appName) + 1) * sizeof(TCHAR));
_tcscpy(pTemp->resval.rstring, appName);
}
//添加数据
pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString);
pTemp = pTemp->rbnext;
pTemp->resval.rstring
= (TCHAR*) malloc((_tcslen(resString) + 1) * sizeof(TCHAR));
_tcscpy(pTemp->resval.rstring, resString);
if(pObj->upgradeOpen()==Acad::eOk)
pObj->setXData(pRb);
pObj->close();
acutRelRb(pRb);
}
//add by xlc on 070524
//删除扩展数据
void DelXdata(AcDbObjectId eId, //[in]对象ID
CString appName //[in]扩展数据名称
)
{
AcDbObject* pObj = NULL;
Acad::ErrorStatus retStat;
if ((retStat = acdbOpenObject(pObj, eId, AcDb::kForRead))
!= Acad::eOk)
{
return;
}
struct resbuf *xdata = NULL;
while ((xdata = pObj->xData(appName)) != NULL)
{
resbuf *xdata_next = xdata->rbnext;
xdata->rbnext = NULL;
pObj->upgradeOpen();
pObj->setXData(xdata);
xdata->rbnext = xdata_next;
acutRelRb(xdata);
}
pObj->close();
}
//设置数据库隐藏组内上华对象不可见
//add by xlc on 070524
void HideTchObject(AcDbDatabase *pDb //[in]操作数据库
)
{
AcDbDictionary *pGroupDict = NULL;//组字典
if( pDb->getGroupDictionary(pGroupDict, AcDb::kForRead) != Acad::eOk )
return;
AcDbObjectId groupId;//组ID
pGroupDict->getAt(_T("_TCH_HIDE_GROUP"), groupId);
AcDbObjectPointer <AcDbGroup> pGroup(groupId, AcDb::kForWrite);
Acad::ErrorStatus es = pGroup.openStatus();
if( es != Acad::eOk)
{
pGroupDict->close();
return ;
}
AcDbGroupIterator *pGroupIter = pGroup->newIterator();
for (; !pGroupIter->done(); pGroupIter->next())
{
//设置组内对象不可见
AcDbObjectId id=pGroupIter->objectId();
OPENOBJ_BEGIN(id, AcDb::kForWrite, AcDbEntity, pEnt);
if(pEnt)
{
pEnt->setVisibility(AcDb::kInvisible);
}
OPENOBJ_END();
}
pGroup->close();
pGroupDict->close();
}
//组内实体创建扩展数据记录组名
//add by xlc on 070524
void AddGroupNameToXData(AcDbDatabase *pDb //[in]操作数据库
)
{
AcDbDictionary *pGroupDictOld = NULL;
if ( pDb->getGroupDictionary(pGroupDictOld, AcDb::kForRead) == Acad::eOk)
{
AcDbDictionaryIterator *pIter = pGroupDictOld->newIterator();
pGroupDictOld->close();
for (; !pIter->done(); pIter->next())
{
AcDbObjectId groupId = pIter->objectId();
if (groupId != NULL)
{
AcDbGroup *pGroup = NULL;
if(acdbOpenObject(pGroup, groupId, AcDb::kForWrite) != Acad::eOk)
{
continue;
}
CString strGroup=pGroup->name();
if(strGroup.IsEmpty())
{
pGroup->close();
continue;
}
AcDbGroupIterator *pGroupIter = pGroup->newIterator();
for (; !pGroupIter->done(); pGroupIter->next())
{
AcDbObjectId id=pGroupIter->objectId();
AddXdata(id,_T("TCH_GROUP"),strGroup) ; //添加扩展数据
}
delete pGroupIter;
pGroup->close();
}
}
delete pIter;
}
}
//删除组内实体扩展数据
//add by xlc on 070524
void DelXDataFromGroup(AcDbDatabase *pDb //[in]操作数据库
)
{
AcDbDictionary *pGroupDictOld = NULL;
if( pDb->getGroupDictionary(pGroupDictOld, AcDb::kForRead) == Acad::eOk )
{
AcDbDictionaryIterator *pIter = pGroupDictOld->newIterator();
pGroupDictOld->close();
if(pIter == NULL)
return;
for(; !pIter->done(); pIter->next())
{
AcDbObjectId groupId = pIter->objectId();
if (groupId != NULL)
{
AcDbGroup *pGroup = NULL;
if(acdbOpenObject(pGroup, groupId, AcDb::kForWrite) != Acad::eOk)
continue;
AcDbGroupIterator *pGroupIter = pGroup->newIterator();
for (; !pGroupIter->done(); pGroupIter->next())
{
AcDbObjectId id=pGroupIter->objectId();
DelXdata(id,_T("TCH_GROUP")); //删除扩展数据
}
delete pGroupIter;
pGroup->close();
}
}
delete pIter;
}
}
// sg add 120502,判断一个对象是否在_TCH_HIDE_GROUP组内
bool IsTchHideGroupObj(AcDbObjectId objId, AcDbObjectId &groupId)
{
AcDbEntity *pEnt;
if (Acad::eOk != acdbOpenObject(pEnt, objId, AcDb::kForRead))
return false;
const AcDbVoidPtrArray *pReactors = NULL;
pReactors = pEnt->reactors();
if (pReactors == NULL)
{
pEnt->close();
return false;
}
pEnt->close();
void *pSomething;
int nLength = pReactors->length();
for (int i=0; i<nLength; i++)
{
pSomething = (AcDbObject*) pReactors->at(i);
if (acdbIsPersistentReactor(pSomething))
{
AcDbObjectId persObjId = acdbPersistentReactorObjectId(pSomething);
AcDbObject *pReactor;
if (Acad::eOk != acdbOpenObject(pReactor, persObjId, AcDb::kForRead))
continue;
if (!pReactor->isKindOf(AcDbGroup::desc()))
{
pReactor->close();
continue;
}
AcDbGroup *pGroup = AcDbGroup::cast(pReactor);
if (pGroup == NULL)
{
pReactor->close();
continue;
}
#if (ADS > 15)
TCHAR *pName = NULL;
pGroup->getName(pName); // 15平台没有此函数
if (_tcscmp(pName, _T("_TCH_HIDE_GROUP")) == 0)
{
delete []pName;
pGroup->close();
groupId = persObjId;
return true;
}
delete []pName;
#else
CString csName = pGroup->name(); // 高版本推荐不使用此函数
if (_tcscmp(csName, _T("_TCH_HIDE_GROUP")) == 0)
{
pGroup->close();
groupId = persObjId;
return true;
}
#endif
pGroup->close();
}
}
return false;
}
//add by xlc on 070713
//modified by whl on 090330,提高稳定性
void EraseWrongHatchEnt(AcDbDatabase *pDb //[in]操作数据库
)
{
int count=0;
AcDbBlockTable *pBlkTbl;
pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);
if(pBlkTbl!=NULL)
{
AcDbBlockTableRecord *pBlkTblRcd=NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForRead);
pBlkTbl->close();
if(pBlkTblRcd!=NULL)
{
AcDbBlockTableRecordIterator *pBlkTblRcdItr=NULL;
pBlkTblRcd->newIterator(pBlkTblRcdItr);
pBlkTblRcd->close();
if(pBlkTblRcdItr!=NULL)
{
for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done();pBlkTblRcdItr->step())
{
AcDbEntity *pEnt=NULL;
pBlkTblRcdItr->getEntity(pEnt,AcDb::kForRead);
if(pEnt!=NULL)
{
AcDbHatch *pHatch=AcDbHatch::cast(pEnt);
if(pHatch!=NULL)
{
BOOL bErase = FALSE;
#if ADS>16
double area = 0.0;
if(pHatch->getArea(area) != Acad::eOk)
bErase = TRUE;
else if(area < 1.0e-6)
bErase = TRUE;
#endif
if(bErase)
{
pEnt->upgradeOpen();
pEnt->erase(Adesk::kTrue);
count++;
}
}
pEnt->close();
}
}
delete pBlkTblRcdItr;
}
}
}
if(count>0)
adsout<<_T("\n删除了")<<count<<_T("个不能用的hatch对象!");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
UINT DibColorCount (void *pv)
{
int bits ;
LPBITMAPINFOHEADER lpbi =((LPBITMAPINFOHEADER)pv) ;
LPBITMAPCOREHEADER lpbc =((LPBITMAPCOREHEADER)pv) ;
if ( lpbi->biSize != sizeof (BITMAPCOREHEADER) )
{
if ( lpbi->biClrUsed != 0 )
return ((WORD)lpbi->biClrUsed) ;
bits =lpbi->biBitCount ;
}
else
{
bits =lpbc->bcBitCount ;
}
switch ( bits )
{
case 1:
return (2) ;
case 4:
return (16) ;
case 8:
return (256) ;
default:
return (0) ;
}
}
BOOL DibInfo (HANDLE hbi, LPBITMAPINFOHEADER lpbi)
{
if ( hbi ) {
*lpbi =*(LPBITMAPINFOHEADER)GlobalLock (hbi) ;
if ( lpbi->biSize != sizeof (BITMAPCOREHEADER) )
{
if ( lpbi->biSizeImage == 0L )
lpbi->biSizeImage =WIDTHBYTES(lpbi->biWidth*lpbi->biBitCount) * lpbi->biHeight ;
if ( lpbi->biClrUsed == 0L )
lpbi->biClrUsed =DibColorCount (lpbi) ;
}
GlobalUnlock (hbi) ;
return (TRUE) ;
}
return (FALSE) ;
}
void GetBitmapFromDib (HANDLE hDib, char *&pBmp)
{
BITMAPINFO bmInfo ;
pBmp =NULL ;
if ( hDib == NULL )
return ;
if ( DibInfo(hDib, &(bmInfo.bmiHeader)) == FALSE )
return ;
RGBQUAD *pRgb =(RGBQUAD *)((LPSTR)(&bmInfo.bmiHeader) + (WORD)bmInfo.bmiHeader.biSize) ;
bmInfo.bmiColors [0] =*pRgb ;
Adesk::UInt32 numberBmiColors =
bmInfo.bmiHeader.biBitCount > 8
? 0
: bmInfo.bmiHeader.biClrUsed
? bmInfo.bmiHeader.biClrUsed
: 1 << bmInfo.bmiHeader.biBitCount ;
int xSize =bmInfo.bmiHeader.biWidth ;
int ySize =bmInfo.bmiHeader.biHeight;
Adesk::UInt32 lenBmp =40
+ (numberBmiColors * sizeof (RGBQUAD))
+ (bmInfo.bmiHeader.biSizeImage
? bmInfo.bmiHeader.biSizeImage
: ((xSize + 3) & ~3) * ySize) ;
pBmp =new char [lenBmp] ;
if ( !pBmp )
return ;
BITMAPINFOHEADER FAR *lpbi =(LPBITMAPINFOHEADER)GlobalLock (hDib) ;
memcpy (pBmp, lpbi, lenBmp) ;
GlobalUnlock (hDib) ;
}
HANDLE DDBToDIB (CBitmap &bitmap, DWORD dwCompression, CPalette *pPal)
{
BITMAP bm ;
BITMAPINFOHEADER bi ;
LPBITMAPINFOHEADER lpbi ;
DWORD dwLen ;
HANDLE hDIB ;
HANDLE handle ;
HDC hDC ;
HPALETTE hPal ;
ASSERT ( bitmap.GetSafeHandle () ) ;
//----- The function has no arg for bitfields
if ( dwCompression == BI_BITFIELDS )
return (NULL) ;
//----- If a palette has not been supplied use defaul palette
hPal =(HPALETTE)pPal->GetSafeHandle () ;
if ( hPal == NULL )
hPal =(HPALETTE)GetStockObject (DEFAULT_PALETTE) ;
//----- Get bitmap information
bitmap.GetObject (sizeof (bm), (LPSTR)&bm) ;
//----- Initialize the bitmapinfoheader
bi.biSize =sizeof (BITMAPINFOHEADER) ;
bi.biWidth =bm.bmWidth ;
bi.biHeight =bm.bmHeight ;
bi.biPlanes =1 ;
bi.biBitCount =8 ; //----- bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression =dwCompression ;
bi.biSizeImage =0 ;
bi.biXPelsPerMeter =0 ;
bi.biYPelsPerMeter =0 ;
bi.biClrUsed =0 ;
bi.biClrImportant =0 ;
//----- Compute the size of the infoheader and the color table
int nColors =(1 << bi.biBitCount) ;
if ( nColors > 256 )
nColors = 0;
dwLen =bi.biSize + nColors * sizeof (RGBQUAD) ;
//----- We need a device context to get the DIB from
hDC =::GetDC (NULL) ;
hPal =::SelectPalette (hDC, hPal, FALSE) ;
::RealizePalette (hDC) ;
//----- Allocate enough memory to hold bitmapinfoheader and color table
hDIB =::GlobalAlloc (GMEM_FIXED, dwLen) ;
if ( !hDIB )
{
::SelectPalette (hDC, hPal, FALSE) ;
::ReleaseDC (NULL, hDC) ;
return (NULL) ;
}
lpbi =(LPBITMAPINFOHEADER)hDIB ;
*lpbi =bi ;
//----- Call GetDIBits with a NULL lpBits param, so the device driver
//----- will calculate the biSizeImage field
GetDIBits (
hDC, (HBITMAP)bitmap.GetSafeHandle (), 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS
) ;
bi =*lpbi ;
//----- If the driver did not fill in the biSizeImage field, then compute it
//----- Each scan line of the image is aligned on a DWORD (32bit) boundary
if ( bi.biSizeImage == 0 )
{
bi.biSizeImage =((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight ;
//----- If a compression scheme is used the result may infact be larger
//----- Increase the size to account for this.
if ( dwCompression != BI_RGB )
bi.biSizeImage =(bi.biSizeImage * 3) / 2 ;
}
//----- Realloc the buffer so that it can hold all the bits
dwLen +=bi.biSizeImage ;
if ( handle =::GlobalReAlloc (hDIB, dwLen, GMEM_MOVEABLE) )
{
hDIB =handle ;
}
else
{
::GlobalFree (hDIB) ;
//----- Reselect the original palette
::SelectPalette (hDC, hPal, FALSE) ;
::ReleaseDC (NULL, hDC);
return (NULL) ;
}
//----- Get the bitmap bits
lpbi =(LPBITMAPINFOHEADER)hDIB ;
//----- FINALLY get the DIB
BOOL bGotBits =GetDIBits (
hDC, (HBITMAP)bitmap.GetSafeHandle (),
0L, //----- Start scan line
(DWORD)bi.biHeight, //----- # of scan lines
(LPBYTE)lpbi //----- address for bitmap bits
+ (bi.biSize + nColors * sizeof (RGBQUAD)),
(LPBITMAPINFO)lpbi, //----- address of bitmapinfo
(DWORD)DIB_RGB_COLORS
) ; //----- Use RGB for color table
if ( !bGotBits )
{
::GlobalFree (hDIB) ;
::SelectPalette (hDC, hPal, FALSE) ;
::ReleaseDC (NULL, hDC);
return (NULL) ;
}
::SelectPalette (hDC, hPal, FALSE) ;
::ReleaseDC (NULL, hDC);
return (hDIB) ;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//得到dwg版本
static int GetDwgVersion(const CString &sDwgFile)
{
int ret = 0;
FILE *fp=_tfopen(sDwgFile, _T("r+b"));
if(fp)
{
char szHead[7];
if(fread(szHead, 1, 7, fp)==7)
{
szHead[6]=EOS;
if(strcmp(szHead, "AC1014")==0)
ret = 14;
else if(strcmp(szHead, "AC1015")==0)
ret = 15;
else if(strcmp(szHead, "AC1018")==0)
ret = 16;
else if(strcmp(szHead, "AC1021")==0)
ret = 17;
else if(strcmp(szHead, "AC1024")==0)
ret = 18;
else if(strcmp(szHead, "AC1027")==0)
ret = 19;
}
fclose(fp);
}
return ret;
}
// 保存DWG文件,从另一个dwg继承预览图标
#if ADS >= 21
#include "acdbimageutils.h"
#endif
Acad::ErrorStatus SaveDwgFile(AcDbDatabase *pDb, LPCTSTR lpFilePath, LPCTSTR lpFilePath1, int nVer)
{
HBITMAP hBitmap;
HPALETTE hPal;
acdbGetPreviewBitmapFromDwg(lpFilePath, &hBitmap, &hPal);
CBitmap bm;
bm.Attach(hBitmap);
HANDLE hDib = DDBToDIB (bm, BI_RGB, NULL) ;
bm.DeleteObject();
DeleteObject(hBitmap);
DeleteObject(hPal);
char *pBmp =NULL ;
GetBitmapFromDib(hDib, pBmp);
pDb->setThumbnailBitmap((void *)pBmp) ;
delete pBmp ;
GlobalUnlock (hDib) ;
GlobalFree (hDib) ;
#if (ADS == 15)
if (nVer == 14)
return acdbSaveAsR14(pDb,lpFilePath1);
else
return pDb->saveAs(lpFilePath1);
#endif
#if (ADS == 16)
if (nVer == 15)
return acdbSaveAs2000(pDb,lpFilePath1);
else
return pDb->saveAs(lpFilePath1);
#endif
#if (ADS == 17)
switch(nVer)
{
case 14:
return acdbSaveAsR14(pDb,lpFilePath1);
case 15:
return acdbSaveAs2000(pDb,lpFilePath1);
case 16:
return acdbSaveAs2004(pDb,lpFilePath1);
default:
return pDb->saveAs(lpFilePath1);
}
#endif
#if (ADS == 18)
switch(nVer)
{
case 14:
return acdbSaveAsR14(pDb,lpFilePath1);
case 15:
return acdbSaveAs2000(pDb,lpFilePath1);
case 16:
return acdbSaveAs2004(pDb,lpFilePath1);
default:
return pDb->saveAs(lpFilePath1);
}
#endif
#if (ADS >= 19)
switch(nVer)
{
case 14:
return acdbSaveAsR14(pDb,lpFilePath1);
case 15:
return acdbSaveAs2000(pDb,lpFilePath1);
case 16:
return acdbSaveAs2004(pDb,lpFilePath1);
default:
return pDb->saveAs(lpFilePath1);
}
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// sg add 120307,增加一个局部导出的功能
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
namespace
{
bool DoPartSaveAsOldVer(AcDbEntity *pEntity, AcDbVoidPtrArray &entSetNew, int nSaveVer)
{
BOOL bErase = FALSE;
int nDrawMode = IsExplode3D();
if (nDrawMode == 1)
nDrawMode = DRAW_3D;
else
nDrawMode = DRAW_2D;
AcDbObjectId idPubWall = InitLayer(LAY_THICK_LINE, acdbCurDwg());
if (pEntity->isKindOf(TDbEntity::desc()) ||
pEntity->isKindOf(TDbCurveEntity::desc())) // 上华对象,派生自TEntityBase
{
if (nSaveVer == 3) // 导出T3
{
XPushMemVar<AcDbObjectId> vTempWall(g_idPubWall, idPubWall);
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
XPushMemVar<BOOL> vTemp2(XExplodeStream::m_bFullExplode, TRUE);
pEntity->explode(entSetNew);
pEntity->close();
}
else if (pEntity->isWriteEnabled()) // 导出T5、6、7、8、9
{
XPushMemVar<int> vSave(g_nSaveTArchVer, nSaveVer);
if (pEntity->isKindOf(TDbEntity::desc()))
{
TDbEntity *oldEnt = TDbEntity::cast(pEntity);
oldEnt->DownGradeSave(nDrawMode, entSetNew, &bErase);
}
else
{
TDbCurveEntity *oldEnt = TDbCurveEntity::cast(pEntity);
oldEnt->DownGradeSave(nDrawMode, entSetNew, &bErase);
}
}
}
else if (pEntity->isKindOf(TDbBlockInsert::desc()) || // 上华对象,派生自AcDbEntity
pEntity->isKindOf(CWireDim::desc()) || pEntity->isKindOf(CLampDim::desc()))
{
if (nSaveVer == 3) // 导出T3
{
XPushMemVar<BOOL> vTemp1(XExplodeStream::m_bExportTch4, TRUE);
XPushMemVar<BOOL> vTemp2(XExplodeStream::m_bFullExplode, TRUE);
pEntity->explode(entSetNew);
pEntity->close();
}
}
else // CAD对象
{
// 处理对象导出T3
if (_tcsicmp(pEntity->isA()->dxfName(), _T("3DSOLID"))==0 && nSaveVer==3 && pEntity->upgradeOpen()==Acad::eOk)
{
RemoveTchSolidData(pEntity);
return false;
}
}
return true;
}
void DeleteTableRecord(AcDbBlockReference *pTblRef)
{
AcDbObjectId idBlock = pTblRef->blockTableRecord();
OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord, pRecord);
{
if (!pRecord)
return;
if (pRecord->isFromExternalReference())
return;
AcDbBlockTableRecordIterator *pIter = NULL;
pRecord->newIterator(pIter);
for (pIter->start();!pIter->done();pIter->step())
{
AcDbEntity *pEnt = NULL;
pIter->getEntity(pEnt, AcDb::kForWrite);
if (!pEnt)
continue;
if (pEnt->isKindOf(AcDbBlockReference::desc()))
DeleteTableRecord((AcDbBlockReference*)pEnt);
else
{
if (pEnt->isKindOf(TDbEntity::desc()) ||
pEnt->isKindOf(TDbCurveEntity::desc()) ||
// pEnt->isKindOf(TDbBlockInsert::desc()) ||
pEnt->isKindOf(CWireDim::desc()) ||
pEnt->isKindOf(CLampDim::desc()))
pEnt->erase();
}
pEnt->close();
}
delete pIter;
}
OPENOBJ_END();
}
void AnalyTableRecord(AcDbBlockReference *pTblRef, AcDbVoidPtrArray &entSetNew, int nSaveVer)
{
AcDbObjectId idBlock = pTblRef->blockTableRecord();
#if (ADS < 17)
entSetNew.removeSubArray(0, entSetNew.length()-1);
#else
entSetNew.removeAll();
#endif
OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord, pRecord);
{
if (!pRecord)
return;
if (pRecord->isFromExternalReference())
return;
AcDbBlockTableRecordIterator *pIter = NULL;
pRecord->newIterator(pIter);
for (pIter->start();!pIter->done();pIter->step())
{
AcDbEntity *pEnt = NULL;
pIter->getEntity(pEnt, AcDb::kForWrite);
if (!pEnt)
continue;
if (pEnt->isKindOf(AcDbBlockReference::desc()))
AnalyTableRecord((AcDbBlockReference*)pEnt, entSetNew, nSaveVer);
else
{
bool bTch = DoPartSaveAsOldVer(pEnt, entSetNew, nSaveVer);
for (int i = 0; i < entSetNew.length(); ++i)
{
if (!bTch)
continue;
pRecord->appendAcDbEntity((AcDbEntity*)entSetNew[i]);
((AcDbEntity*)entSetNew[i])->close();
}
}
pEnt->close();
}
delete pIter;
}
OPENOBJ_END();
}
}
void PartSaveAsOldVerCmd()
{
PickSet ssSelect(SS_FREE); // 框选到的所有对象,上华+CAD
{
if (SelectEntities(_T("请选择要导出的对象<退出>: "), ssSelect, RBList()) != RTNORM)
return;
}
//#define HIGHEST_VER 11
#define HIGHEST_VER 12 //change by jsx on 160622
static int nIdx = 8; // 下次升级加1
XString sFileDefault; // 默认文件完整路径
{
xg_getvar(_T("DWGPREFIX"), sFileDefault); // H:\Tangent\TArchDev9.0\Bin\sys18\
TCHAR szDwgName[250]=_T("");
AT_GetCurDwg(szDwgName); // 当前图纸名称
int nTgVer = HIGHEST_VER - nIdx; // 建筑最高导出到T9格式,后续升级,只要每次在10的基础上加1即可
if (nTgVer == 4) // 没有T4的版本,T5后,直接就是T3
nTgVer--;
//再增加版本,需要特殊处理,目前20V3版本是11
if (nTgVer == 10)
sFileDefault << szDwgName << XString(_T("_t20V2.dwg")); // 根据保存的TG版本,获得默认的后缀名称
else if (nTgVer == 11)
sFileDefault << szDwgName << XString(_T("_t20V3.dwg")); // 根据保存的TG版本,获得默认的后缀名称
else
sFileDefault << szDwgName << XString(_T("_t%d.dwg"), nTgVer); // 根据保存的TG版本,获得默认的后缀名称
}
CTemporaryResourceOverride vTemp;
CTArchFileDialog dlg(sFileDefault, nIdx); // 对话框
if (dlg.DoModal() != IDOK)
return;
int nSaveVer = 3;
XString sFileName; // 文件的完整路径和名称
{
nSaveVer = dlg.GetSaveVersion();
sFileName = (const TCHAR *)dlg.GetPathName(); // 获得保存文件的完整路径和名称
nIdx = HIGHEST_VER - nSaveVer;
if (nSaveVer == 3)
nIdx--;
}
{
if (!XSymbolTable(_T("APPID"), _T("WTHICK")))
VERIFY(ads_regapp(_T("WTHICK")) == RTNORM);
if (g_nFilterType==2 || g_nFilterType==3) // 结构基础条件图或结构平面条件图,创建梁图层
InitLayer(LAY_BEAM);
AcDbLayerTable *pLayertable = NULL;
acdbCurDwg()->getLayerTable(pLayertable, AcDb::kForRead);
if (pLayertable != NULL)
{
AcDbObjectId idExtDict = pLayertable->extensionDictionary();
AcDbDictionary *pDict = NULL;
acdbOpenObject(pDict, idExtDict, AcDb::kForRead);
if (pDict != NULL)
{
AcDbObject *pObj = NULL;
pDict->getAt(_T("ACAD_LAYERFILTERS"),pObj,AcDb::kForWrite);
if (pObj != NULL)
{
AcDbDictionary *pFilters = AcDbDictionary::cast(pObj);
if (pFilters!=NULL && pFilters->numEntries()>200)
{
adsout<<_T("图层过滤器过多!已删除。");
pObj->erase();
}
pObj->close();
}
pDict->close();
}
pLayertable->close();
}
}
BOOL bIsWcs = IsWCS();
{
if (!bIsWcs) // 模型空间,UCS
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T(""), RTNONE);
}
}
AcDbDatabase *pDb = NULL;
{
AcDbObjectIdArray idAllArray;
// ssNewEntity.AsIdArray(idAllArray);
// ssOldEntity.AsIdArray(idAllArray);
ssSelect.AsIdArray(idAllArray);
acdbCurDwg()->wblock(pDb, idAllArray, AcGePoint3d::kOrigin);
}
#if ADS==17//wlw15818,解决2008,2009平台轴号导出丢失问题
AcDbObjectId idAxisBlk = InitBlock(_T("_AXISO"));
if (idAxisBlk.isValid())
{
AcDbObjectIdArray ids;
ids.append(idAxisBlk);
acdbCurDwg()->wblock(pDb,ids,AcGePoint3d::kOrigin,AcDb::kDrcIgnore);
}
#endif
{
if (!bIsWcs) // UCS
{
SHads_command(RTSTR, _T("UCS"), RTSTR, _T("P"), RTNONE);
}
CSaveFilter::PreSave(pDb);
}
{
acedVports2VportTableRecords();
DList<TViewportTableData> lstData; // 获得当前视口信息
AcDbViewportTable *pVpCurTable = NULL;
if (acdbCurDwg()->getViewportTable(pVpCurTable, AcDb::kForRead)==Acad::eOk && pVpCurTable!=NULL)
{
AcDbViewportTableIterator *pVPIter = NULL;
pVpCurTable->newIterator(pVPIter);
pVpCurTable->close();
if (pVPIter != NULL)
{
for (pVPIter->start(); !pVPIter->done(); pVPIter->step())
{
AcDbViewportTableRecord *pRecord = NULL;
if (pVPIter->getRecord(pRecord, AcDb::kForRead)==Acad::eOk && pRecord!=NULL)
{
TViewportTableData data;
data.m_ptCen.x = pRecord->centerPoint().x;
data.m_ptCen.y = pRecord->centerPoint().y;
pRecord->getUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
lstData.Append(new TViewportTableData(data.m_ptCen, data.m_ptOrg, data.m_vtX, data.m_vtY));
pRecord->close();
}
}
delete pVPIter;
}
}
AcDbViewportTable *pVpNewTable = NULL;
if (pDb->getViewportTable(pVpNewTable, AcDb::kForRead)==Acad::eOk && pVpNewTable!=NULL)
{
AcDbViewportTableIterator *pVPNewIter = NULL;
pVpNewTable->newIterator(pVPNewIter);
pVpNewTable->close();
if (pVPNewIter != NULL)
{
for (pVPNewIter->start(); !pVPNewIter->done(); pVPNewIter->step())
{
AcDbViewportTableRecord *pRecord = NULL;
if (pVPNewIter->getRecord(pRecord, AcDb::kForWrite)==Acad::eOk && pRecord!=NULL)
{
AcGePoint2d ptCen = pRecord->centerPoint();
int nVtNums = lstData.Length();
for (int nN=0; nN<nVtNums; nN++)
{
TViewportTableData data = *lstData[nN];
AcGePoint2d ptCurCen(data.m_ptCen.x, data.m_ptCen.y);
if (ptCurCen.distanceTo(ptCen) < _DIST_SNAP)
{
pRecord->setUcs(data.m_ptOrg, data.m_vtX, data.m_vtY);
}
}
pRecord->close();
}
}
delete pVPNewIter;
}
}
}
{
if (nSaveVer != 3)
{
AcDbDictionary *pDict1 = NULL;
pDb->getNamedObjectsDictionary(pDict1, AcDb::kForWrite);
TDbConfig *p0 = GetDwgGlobal(AcDb::kForRead);
if (p0!=NULL && pDict1!=NULL)
{
TDbConfig *p1 = TDbConfig::cast(p0->clone());
if (p1 != NULL)
{
p1->SetHatchDividerId(AcDbObjectId::kNull);
p1->SetHatchFillId(AcDbObjectId::kNull);
p1->SetHatchFill1Id(AcDbObjectId::kNull);
p1->SetHatchFill2Id(AcDbObjectId::kNull);
if (p0->IsDividerLineHatch())
{
p1->SetHatchDividerId(WblockCloneObjects(p0->GetHatchDividerId(),pDb));
}
if (p0->IsFillLineHatch())
{
p1->SetHatchFillId(WblockCloneObjects(p0->GetHatchFillId(),pDb));
}
if (p0->IsFill1LineHatch())
{
p1->SetHatchFill1Id(WblockCloneObjects(p0->GetHatchFill1Id(),pDb));
}
if (p0->IsFill2LineHatch())
{
p1->SetHatchFill2Id(WblockCloneObjects(p0->GetHatchFill2Id(),pDb));
}
p1->SetHatchBrickId(AcDbObjectId::kNull);
p1->SetHatchRocketId(AcDbObjectId::kNull);
p1->SetHatchConcreteId(AcDbObjectId::kNull);
p1->SetHatchSteelId(AcDbObjectId::kNull);
p1->SetLinetypeDote(GetLinetypeIdFromString(_T("DOTE"),pDb));
p1->SetLinetypeDash(GetLinetypeIdFromString(_T("DASH"),pDb));
double dText2BaseRatio = p0->GetText2BaseRatio();
dText2BaseRatio /= 0.286;
p1->SetText2Base(dText2BaseRatio);
AcDbObjectId id;
if (pDict1->setAt(_T("ATS_DBCONFIG"), p1, id) == Acad::eOk)
p1->close();
else
delete p1;
}
}
AcDbDictionary *pDict2 = NULL;
acdbCurDwg()->getNamedObjectsDictionary(pDict2, AcDb::kForRead);
if (pDict2!=NULL && pDict1!=NULL)
{
AcDbObjectId objId;
if (pDict2->getAt (_T("TCH_DBPSCONFIG"),objId) == Acad::eOk)
{
AcDbObject *pObj = NULL;
if (acdbOpenObject(pObj, objId, AcDb::kForRead) == Acad::eOk)
{
if (pObj != NULL)
{
AcDbObject *p2 = AcDbObject::cast(pObj->clone());
if (p2 != NULL)
{
AcDbObjectId id;
if (pDict1->setAt(_T("TCH_DBPSCONFIG"), p2, id) == Acad::eOk)
p2->close();
else
delete p2;
}
pObj->close ();
}
}
}
}
if (NULL != pDict2)
pDict2->close();
if (pDict1 != NULL)
pDict1->close();
if (p0 != NULL)
p0->close();
}
}
int nCadVer = g_nDownGradeSaveCadVer + 14;
CString str(_T(""));
if (nSaveVer == 3)
{
if (SaveAsTArch3(pDb, sFileName, nCadVer, false) == RTNORM)
adsout << XString(_T("\n成功地生成上华建筑%d文件: "), nSaveVer) << sFileName;
else
adsout << XString(_T("\n不能生成上华建筑%d文件: "), nSaveVer) << sFileName;
}
else
{
bool bSuccess = true;
if (SaveAs(pDb, sFileName, nSaveVer, nCadVer) == RTNORM)
{
bSuccess = true;
//adsout << XString(_T("\n成功地生成上华建筑%s%d文件: "), nSaveVer == 10 ? _T("T") : _T(""), nSaveVer == 10 ? 20 : nSaveVer) << sFileName;
}
else
{
bSuccess = false;
//adsout << XString(_T("\n不能生成上华建筑%s%d文件: "), nSaveVer == 10 ? _T("T") : _T(""), nSaveVer == 10 ? 20 : nSaveVer) << sFileName;
}
//再增加版本,需要特殊处理,目前20V3版本是11
if (nSaveVer == 10) // 先这样处理,看将来大版本号如何改动,再做修改。
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << _T("T20V2文件: ") << sFileName;
else if (nSaveVer == 11) // 先这样处理,看将来大版本号如何改动,再做修改。
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << _T("T20V3文件: ") << sFileName;
else
adsout << _T("\n") << (bSuccess ? _T("") : _T("不能")) << _T("成功地生成上华建筑") << nSaveVer << _T("文件: ") << sFileName;
}
delete pDb;
return;
}