Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

489 lines
12 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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; 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) {
//AfxMessageBox("TK文件只读或损坏!");
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);
// }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<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++;
}
}
//(注意自定义实体绘制接口(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
&& 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;
}
// 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;
}