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

2480 lines
60 KiB
C++

#include "stdafx.h"
#include "NewSanitaryDefineDlg.h"
#include "SelectBlkDlg.h"
#include "SanitaryDangDlg.h"
#include "NewSanitaryTypeDlg.h"
#include "SanitaryPicDlg.h"
//#ifdef _WIN64
#include"TGAs.h"
//#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// 返回值 1: 洁具本身获取数据 2:本地获取数据 0:无数据可获取
int GetSanitaryDataSourceType(Entity ent);
bool GetLocSanitaryData(Entity ent, CSanitaryInfo &data, AcGePoint3d &ptFeed, AcGePoint3d &ptHeatFeed, AcGePoint3d &ptDrain, AcGePoint3d &ptDir);
//根据图集号识别洁具类型
void GetDwbInfo(CString sPicName, int &iCurType)
{
CodeBase db;
XString fullFile;
if(!FindFile(_T("Sanitary.dbf"), fullFile))
{
AfxMessageBox(_T("读取Sanitary.dbf文件错误!"));
return;
}
CString sName;
CString sFeedBlk, sFeedSys, sFeedPtEle, sFeedPipe, sHeatPipe, sDrainBlk, sFeedNG, sFeedQ, sDrainNG, sDrainQ;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return;
}
CString sType;
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
{
GET_FIELD(pTable, _T("Type"), sType);
double dTypeTmp = _tstof(sType);
GET_FIELD(pTable, _T("Page"), sName);
if(sName.Compare(sPicName) == 0)
{
iCurType = dTypeTmp;
}
}
}
bool GetSanitaryInfo(Entity ent, XPoint &ptRet, CString &csBlk, CString &csSysBlk, double &nRadius,
double &nDang, double &nBigQ, double &dEle, int iType, CString &sDwbName, CString &sFeedElev, CString &sHotElev/*, double &dSanitaryDriec*/)
{
double xscale;
ent.GetData(41, &xscale);
xscale = fabs(xscale);
CString csApp;
if(iType == 0)
csApp = _T("SANITARYFEED");
else if(iType == 1)
csApp = _T("SANITARYHEADFEED");
else if(iType == 2)
csApp = _T("SANITARYDRAIN");
bool bRet(false);
AcDbObjectId Id;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
pBlkRef->close();
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
AcDbBlockTableRecord *pRecord = NULL;
AcDbBlockTable* pBlockTable = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if(pBlockTable == NULL)
return false;
if(Acad::eOk != pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead))
{
pBlockTable->close();
return false;
}
pBlockTable->close();
if(pRecord == NULL)
return false;
AcDbBlockTableRecordIterator *pIterator;
pRecord->newIterator(pIterator);
pRecord->close();
if(pIterator == NULL)
return false;
for(pIterator->start(); !pIterator->done(); pIterator->step())
{
AcDbEntity *pEnt = NULL;
pIterator->getEntity(pEnt, AcDb::kForRead);
if(pEnt != NULL)
{
AcDbPoint *pll = NULL;
AcDbCircle *pCir = NULL;
if(pCir = AcDbCircle::cast(pEnt))
{
if(iType == 2){
resbuf *pRb = pEnt->xData(csApp);
if(pRb != NULL) {
resbuf *pNext = pRb->rbnext;
if(pNext && pNext->restype == 1000)
{
csBlk = pNext->resval.rstring;
pNext = pNext->rbnext;
if(pNext && pNext->restype == 1000)
{
csSysBlk = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
nDang = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
nBigQ = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sFeedElev = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sHotElev = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sDwbName = pNext->resval.rstring;
bRet = true;
}
}
ads_relrb(pRb);
AcGePoint3d ptIns = pCir->center();
nRadius = pCir->radius()*xscale;
ptIns = ptIns.transformBy(matrix);
ptRet = ptIns;
pEnt->close();
break;
}
}
}
else if(pll = AcDbPoint::cast(pEnt))
{
resbuf *pRb = pEnt->xData(csApp);
if(pRb != NULL)
{
resbuf *pNext = pRb->rbnext;
if(pNext && pNext->restype == 1000)
{
csBlk = pNext->resval.rstring;
pNext = pNext->rbnext;
if(pNext && pNext->restype == 1000)
{
csSysBlk = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
nDang = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
nBigQ = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
dEle = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sFeedElev = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sHotElev = pNext->resval.rstring;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1000)
{
sDwbName = pNext->resval.rstring;
bRet = true;
}
}
ads_relrb(pRb);
nDang = fabs(nDang);
AcGePoint3d ptIns = pll->position();
ptIns = ptIns.transformBy(matrix);
ptRet = ptIns;
pEnt->close();
break;
}
}
pEnt->close();
}
}
delete pIterator;
return bRet;
}
bool AddPointInBlk(Entity entBlk, AcGePoint3d ptIns, const TCHAR* szBlk, const TCHAR* szSysBlk,
double nDang, double nBigQ, int iType, CString sDwbName, CString sFeedElev, CString sHotElev/*, double dSanitaryDriec*/)
{
if(fabs(ptIns.x) < 0.001 && fabs(ptIns.y) < 0.001)
return false;
double dEle = ptIns.z;
AcDbObjectId Id;
acdbGetObjectId(Id, entBlk);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
pBlkRef->close();
matrix = matrix.inverse();
TCHAR szBlkName[256];
entBlk.GetData(2, szBlkName);
AcDbBlockTable* pBlockTable = NULL;
AcDbBlockTableRecord* pRecord = NULL;
AcDbObjectId objId = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if(pBlockTable == NULL)
return false;
pBlockTable->getAt(szBlkName, pRecord, AcDb::kForWrite);
pBlockTable->close();
if(pRecord == NULL)
return false;
ptIns = ptIns.transformBy(matrix);
AcDbPoint *pNewPt = new AcDbPoint();
pNewPt->setPosition(ptIns);
CString csApp;
if(iType == 0)
{
csApp = _T("SANITARYFEED");
}
else if(iType == 1)
{
csApp = _T("SANITARYHEADFEED");
}
else if(iType == 2)
{
csApp = _T("SANITARYDRAIN");
}
if(!XSymbolTable(_T("APPID"), csApp))
ads_regapp(csApp);
resbuf *pXData = ads_buildlist(1001, csApp, 1000, szBlk, 1000, szSysBlk, 1040, nDang, 1040, nBigQ, 1040, dEle,
1000, sFeedElev, 1000 , sHotElev, 1000, sDwbName, NULL);
if (Acad::eOk != pNewPt->setXData(pXData))
{
return false;
}
ads_relrb(pXData);
pRecord->appendAcDbEntity(objId, pNewPt);
pRecord->close();
pNewPt->close();
return true;
}
// 洁具方向相对X轴的夹角
double GetEntDriection(const XPoint &ptStart, const XPoint &ptEnd)
{
double dAngle = 0.0;
AcGeVector3d vtX = AcGeVector3d::kXAxis;
// vtX.rotateBy(Ucs2Wcs(0.0), AcGeVector3d::kZAxis);
AcGeVector3d vtDir = ptEnd - ptStart;
vtDir.z = 0.0;
dAngle = vtX.angleTo(vtDir, AcGeVector3d::kZAxis);
if (fabs(dAngle - 2 * PI) < 0.001)
{
dAngle = 0.0;
}
return dAngle;
}
bool SetSanitaryDirPt(Entity entBlk, AcGePoint3d ptIns, AcGePoint3d ptBlck)
{
AcDbObjectId Id;
acdbGetObjectId(Id, entBlk);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
double dBlkAng = pBlkRef->rotation();
double xscale;
double dMirror = -1;
entBlk.GetData(41, &xscale);
xscale = fabs(xscale);
if (xscale < 0)
{
dMirror = 1;
}
pBlkRef->close();
matrix = matrix.inverse();
TCHAR szBlkName[256];
entBlk.GetData(2, szBlkName);
AcDbBlockTable* pBlockTable = NULL;
AcDbBlockTableRecord* pRecord = NULL;
AcDbObjectId objId = NULL, blkId = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if(pBlockTable == NULL)
return false;
pBlockTable->getAt(szBlkName, pRecord, AcDb::kForWrite);
pBlockTable->close();
if(pRecord == NULL)
return false;
ptIns = ptIns.transformBy(matrix);
ptBlck = ptBlck.transformBy(matrix);
AcDbPoint *pNewPt = new AcDbPoint();
//pNewPt->setVisibility(AcDb::kInvisible);
pNewPt->setPosition(ptIns);
AcDbPoint *ptNewBlk = new AcDbPoint();
//ptNewBlk->setVisibility(AcDb::kInvisible);
ptNewBlk->setPosition(ptBlck);
CString csApp, csAppBlk;
csApp = _T("SANITARYDIRPT");
csAppBlk = _T("SANITARYPOS");
if(!XSymbolTable(_T("APPID"), csApp))
ads_regapp(csApp);
double dAngle = GetEntDriection(ptBlck, ptIns);
resbuf *pXData = ads_buildlist(1001, csApp, 1000, _T("ptDriction"), 1040, dBlkAng, 1040, dMirror, 1040, dAngle, NULL);
if (Acad::eOk != pNewPt->setXData(pXData))
{
return false;
}
ads_relrb(pXData);
if(!XSymbolTable(_T("APPID"), csAppBlk))
ads_regapp(csAppBlk);
resbuf *pXPosData = ads_buildlist(1001, csAppBlk, 1000, _T("ptPos"), NULL);
if (Acad::eOk != ptNewBlk->setXData(pXPosData))
{
return false;
}
ads_relrb(pXPosData);
pRecord->appendAcDbEntity(objId, pNewPt);
pRecord->appendAcDbEntity(blkId, ptNewBlk);
pRecord->close();
pNewPt->close();
ptNewBlk->close();
return true;
}
bool GetSanitaryDirPt(Entity ent, XPoint &ptRet, XPoint &ptBlk, double &dBlkAngle, bool &bIsMirror, double &dAngle)
{
AcDbObjectId Id;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
pBlkRef->close();
CString csApp = _T("SANITARYDIRPT");
CString csAppBlk = _T("SANITARYPOS");
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
AcDbBlockTableRecord *pRecord = NULL;
AcDbBlockTable* pBlockTable = NULL;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
if(pBlockTable == NULL)
return false;
if(Acad::eOk != pBlockTable->getAt(szBlkName, pRecord, AcDb::kForRead))
{
pBlockTable->close();
return false;
}
pBlockTable->close();
if(pRecord == NULL)
return false;
AcDbBlockTableRecordIterator *pIterator;
pRecord->newIterator(pIterator);
pRecord->close();
if(pIterator == NULL)
return false;
for(pIterator->start(); !pIterator->done(); pIterator->step())
{
AcDbEntity *pEnt = NULL;
pIterator->getEntity(pEnt, AcDb::kForRead);
if(pEnt != NULL)
{
CString name = pEnt->desc()->name();
AcDbPoint *pll = NULL;
if(pll = AcDbPoint::cast(pEnt))
{
resbuf *pRb = pEnt->xData(csApp);
if(pRb != NULL)
{
resbuf *pNext = pRb->rbnext;
if(pNext && pNext->restype == 1000)
{
pNext = pNext->rbnext;
if(pNext && pNext->restype == 1040)
{
dBlkAngle = pNext->resval.rreal;
pNext = pNext->rbnext;
}
if(pNext && pNext->restype == 1040)
{
double dMirror = pNext->resval.rreal;
if (dMirror > 0)
{
bIsMirror = true;
}
else
{
bIsMirror = false;
}
pNext = pNext->rbnext;
}
if (pNext && pNext->restype == 1040)
{
dAngle = pNext->resval.rreal;
}
}
AcGePoint3d ptIns = pll->position();
ptIns = ptIns.transformBy(matrix);
ptRet = ptIns;
pEnt->close();
continue;
}
ads_relrb(pRb);
resbuf *pRbBlk = pEnt->xData(csAppBlk);
if(pRbBlk != NULL)
{
AcGePoint3d ptIns = pll->position();
ptIns = ptIns.transformBy(matrix);
ptBlk = ptIns;
pEnt->close();
continue;
}
ads_relrb(pRbBlk);
}
pEnt->close();
}
}
delete pIterator;
if (!ptRet)
{
return false;
}
return true;
}
bool GetSanitaryDriection(Entity ent, double &dSanitaryDriec)
{
XPoint ptTmp, ptBlk;
double dBlkAng = 0.0, dAngle = 0.0;
bool bIsMirror = false;
int nDataSource = GetSanitaryDataSourceType(ent);
if (nDataSource == 1 || nDataSource == 0)
{
if (!GetSanitaryDirPt(ent, ptTmp, ptBlk, dBlkAng, bIsMirror, dAngle))
{
return false;
}
}
else
{
AcDbObjectId Id = NULL;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(!pBlkRef)
return false;
ptBlk = pBlkRef->position();
pBlkRef->close();
CSanitaryInfo data;
XPoint ptFeed, ptHeat, ptDrain;
GetLocSanitaryData(ent, data, ptFeed, ptHeat, ptDrain, ptTmp);
}
dSanitaryDriec = GetEntDriection(ptBlk, ptTmp);
return true;
}
bool GetSanitaryDwbSerial(Entity ent,CString &sDwbName)
{
XPoint ptTmp;
CString csTmp1, csTmp2;
double nTmp(0), nDang(0), nBigQ(0), dEle(0), dAngle(0);
CString sHotElev, sFeedElev;
GetSanitaryInfo(ent, ptTmp, csTmp1, csTmp2, nTmp, nDang, nBigQ, dEle,0, sDwbName, sFeedElev, sHotElev);
GetSanitaryInfo(ent, ptTmp, csTmp1, csTmp2, nTmp, nDang, nBigQ, dEle,1, sDwbName, sFeedElev, sHotElev);
GetSanitaryInfo(ent, ptTmp, csTmp1, csTmp2, nTmp, nDang, nBigQ, dEle,2, sDwbName, sFeedElev, sHotElev);
if (!sDwbName.IsEmpty())
{
return true;
}
return false;
}
//****************************************************************************************************
// 新定义洁具
//****************************************************************************************************
extern AcDbObjectId GetPickCirByBlk(Entity ent, XPoint ptPick);
extern void ClearSanitaryInfo(Entity ent);
extern BOOL SetDrainCirInBlk(Entity entBlk, AcDbObjectId IdCir, const TCHAR* szBlk,
const TCHAR* szSysBlk, double nDang, double nBigQ);
extern void ChangeBlkColor(PickSet &ss, int iCol);
class TArrowJig : public AcEdJig
{
protected:
//AcDbPolyline *m_pDrawEnt;
AcDbLine *m_pDrawEnt;
public:
TArrowJig(XPoint ptStart);
~TArrowJig();
int DoIt();
virtual DragStatus sampler();
XPoint m_ptStart, m_ptEnd;
protected:
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
};
TArrowJig::TArrowJig(XPoint ptStart)
{
m_ptStart = ptStart;
}
// 开始执行拖动
int TArrowJig::DoIt()
{
m_pDrawEnt = new AcDbLine;
XPushVar<int> vOrthoMode(_T("ORTHOMODE"), 1);//默认正交开
XPushVar<int> OsMode(_T("OSMODE"), 0); //关闭对象捕捉
setDispPrompt(_T("\n请选择洁具方向(给水点指向排水点方向):"));
AcEdJig::DragStatus stat = drag();
if (stat == kNormal)
{
return RTNORM;
}
return RTNONE;
}
AcEdJig::DragStatus TArrowJig::sampler()
{
return acquirePoint(m_ptEnd, m_ptStart);
}
// 更新实体数据
Adesk::Boolean TArrowJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
AcGeVector3d vec = m_ptEnd - m_ptStart;
vec.normalize();
XPoint ptInLine = m_ptEnd - vec * 100;
vec.rotateBy(PI / 2, AcGeVector3d::kZAxis);
ptInLine = ptInLine - vec * 20;
m_pDrawEnt->setStartPoint(m_ptEnd);
m_pDrawEnt->setEndPoint(ptInLine);
// m_pDrawEnt->addVertexAt(1, ptInLine);
return bRet;
}
AcDbEntity* TArrowJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
TArrowJig::~TArrowJig()
{
if(m_pDrawEnt)
delete m_pDrawEnt;
}
void Add2CurrentSpace(XPoint ptStart, XPoint ptEnd)
{
AcDbPolyline *pPolyLine = new AcDbPolyline;
pPolyLine->setColorIndex(4);
pPolyLine->addVertexAt(0, ptEnd,0, 0, 40);
AcGeVector3d vec = ptEnd - ptStart;
vec.normalize();
XPoint ptInLine = ptEnd - vec * 100;
pPolyLine->addVertexAt(1, ptInLine, 0, 0, 0);
pPolyLine->addVertexAt(2, ptStart);
AddToCurrentSpace(pPolyLine, Adesk::kTrue);
}
bool HasLocData(Entity ent)
{
TCHAR sCurBlkName[256];
ent.GetData(2, sCurBlkName);
CodeBase db;
XString fullFile;
if(!FindFile(_T("SanitaryLocal.dbf"), fullFile))
{
AfxMessageBox(_T("读取SanitaryLocal.dbf文件错误!"));
return false;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return false;
}
CString sBlkName;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("Name"), sBlkName);
if(sBlkName.Compare(sCurBlkName) == 0)
{
return true;
}
}
return false;
}
void GetPtByStr(const CString sText, AcGePoint3d &pt)
{
CString sX, sY, sZ;
int nIndex = 0;
nIndex = sText.Find(_T(","), 0);
if (nIndex > 0)
{
sX = sText.Left(nIndex);
}
CString sTmp = sText.Right(sText.GetLength() - nIndex - 1);
nIndex = sTmp.Find(_T(","), 0);
if (nIndex > 0)
{
sY = sTmp.Left(nIndex);
}
sTmp = sTmp.Right(sTmp.GetLength() - nIndex - 1);
sZ = sTmp;
pt.x = _tstof(sX);
pt.y = _tstof(sY);
pt.z = _tstof(sZ);
}
// 获取本地定义的洁具数据
bool GetLocSanitaryData(Entity ent, CSanitaryInfo &data, AcGePoint3d &ptFeed, AcGePoint3d &ptHeatFeed, AcGePoint3d &ptDrain, AcGePoint3d &ptDir)
{
TCHAR sCurBlkName[256];
ent.GetData(2, sCurBlkName);
AcDbObjectId Id;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
pBlkRef->close();
CodeBase db;
XString fullFile;
if(!FindFile(_T("SanitaryLocal.dbf"), fullFile))
{
AfxMessageBox(_T("读取SanitaryLocal.dbf文件错误!"));
return false;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return false;
}
CString sBlkName;
CString sFeedBlk, sFeedSys, sFeedPtXYZ, sHeatPtXYZ, sDrainXYZ, sDrainBlk, sPage, sDirection;
double dFeedPipe = 0.0, dHeatPipe = 0.0, dFeedng = 0.0, dFeeddq = 0.0, dDrainng = 0.0, dDrainnq = 0.0;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("Name"), sBlkName);
if(sBlkName.Compare(sCurBlkName) == 0)
{
GET_FIELD(pTable, _T("Feedsys"), sFeedSys);
data.sSysBlk1 = sFeedSys;
GET_FIELD(pTable, _T("Feedblk"), sFeedBlk);
data.sFeedSys = sFeedBlk;
GET_FIELD(pTable, _T("Feedpipe"), dFeedPipe);
data.sFeedElev.Format(_T("%.3f"), dFeedPipe);
GET_FIELD(pTable, _T("Heatpipe"), dHeatPipe);
data.sHotElev.Format(_T("%.3f"), dHeatPipe);
if (dHeatPipe + 999 < 0.001)
{
data.sHotElev = _T("");
}
GET_FIELD(pTable, _T("Feedxyz"), sFeedPtXYZ);
GetPtByStr(sFeedPtXYZ, ptFeed);
data.dPtFeedElev = ptFeed.z;
GET_FIELD(pTable, _T("Heatxyz"), sHeatPtXYZ);
GetPtByStr(sHeatPtXYZ, ptHeatFeed);
GET_FIELD(pTable, _T("Drainblk"), sDrainBlk);
data.sSysBlk2 = sDrainBlk;
GET_FIELD(pTable, _T("Drainxyz"), sDrainXYZ);
GetPtByStr(sDrainXYZ, ptDrain);
GET_FIELD(pTable, _T("Drainng"), dDrainng);
data.dNg = dDrainng;
GET_FIELD(pTable, _T("Feedq"), dFeeddq);
data.dRateQ = dFeeddq;
GET_FIELD(pTable, _T("Feedng"), dFeedng);
data.dDang = dFeedng;
GET_FIELD(pTable, _T("Drainq"), dDrainnq);
data.dBigQ = dDrainnq;
GET_FIELD(pTable, _T("Directionx"), sDirection);
GetPtByStr(sDirection, ptDir);
GET_FIELD(pTable, _T("Page"), sPage);
data.sDwbName = sPage;
ptFeed = ptFeed.transformBy(matrix);
XPoint ptHeat = ptHeatFeed;
if (!!ptHeat)
{
ptHeatFeed = ptHeatFeed.transformBy(matrix);
}
ptDrain = ptDrain.transformBy(matrix);
ptDir = ptDir.transformBy(matrix);
return true;
}
}
return false;
}
bool SetLocSanitaryData(Entity ent, const CSanitaryInfo &data, AcGePoint3d ptFeed, AcGePoint3d ptHeatFeed, AcGePoint3d ptDrain, AcGePoint3d ptDir)
{
TCHAR sCurBlkName[256];
ent.GetData(2, sCurBlkName);
AcDbObjectId Id;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(pBlkRef == NULL)
return false;
AcGeMatrix3d matrix = pBlkRef->blockTransform();
pBlkRef->close();
XPoint ptHeat = ptHeatFeed;
matrix = matrix.inverse();
ptFeed = ptFeed.transformBy(matrix);
if (!!ptHeat)
{
ptHeatFeed = ptHeatFeed.transformBy(matrix);
}
ptDrain = ptDrain.transformBy(matrix);
ptDir = ptDir.transformBy(matrix);
CodeBase db;
XString fullFile;
if(!FindFile(_T("SanitaryLocal.dbf"), fullFile))
{
AfxMessageBox(_T("读取SanitaryLocal.dbf文件错误!"));
return false;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return false;
}
CString sBlkName;
CString sFeedPtXYZ, sHeatPtXYZ, sDrainXYZ, sDirection;
bool bFind = false;
for(pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
GET_FIELD(pTable, _T("Name"), sBlkName);
if(sBlkName.Compare(sCurBlkName) == 0)
{
bFind = true;
SET_FIELD(pTable, _T("Feedsys"), data.sSysBlk1);
SET_FIELD(pTable, _T("Feedblk"), data.sFeedSys);
if (!data.sFeedElev.IsEmpty())
{
SET_FIELD(pTable, _T("Feedpipe"), data.sFeedElev);
}
if (!data.sHotElev.IsEmpty())
{
SET_FIELD(pTable, _T("Heatpipe"), data.sHotElev);
}
else
{
SET_FIELD(pTable, _T("Heatpipe"), _T("-999"));
}
sFeedPtXYZ.Format(_T("%f,%f,%f"), ptFeed.x, ptFeed.y, ptFeed.z);
SET_FIELD(pTable, _T("Feedxyz"), (const TCHAR*)sFeedPtXYZ);
if (!!ptHeat)
{
sHeatPtXYZ.Format(_T("%f,%f,%f"), ptHeatFeed.x, ptHeatFeed.y, ptHeatFeed.z);
SET_FIELD(pTable, _T("Heatxyz"), (const TCHAR*)sHeatPtXYZ);
}
else
{
SET_FIELD(pTable, _T("Heatxyz"), (const TCHAR*)_T(""));
}
SET_FIELD(pTable, _T("Drainblk"), data.sSysBlk2);
sDrainXYZ.Format(_T("%f,%f,%f"), ptDrain.x, ptDrain.y, ptDrain.z);
SET_FIELD(pTable, _T("Drainxyz"), (const TCHAR*)sDrainXYZ);
SET_FIELD(pTable, _T("Drainng"), data.dNg);
SET_FIELD(pTable, _T("Feedq"), data.dRateQ);
SET_FIELD(pTable, _T("Feedng"), data.dDang);
SET_FIELD(pTable, _T("Drainq"), data.dBigQ);
sDirection.Format(_T("%f,%f,%f"), ptDir.x, ptDir.y, ptDir.z);
SET_FIELD(pTable, _T("Directionx"), (const TCHAR*)sDirection);
SET_FIELD(pTable, _T("Page"), data.sDwbName);
return true;
}
}
if (!bFind)
{
if (pTable != NULL)
{
pTable->AppendBegin();
SET_FIELD(pTable, _T("Name"), (const TCHAR*)sCurBlkName);
SET_FIELD(pTable, _T("Feedsys"), data.sSysBlk1);
SET_FIELD(pTable, _T("Feedblk"), data.sFeedSys);
if (!data.sFeedElev.IsEmpty())
{
SET_FIELD(pTable, _T("Feedpipe"), data.sFeedElev);
}
if (!data.sHotElev.IsEmpty())
{
SET_FIELD(pTable, _T("Heatpipe"), data.sHotElev);
}
else
{
SET_FIELD(pTable, _T("Heatpipe"), _T("-999"));
}
sFeedPtXYZ.Format(_T("%f,%f,%f"), ptFeed.x, ptFeed.y, ptFeed.z);
SET_FIELD(pTable, _T("Feedxyz"), (const TCHAR*)sFeedPtXYZ);
if (!!ptHeat)
{
sHeatPtXYZ.Format(_T("%f,%f,%f"), ptHeatFeed.x, ptHeatFeed.y, ptHeatFeed.z);
SET_FIELD(pTable, _T("Heatxyz"), (const TCHAR*)sHeatPtXYZ);
}
else
{
SET_FIELD(pTable, _T("Heatxyz"), (const TCHAR*)_T(""));
}
SET_FIELD(pTable, _T("Drainblk"), data.sSysBlk2);
sDrainXYZ.Format(_T("%f,%f,%f"), ptDrain.x, ptDrain.y, ptDrain.z);
SET_FIELD(pTable, _T("Drainxyz"), (const TCHAR*)sDrainXYZ);
SET_FIELD(pTable, _T("Drainng"), data.dNg);
SET_FIELD(pTable, _T("Feedq"), data.dRateQ);
SET_FIELD(pTable, _T("Feedng"), data.dDang);
SET_FIELD(pTable, _T("Drainq"), data.dBigQ);
sDirection.Format(_T("%f,%f,%f"), ptDir.x, ptDir.y, ptDir.z);
SET_FIELD(pTable, _T("Directionx"), (const TCHAR*)sDirection);
SET_FIELD(pTable, _T("Page"), data.sDwbName);
pTable->AppendEnd();
return true;
}
}
return false;
}
bool HasEntData(Entity ent)
{
CSanitaryInfo CurInfo;
CString csTmp1, csTmp2, sDwbName, sHotElev, sFeedElev;
double nTmp, dEle(0);
XPoint ptHeatFeed, ptFeed, ptDrain;
GetSanitaryInfo(ent, ptHeatFeed, csTmp1, csTmp2, nTmp, CurInfo.dDang, CurInfo.dBigQ, dEle, 1,
sDwbName, sFeedElev, sHotElev);
CurInfo.sHotElev = sHotElev;
GetSanitaryInfo(ent, ptFeed, csTmp1, csTmp2, nTmp, CurInfo.dDang, CurInfo.dRateQ, CurInfo.dPtFeedElev, 0,
sDwbName, sFeedElev, sHotElev);
{
CurInfo.sSysBlk1 = csTmp2;
}
CurInfo.sFeedElev = sFeedElev;
GetSanitaryInfo(ent, ptDrain, csTmp1, csTmp2, nTmp, CurInfo.dNg, CurInfo.dBigQ, dEle, 2,
sDwbName, sFeedElev, sHotElev);
{
CurInfo.sSysBlk2 = csTmp2;
}
CurInfo.sDwbName = sDwbName;
int iRet = CurInfo.CheckEntInfo();
if (iRet == 0)
{
return false;
}
else
{
return true;
}
}
// 判断洁具数据源
// 返回值 0:无数据可获取 1: 洁具本身获取数据 2:本地获取数据
int GetSanitaryDataSourceType(Entity ent)
{
bool bHasLocData = false, bHasEntData = false;
bHasEntData = HasEntData(ent);
bHasLocData = HasLocData(ent);
int nDataSource = -1;
if (bHasEntData && bHasLocData)
{
// zxl 2012.12.05 add 从注册表获取数据
CRegProperty regProp(GetRegLocation(), _T("TWTConfig"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
bool bRet = regProp.GetValue(_T("SanitaryDataType"), g_nSinataryDataType);
if (!bRet)
{
g_nSinataryDataType = 0;
}
if (g_nSinataryDataType == 0)
{
nDataSource = 1;
}
else
{
nDataSource = 2;
}
}
else if (bHasEntData)
{
nDataSource = 1;
}
else if (bHasLocData)
{
nDataSource = 2;
}
else
{
nDataSource = 0;
}
return nDataSource;
}
void NewDefineSanitary()
{
Entity ent;
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_BLOCK_INSERT"), -4, _T("and>"),
-4, _T("or>"), NULL);
if(SelectEntity(_T("\n请选择要定义的洁具图块(本图每种洁具只需定义一次):<退出>"), ent, rbMask) != RTNORM)
return;
CTemporaryResourceOverride vTemp;
CNewSanitaryDefineDlg dlg;
dlg.m_ent = ent;
CString sDwbName;
int iSanitaryType = 0;
int nDataSource = GetSanitaryDataSourceType(ent);
dlg.SetDataSourceType(nDataSource);
if (nDataSource == 2 || nDataSource == 0 || (!GetSanitaryDwbSerial(ent, sDwbName) && nDataSource == 1))//未定义过de洁具
{
CTemporaryResourceOverride vTemp2;
CNewSanitaryTypeDlg dlg2;
if(dlg2.DoModal() != IDOK)
return;
iSanitaryType = dlg2.GetSanitaryType();
dlg.SetSanitaryType(iSanitaryType);
}
else//定义过de洁具
{
int iCurType = 0;
GetDwbInfo(sDwbName, iCurType);
iSanitaryType = iCurType;
dlg.SetSanitaryType(iCurType);
dlg.SetPic(sDwbName);
}
if(dlg.DoModal() != IDOK)
return;
if (iSanitaryType == 12)//自定义洁具
{
if (!dlg.m_ptFeed && !dlg.m_ptDrain && !dlg.m_ptHeatFeed)
{
adsout << _T("\n没有指定给水点或排水点!");
return;
}
}
else
{
if(!dlg.m_ptFeed)
{
adsout << _T("\n没有指定给水点!");
return;
}
if(!dlg.m_id && !dlg.m_ptDrain)
{
adsout << _T("\n没有指定排水点或排水圆圈!");
return;
}
}
if(dlg.m_iFeedElev == 1 && !!dlg.m_ptFeed)
{
dlg.m_ptFeed.z = dlg.m_CurInfo.dPtFeedElev;
if (!!dlg.m_ptHeatFeed && !dlg.m_CurInfo.sHotElev.IsEmpty())
{
dlg.m_ptHeatFeed.z = dlg.m_CurInfo.dPtFeedElev;
}
}
else if (!!dlg.m_ptFeed)
{
dlg.m_ptFeed.z = -1;
dlg.m_ptHeatFeed.z = 0;
}
double xscale, yscale;
ent.GetData(41, &xscale);
ent.GetData(42, &yscale);
BOOL bMirror = FALSE;
if(ent.Is(_T("INSERT")))
{
if(xscale < 0)
bMirror = TRUE;
}
else if(ent.Is(_T("AEC_BLOCK_INSERT")))
{
if(yscale < 0)
bMirror = TRUE;
}
CString sDwbSerial;
double dAngle = -1;
sDwbSerial = dlg.m_CurInfo.sDwbName;
bool bReDriection = false;
if (nDataSource == 1)
{
bReDriection = GetSanitaryDriection(ent, dAngle);
}
else if (nDataSource == 2 && !!dlg.m_ptDriection)
{
bReDriection = true;
}
if (bReDriection)
{
TCHAR szTmp[10];
INITGET_BEG(0, _T("Y N"));
if (acedGetKword(_T("\n洁具方向已存在,是否重新定义[Y/N]:<N>"), szTmp) == RTNORM)
{
INITGET_END();
if (szTmp[0] == 'Y' || szTmp[0] == 'y')
{
ClearSanitaryInfo(ent);
dlg.SetSanitaryDriection(ent);
}
else// 继续使用上次定义方向 zxl 2012.04.23 add
{
XPoint ptDir, ptBlk;
double dBlkAng = 0.0, dAngle = 0.0;
bool bIsMirror = false;
if (nDataSource != 1)// 从本地数据获取洁具方向
{
ptDir = dlg.m_ptDriection;
AcDbObjectId Id = NULL;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(!pBlkRef)
return;
ptBlk = pBlkRef->position();
pBlkRef->close();
}
else// 从洁具本身获取数据
{
GetSanitaryDirPt(ent, ptDir, ptBlk, dBlkAng, bIsMirror, dAngle);
}
ClearSanitaryInfo(ent);
dlg.m_ptDriection = ptDir;
SetSanitaryDirPt(ent, ptDir, ptBlk);
}
}
}
else
{
ClearSanitaryInfo(ent);
dlg.SetSanitaryDriection(ent);
}
if(!!dlg.m_ptFeed)
{
double dNg = dlg.m_CurInfo.dDang;
if(bMirror)
dNg = dNg * -1;
AddPointInBlk(ent, asPnt3d(dlg.m_ptFeed), dlg.m_csBlkName, dlg.m_CurInfo.sSysBlk1, dNg, dlg.m_CurInfo.dRateQ, 0, sDwbSerial, dlg.m_CurInfo.sFeedElev, _T(""));
}
if(!!dlg.m_ptHeatFeed)
{
dlg.m_ptHeatFeed.z = dlg.m_ptFeed.z;
//对于混水龙头, 不需要热水再绘制一遍
CString csSysBlk = dlg.m_CurInfo.sSysBlk1;
if(csSysBlk == _T("TWTSYS(00000016)") || csSysBlk == _T("TWTSYS(00000200)")
|| csSysBlk == _T("TWTSYS(00000467)")|| csSysBlk == _T("TWTSYS(00000471)")
|| csSysBlk == _T("TWTSYS(00000204)")|| csSysBlk == _T("TWTSYS(00000208)")
|| csSysBlk == _T("TWTSYS(00000344)")|| csSysBlk == _T("TWTSYS(00000463)"))
csSysBlk = _T("");
AddPointInBlk(ent, asPnt3d(dlg.m_ptHeatFeed), dlg.m_csBlkName, csSysBlk, dlg.m_CurInfo.dDang, 0, 1, sDwbSerial, _T(""), dlg.m_CurInfo.sHotElev);
}
if(dlg.m_id)
{
SetDrainCirInBlk(ent, dlg.m_id, dlg.m_csDrainBlk, dlg.m_CurInfo.sSysBlk2, dlg.m_CurInfo.dNg, dlg.m_CurInfo.dBigQ);
}
else if(!!dlg.m_ptDrain)
{
AddPointInBlk(ent, asPnt3d(dlg.m_ptDrain), dlg.m_csDrainBlk, dlg.m_CurInfo.sSysBlk2, dlg.m_CurInfo.dNg, dlg.m_CurInfo.dBigQ, 2, sDwbSerial, _T(""), _T(""));
}
SetLocSanitaryData(ent, dlg.m_CurInfo, dlg.m_ptFeed, dlg.m_ptHeatFeed, dlg.m_ptDrain, dlg.m_ptDriection);
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
RBList rbMask2 = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), 8, _T("*"), 2, szBlkName, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_BLOCK_INSERT"), 8, _T("*"), 2, szBlkName, -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ssAll(SS_FREE);
ssAll.Get(_T("X"), NULL, NULL, rbMask2);
long len = ssAll.Length();
for(long i=0;i<len;i++)
{
Entity entBlk = ssAll[i];
OPENOBJ_BEGIN(entBlk, AcDb::kForWrite, AcDbBlockReference, pBlk);
if(pBlk)
{
pBlk->setColorIndex(4);
}
OPENOBJ_END();
}
ChangeBlkColor(ssAll, 0);//随块
}
//从注册表读取数据
bool ReadRegData(const CString &strKey, int& iVal)
{
CRegProperty regProp(GetRegLocation(), _T("SanitaryLinkType"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
return regProp.GetValue(strKey, iVal);
}
//将数据写入注册表
bool WriteRegData(const CString &strKey, int iVal)
{
CRegProperty regProp(GetRegLocation(), _T("SanitaryLinkType"));
regProp.SetTopRootKey(HKEY_CURRENT_USER);
return regProp.SetValue(strKey, iVal);
}
/////////////////////////////////////////////////////////////////////////////
// CNewSanitaryDefineDlg dialog
CNewSanitaryDefineDlg::CNewSanitaryDefineDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewSanitaryDefineDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNewSanitaryDefineDlg)
m_iType = 0;
m_iFeedElev = 1;
m_iCurPic = 0;
//}}AFX_DATA_INIT
m_iCurPos = 1;
m_iSelPos = 1;
m_iSanitaryType = 1;
m_bIsInitDlg = false;
m_nDataSourceType = -1;
CString csDwb = g_csDwbPath + _T("TwtSys");
XString xsTmp;
if(LoadDwbBlock(csDwb, _T("00000147"), xsTmp) != RTNORM) //排水点
return;
m_csDrainBlk = (const TCHAR*)xsTmp;
}
void CNewSanitaryDefineDlg::SetSanitaryType(int iType)
{
m_iSanitaryType = iType;
}
void CNewSanitaryDefineDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewSanitaryDefineDlg)
DDX_Control(pDX, IDC_EDIT_HOT, m_wndHeatPipe);
DDX_Control(pDX, IDC_SCROLLBAR1, m_wndScroll);
DDX_Radio(pDX, IDC_RADIO_TYPE3, m_iType);
DDX_Text(pDX, IDC_EDIT_DANG, m_CurInfo.dDang);
DDX_Text(pDX, IDC_EDIT_BIGQ, m_CurInfo.dBigQ);
DDX_Text(pDX, IDC_EDIT_NG, m_CurInfo.dNg);
DDX_Text(pDX, IDC_EDIT_RATEQ, m_CurInfo.dRateQ);
DDX_Text(pDX, IDC_EDIT_FEED_ELEV, m_CurInfo.dPtFeedElev);
DDX_Radio(pDX, IDC_RADIO_FEEDELE1, m_iFeedElev);
DDX_Text(pDX, IDC_EDIT_FEED, m_CurInfo.sFeedElev);
DDX_Text(pDX, IDC_EDIT_HOT, m_CurInfo.sHotElev);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewSanitaryDefineDlg, CDialog)
//{{AFX_MSG_MAP(CNewSanitaryDefineDlg)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_PREVIEW2, OnPreview2)
ON_BN_CLICKED(IDC_PREVIEW3, OnPreview3)
ON_BN_CLICKED(IDC_RADIO_TYPE1, OnRadioType1)
ON_BN_CLICKED(IDC_BUTTON_PICK1, OnButtonPick1)
ON_BN_CLICKED(IDC_BUTTON_PICK2, OnButtonPick2)
ON_BN_CLICKED(IDC_BUTTON_PICK3, OnButtonPick3)
ON_BN_CLICKED(IDC_BUTTON_DANG, OnButtonDang)
ON_BN_CLICKED(IDC_RADIO_TYPE3, OnRadioType3)
ON_BN_CLICKED(IDC_BUTTON_PICK4, OnButtonPick4)
ON_BN_CLICKED(IDC_BUTTON_NG, OnButtonNg)
ON_BN_CLICKED(IDC_RADIO_TYPE4, OnRadioType4)
ON_BN_CLICKED(IDC_RADIO_FEEDELE1, OnRadioFeedele1)
ON_BN_CLICKED(IDC_RADIO_FEEDELE2, OnRadioFeedele2)
ON_BN_CLICKED(IDC_PREVIEW_PIC1, OnPreviewPic1)
ON_BN_CLICKED(IDC_PREVIEW_PIC2, OnPreviewPic2)
ON_BN_CLICKED(IDC_PREVIEW_PIC3, OnPreviewPic3)
ON_BN_CLICKED(IDC_PREVIEW_PIC4, OnPreviewPic4)
ON_BN_CLICKED(IDC_PREVIEW_PIC5, OnPreviewPic5)
ON_BN_CLICKED(IDC_PREVIEW_PIC6, OnPreviewPic6)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BTN_SEL_TYPE, OnBtnSelType)
ON_WM_VSCROLL()
ON_WM_MOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//幻灯片数组
UINT pic[6] = {
IDC_PREVIEW_PIC1,
IDC_PREVIEW_PIC2,
IDC_PREVIEW_PIC3,
IDC_PREVIEW_PIC4,
IDC_PREVIEW_PIC5,
IDC_PREVIEW_PIC6,
};
//幻灯片按钮数组
UINT btn[6] = {
IDC_BUTTON1,
IDC_BUTTON2,
IDC_BUTTON3,
IDC_BUTTON4,
IDC_BUTTON5,
IDC_BUTTON6,
};
BOOL CNewSanitaryDefineDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_CurInfo.Clear();
m_entInfo.Clear();
m_DbInfo.Clear();
m_bIsInitDlg = true;
GetPicFromDB();
SetPreviewPic();
m_pDlgPic = new CSanitaryPicDlg;
pDXSave = new CDataExchange(this, TRUE);
pDXLoad = new CDataExchange(this, FALSE);
//获取实体本身扩展数据
CString csTmp1, csTmp2, sDwbName, sHotElev, sFeedElev;
double nTmp, dEle(0);
if (m_nDataSourceType == 1 || m_nDataSourceType == 0)
{
//从注册表读取大类连接方式
CString sSanitaryType;
sSanitaryType.Format(_T("SanitaryType%.0d"), m_iSanitaryType);
if (!ReadRegData(sSanitaryType, m_iType))
{
m_iType = 0;
}
GetSanitaryInfo(m_ent, m_ptHeatFeed, csTmp1, csTmp2, nTmp, m_CurInfo.dDang, m_CurInfo.dBigQ, dEle, 1,
sDwbName, sFeedElev, sHotElev);
m_CurInfo.sHotElev = sHotElev;
GetSanitaryInfo(m_ent, m_ptFeed, csTmp1, csTmp2, nTmp, m_CurInfo.dDang, m_CurInfo.dRateQ, m_CurInfo.dPtFeedElev, 0,
sDwbName, sFeedElev, sHotElev);
{
m_CurInfo.sSysBlk1 = csTmp2;
}
m_CurInfo.sFeedElev = sFeedElev;
GetSanitaryInfo(m_ent, m_ptDrain, csTmp1, csTmp2, nTmp, m_CurInfo.dNg, m_CurInfo.dBigQ, dEle, 2,
sDwbName, sFeedElev, sHotElev);
{
m_CurInfo.sSysBlk2 = csTmp2;
}
m_CurInfo.sDwbName = sDwbName;
}
else// 读取本地数据
{
GetLocSanitaryData(m_ent, m_CurInfo, m_ptFeed, m_ptHeatFeed, m_ptDrain, m_ptDriection);
m_csBlkName = m_CurInfo.sFeedSys;
if(m_csBlkName == _T("$TWTSYS$00000225"))
{
m_iType = 0;
}
else if(m_csBlkName == _T("$TWTSYS$00000519"))
{
m_iType = 1;
}
else if(m_csBlkName == _T("$TWTSYS$00000320"))
{
m_iType = 2;
}
m_CurInfo.sDwbName = _T("");
}
SetEntInfo();
UpdateData(FALSE);
int iRet = m_entInfo.CheckEntInfo();
if (iRet == 0)
{
m_iCurPos = 1;
m_iCurPic = 0;
GetDataFromDB(m_iCurPic);
m_CurInfo = m_DbInfo;
}
else if (iRet == 1)
{
m_iCurPos = 1;
m_iCurPic = -1;
}
else
{
SetSelPic();
GetDataFromDB(m_iCurPic);
}
if (!m_ptHeatFeed || m_CurInfo.sHotElev.IsEmpty())//无热给水点,设定热给水管标高显示框为灰
{
m_CurInfo.sHotElev = _T("");
m_wndHeatPipe.EnableWindow(FALSE);
}
else
{
m_wndHeatPipe.EnableWindow(TRUE);
}
//初始化滚动条
CWnd *pScroll = GetDlgItem(IDC_SCROLLBAR1);
if (m_vecPic.size() <= 6)
{
pScroll->ShowWindow(SW_HIDE);
}
else
{
pScroll->ShowWindow(SW_SHOW);
m_wndScroll.SetScrollRange(1, (m_vecPic.size() / 6) + 1, TRUE);
m_wndScroll.SetScrollPos(m_iCurPos);
}
UpdateData(FALSE);
OpenSlide();
if (m_CurInfo.dPtFeedElev > 0.001)
{
m_iFeedElev = 1;
}
else
{
m_CurInfo.dPtFeedElev = -1;
m_iFeedElev = 0;
}
CWnd *pWnd = GetDlgItem(IDC_EDIT_FEED_ELEV);
if(m_iFeedElev == 0)
pWnd->EnableWindow(FALSE);
else
pWnd->EnableWindow(TRUE);
UpdateData(FALSE);
return TRUE;
}
void CNewSanitaryDefineDlg::SetDataSourceType(int nDataSource)
{
m_nDataSourceType = nDataSource;
}
void CNewSanitaryDefineDlg::SetEntInfo()
{
m_entInfo = m_CurInfo;
}
//设定选中图片名
void CNewSanitaryDefineDlg::SetPic(CString &sPic)
{
m_CurInfo.sDwbName = sPic;
}
//对幻灯片按照名字进行排序
bool SortPicSerial(CString str1, CString str2)
{
int iIndex = str1.Find(_T("-"));
str1 = str1.Right(str1.GetLength() - iIndex - 1);
double dSerial1 = _tstof(str1);
iIndex = str2.Find(_T("-"));
str2 = str2.Right(str2.GetLength() - iIndex - 1);
double dSerial2 = _tstof(str2);
if (dSerial1 - dSerial2 > 0.0)
{
return false;
}
return true;
}
//从数据库读取大类的所有小类
void CNewSanitaryDefineDlg::GetPicFromDB()
{
m_vecPic.clear();
CodeBase db;
XString fullFile;
if(!FindFile(_T("Sanitary.dbf"), fullFile))
{
AfxMessageBox(_T("读取Sanitary.dbf文件错误!"));
return;
}
CString sName;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return;
}
CString sType;
double dType = 0.0;
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
{
GET_FIELD(pTable, _T("Type"), sType);
dType = _tstof(sType);
if (fabs(dType - m_iSanitaryType) == 0)
{
GET_FIELD(pTable, _T("Page"), sName);
m_vecPic.push_back(sName);
}
}
sort(m_vecPic.begin(), m_vecPic.end(), SortPicSerial);
}
//设定选定图片的位置,设置该类型为当前选中状态
void CNewSanitaryDefineDlg::SetSelPic()
{
std::vector<CString>::iterator it = m_vecPic.begin();
int iPos = 0;
for (; it != m_vecPic.end(); it ++)
{
if (m_CurInfo.sDwbName.Compare(*it) == 0)
{
if (iPos < 6)
{
m_iSelPos = 1;
m_iCurPic = iPos;
}
else if (iPos >= 6 && iPos < 12)
{
m_iSelPos = 2;
m_iCurPic = iPos - 6;
}
else if (iPos >= 12 )
{
m_iSelPos = 3;
m_iCurPic = iPos - 12;
}
m_iCurPos = m_iSelPos;
break;
}
iPos ++;
}
SetPreviewPic();
}
//初始化幻灯片和按钮内容
void CNewSanitaryDefineDlg::SetPreviewPic()
{
//根据当前的滚动条位置和大类类型 设定相应的幻灯片
SetSanitaryPos();
SetBtnText();
}
//设置当前显示的幻灯片
void CNewSanitaryDefineDlg::SetSanitaryPos()
{
int iPos = (m_iCurPos - 1) * 6;
int iNum = m_vecPic.size();
for (int i = 0; i < 6; i++)
{
if (iPos < iNum)
{
m_sPic[i] = m_vecPic[iPos];
iPos++;
}
else
{
m_sPic[i] = _T("");
}
}
}
//设置按钮文字
void CNewSanitaryDefineDlg::SetBtnText()
{
for (int i = 0; i < 6; i++)
{
CWnd *pWnd = GetDlgItem(btn[i]);
pWnd->SetWindowText(m_sPic[i]);
CString sName;
CWnd *pImageBox = GetDlgItem(pic[i]);
sName.Format(_T("SanitaryAtlas("));
sName += m_sPic[i];
sName += _T(")");
m_sPicName[i] = sName;
DrawSlide(sName, pImageBox);
if (m_sPic[i].IsEmpty())
{
m_sPicName[i] = _T("");
pWnd->ShowWindow(SW_HIDE);
pImageBox->ShowWindow(SW_HIDE);
}
else
{
pWnd->ShowWindow(SW_SHOW);
pImageBox->ShowWindow(SW_SHOW);
}
}
}
void CNewSanitaryDefineDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
m_iCurPos = pScrollBar->GetScrollPos();
switch(nSBCode) //处理滚动信息
{
case SB_LINEUP: //向上的箭头被按下
{
if (m_iCurPos > 1)
{
m_iCurPos--;
}
break;
}
case SB_LINEDOWN: //向下的箭头被按下
{
if (m_iCurPos < 3)
{
m_iCurPos++;
}
break;
}
case SB_THUMBTRACK: //鼠标拖动
{
m_iCurPos = nPos;
break;
}
}
pScrollBar->SetScrollPos(m_iCurPos); //更新信息
SetPreviewPic();
SetPicSelBColor();
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CNewSanitaryDefineDlg::OnPaint()
{
CPaintDC dc(this);
OpenSlide();
}
void CNewSanitaryDefineDlg::OpenSlide()
{
SetPreviewPic();
CWnd *pImageBox1 = GetDlgItem(IDC_PREVIEW2);
CWnd *pImageBox2 = GetDlgItem(IDC_PREVIEW3);
CWnd *pImageBox3 = GetDlgItem(IDC_PREVIEW1);
DrawSlide((const TCHAR*)m_CurInfo.sSysBlk1, pImageBox1);
DrawSlide((const TCHAR*)m_CurInfo.sSysBlk2, pImageBox2);
CString csTmp;
if(m_iType == 0)
{
m_csBlkName = _T("$TWTSYS$00000225");
csTmp = _T("TWTSYS(00000225)");
}
else if(m_iType == 1)
{
m_csBlkName = _T("$TWTSYS$00000519");
csTmp = _T("TWTSYS(00000519)");
}
else if(m_iType == 2)
{
m_csBlkName = _T("$TWTSYS$00000320");
csTmp = _T("TWTSYS(00000320)");
}
m_CurInfo.sFeedSys = m_csBlkName;
DrawSlide((const TCHAR*)csTmp, pImageBox3);
SetPicSelBColor();
}
//设置选定幻灯片背景色
void CNewSanitaryDefineDlg::SetPicSelBColor()
{
CWnd *pBtn = GetDlgItem(btn[m_iCurPic]);
CWnd *pOk = GetDlgItem(IDOK);
if (m_iCurPos == m_iSelPos)
{
pBtn->SetFocus();
}
else
{
pOk->SetFocus();
}
CWnd *pImageBox = GetDlgItem(pic[m_iCurPic]);
if (pImageBox != NULL)
{
CDC* pDC = pImageBox->GetDC();
CRect rc;
pImageBox->GetClientRect(&rc);
CImageDC* pImageDC = new CImageDC;
if (m_iCurPos == m_iSelPos)
{
pImageDC->InitDC(pDC, rc, RGB(24, 116, 205));
}
else
{
pImageDC->InitDC(pDC, rc, GetAcadBackColor());
}
pImageDC->PaintSlide(m_sPicName[m_iCurPic]);
pImageDC->SetDC(pDC);
pImageBox->ReleaseDC(pDC);
}
}
void CNewSanitaryDefineDlg::OnPreview3()
{
CTemporaryResourceOverride vTemp;
CSelectBlkDlg dlg;
dlg.m_csTkName = _T("TWTSYS");
dlg.m_csType = _T("排水点\\90度");
CWnd *pWnd = GetDlgItem(IDC_PREVIEW3);
CRect rect;
dlg.m_staticSlide.m_csCurRecord = m_CurInfo.sSysBlk2;
pWnd->GetWindowRect(&rect);
dlg.m_ptBase = rect.TopLeft();
if(dlg.DoModal() == IDOK){
CString csRet = dlg.m_staticSlide.m_csCurRecord;
XString xsTKName, xsRocord;
SplitSlbName(csRet, xsTKName, xsRocord);
csRet.Format(_T("%s(%s)"), dlg.m_csTkName, xsRocord);
m_CurInfo.sSysBlk2 = csRet;
OpenSlide();
}
}
void CNewSanitaryDefineDlg::OnPreview2()
{
CTemporaryResourceOverride vTemp;
CSelectBlkDlg dlg;
dlg.m_staticSlide.m_iRowNum = 4;
dlg.m_staticSlide.m_iColNum = 4;
dlg.m_csTkName = _T("TWTSYS");
dlg.m_csType = _T("给水点\\90度");
CWnd *pWnd = GetDlgItem(IDC_PREVIEW2);
CRect rect;
dlg.m_staticSlide.m_csCurRecord = m_CurInfo.sSysBlk1;
pWnd->GetWindowRect(&rect);
dlg.m_ptBase = rect.TopLeft();
if(dlg.DoModal() == IDOK){
CString csRet = dlg.m_staticSlide.m_csCurRecord;
XString xsTKName, xsRocord;
SplitSlbName(csRet, xsTKName, xsRocord);
csRet.Format(_T("%s(%s)"), dlg.m_csTkName, xsRocord);
m_CurInfo.sSysBlk1 = csRet;
OpenSlide();
}
}
void CNewSanitaryDefineDlg::OnRadioType1()
{
m_iType = 2;
OpenSlide();
}
void CNewSanitaryDefineDlg::OnRadioType3()
{
m_iType = 0;
OpenSlide();
}
void CNewSanitaryDefineDlg::OnRadioType4()
{
m_iType = 1;
OpenSlide();
}
//获取冷水给水点位置
void CNewSanitaryDefineDlg::OnButtonPick1()
{
HideDialog(this, TRUE);
bool bIsBig = false;
if (m_pDlgPic->m_hWnd)//判断当前幻灯片是否处于放大状态
{
bIsBig = true;
m_pDlgPic->DestroyWindow();
}
XPoint ptCen, pt1, pt2;
m_ent.GetExtend(pt1, pt2);
XLine line(pt1, pt2, 1);
line.MidPoint(ptCen);
if(!!m_ptFeed){
ptCen = m_ptFeed;
m_ptFeed = XPoint();
}
while(!m_ptFeed){
int ret = ads_getpoint(Wcs2Ucs(ptCen), _T("\n请点取冷水给水点位置:<中心>"), m_ptFeed);
m_ptFeed = Ucs2Wcs(m_ptFeed);
if(ret == RTNONE)
m_ptFeed = ptCen;
}
HideDialog(this, FALSE);
if (bIsBig)
{
m_pDlgPic->Create(IDD_SANITARY_PIC, this);
m_pDlgPic->ShowWindow(SW_SHOW);
}
}
//获取热水给水点位置
void CNewSanitaryDefineDlg::OnButtonPick4()
{
HideDialog(this, TRUE);
bool bIsBig = false;
if (m_pDlgPic->m_hWnd)
{
bIsBig = true;
m_pDlgPic->DestroyWindow();
}
XPoint ptCen, pt1, pt2;
m_ent.GetExtend(pt1, pt2);
XLine line(pt1, pt2, 1);
line.MidPoint(ptCen);
if(!!m_ptHeatFeed){
ptCen = m_ptHeatFeed;
m_ptHeatFeed = XPoint();
}
while(!m_ptHeatFeed){
int ret = ads_getpoint(Wcs2Ucs(ptCen), _T("\n请点取热水给水点位置:<中心>"), m_ptHeatFeed);
m_ptHeatFeed = Ucs2Wcs(m_ptHeatFeed);
if(ret == RTNONE)
m_ptHeatFeed = ptCen;
if (ret == RTNORM)
{
if (m_iCurPic >= 0)
{
GetDataFromDB(m_iCurPic);
}
m_CurInfo.sHotElev = m_DbInfo.sHotElev;
m_wndHeatPipe.EnableWindow(TRUE);
DDX_Text(pDXLoad, IDC_EDIT_HOT, m_CurInfo.sHotElev);
if (m_iSanitaryType == 1)
{
m_CurInfo.dDang = 0.5;
m_CurInfo.dRateQ = 0.1;
}
else if (m_iSanitaryType == 8)
{
m_CurInfo.dDang = 0.7;
m_CurInfo.dRateQ = 0.14;
}
else if (m_iSanitaryType == 10)
{
m_CurInfo.dDang = 0.35;
m_CurInfo.dRateQ = 0.07;
}
DDX_Text(pDXLoad, IDC_EDIT_DANG, m_CurInfo.dDang);
DDX_Text(pDXLoad, IDC_EDIT_RATEQ, m_CurInfo.dRateQ);
}
}
HideDialog(this, FALSE);
if (bIsBig)
{
m_pDlgPic->Create(IDD_SANITARY_PIC, this);
m_pDlgPic->ShowWindow(SW_SHOW);
}
}
//获取排水点位置
void CNewSanitaryDefineDlg::OnButtonPick2()
{
HideDialog(this, TRUE);
bool bIsBig = false;
if (m_pDlgPic->m_hWnd)
{
bIsBig = true;
m_pDlgPic->DestroyWindow();
}
XPoint ptCen, pt1, pt2;
m_ent.GetExtend(pt1, pt2);
XLine line(pt1, pt2, 1);
line.MidPoint(ptCen);
if(!!m_ptDrain){
ptCen = m_ptDrain;
m_ptDrain = XPoint();
}
while(!m_ptDrain){
int ret = ads_getpoint(Wcs2Ucs(ptCen), _T("\n请点取排水点位置:<中心>"), m_ptDrain);
m_ptDrain = Ucs2Wcs(m_ptDrain);
if(ret == RTNONE)
m_ptDrain = ptCen;
}
HideDialog(this, FALSE);
if (bIsBig)
{
m_pDlgPic->Create(IDD_SANITARY_PIC, this);
m_pDlgPic->ShowWindow(SW_SHOW);
}
}
void CNewSanitaryDefineDlg::OnButtonPick3()
{
HideDialog(this, TRUE);
bool bIsBig = false;
if (m_pDlgPic->m_hWnd)
{
bIsBig = true;
m_pDlgPic->DestroyWindow();
}
TCHAR szBlkName[256];
m_ent.GetData(2, szBlkName);
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("INSERT"), 8, _T("*"), 2, szBlkName, -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("AEC_BLOCK_INSERT"), 8, _T("*"), 2, szBlkName, -4, _T("and>"),
-4, _T("or>"), NULL);
XPoint ptPick1;
Entity ent;
if(SelectEntity1(_T("\n请选择洁具图块上的排水圆圈:<退出>"), ent, ptPick1, rbMask) == RTNORM){
if(ent == m_ent){
m_id = GetPickCirByBlk(ent, ptPick1);
}
}
HideDialog(this, FALSE);
if (bIsBig)
{
m_pDlgPic->Create(IDD_SANITARY_PIC, this);
m_pDlgPic->ShowWindow(SW_SHOW);
}
}
void CNewSanitaryDefineDlg::OnButtonDang()
{
CTemporaryResourceOverride vTemp;
CSanitaryDangDlg dlg;
if(dlg.DoModal() == IDOK && dlg.m_nRet > 0){
m_CurInfo.dDang = dlg.m_nRet;
m_CurInfo.dRateQ = dlg.m_nRet2;
DDX_Text(pDXLoad, IDC_EDIT_DANG, m_CurInfo.dDang);
DDX_Text(pDXLoad, IDC_EDIT_RATEQ, m_CurInfo.dRateQ);
}
}
void CNewSanitaryDefineDlg::OnButtonNg()
{
CTemporaryResourceOverride vTemp;
CSanitaryDangDlg dlg;
dlg.m_iMode = 1;
if(dlg.DoModal() == IDOK){
m_CurInfo.dNg = dlg.m_nRet;
m_CurInfo.dBigQ = dlg.m_nRet2;
DDX_Text(pDXLoad, IDC_EDIT_NG, m_CurInfo.dNg);
DDX_Text(pDXLoad, IDC_EDIT_BIGQ, m_CurInfo.dBigQ);
}
}
void CNewSanitaryDefineDlg::OnRadioFeedele1()
{
DDX_Text(pDXSave, IDC_EDIT_FEED_ELEV, m_CurInfo.dPtFeedElev);//更新给水点标高编辑框数据
CWnd *pWnd = GetDlgItem(IDC_EDIT_FEED_ELEV);
m_CurInfo.dPtFeedElev = -1;
pWnd->EnableWindow(FALSE);
DDX_Text(pDXLoad, IDC_EDIT_FEED_ELEV, m_CurInfo.dPtFeedElev);
}
void CNewSanitaryDefineDlg::OnRadioFeedele2()
{
DDX_Text(pDXSave, IDC_EDIT_FEED_ELEV, m_CurInfo.dPtFeedElev);
CWnd *pWnd = GetDlgItem(IDC_EDIT_FEED_ELEV);
pWnd->EnableWindow(TRUE);
if (m_iCurPic >= 0)
{
m_CurInfo.dPtFeedElev = m_DbInfo.dPtFeedElev;
}
DDX_Text(pDXLoad, IDC_EDIT_FEED_ELEV, m_CurInfo.dPtFeedElev);
}
//放大幻灯片
void CNewSanitaryDefineDlg::OnPreviewPic(const int iIndex)
{
CTemporaryResourceOverride vTemp;
CRect rect;
CWnd *pWndPic = GetDlgItem(IDC_STATIC_SEL);
pWndPic->GetWindowRect(&rect);
m_pDlgPic->SetDlgPos(rect);
m_pDlgPic->SetBlkName(m_sPicName[iIndex]);
m_pDlgPic->Create(IDD_SANITARY_PIC, this);
::SetWindowPos(m_pDlgPic->m_hWnd,HWND_TOP,0,0,0,0,SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE);//设定本窗口在程序主窗口中置顶
m_pDlgPic->ShowWindow(SW_SHOW);
}
BOOL CNewSanitaryDefineDlg::PreTranslateMessage(MSG* pMsg)
{
if(WM_LBUTTONDBLCLK == pMsg->message)
{
for (int i = 0; i < 6; i++)
{
CStatic* pStatic = (CStatic*)GetDlgItem(pic[i]);
ASSERT(pStatic);
CRect rect;
pStatic->GetWindowRect(&rect);
if(rect.PtInRect(pMsg->pt))
{
OnPreviewPic(i);
break;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CNewSanitaryDefineDlg::OnPreviewPic1()
{
TranslateData(0);
}
void CNewSanitaryDefineDlg::OnPreviewPic2()
{
TranslateData(1);
}
void CNewSanitaryDefineDlg::OnPreviewPic3()
{
TranslateData(2);
}
void CNewSanitaryDefineDlg::OnPreviewPic4()
{
TranslateData(3);
}
void CNewSanitaryDefineDlg::OnPreviewPic5()
{
TranslateData(4);
}
void CNewSanitaryDefineDlg::OnPreviewPic6()
{
TranslateData(5);
}
//从数据库读取数据
void CNewSanitaryDefineDlg::GetDataFromDB(const int iIndex)
{
if (iIndex < 0)
{
return;
}
CString sPicName = m_sPic[iIndex];
CodeBase db;
XString fullFile;
if(!FindFile(_T("Sanitary.dbf"), fullFile))
{
AfxMessageBox(_T("读取Sanitary.dbf文件错误!"));
return;
}
CString sName;
CString sFeedBlk, sFeedSys, sFeedPtEle, sFeedPipe, sHeatPipe, sDrainBlk, sFeedNG, sFeedQ, sDrainNG, sDrainQ;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return;
}
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
{
GET_FIELD(pTable, _T("Page"), sName);
if(sName.Compare(sPicName) == 0)
{
m_DbInfo.sDwbName = sPicName;
GET_FIELD(pTable, _T("Feedsys"), sFeedSys);
CString csTK, csRecord;
SplitBlkStr(sFeedSys, csTK, csRecord);
m_DbInfo.sSysBlk1.Format(_T("TWTSYS(%s)"), csRecord);
GET_FIELD(pTable, _T("Feedptele"), sFeedPtEle);
m_DbInfo.dPtFeedElev = _tstof(sFeedPtEle);
if (m_DbInfo.dPtFeedElev == -1)
{
m_iFeedElev = 0;
}
else
{
m_iFeedElev = 1;
}
CWnd *pWnd = GetDlgItem(IDC_EDIT_FEED_ELEV);
if(m_iFeedElev == 0)
pWnd->EnableWindow(FALSE);
else
pWnd->EnableWindow(TRUE);
GET_FIELD(pTable, _T("Feedpipe"), sFeedPipe);
m_DbInfo.sFeedElev = sFeedPipe;
GET_FIELD(pTable, _T("Heatpipe"), sHeatPipe);
if (sHeatPipe.Compare(_T("-999")) == 0)
{
sHeatPipe = _T("");
m_wndHeatPipe.EnableWindow(FALSE);
}
else
{
m_wndHeatPipe.EnableWindow(TRUE);
}
m_DbInfo.sHotElev = sHeatPipe;
GET_FIELD(pTable, _T("Drainblk"), sDrainBlk);
SplitBlkStr(sDrainBlk, csTK, csRecord);
m_DbInfo.sSysBlk2.Format(_T("TWTSYS(%s)"), csRecord);
GET_FIELD(pTable, _T("Feedng"), sFeedNG);
m_DbInfo.dDang = _tstof(sFeedNG);
GET_FIELD(pTable, _T("Feedq"), sFeedQ);
m_DbInfo.dRateQ = _tstof(sFeedQ);
GET_FIELD(pTable, _T("Drainng"), sDrainNG);
m_DbInfo.dNg = _tstof(sDrainNG);
GET_FIELD(pTable, _T("Drainq"), sDrainQ);
m_DbInfo.dBigQ = _tstof(sDrainQ);
return;
}
}
}
//更新当前幻灯片对应的数据
void CNewSanitaryDefineDlg::TranslateData(const int iIndex)
{
if (iIndex < 0)
{
return;
}
m_iSelPos2 = m_iSelPos;//记忆当前滚动条位置
m_iSelPos = m_iCurPos;
m_iCurPic2 = m_iCurPic;//记忆当前选中的图片
m_iCurPic = iIndex;
//记忆当前对话框数据
m_CurInfo2 = m_CurInfo;
if (m_iSelPos2 == m_iSelPos && m_iCurPic2 == m_iCurPic)//选中图片未改变
{
return;
}
else
{
GetDataFromDB(iIndex);
m_CurInfo = m_DbInfo;
UpdateData(FALSE);
OpenSlide();
}
}
void CNewSanitaryDefineDlg::OnButton1()
{
OnPreviewPic1();
}
void CNewSanitaryDefineDlg::OnButton2()
{
OnPreviewPic2();
}
void CNewSanitaryDefineDlg::OnButton3()
{
OnPreviewPic3();
}
void CNewSanitaryDefineDlg::OnButton4()
{
OnPreviewPic4();
}
void CNewSanitaryDefineDlg::OnButton5()
{
OnPreviewPic5();
}
void CNewSanitaryDefineDlg::OnButton6()
{
OnPreviewPic6();
}
void CNewSanitaryDefineDlg::OnCancel()
{
m_pDlgPic->DestroyWindow();
delete m_pDlgPic;
m_pDlgPic = NULL;
CDialog::OnCancel();
}
void CNewSanitaryDefineDlg::OnBtnSelType()
{
this->ShowWindow(SW_HIDE);
m_pDlgPic->DestroyWindow();
CTemporaryResourceOverride vTemp;
CNewSanitaryTypeDlg dlg;
if (dlg.DoModal() != IDOK)
{
CDialog::OnCancel();
return;
}
else
{
SetSanitaryType(dlg.GetSanitaryType());
m_iCurPos = 1;
m_iCurPic = -1;
OnInitDialog();
m_CurInfo.sDwbName = _T(""); // 对话框处于空选状态,图集号设定为空
UpdateData(FALSE);
}
this->ShowWindow(SW_SHOW);
}
void CNewSanitaryDefineDlg::OnOK()
{
if (!UpdateData())
{
return;
}
//大类连接方式写入注册表
CString sSanitaryType;
sSanitaryType.Format(_T("SanitaryType%.0d"), m_iSanitaryType);
WriteRegData(sSanitaryType, m_iType);
if (IsChanged())
{
CString sTmp = _T("是否修改");
sTmp += m_sPic[m_iCurPic];
sTmp += _T("卫生设备安装图集参数?");
int iRet = AfxMessageBox(sTmp, MB_YESNO);
if (iRet == IDYES)
{
UpdateDBdata();
}
}
m_pDlgPic->DestroyWindow();
delete m_pDlgPic;
m_pDlgPic = NULL;
CDialog::OnOK();
}
bool CNewSanitaryDefineDlg::IsChanged()//对比当前洁具数据和数据库数据是否相同,判定数据库是否需要更新
{
SetSelPic();
if (m_iCurPic < 0)
{
return false;
}
GetDataFromDB(m_iCurPic);
if (m_CurInfo.sDwbName == m_DbInfo.sDwbName
&& m_CurInfo.sSysBlk1 == m_DbInfo.sSysBlk1
&& m_CurInfo.sSysBlk2 ==m_DbInfo.sSysBlk2
&& fabs(m_CurInfo.dBigQ - m_DbInfo.dBigQ) <0.001
&& fabs(m_CurInfo.dDang - m_DbInfo.dDang) < 0.001
&& m_CurInfo.sFeedElev == m_DbInfo.sFeedElev
&& fabs(m_CurInfo.dNg - m_DbInfo.dNg) < 0.001
&& fabs(m_CurInfo.dPtFeedElev - m_DbInfo.dPtFeedElev) < 0.001
&& fabs(m_CurInfo.dRateQ - m_DbInfo.dRateQ) < 0.001)
{
if (!!m_ptHeatFeed)//若存在热给水点 判断热给水管标高
{
if (m_CurInfo.sHotElev == m_DbInfo.sHotElev)
{
return false;
}
return true;
}
return false;
}
return true;
}
void GetDwbSerial(CString &csBlk, CString &csRecord)
{
int iIndex = csBlk.Find(_T("("));
CString sTmp;
if (iIndex > 0)
{
sTmp = csBlk.Right(csBlk.GetLength() - iIndex - 1);
}
iIndex = 0;
iIndex = sTmp.Find(_T(")"));
if (iIndex > 0)
{
csRecord = sTmp.Left(iIndex);
}
}
void CNewSanitaryDefineDlg::UpdateDBdata()
{
if (m_iCurPic < 0)
{
return;
}
CString sPicName = m_sPic[m_iCurPic];
CodeBase db;
XString fullFile;
if(!FindFile(_T("Sanitary.dbf"), fullFile))
{
AfxMessageBox(_T("读取Sanitary.dbf文件错误!"));
return;
}
CString sName;
CString sFeedSys, sFeedPtEle, sFeedPipe, sHeatPipe, sDrainBlk, sFeedNG, sFeedQ, sDrainNG, sDrainQ;
XDbfTable *pTable = db.Open(fullFile);
if(!pTable)
{
return;
}
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext())
{
GET_FIELD(pTable, _T("Page"), sName);
if(sName.Compare(sPicName) == 0)
{
CString csRecord;
GetDwbSerial(m_CurInfo.sSysBlk1, csRecord);
sFeedSys.Format(_T("$TWTSYS$%s"), csRecord);
SET_FIELD(pTable, _T("Feedsys"), (const TCHAR*)sFeedSys);
sFeedPtEle.Format(_T("%.3f"), m_CurInfo.dPtFeedElev);
SET_FIELD(pTable, _T("Feedptele"), (const TCHAR*)sFeedPtEle);
SET_FIELD(pTable, _T("Feedpipe"), (const TCHAR*)m_CurInfo.sFeedElev);
sHeatPipe = m_CurInfo.sHotElev;
if (sHeatPipe.IsEmpty())
{
sHeatPipe.Format(_T("-999"));
}
SET_FIELD(pTable, _T("Heatpipe"), (const TCHAR*)sHeatPipe);
GetDwbSerial(m_CurInfo.sSysBlk2, csRecord);
sDrainBlk.Format(_T("$TWTSYS$%s"), csRecord);
SET_FIELD(pTable, _T("Drainblk"), (const TCHAR*)sDrainBlk);
sFeedNG.Format(_T("%.3f"), m_CurInfo.dDang);
SET_FIELD(pTable, _T("Feedng"), (const TCHAR*)sFeedNG);
sFeedQ.Format(_T("%.3f"), m_CurInfo.dRateQ);
SET_FIELD(pTable, _T("Feedq"), (const TCHAR*)sFeedQ);
sDrainNG.Format(_T("%.3f"), m_CurInfo.dNg);
SET_FIELD(pTable, _T("Drainng"), (const TCHAR*)sDrainNG);
sDrainQ.Format(_T("%.3f"), m_CurInfo.dBigQ);
SET_FIELD(pTable, _T("Drainq"), (const TCHAR*)sDrainQ);
return;
}
}
}
void CNewSanitaryDefineDlg::OnMove(int x, int y)
{
CDialog::OnMove(x, y);
if (m_pDlgPic && m_bIsInitDlg)
{
CRect rect;
CWnd *pWndPic = GetDlgItem(IDC_STATIC_SEL);
pWndPic->GetWindowRect(&rect);
m_pDlgPic->MoveWindow(rect);
}
}
double CNewSanitaryDefineDlg::SetSanitaryDriection(Entity ent)//设置洁具方向
{
AcDbObjectId Id = NULL;
acdbGetObjectId(Id, ent);
AcDbBlockReference *pBlkRef = NULL;
acdbOpenObject(pBlkRef, Id, AcDb::kForRead);
if(!pBlkRef)
return -1;
XPoint ptIns;
ptIns = pBlkRef->position();
pBlkRef->close();
XPoint ptDriection;
while (1)//重新定义方向
{
TArrowJig jig(ptIns);
if(jig.DoIt()==RTNORM)
{
acutPrintf(_T("\n洁具方向定义成功!"));
ptDriection = jig.m_ptEnd;
AcGeVector3d vt = ptDriection - ptIns;
vt.normalize();
m_ptDriection = ptIns + vt * 30;
SetSanitaryDirPt(ent, m_ptDriection, ptIns);
return GetEntDriection(ptIns, m_ptDriection);
}
}
}
// 洁具携带数据类
CSanitaryInfo::CSanitaryInfo()
{
dDang = 0.0;
dBigQ = 0.0;
dPtFeedElev = 0.0;
dNg = 0.0;
dRateQ = 0.0;
}
void CSanitaryInfo::Clear()
{
dDang = 0.0;
dBigQ = 0.0;
dPtFeedElev = 0.0;
dNg = 0.0;
dRateQ = 0.0;
sDwbName = _T("");
sSysBlk1 = _T("");
sSysBlk2 = _T("");
sFeedElev = _T("");
sHotElev = _T("");
}
// 0 无扩展数据 1 有扩展数据但无图集号 2 有扩展数据也有图集号
int CSanitaryInfo::CheckEntInfo()
{
if (sSysBlk1.Compare(_T("")) == 0
&& sSysBlk2.Compare(_T("")) == 0
&& fabs(dBigQ - 0.0) < 0.001
&& fabs(dDang - 0.0) < 0.001
&& sFeedElev.Compare(_T("")) == 0
&& fabs(dNg - 0.0) < 0.001
&& fabs(dPtFeedElev - 0.0) < 0.001
&& fabs(dRateQ - 0.0) < 0.001
&& sDwbName.Compare(_T("")) == 0
&& sHotElev.Compare(_T("")) == 0)
{
return 0;
}
else if (sDwbName.IsEmpty())
{
return 1;
}
else
{
return 2;
}
}