#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 vOrthoMode(_T("ORTHOMODE"), 1);//默认正交开 XPushVar 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(""), -4, _T(""), -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]:"), 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(""), -4, _T(""), -4, _T("or>"), NULL); PickSet ssAll(SS_FREE); ssAll.Get(_T("X"), NULL, NULL, rbMask2); long len = ssAll.Length(); for(long i=0;isetColorIndex(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::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(""), -4, _T(""), -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; } }