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;
|
|
|
|
|
|
}
|