#include "StdAfx.h" //#include "cbclass.h" #include "PipeTools.h" #include "DbPipeValve.h" #include "DbfTools.h" #include "DbPipe.h" //#ifdef _WIN64 #include "TGAs.h" //#endif void SplitBlkStr(const TCHAR *pszInput, CString &sTK, CString &sRecord); CString GetBlkDesName(const TCHAR* pszRecord, const TCHAR* pszTKName); BOOL GetValveNameById(AcDbObjectId id,CString &sBlkName,CString &sDesName); BOOL GetNumFromString(const CString& sSrc,int& nPos,double& dRet); BOOL GetNumFromString(const CString& sSrc,int& nPos,CString& sNum); //BOOL ChangeStringNum(CString &sSrc,int &nPos,double dChange); XExtent::XExtent(const AcDbEntity *pEnt): dLen(0),dWid(0) { AcDbExtents ext; if(pEnt->getGeomExtents(ext)==Acad::eOk) { XPoint ptMin=ext.minPoint(); XPoint ptMax=ext.maxPoint(); dLen = ptMax.x-ptMin.x; dWid = ptMax.y-ptMin.y; } } XExtent::XExtent(Entity &ent): dLen(0),dWid(0) { OPENOBJ_BEGIN(ent,AcDb::kForRead,AcDbEntity,pEnt); if(pEnt!=NULL) { AcDbExtents ext; if(pEnt->getGeomExtents(ext)==Acad::eOk) { XPoint ptMin=ext.minPoint(); XPoint ptMax=ext.maxPoint(); dLen = ptMax.x-ptMin.x; dWid = ptMax.y-ptMin.y; } } OPENOBJ_END(); } XExtent::XExtent(const AcDbObjectId &id): dLen(0),dWid(0) { OPENOBJ_BEGIN(id,AcDb::kForRead,AcDbEntity,pEnt); if(pEnt!=NULL) { AcDbExtents ext; if(pEnt->getGeomExtents(ext)==Acad::eOk) { XPoint ptMin=ext.minPoint(); XPoint ptMax=ext.maxPoint(); dLen = ptMax.x-ptMin.x; dWid = ptMax.y-ptMin.y; } } OPENOBJ_END(); } // 取得图块的宽度和高度 BOOL GetInsertExtend(const AcDbObjectId &id,double &dWidth,double &dHeight) { if(!id.isValid()) return FALSE; AcDbBlockReference insert(AcGePoint3d(0,0,0), id); AcDbExtents extents; Acad::ErrorStatus es=Acad::eOk; insert.geomExtentsBestFit(extents); if(es != Acad::eOk) return FALSE; XPoint ptMax = extents.maxPoint(); XPoint ptMin = extents.minPoint(); dWidth = ptMax.x-ptMin.x; dHeight = ptMax.y-ptMin.y; return TRUE; } BOOL GetInsertExtend(const AcDbObjectId &id,double &x,double &y,double &z) { if(!id.isValid()) return FALSE; AcDbBlockReference insert(AcGePoint3d(0,0,0), id); AcDbExtents extents; Acad::ErrorStatus es=Acad::eOk; insert.geomExtentsBestFit(extents); if(es != Acad::eOk) return FALSE; XPoint ptMax = extents.maxPoint(); XPoint ptMin = extents.minPoint(); x = ptMax.x-ptMin.x; y = ptMax.y-ptMin.y; z = ptMax.z-ptMin.z; return TRUE; } BOOL IsInPickFirst(AcDbObjectId id) { long lCount = g_ssPickFirst.Length(); for (long i=0; iMoveFirst();!pTable->IsEOF();pTable->MoveNext()){ CString sDrawing, sItem; GET_FIELD(pTable, _T("drawing"), sDrawing); GET_FIELD(pTable, _T("item"), sItem); if(_tcscmp(sDrawing, pszRecord) == 0) { sName = (const TCHAR*)sItem; return sName; } } return CString(); } BOOL GetBlkNameById(AcDbObjectId id,CString &sBlkName,CString &sDesName) { sBlkName = _T(""); const TCHAR *pszBlkName = NULL; OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(pszBlkName); OPENOBJ_END(); if(pszBlkName!=NULL) { sBlkName = pszBlkName; CString sTKName, sRocord; SplitBlkStr(sBlkName, sTKName, sRocord); sTKName = g_sDwbPath + sTKName + _T(".tk"); sDesName = GetBlkDesName((const TCHAR*)sRocord, (const TCHAR*)sTKName); // if(sDesName.Find(_T("-")) > -1){ // sDesName = sDesName.Mid(0, sDesName.GetLength()-9); // }sr remove it, 不知道这3句话干什么 2008-3-31 if(sBlkName != _T("")) return TRUE; } return FALSE; } BOOL GetNumFromString(const CString& sSrc,int& nPos,CString& sNum) { sNum.Empty(); int nCount = sSrc.GetLength(); if(nPos>=0 && nPos=0 && nPos=nCount) return bRet; CString sLeft=sSrc.Left(nPos); for(; nPos=nCount) { sSrc = sLeft+sChange; } else { CString sRight=sSrc.Right(nPos); sSrc = sLeft+sChange+sRight; } bRet = TRUE; } return bRet; } */ BOOL GetValveNameById(AcDbObjectId id, CString &sBlkName, CString &sDesName) { sBlkName = _T(""); OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPipeValve, pEquip); if(pEquip){ const TCHAR *pszBlkName = NULL; AcDbObjectId eqId = pEquip->GetBlock2d(); OPENOBJ_BEGIN(eqId, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(pszBlkName); OPENOBJ_END(); sBlkName = pszBlkName; CString sTKName, sRocord; SplitBlkStr(sBlkName, sTKName, sRocord); sTKName = g_sDwbPath + sTKName + _T(".tk"); sDesName = GetBlkDesName((const TCHAR*)sRocord, (const TCHAR*)sTKName); if(sDesName.Find(_T("-")) > -1){ sDesName = sDesName.Mid(0, sDesName.GetLength()-9); } if(sBlkName != _T("")) return TRUE; } OPENOBJ_END(); return FALSE; } BOOL IsSystemValve(AcDbObjectId id) { const TCHAR *pszBlkName = NULL; OPENOBJ_BEGIN(id, AcDb::kForRead, AcDbBlockTableRecord, pRecord); if(pRecord) pRecord->getName(pszBlkName); OPENOBJ_END(); if(pszBlkName!=NULL) { CString sBlkName = pszBlkName; CString sTKName, sRocord; SplitBlkStr(sBlkName, sTKName, sRocord); sTKName = g_sDwbPath + sTKName + _T(".tk"); CString sDesName = GetBlkDesName((const TCHAR*)sRocord, (const TCHAR*)sTKName); if(sDesName.Find(_T("-")) > -1 || sTKName.Find(_T("_U")) > -1) return FALSE; else return TRUE; } return FALSE; } void SplitBlkStr(const TCHAR *pszInput, CString &sTK, CString &sRecord) { int len = (int)_tcslen(pszInput); TCHAR szTemp[256]=_T(""); int j =0; BOOL bfisrt = TRUE; szTemp[0] = _T('\0'); for(int i=0; i<=len; i++) { if(pszInput[i] != _T('\0') && pszInput[i] != _T('$')) szTemp[j] = pszInput[i]; else { szTemp[j] = _T('\0'); if(szTemp[0] != _T('\0') && bfisrt){ sTK = szTemp; bfisrt = FALSE; } else if(szTemp[0] != _T('\0') && !bfisrt){ sRecord = szTemp; } j =-1; } j++; } } //(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率) BOOL GetPipeMaterial(XStringList &lstMaterial) { CodeBase db; XString fullFile; if(!FindFile(_T("pipe.dbf"), fullFile)) return FALSE; XDbfTable *pTable = db.Open(fullFile); if(!pTable) return FALSE; CString csMaterial; for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){ GET_FIELD(pTable, _T("GC"), csMaterial); if(csMaterial != _T("") && lstMaterial.Index(csMaterial) < 0) lstMaterial.Append(tstrnew(csMaterial)); } return TRUE; } //给定1个管材index,返回管材名称(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率) CString GetPipeMaterialByIdx(int idx) { if(idx < 0) return _T(""); XStringList lst; //GetPipeMaterialList(lst); GetPipeMaterial(lst); if(idx > lst.Length() || lst.Length() == 0){ // adsout << _T("没有发现用户自定义管材。请确认sys/pipe.dbf文件是否是最新版。\n"); return _T(""); } CString csMat = (const TCHAR*)lst[idx]; return csMat; } //得到计算内径(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率) double GetPipeDjByDn(const TCHAR* szMat, int iDnIn) { double nRet((double)iDnIn/1000); CodeBase db; XString fullFile; if(!FindFile(_T("pipe.dbf"), fullFile)) { // AfxMessageBox(_T("对不起,没有发现pipe.dbf文件!")); return nRet; } XDbfTable *pTable = db.Open(fullFile); if(!pTable) return nRet; CString sMaterial; int iDn(0); double nDj(0); for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){ GET_FIELD(pTable, _T("GC"), sMaterial); GET_FIELD(pTable, _T("DN"), iDn); GET_FIELD(pTable, _T("DJ"), nDj); nDj = nDj/1000; if(_tcsicmp((const TCHAR*)sMaterial, szMat) == 0 && iDn == iDnIn) return nDj; } return nRet; } //得到外径(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率) double GetPipeOutDByDn(int nMaterial, double dDn) { CString csMat; XStringList lstMaterial; if(GetPipeMaterial(lstMaterial) && nMaterial>=0 && nMaterialMoveFirst();!pTable->IsEOF();pTable->MoveNext()){ GET_FIELD(pTable, _T("GC"), csMaterial); GET_FIELD(pTable, _T("DN"), nDn); GET_FIELD(pTable, _T("D"), nDj); if(_tcsicmp((const TCHAR*)csMaterial, csMat) == 0 && fabs(dDn - nDn) < 0.001) return nDj; } return nRet; } // cet 2018.2.2 add 管道外径 double GetPipeOutDByDn(const AcDbObjectId &idPipe) { double dRet = 0.0; TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { dRet = pPipe->OuterDn(); pPipe->close(); } return dRet; } // cet 2018.2.2 add 管道外径 double GetPipeDjByDn(const AcDbObjectId &idPipe) { double dRet = 0.0; TDbPipe *pPipe = NULL; acdbOpenObject(pPipe, idPipe, AcDb::kForRead); if (pPipe != NULL) { dRet = pPipe->OuterDn() - pPipe->GetPipeThick() * 2; pPipe->close(); } return dRet; } // 获取风管材料 // sg add BOOL GetDuctMaterial(XStringList &lstMaterial) { CodeBase db; XString fullFile; if (!FindFile(_T("duct.dbf"), fullFile)) return FALSE; XDbfTable *pTable = db.Open(fullFile); if (pTable == NULL) return FALSE; CString csMaterial; for (pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()) { GET_FIELD(pTable, _T("GC"), csMaterial); if (csMaterial!=_T("") && lstMaterial.Index(csMaterial)<0) lstMaterial.Append(tstrnew(csMaterial)); } return TRUE; } inline AcGeVector3d GetUcsZvt() { AcGeVector3d vtZ = AcGeVector3d::kZAxis; AcDbDatabase* pDb = acdbCurDwg(); if (NULL != pDb) vtZ = pDb->ucsxdir().crossProduct(pDb->ucsydir()); return vtZ; } PS_IMPEXP bool IsVisibleEntity(const AcDbObjectId &idEnt) { bool bRet = true; AcDbEntity *pEnt = NULL; acdbOpenObject(pEnt, idEnt, AcDb::kForRead); if (pEnt != NULL) { bRet = IsVisibleEntity(pEnt); pEnt->close(); } return bRet; } PS_IMPEXP bool IsVisibleEntity(const AcDbEntity *pEnt) { // 实体不可见 if (pEnt->visibility() != AcDb::kVisible) { return false; } // 实体所在图层是否可见 bool bRet = true; AcDbLayerTableRecord *pLayer = NULL; acdbOpenObject(pLayer, pEnt->layerId(), AcDb::kForRead); if (pLayer != NULL) { bRet = !(pLayer->isFrozen() || pLayer->isOff()); pLayer->close(); } return bRet; } PS_IMPEXP double EqualPointTol() { // 有些图纸绘制出来的对象,点间误差较大,不增大误差值,连接等操作会出错 double dTol = 0.1; if(DocGetMeterUnitDraw()) dTol = 0.001; return dTol; }