489 lines
12 KiB
C++
489 lines
12 KiB
C++
#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;
|
||
}
|