Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipewire/PipeTools.cpp
T

488 lines
12 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "StdAfx.h"
2026-09-28 15:28:50 +08:00
//#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();
}
2026-10-04 00:04:20 +08:00
// 取得图块的宽度和高度
2026-09-28 15:28:50 +08:00
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; i<lCount; i++) {
Entity ent = g_ssPickFirst[i];
AcDbObjectId idTemp;
if(acdbGetObjectId(idTemp,ent.name)==Acad::eOk) {
if(idTemp == id)
return TRUE;
}
}
return FALSE;
}
CString GetBlkDesName(const TCHAR* pszRecord, const TCHAR* pszTKName)
{
CString sName;
CodeBase db;
XDbfTable *pTable = db.Open((const TCHAR*)pszTKName);
if(!pTable) {
2026-10-04 00:04:20 +08:00
//AfxMessageBox("TK文件只读或损坏!");
2026-09-28 15:28:50 +08:00
return CString();
}
for(pTable->MoveFirst();!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);
2026-10-04 00:04:20 +08:00
// }sr remove it, 不知道这3句话干什么 2008-3-31
2026-09-28 15:28:50 +08:00
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<nCount) {
int nCondition=-1;
for(; nPos<nCount; nPos++) {
if(_istdigit(sSrc.GetAt(nPos)) || sSrc.GetAt(nPos)==_T('.')) {
sNum += sSrc.GetAt(nPos);
nCondition = nPos;
}
if(!(nCondition==-1 || nCondition==nPos))
break;
}
}
return !sNum.IsEmpty();
}
BOOL GetNumFromString(const CString& sSrc,int& nPos,double& dRet)
{
CString sNum;
BOOL bRet=GetNumFromString(sSrc,nPos,sNum);
if(bRet)
dRet=_tcstod((const TCHAR*)sNum,NULL);
return bRet;
}
/*
BOOL ChangeStringNum(CString &sSrc,int &nPos,double dChange)
{
BOOL bRet=FALSE;
int nCount = sSrc.GetLength();
if(nPos>=0 && nPos<nCount) {
for(; nPos<nCount; nPos++) {
if(_istdigit(sSrc.GetAt(nPos)) || sSrc.GetAt(nPos)==_T('.'))
break;
}
if(nPos>=nCount)
return bRet;
CString sLeft=sSrc.Left(nPos);
for(; nPos<nCount; nPos++) {
if(!(_istdigit(sSrc.GetAt(nPos)) || sSrc.GetAt(nPos)==_T('.')))
break;
}
CString sChange;
if(fabs(dChange - (int)dChange < 1.0E-3))
sChange.Format(_T("%0.0f"),dChange);
else
sChange.Format(_T("%f"),dChange);
if(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++;
}
}
2026-10-04 00:04:20 +08:00
//(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率)
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//给定1个管材index,返回管材名称(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率)
2026-09-28 15:28:50 +08:00
CString GetPipeMaterialByIdx(int idx)
{
if(idx < 0)
return _T("");
XStringList lst;
//GetPipeMaterialList(lst);
GetPipeMaterial(lst);
if(idx > lst.Length() || lst.Length() == 0){
2026-10-04 00:04:20 +08:00
// adsout << _T("没有发现用户自定义管材。请确认sys/pipe.dbf文件是否是最新版。\n");
2026-09-28 15:28:50 +08:00
return _T("");
}
CString csMat = (const TCHAR*)lst[idx];
return csMat;
}
2026-10-04 00:04:20 +08:00
//得到计算内径(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率)
2026-09-28 15:28:50 +08:00
double GetPipeDjByDn(const TCHAR* szMat, int iDnIn)
{
double nRet((double)iDnIn/1000);
CodeBase db;
XString fullFile;
if(!FindFile(_T("pipe.dbf"), fullFile)) {
2026-10-04 00:04:20 +08:00
// AfxMessageBox(_T("对不起,没有发现pipe.dbf文件!"));
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
//得到外径(注意自定义实体绘制接口(draw2d,draw3d)尽量不调用读取文件的操作,影响绘制效率)
2026-09-28 15:28:50 +08:00
double GetPipeOutDByDn(int nMaterial, double dDn)
{
CString csMat;
XStringList lstMaterial;
if(GetPipeMaterial(lstMaterial) && nMaterial>=0
&& nMaterial<lstMaterial.Length()) {
csMat = lstMaterial[nMaterial];
}
double nRet(dDn);
CodeBase db;
XString fullFile;
if(!FindFile(_T("pipe.dbf"), fullFile)) {
return nRet;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
return nRet;
CString csMaterial;
double nDn(0);
double nDj(0);
for(pTable->MoveFirst();!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;
}
2026-10-04 00:04:20 +08:00
// cet 2018.2.2 add 管道外径
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
// cet 2018.2.2 add 管道外径
2026-09-28 15:28:50 +08:00
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;
}
2026-10-04 00:04:20 +08:00
// 获取风管材料 // sg add
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
// 实体不可见
2026-09-28 15:28:50 +08:00
if (pEnt->visibility() != AcDb::kVisible)
{
return false;
}
2026-10-04 00:04:20 +08:00
// 实体所在图层是否可见
2026-09-28 15:28:50 +08:00
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()
{
2026-10-04 00:04:20 +08:00
// 有些图纸绘制出来的对象,点间误差较大,不增大误差值,连接等操作会出错
2026-09-28 15:28:50 +08:00
double dTol = 0.1;
if(DocGetMeterUnitDraw())
dTol = 0.001;
return dTol;
}