#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; isetPropertiesFrom(pMesh); VERIFY(pMesh->appendVertex(pVertex)==Acad::eOk); pVertex->close(); } for(i=0; isetPropertiesFrom(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; iisA()==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 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 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; idxappendAcDbEntity(pNewEnt); pNewEnt->close(); } } } } //加入新转换的对象 int num=entSetNew.length(); for(int n=0; nappendAcDbEntity(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; idxGetWallId(); 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 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 vTemp(XExplodeStream::m_bFullExplode, TRUE); XPushMemVar vTemp1(XExplodeStream::m_bExportTch4, TRUE); long lCount=ss.Length(); for(long i=0L; iexplode(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; jappendAcDbEntity(idLast, pEnt)==Acad::eOk); pEnt->close(); } } pTempBlock->close(); AcDbObjectIdArray objectIds; long lCount=ssAll.Length(); objectIds.setPhysicalLength(lCount); for(long i=0L; ideepCloneObjects(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 vTemp1(XExplodeStream::m_bExportTch4, TRUE); XPushMemVar 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 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 vTemp1(XExplodeStream::m_bExportTch4, TRUE); XPushMemVar 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; nappendAcDbEntity(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; nappendAcDbEntity(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 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 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; nappendAcDbEntity(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; nerase(); OPENOBJ_END(); } // 加入新转换的对象 /* int num=entSetNew.length(); for(n=0; nappendAcDbEntity(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; nappendAcDbEntity(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; iappendAcDbEntity(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 vTemp(XExplodeStream::m_bFullExplode, TRUE); XPushMemVar 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; iownerId(); // 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; jappendAcDbEntity(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 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 lstVPData; // 获得当前视口信息 BOOL bIsWcs = IsWCS(); if (nTileMode == 0) // 当前是图纸空间 { long lCount = ssViewPort.Length(); for (long l=0L; lnumber(); 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 idList; GetEntityFromDatabase(idList, *pDb, _T("VIEWPORT"), 0, ACDB_PAPER_SPACE); int nCount = lstVPData.Length(), nVPNums = idList.Length(); for (int nVP=0; nVPcenterPoint().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 pushVar(g_bMonitorDbAction, FALSE); DelXDataFromGroup(acdbCurDwg()); // 删除组内实体扩展数据 } // 不稳定问题解决方案 if (dlg.GetSaveVersion() == 3) { ssOldDim.Delete(); // undelete //ssNewDim.Delete(); int nNewDimCount = aryNewDimId.logicalLength(); for (int nIndex=0; nIndexerase(); } 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 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; nNsetUcs(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(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 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 vTemp(XExplodeStream::m_bFullExplode, TRUE); XPushMemVar vTemp1(XExplodeStream::m_bExportTch4, TRUE); long lCount=ss.Length(); for(long i=0L; iexplode(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; nexplode(entitySet); int nCount=entitySet.length(); for(int j=0; j 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 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 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(""); //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 vTemp0(g_pCurrentDb,&db); sNewFile <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 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 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; iat(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删除了")<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 vTempWall(g_idPubWall, idPubWall); XPushMemVar vTemp1(XExplodeStream::m_bExportTch4, TRUE); XPushMemVar vTemp2(XExplodeStream::m_bFullExplode, TRUE); pEntity->explode(entSetNew); pEntity->close(); } else if (pEntity->isWriteEnabled()) // 导出T5、6、7、8、9 { XPushMemVar 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 vTemp1(XExplodeStream::m_bExportTch4, TRUE); XPushMemVar 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 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; nNsetUcs(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; }