3580 lines
93 KiB
C++
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;
|
|
}
|
|
|