// DbWaterTank.cpp: implementation of the TDbWaterTank class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "DbWaterTank.h" #define PSCALE 100 // 管线加粗 extern Acad::ErrorStatus DrawPolyMesh(XPoint ptS, XPoint ptE, double nRadius, XExplodeDraw &dc); void GetPointList(XCurveSegment seg, int iNum, XPointList &lstPt, int mode) { if(mode == 0){ if(seg.Is(CURVE_LINE)){ XLine line = seg.GetLine(); double angLine = ads_angle(line.GetStartPoint(), line.GetEndPoint()); double distLine = line.GetLength() / iNum / 2; int n = 0; while(n < iNum){ XPoint ptTemp; ads_polar(line.GetStartPoint(), angLine, (2*n+1)*distLine, ptTemp); lstPt.NewAppend(ptTemp); n++; } } else if(seg.Is(CURVE_ARC)){ XArc arc = seg.GetArc(); double al = arc.GetEndAngle() - arc.GetStarAngle(); if(al < 0) al += 2 * PI; double distArc = al / iNum / 2; int n = 0; while(n < iNum){ XPoint ptTemp; ads_polar(arc.GetCenterPt(), (arc.GetStarAngle() + distArc*(1+ 2*n)), arc.GetRadius(), ptTemp); lstPt.NewAppend(ptTemp); n++; } } else if(seg.Is(CURVE_CIRCLE)){ XCircle cir = seg.GetCircle(); double al = 2 * PI; double start = -(PI/2); double distCir = al / iNum / 2; int n = 0; while(n < iNum){ XPoint ptTemp; ads_polar(cir.GetCenterPt(), (start + distCir*(1+ 2*n)), cir.GetRadius(), ptTemp); lstPt.NewAppend(ptTemp); n++; } } } else if(mode == 1){ if(iNum < 2) return; if(seg.Is(CURVE_LINE)){ XLine line = seg.GetLine(); double angLine = ads_angle(line.GetStartPoint(), line.GetEndPoint()); double distLine = line.GetLength() / (iNum - 1); int n = 0; while(n < iNum){ XPoint ptTemp; ads_polar(line.GetStartPoint(), angLine, n*distLine, ptTemp); lstPt.NewAppend(ptTemp); n++; } } else if(seg.Is(CURVE_ARC)){ XArc arc = seg.GetArc(); double al = arc.GetEndAngle() - arc.GetStarAngle(); if(al < 0) al += 2 * PI; double distArc = al / (iNum - 1); int n = 0; while(n < iNum){ XPoint ptTemp; ads_polar(arc.GetCenterPt(), (arc.GetStarAngle() + distArc*n), arc.GetRadius(), ptTemp); lstPt.NewAppend(ptTemp); n++; } } } } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// ACRX_DXF_DEFINE_MEMBERS(ATSWaterTank, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_WATERTANK, "ATS_WATERTANK图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbWaterTank); const Adesk::UInt8 TDbWaterTank::g_nVersion = 2; TDbWaterTank::TDbWaterTank() { m_bNeedHole = TRUE; m_bNeedSleeper = TRUE; m_iShape = 1; m_iShowType = 0; m_iSleeperNum = 3; m_iSleeperPos = 0; m_nHighLine = 0; m_nLowLine = 0; m_nHoleWidth = 0.25; m_nSleeperWidth = 0.1; m_nHeight = 3; m_nLength = 3; m_nWidth = 3; m_nSpare = 0.2; m_nRotation = 0; m_nOverfallEle = 0; m_nRushEle = 0; m_nWaterInEle = 0; m_bHoleIsRect = FALSE; } void TDbWaterTank::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag) { assertWriteEnabled(); TDbWaterTank *pSect = TDbWaterTank::cast(pSrc); if(pSect) { m_nHeight = pSect->m_nHeight; m_nLength = pSect->m_nLength; m_nWidth = pSect->m_nWidth; } TDbEntity::CopyPropertiesFrom(pSrc, gMatchFlag); } Acad::ErrorStatus TDbWaterTank::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 取得所有的夹点 Acad::ErrorStatus TDbWaterTank::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); gripPoints.append(m_ptLocation); if(m_iShowType == 0){ gripPoints.append(m_ptHoleInsert); if(!!m_ptOverfallStart && !!m_ptOverfallEnd){ gripPoints.append(m_ptOverfallStart); gripPoints.append(m_ptOverfallEnd); } } return Acad::eOk; } // 功能: 夹点操作 Acad::ErrorStatus TDbWaterTank::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); bool bMoveHole = false; // cet 2011.10.10 add AcGeMatrix3d mat; AcGeVector3d vtOffset=offset; //vtOffset.z=0; zxl modify 2012.12.03 支持z轴移动 mat.setToTranslation(vtOffset); int idx=0; for (int i = 0; i < indices.length(); i++) { idx = indices[i]; if(idx == 0){ m_ptLocation.TransformBy(mat); SetElev(m_ptLocation.z / 1000, false); // cet 2011.10.10 modify ucs下无进出管时,无需坐标变换,否则会绘制出进出管 // m_ptHoleInsert.TransformBy(mat); // m_ptOverfallStart.TransformBy(mat); // m_ptOverfallEnd.TransformBy(mat); // m_ptWaterIn1.TransformBy(mat); // m_ptWaterIn2.TransformBy(mat); if (!bMoveHole) { bMoveHole = true; m_ptHoleInsert.TransformBy(mat); } if (!!m_ptOverfallStart) { m_ptOverfallStart.TransformBy(mat); } if (!!m_ptOverfallEnd) { m_ptOverfallEnd.TransformBy(mat); } if (!!m_ptWaterIn1) { m_ptWaterIn1.TransformBy(mat); } if (!!m_ptWaterIn2) { m_ptWaterIn2.TransformBy(mat); } m_ptWaterInFrom.TransformBy(mat); } else if(idx == 1){ //m_ptHoleInsert.TransformBy(mat); cet 2011.10.10 modify if (!bMoveHole) { bMoveHole = true; m_ptHoleInsert.TransformBy(mat); } } else if(idx == 2){ m_ptOverfallStart.TransformBy(mat); } else if(idx == 3){ m_ptOverfallEnd.TransformBy(mat); } } Acad::ErrorStatus es=Acad::eOk; return es; } Acad::ErrorStatus TDbWaterTank::GetGripText(int idx, CString &cs) const { Acad::ErrorStatus es=Acad::eOk; switch(idx) { case 0: cs=_T("移动水箱"); break; case 1: cs=_T("移动人孔"); break; case 2: cs=_T("溢流管起点"); break; case 3: cs=_T("溢流管终点"); break; default: es=Acad::eInvalidInput; } return es; } // 从DWG读入数据: Acad::ErrorStatus TDbWaterTank::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbEntity::dwgInFields(pFiler); if(es != Acad::eOk) return es; Adesk::UInt8 nVer; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } pFiler->readItem((AcGePoint3d *)&m_ptLocation); pFiler->readItem((AcGePoint3d *)&m_ptHoleInsert); pFiler->readItem((AcGePoint3d *)&m_ptOverfallStart); pFiler->readItem((AcGePoint3d *)&m_ptOverfallEnd); pFiler->readItem((AcGePoint3d *)&m_ptWaterIn1); pFiler->readItem((AcGePoint3d *)&m_ptWaterIn2); pFiler->readItem((AcGePoint3d *)&m_ptWaterInFrom); //pFiler->readItem(&m_bNeedHole); //pFiler->readItem(&m_bNeedSleeper); FilerRead(pFiler, m_bNeedHole); FilerRead(pFiler, m_bNeedSleeper); pFiler->readItem(&m_iShape); pFiler->readItem(&m_iShowType); pFiler->readItem(&m_iSleeperNum); pFiler->readItem(&m_iSleeperPos); pFiler->readItem(&m_nHighLine); pFiler->readItem(&m_nLowLine); pFiler->readItem(&m_nHoleWidth); pFiler->readItem(&m_nSleeperWidth); pFiler->readItem(&m_nHeight); pFiler->readItem(&m_nLength); pFiler->readItem(&m_nWidth); pFiler->readItem(&m_nRotation); pFiler->readItem(&m_nOverfallEle); pFiler->readItem(&m_nRushEle); pFiler->readItem(&m_nWaterInEle); pFiler->readItem(&m_nSpare); pFiler->readItem(&m_idDashLayer); pFiler->readItem(&m_idBlock3d); if(nVer > 1){ //pFiler->readItem(&m_bHoleIsRect); FilerRead(pFiler, m_bHoleIsRect); pFiler->readItem(&m_iSpare); pFiler->readItem((AcGePoint3d *)&m_ptSpare); ReadString(pFiler,m_sSpare); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbWaterTank::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbEntity::dwgOutFields(pFiler); if(es != Acad::eOk) return es; // pFiler->writeItem(g_nVersion); if(g_nSaveTArchVer==7) pFiler->writeItem((Adesk::UInt8)1); else pFiler->writeItem(g_nVersion); pFiler->writeItem((const AcGePoint3d &)m_ptLocation); pFiler->writeItem((const AcGePoint3d &)m_ptHoleInsert); pFiler->writeItem((const AcGePoint3d &)m_ptOverfallStart); pFiler->writeItem((const AcGePoint3d &)m_ptOverfallEnd); pFiler->writeItem((const AcGePoint3d &)m_ptWaterIn1); pFiler->writeItem((const AcGePoint3d &)m_ptWaterIn2); pFiler->writeItem((const AcGePoint3d &)m_ptWaterInFrom); //pFiler->writeItem(m_bNeedHole); //pFiler->writeItem(m_bNeedSleeper); FilerWrite(pFiler, m_bNeedHole); FilerWrite(pFiler, m_bNeedSleeper); pFiler->writeItem(m_iShape); pFiler->writeItem(m_iShowType); pFiler->writeItem(m_iSleeperNum); pFiler->writeItem(m_iSleeperPos); pFiler->writeItem(m_nHighLine); pFiler->writeItem(m_nLowLine); pFiler->writeItem(m_nHoleWidth); pFiler->writeItem(m_nSleeperWidth); pFiler->writeItem(m_nHeight); pFiler->writeItem(m_nLength); pFiler->writeItem(m_nWidth); pFiler->writeItem(m_nRotation); pFiler->writeItem(m_nOverfallEle); pFiler->writeItem(m_nRushEle); pFiler->writeItem(m_nWaterInEle); pFiler->writeItem(m_nSpare); pFiler->writeItem(m_idDashLayer); pFiler->writeItem(m_idBlock3d); if(g_nSaveTArchVer>7){ //pFiler->writeItem(m_bHoleIsRect); FilerWrite(pFiler, m_bHoleIsRect); pFiler->writeItem(m_iSpare); pFiler->writeItem((const AcGePoint3d &)m_ptSpare); pFiler->writeItem((const TCHAR *)m_sSpare); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbWaterTank::dxfInFields(AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es=TDbEntity::dxfInFields(pFiler); return es; } Acad::ErrorStatus TDbWaterTank::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es=Acad::eOk; es=TDbEntity::dxfOutFields(pFiler); return es; } // Active when being rotated, scaled, moved, etc. Acad::ErrorStatus TDbWaterTank::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); m_ptLocation.TransformBy(xform); SetElev(m_ptLocation.z / 1000, false); // zxl 2012.12.03 add m_ptHoleInsert.TransformBy(xform); double nLength = m_nLength * 1000; double nWidth = m_nWidth * 1000; TDbRect rect1; rect1.SetSizeX(nLength); rect1.SetSizeY(nWidth); rect1.SetCenter(m_ptLocation); rect1.SetRotation(m_nRotation); XPoint ptLowLeft=rect1.GetLowLeft(); XPoint ptLowRight=rect1.GetLowRight(); ((AcGePoint3d &)ptLowLeft).transformBy(xform); ((AcGePoint3d &)ptLowRight).transformBy(xform); if(!!m_ptOverfallStart) m_ptOverfallStart.TransformBy(xform); if(!!m_ptOverfallEnd) m_ptOverfallEnd.TransformBy(xform); if(!!m_ptWaterIn1) m_ptWaterIn1.TransformBy(xform); if(!!m_ptWaterIn2) m_ptWaterIn2.TransformBy(xform); if(!!m_ptWaterInFrom) m_ptWaterInFrom.TransformBy(xform); m_nRotation=ads_angle(ptLowLeft, ptLowRight); Acad::ErrorStatus es=Acad::eOk; return es; } Acad::ErrorStatus TDbWaterTank::DrawCircleSect0(XExplodeDraw &dc) const { double nLength = m_nLength * 1000; double nHoleWidth = m_nHoleWidth * 1000; double nHeight = m_nHeight * 1000; double nWidth = m_nWidth * 1000; double nSleeperWidth = m_nSleeperWidth * 1000; TDbRect rect1; rect1.SetSizeX(nLength); rect1.SetSizeY(nHeight); rect1.SetCenter(m_ptLocation); rect1.SetRotation(m_nRotation); XLine line3(rect1.GetUpLeft(), rect1.GetLowLeft()); dc << line3; XLine line4(rect1.GetUpRight(), rect1.GetLowRight()); dc << line4; XLine line1(rect1.GetUpLeft(), rect1.GetUpRight()); XPoint ptTmp; ptTmp = line1.MidPoint(); ads_polar(ptTmp, m_nRotation+PI/2, 3*PSCALE, ptTmp); XArc arc(rect1.GetUpLeft(),ptTmp,rect1.GetUpRight()); dc << arc; XLine line2(rect1.GetLowLeft(), rect1.GetLowRight()); ptTmp = line2.MidPoint(); ads_polar(ptTmp, m_nRotation-PI/2, 3*PSCALE, ptTmp); XArc arc2(rect1.GetLowLeft(),ptTmp,rect1.GetLowRight()); dc << arc2; ads_polar(ptTmp, m_nRotation-PI/2, nWidth/2, ptTmp); TDbRect rect3; rect3.SetCenter(ptTmp); rect3.SetRotation(m_nRotation); rect3.SetSizeX(nSleeperWidth); rect3.SetSizeY(nWidth); rect3.ExplodeOrDraw2d(dc); ads_polar(rect1.GetLowLeft(), m_nRotation-PI/2, (nWidth+3*PSCALE)/2, ptTmp); ads_polar(ptTmp, m_nRotation, nSleeperWidth/2, ptTmp); TDbRect rect4; rect4.SetCenter(ptTmp); rect4.SetRotation(m_nRotation); rect4.SetSizeX(nSleeperWidth); rect4.SetSizeY(nWidth+3*PSCALE); rect4.ExplodeOrDraw2d(dc); ads_polar(rect1.GetLowRight(), m_nRotation-PI/2, (nWidth+3*PSCALE)/2, ptTmp); ads_polar(ptTmp, m_nRotation-PI, nSleeperWidth/2, ptTmp); TDbRect rect5; rect5.SetCenter(ptTmp); rect5.SetRotation(m_nRotation); rect5.SetSizeX(nSleeperWidth); rect5.SetSizeY(nWidth+3*PSCALE); rect5.ExplodeOrDraw2d(dc); return Acad::eOk; } //绘制水位线 Acad::ErrorStatus TDbWaterTank::DrawWaterLevel(XPoint pt1, XPoint pt2, double nScale, XExplodeDraw &dc) const { XLine line9(pt1, pt2, 1); double nAng = line9.Direction(); dc << line9; XPoint ptMid, p3, p4; ptMid = line9.MidPoint(); ads_polar(ptMid, nAng-PI/2, nScale/2, ptMid); ads_polar(ptMid, nAng, nScale*2, p3); ads_polar(ptMid, nAng, -nScale*2, p4); dc << XLine(p3, p4); ads_polar(ptMid, nAng-PI/2, nScale/2, ptMid); ads_polar(ptMid, nAng, nScale, p3); ads_polar(ptMid, nAng, -nScale, p4); dc << XLine(p3, p4); ads_polar(ptMid, nAng-PI/2, nScale/2, ptMid); ads_polar(ptMid, nAng, nScale/2, p3); ads_polar(ptMid, nAng, -nScale/2, p4); dc << XLine(p3, p4); return Acad::eOk; } void TDbWaterTank::DrawPLine(XPoint ptStart, XPoint ptEnd, XExplodeDraw &dc) const { XLine pLine(ptStart, ptEnd, 1); XCurveSegment seg; seg = pLine; XPoly2D poly; seg.AsPoly2D(poly); AcDbPolyline pline; PolyConvert(poly, pline); XAcGiViewDraw &viewDraw = (XAcGiViewDraw &)dc; int nNum = pline.numVerts(); if (nNum > 0) { for (int k=0;k 0){ XLine line1(m_ptWaterIn1, m_ptWaterInFrom, 1); TDbRect rect10; rect10.SetSizeX(nLength); rect10.SetSizeY(nWidth); rect10.SetCenter(m_ptLocation); rect10.SetRotation(m_nRotation); XLine line11(rect10.GetUpLeft(), rect10.GetUpRight(), 1); XLine line22(rect10.GetLowLeft(), rect10.GetLowRight(), 1); XLine line33(rect10.GetUpLeft(), rect10.GetLowLeft(), 1); XLine line44(rect10.GetUpRight(), rect10.GetLowRight(), 1); int ret1 = line1.Intersection(&line11, ptTmp1); int ret2 = line1.Intersection(&line22, ptTmp1); int ret3 = line1.Intersection(&line33, ptTmp1); int ret4 = line1.Intersection(&line44, ptTmp1); double nAngle(0); if(ret1 == 1) nAngle = PI; double nValveLen = PSCALE*2; if(ret3 == 1 || ret4 == 1){ ptTmp1 = m_ptWaterIn1; ptTmp1.Project(&line44, ptTmp2); double nDist = ads_distance(rect10.GetUpRight(), ptTmp2); ads_polar(rect1.GetLowLeft(), m_nRotation, nDist, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); dc << XCircle(ptTmp2, PSCALE/2); ptTmp1 = m_ptWaterIn2; ptTmp1.Project(&line44, ptTmp2); nDist = ads_distance(rect10.GetUpRight(), ptTmp2); ads_polar(rect1.GetLowLeft(), m_nRotation, nDist, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); dc << XCircle(ptTmp2, PSCALE/2); } else if(ret1 == 1 || ret2 == 1){ ptTmp1 = m_ptWaterIn1; ptTmp1.Project(&line44, ptTmp2); double nDist = ads_distance(rect10.GetUpRight(), ptTmp2); ads_polar(rect1.GetLowLeft(), m_nRotation, nDist, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); ads_polar(ptTmp2, m_nRotation+nAngle, line1.GetLength(), ptTmp6); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen, ptTmp5); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen/2*3, ptTmp3); DrawPLine(ptTmp2, ptTmp3, dc); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen/2, ptTmp3); DrawPLine(ptTmp3, ptTmp6, dc); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp5); rect2.SetRotation(m_nRotation+nAngle); dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); ads_polar(ptTmp2, m_nRotation+nAngle, -PSCALE/2, ptTmp2); TDbRect rect3; rect3.SetSizeX(nValveLen/2); rect3.SetSizeY(nValveLen/2); rect3.SetCenter(ptTmp2); rect3.SetRotation(m_nRotation); rect3.ExplodeOrDraw2d(dc); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp6); ads_polar(ptTmp6, m_nRotation+PI/2, PSCALE/2, ptTmp5); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp5, m_nRotation+nAngle, -PSCALE/2*3, ptTmp6); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp6, m_nRotation-PI/2, PSCALE, ptTmp5); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp5, m_nRotation+nAngle/2+PI/4*5, PSCALE*2, ptTmp6); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp6, m_nRotation+nAngle/2+PI/4*5, PSCALE/4, ptTmp6); dc << XCircle(ptTmp6, PSCALE/4); } } if(!!m_ptOverfallStart && !!m_ptOverfallEnd && m_nHighLine > 0){ XLine line1(m_ptOverfallStart, m_ptOverfallEnd, 1); double nAngle(0); TDbRect rect10; rect10.SetSizeX(nLength); rect10.SetSizeY(nWidth); rect10.SetCenter(m_ptLocation); rect10.SetRotation(m_nRotation); XLine line11(rect10.GetUpLeft(), rect10.GetUpRight(), 1); XLine line22(rect10.GetLowLeft(), rect10.GetLowRight(), 1); XLine line33(rect10.GetUpLeft(), rect10.GetLowLeft(), 1); XLine line44(rect10.GetUpRight(), rect10.GetLowRight(), 1); int ret1 = line1.Intersection(&line11, ptTmp1); int ret2 = line1.Intersection(&line22, ptTmp1); int ret3 = line1.Intersection(&line33, ptTmp1); int ret4 = line1.Intersection(&line44, ptTmp1); if(ret1 == 1) nAngle = PI; TDbRect rect0; rect0.SetSizeX(nLength); rect0.SetSizeY(nWidth); rect0.SetCenter(m_ptLocation); rect0.SetRotation(m_nRotation); // cet 2011.11.2 del // XLine line9(rect0.GetUpRight(), rect0.GetLowRight(), 1); // ptTmp1 = m_ptOverfallStart; // ptTmp1.Project(&line9, ptTmp2); double nDist = ads_distance(rect0.GetUpRight(), ptTmp2); // cet 2011.11.2 modify // ads_polar(rect1.GetUpLeft(), 0, nDist, ptTmp2); // ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); // ptTmp2.y = ptTmp3.y; AcGeVector3d vtTemp = rect1.GetUpRight() - rect1.GetLowRight(); ads_polar(rect1.GetUpLeft(), m_nRotation, nDist, ptTmp2); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); XLine lineTemp(ptTmp3, ptTmp3 + vtTemp, 0); ptTmp2.Project(&lineTemp, ptTmp2); if(ret1 == 1 || ret2 == 1){ double nValveLen = PSCALE*2; ptTmp6 = ptTmp2; //绘制溢流口 ads_polar(ptTmp2, m_nRotation, -PSCALE/4, ptTmp1); ads_polar(ptTmp2, m_nRotation, PSCALE/4, ptTmp3); dc << XLine(ptTmp1, ptTmp3); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp2); ads_polar(ptTmp2, m_nRotation, -PSCALE/2, ptTmp4); ads_polar(ptTmp2, m_nRotation, PSCALE/2, ptTmp5); dc << XLine(ptTmp4, ptTmp5); dc << XLine(ptTmp1, ptTmp4); dc << XLine(ptTmp3, ptTmp5); //绘制溢流管 ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nOverfallEle*1000, ptTmp3); //cet 2011.11.2 modify //ptTmp2.y = ptTmp3.y; vtTemp = rect1.GetUpLeft() - rect1.GetUpRight(); lineTemp.SetPoints(ptTmp3, ptTmp3 + vtTemp); ptTmp2.Project(&lineTemp, ptTmp2); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(ptTmp2, m_nRotation+nAngle, line1.GetLength(), ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nRushEle*1000, ptTmp3); ptTmp2 = ptTmp6; //cet 2011.11.2 modify //ptTmp2.y = ptTmp3.y; lineTemp.SetPoints(ptTmp3, ptTmp3 + vtTemp); ptTmp2.Project(&lineTemp, ptTmp2); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(ptTmp2, m_nRotation+nAngle+PI, PSCALE, ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(ptTmp2, m_nRotation+nAngle, line1.GetLength(), ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(ptTmp2, m_nRotation+nAngle+PI, PSCALE*2, ptTmp2); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp2); rect2.SetRotation(m_nRotation); dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); ads_polar(ptTmp2, m_nRotation+nAngle+PI, PSCALE, ptTmp2); ads_polar(ptTmp2, m_nRotation+nAngle+PI, line1.GetLength()-PSCALE*3, ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); } else if(ret3 == 1 || ret4 == 1){ //绘制溢流口 ptTmp6 = ptTmp2; ads_polar(ptTmp2, m_nRotation, -PSCALE/4, ptTmp1); ads_polar(ptTmp2, m_nRotation, PSCALE/4, ptTmp3); dc << XLine(ptTmp1, ptTmp3); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp2); ads_polar(ptTmp2, m_nRotation, -PSCALE/2, ptTmp4); ads_polar(ptTmp2, m_nRotation, PSCALE/2, ptTmp5); dc << XLine(ptTmp4, ptTmp5); dc << XLine(ptTmp1, ptTmp4); dc << XLine(ptTmp3, ptTmp5); //绘制溢流管 ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nOverfallEle*1000, ptTmp3); //cet 2011.11.2 modify //ptTmp3.x = ptTmp6.x; vtTemp = rect1.GetUpLeft() - rect1.GetUpRight(); lineTemp.SetPoints(ptTmp6, ptTmp6 + vtTemp); ptTmp3.Project(&lineTemp, ptTmp3); ads_polar(ptTmp3, m_nRotation+PI/2, PSCALE/2, ptTmp4); DrawPLine(ptTmp6, ptTmp4, dc); dc << XCircle(ptTmp3, PSCALE/2); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nRushEle*1000, ptTmp4); //cet 2011.11.2 modify //ptTmp4.x = ptTmp6.x; ptTmp4.Project(&lineTemp, ptTmp4); dc << XCircle(ptTmp4, PSCALE/2); DrawPLine(ptTmp3, ptTmp4, dc); } } if(m_nHighLine > 0.001 ){ ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp2); ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); } if(m_nLowLine > 0.001 ){ ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp2); ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp3); DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); } if(m_bNeedHole){ TDbRect rect0; rect0.SetSizeX(nLength); rect0.SetSizeY(nWidth); rect0.SetCenter(m_ptLocation); rect0.SetRotation(m_nRotation); XLine line9(rect0.GetUpRight(), rect0.GetLowRight(), 1); ptTmp1 = m_ptHoleInsert; ptTmp1.Project(&line9, ptTmp2); double nDist = ads_distance(rect0.GetUpRight(), ptTmp2); ads_polar(rect1.GetUpLeft(), m_nRotation, nDist, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, PSCALE/2, ptTmp2); TDbRect rect4; rect4.SetCenter(ptTmp2); rect4.SetSizeX(nHoleWidth); rect4.SetSizeY(PSCALE); rect4.SetRotation(m_nRotation); rect4.ExplodeOrDraw2d(dc); } if(m_bNeedSleeper){ double dSleeperWidth = m_nSpare * 1000; //modified by cet 2009.11.11 double dSleeperHeight = m_nSleeperWidth * 1000; if(m_iSleeperPos == 1){ XLine line2(rect1.GetLowLeft(), rect1.GetLowRight()); ptTmp1 = line2.MidPoint(); ads_polar(ptTmp1, PI/2, -dSleeperHeight/2, ptTmp1); TDbRect rect3; rect3.SetCenter(ptTmp1); // cet 2011.6.14 modify 枕木长改为用户设置 //rect3.SetSizeX(nWidth + 2*PSCALE); double dSleeperLen = GetSleeperLen(); rect3.SetSizeX(dSleeperLen * 1000); rect3.SetSizeY(dSleeperHeight); rect3.SetRotation(m_nRotation); rect3.ExplodeOrDraw2d(dc); } else if(m_iSleeperPos == 0){ XCurveSegment seg; XLine line5(rect1.GetLowLeft(), rect1.GetLowRight(), 1); seg = line5; XPointList lstPt; GetPointList(seg, m_iSleeperNum, lstPt, 1); for(int i=0;i 0){ XLine line1(m_ptWaterIn1, m_ptWaterInFrom, 1); TDbRect rect10; rect10.SetSizeX(nLength); rect10.SetSizeY(nWidth); rect10.SetCenter(m_ptLocation); rect10.SetRotation(m_nRotation); XLine line11(rect10.GetUpLeft(), rect10.GetUpRight(), 1); XLine line22(rect10.GetLowLeft(), rect10.GetLowRight(), 1); XLine line33(rect10.GetUpLeft(), rect10.GetLowLeft(), 1); XLine line44(rect10.GetUpRight(), rect10.GetLowRight(), 1); int ret1 = line1.Intersection(&line11, ptTmp1); int ret2 = line1.Intersection(&line22, ptTmp1); int ret3 = line1.Intersection(&line33, ptTmp1); int ret4 = line1.Intersection(&line44, ptTmp1); double nAngle(0); if(ret3 == 1) nAngle = PI; double nValveLen = PSCALE*2; if(ret3 == 1 || ret4 == 1){ ptTmp1 = m_ptWaterIn1; ptTmp1.Project(&line22, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); ads_polar(ptTmp2, m_nRotation+nAngle, line1.GetLength(), ptTmp6); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen, ptTmp5); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen/2*3, ptTmp3); DrawPLine(ptTmp2, ptTmp3, dc); ads_polar(ptTmp6, m_nRotation+nAngle, -nValveLen/2, ptTmp3); DrawPLine(ptTmp3, ptTmp6, dc); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp5); rect2.SetRotation(m_nRotation+nAngle); //绘制阀门 dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); ads_polar(ptTmp2, m_nRotation+nAngle, -PSCALE/2, ptTmp2); TDbRect rect3; rect3.SetSizeX(nValveLen/2); rect3.SetSizeY(nValveLen/2); rect3.SetCenter(ptTmp2); rect3.SetRotation(m_nRotation); rect3.ExplodeOrDraw2d(dc); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp6); ads_polar(ptTmp6, m_nRotation+PI/2, PSCALE/2, ptTmp5); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp5, m_nRotation+nAngle, -PSCALE/2*3, ptTmp6); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp6, m_nRotation-PI/2, PSCALE, ptTmp5); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp5, m_nRotation+nAngle/2+PI/4*5, PSCALE*2, ptTmp6); dc << XLine(ptTmp5, ptTmp6); ads_polar(ptTmp6, m_nRotation+nAngle/2+PI/4*5, PSCALE/4, ptTmp6); dc << XCircle(ptTmp6, PSCALE/4); } else if(ret1 == 1 || ret2 == 1){ ptTmp1 = m_ptWaterIn1; ptTmp1.Project(&line22, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); dc << XCircle(ptTmp2, PSCALE/2); ptTmp1 = m_ptWaterIn2; ptTmp1.Project(&line22, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, m_nWaterInEle*1000, ptTmp2); dc << XCircle(ptTmp2, PSCALE/2); } } if(!!m_ptOverfallStart && !!m_ptOverfallEnd && m_nHighLine > 0){ XLine line1(m_ptOverfallStart, m_ptOverfallEnd, 1); TDbRect rect10; rect10.SetSizeX(nLength); rect10.SetSizeY(nWidth); rect10.SetCenter(m_ptLocation); rect10.SetRotation(m_nRotation); XLine line11(rect10.GetUpLeft(), rect10.GetUpRight(), 1); XLine line22(rect10.GetLowLeft(), rect10.GetLowRight(), 1); XLine line33(rect10.GetUpLeft(), rect10.GetLowLeft(), 1); XLine line44(rect10.GetUpRight(), rect10.GetLowRight(), 1); int ret1 = line1.Intersection(&line11, ptTmp1); int ret2 = line1.Intersection(&line22, ptTmp1); int ret3 = line1.Intersection(&line33, ptTmp1); int ret4 = line1.Intersection(&line44, ptTmp1); // cet 2011.11.2 modify 点ptTmp2求解错误 // XLine line9(rect1.GetUpLeft(), rect1.GetUpRight(), 1); // ptTmp1 = m_ptOverfallStart; // ptTmp1.Project(&line9, ptTmp2); // ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); // ptTmp2.y = ptTmp3.y; AcGeVector3d vtTemp = rect1.GetUpRight() - rect1.GetUpLeft(); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); XLine lineTemp(ptTmp3, ptTmp3 + vtTemp, 0); m_ptOverfallStart.Project(&lineTemp, ptTmp2); if(ret1 == 1 || ret2 == 1){ //绘制溢流口 ptTmp6 = ptTmp2; ads_polar(ptTmp2, m_nRotation, -PSCALE/4, ptTmp1); ads_polar(ptTmp2, m_nRotation, PSCALE/4, ptTmp3); dc << XLine(ptTmp1, ptTmp3); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp2); ads_polar(ptTmp2, m_nRotation, -PSCALE/2, ptTmp4); ads_polar(ptTmp2, m_nRotation, PSCALE/2, ptTmp5); dc << XLine(ptTmp4, ptTmp5); dc << XLine(ptTmp1, ptTmp4); dc << XLine(ptTmp3, ptTmp5); //绘制溢流管 ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nOverfallEle*1000, ptTmp3); //cet 2011.11.2 modify //ptTmp3.x = ptTmp6.x; vtTemp = rect1.GetUpLeft() - rect1.GetLowLeft(); lineTemp.SetPoints(ptTmp6, ptTmp6 + vtTemp); ptTmp3.Project(&lineTemp, ptTmp3); ads_polar(ptTmp3, m_nRotation+PI/2, PSCALE/2, ptTmp4); DrawPLine(ptTmp6, ptTmp4, dc); dc << XCircle(ptTmp3, PSCALE/2); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nRushEle*1000, ptTmp4); //cet 2011.11.2 modify //ptTmp4.x = ptTmp6.x; ptTmp4.Project(&lineTemp, ptTmp4); dc << XCircle(ptTmp4, PSCALE/2); DrawPLine(ptTmp3, ptTmp4, dc); } else if(ret3 == 1 || ret4 == 1){ double nValveLen = PSCALE*2; ptTmp6 = ptTmp2; //绘制溢流口 ads_polar(ptTmp2, m_nRotation, -PSCALE/4, ptTmp1); ads_polar(ptTmp2, m_nRotation, PSCALE/4, ptTmp3); dc << XLine(ptTmp1, ptTmp3); ads_polar(ptTmp2, m_nRotation+PI/2, PSCALE/2, ptTmp2); ads_polar(ptTmp2, m_nRotation, -PSCALE/2, ptTmp4); ads_polar(ptTmp2, m_nRotation, PSCALE/2, ptTmp5); dc << XLine(ptTmp4, ptTmp5); dc << XLine(ptTmp1, ptTmp4); dc << XLine(ptTmp3, ptTmp5); //绘制溢流管 ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nOverfallEle*1000, ptTmp3); //cet 2011.11.2 modify //ptTmp2.y = ptTmp3.y; lineTemp.SetPoints(ptTmp3, ptTmp3 + vtTemp); ptTmp2.Project(&lineTemp, ptTmp2); DrawPLine(ptTmp2, ptTmp6, dc); //ads_polar(ptTmp2, m_nRotation+line1.Direction(), line1.GetLength(), ptTmp6); cet 2011.11.2 modify ads_polar(ptTmp2, line1.Direction(), line1.GetLength(), ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nRushEle*1000, ptTmp3); ptTmp2 = ptTmp6; //cet 2011.11.2 modify //ptTmp2.y = ptTmp3.y; lineTemp.SetPoints(ptTmp3, ptTmp3 + vtTemp); ptTmp2.Project(&lineTemp, ptTmp2); DrawPLine(ptTmp2, ptTmp6, dc); //cet 2011.11.2 modify //ads_polar(ptTmp2, m_nRotation+line1.Direction()+PI, PSCALE, ptTmp6); ads_polar(ptTmp2, line1.Direction()+PI, PSCALE, ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); //cet 2011.11.2 modify //ads_polar(ptTmp2, m_nRotation+line1.Direction(), line1.GetLength(), ptTmp6); ads_polar(ptTmp2, line1.Direction(), line1.GetLength(), ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); //cet 2011.11.2 modify //ads_polar(ptTmp2, m_nRotation+line1.Direction()+PI, PSCALE*2, ptTmp2); ads_polar(ptTmp2, line1.Direction()+PI, PSCALE*2, ptTmp2); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp2); rect2.SetRotation(m_nRotation); dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); //cet 2011.11.2 modify //ads_polar(ptTmp2, m_nRotation+line1.Direction()+PI, PSCALE, ptTmp2); //ads_polar(ptTmp2, m_nRotation+line1.Direction()+PI, line1.GetLength()-PSCALE*3, ptTmp6); ads_polar(ptTmp2, line1.Direction()+PI, PSCALE, ptTmp2); ads_polar(ptTmp2, line1.Direction()+PI, line1.GetLength()-PSCALE*3, ptTmp6); DrawPLine(ptTmp2, ptTmp6, dc); } } if(m_nHighLine > 0.001 ){ ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp2); ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); } if(m_nLowLine > 0.001 ){ ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp2); ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp3); DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); } if(m_bNeedHole){ XLine line9(rect1.GetUpLeft(), rect1.GetUpRight(), 1); ptTmp1 = m_ptHoleInsert; ptTmp1.Project(&line9, ptTmp2); ads_polar(ptTmp2, PI/2+m_nRotation, PSCALE/2, ptTmp2); TDbRect rect4; rect4.SetCenter(ptTmp2); rect4.SetSizeX(nHoleWidth); rect4.SetSizeY(PSCALE); rect4.SetRotation(m_nRotation); rect4.ExplodeOrDraw2d(dc); } if(m_bNeedSleeper){ double dSleeperWidth = m_nSpare * 1000; //modified by cet 2009.11.11 double dSleeperHeight = m_nSleeperWidth * 1000; if(m_iSleeperPos == 0){ XLine line2(rect1.GetLowLeft(), rect1.GetLowRight()); ptTmp1 = line2.MidPoint(); // cet 2011.10.10 modify 点计算方法错误 // ptTmp1 = Wcs2Ucs(ptTmp1); // cet 2011.9.15 add // ads_polar(ptTmp1, PI/2, -dSleeperHeight/2, ptTmp1); // ptTmp1 = Ucs2Wcs(ptTmp1); // cet 2011.9.15 add AcGeVector3d vt = rect1.GetLowRight() - rect1.GetLowLeft(); vt.normalize(); vt.rotateBy(-PI/2, AcGeVector3d::kZAxis); ptTmp1 += vt * dSleeperHeight / 2; TDbRect rect3; rect3.SetCenter(ptTmp1); // cet 2011.6.14 modify 枕木长改为用户设置 //rect3.SetSizeX(nLength + 2*PSCALE); double dSleeperLen = GetSleeperLen(); rect3.SetSizeX(dSleeperLen * 1000); rect3.SetSizeY(dSleeperHeight); rect3.SetRotation(m_nRotation); rect3.ExplodeOrDraw2d(dc); } else if(m_iSleeperPos == 1){ XCurveSegment seg; XLine line5(rect1.GetLowLeft(), rect1.GetLowRight(), 1); seg = line5; XPointList lstPt; GetPointList(seg, m_iSleeperNum, lstPt, 1); for(int i=0;i 0.001 ){ // ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp2); // ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp3); // DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); // // ads_polar(rect2.GetLowLeft(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp4); // ads_polar(rect2.GetLowRight(), PI/2+m_nRotation, m_nHighLine*1000, ptTmp5); // dc << XLine(ptTmp4, ptTmp5); // dc << XLine(ptTmp2, ptTmp4); // dc << XLine(ptTmp3, ptTmp5); // } // if(m_nLowLine > 0.001 ){ // ads_polar(rect1.GetLowLeft(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp2); // ads_polar(rect1.GetLowRight(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp3); // DrawWaterLevel(ptTmp2, ptTmp3, PSCALE, dc); // ads_polar(rect2.GetLowLeft(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp4); // ads_polar(rect2.GetLowRight(), PI/2+m_nRotation, m_nLowLine*1000, ptTmp5); // dc << XLine(ptTmp4, ptTmp5); // dc << XLine(ptTmp2, ptTmp4); // dc << XLine(ptTmp3, ptTmp5); // } return Acad::eOk; } Acad::ErrorStatus TDbWaterTank::DrawPlan(XExplodeDraw &dc) const { double nHeight = m_nHeight * 1000; double nLength = m_nLength * 1000; double nWidth = m_nWidth * 1000; double nHoleWidth = m_nHoleWidth * 1000; TDbRect rect1; rect1.SetSizeX(nLength); rect1.SetSizeY(nWidth); rect1.SetCenter(m_ptLocation); rect1.SetRotation(m_nRotation); rect1.ExplodeOrDraw2d(dc); double nValveLen = PSCALE*2; if(!!m_ptWaterIn1 && !!m_ptWaterIn2 && !!m_ptWaterInFrom){ dc << XCircle(m_ptWaterIn1, PSCALE/2); dc << XCircle(m_ptWaterIn2, PSCALE/2); XPoint ptTmp1, ptTmp2, ptTmp3, ptTmp4; XLine line4(m_ptWaterIn1, m_ptWaterInFrom); ads_polar(m_ptWaterIn1, line4.Direction(), PSCALE/2, ptTmp1); ads_polar(m_ptWaterInFrom, line4.Direction(), -nValveLen, ptTmp2); ads_polar(m_ptWaterInFrom, line4.Direction(), -nValveLen/2*3, ptTmp3); DrawPLine(ptTmp1, ptTmp3, dc); ads_polar(m_ptWaterInFrom, line4.Direction(), -nValveLen/2, ptTmp3); DrawPLine(ptTmp3, m_ptWaterInFrom, dc); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp2); rect2.SetRotation(line4.Direction()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); ads_polar(m_ptWaterIn2, line4.Direction(), line4.GetLength(), ptTmp4); XLine line5(m_ptWaterIn2, ptTmp4); ads_polar(m_ptWaterIn2, line4.Direction(), PSCALE/2, ptTmp1); ads_polar(ptTmp4, line4.Direction(), -nValveLen, ptTmp2); ads_polar(ptTmp4, line4.Direction(), -nValveLen/2*3, ptTmp3); DrawPLine(ptTmp1, ptTmp3, dc); ads_polar(ptTmp4, line4.Direction(), -nValveLen/2, ptTmp3); DrawPLine(ptTmp3, ptTmp4, dc); TDbRect rect3; rect3.SetSizeX(nValveLen); rect3.SetSizeY(nValveLen/2); rect3.SetCenter(ptTmp2); rect3.SetRotation(line4.Direction()); dc << XLine(rect3.GetLowLeft(), rect3.GetUpLeft()); dc << XLine(rect3.GetLowRight(), rect3.GetUpRight()); dc << XLine(rect3.GetLowLeft(), rect3.GetUpRight()); dc << XLine(rect3.GetUpLeft(), rect3.GetLowRight()); } if(!!m_ptOverfallStart && !!m_ptOverfallEnd){ dc << XCircle(m_ptOverfallStart, PSCALE/2); dc << XCircle(m_ptOverfallEnd, PSCALE/2); XPoint ptTmp1, ptTmp2, ptTmp3; XLine line4(m_ptOverfallStart, m_ptOverfallEnd); ads_polar(m_ptOverfallStart, line4.Direction(), PSCALE/2, ptTmp1); ads_polar(m_ptOverfallEnd, line4.Direction(), -nValveLen, ptTmp2); ads_polar(m_ptOverfallEnd, line4.Direction(), -nValveLen/2*3, ptTmp3); DrawPLine(ptTmp1, ptTmp3, dc); ads_polar(m_ptOverfallEnd, line4.Direction(), -nValveLen/2, ptTmp3); DrawPLine(ptTmp3, m_ptOverfallEnd, dc); TDbRect rect2; rect2.SetSizeX(nValveLen); rect2.SetSizeY(nValveLen/2); rect2.SetCenter(ptTmp2); rect2.SetRotation(line4.Direction()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpLeft()); dc << XLine(rect2.GetLowRight(), rect2.GetUpRight()); dc << XLine(rect2.GetLowLeft(), rect2.GetUpRight()); dc << XLine(rect2.GetUpLeft(), rect2.GetLowRight()); } if(m_bNeedHole){ if (!m_bHoleIsRect) { XPoint ptTmp1, ptTmp2, ptInt; TDbRect rect2; rect2.SetSizeX(nHoleWidth); rect2.SetSizeY(nHoleWidth); rect2.SetCenter(m_ptHoleInsert); rect2.SetRotation(m_nRotation); rect2.ExplodeOrDraw2d(dc); XLine line1(m_ptHoleInsert, rect2.GetUpLeft()); ptInt = line1.MidPoint(); XLine line3(rect2.GetLowLeft(), ptInt, 1); dc << line3; XLine line4(rect2.GetUpRight(), ptInt, 1); dc << line4; } else { //圆形人孔 XCircle circle(m_ptHoleInsert,m_nHoleWidth/2*1000); dc << circle; } } if(m_bNeedSleeper){ // double nSleeperWidth = m_nSleeperWidth * 1000; double dSleeperWidth = m_nSpare * 1000; //modified by cet 2009.11.11 AcDbObjectId idLayerOld=dc.GetLayerId(); dc.SetLayer(m_idDashLayer); XPoint ptTmp1, ptTmp2; XCurveSegment seg; if(m_iSleeperPos == 0){ XLine line1(rect1.GetUpLeft(), rect1.GetUpRight(), 1); ptTmp1 = line1.MidPoint(); XLine line2(rect1.GetLowLeft(), rect1.GetLowRight(), 1); ptTmp2 = line2.MidPoint(); XLine line3(ptTmp1, ptTmp2); seg = line3; } else{ XLine line1(rect1.GetUpLeft(), rect1.GetLowLeft(), 1); ptTmp1 = line1.MidPoint(); XLine line2(rect1.GetUpRight(), rect1.GetLowRight(), 1); ptTmp2 = line2.MidPoint(); XLine line3(ptTmp1, ptTmp2); seg = line3; } XPointList lstPt; GetPointList(seg, m_iSleeperNum, lstPt, 1); for(int i=0;ilayerId(), AcDb::kForRead); if (player.openStatus() == Acad::eOk && player->isOff()) { return Acad::eOk; } assertReadEnabled(); if(m_iShape == 1){ //方水箱 if(m_iShowType == 0) DrawPlan(dc); else if(m_iShowType == 1) DrawMainSect(dc); else if(m_iShowType == 2) DrawLeftSect(dc); // else if(m_iShowType == 3) // DrawSysTank(dc); 2006 12 21 取消系统水箱,改为平面图生成系统图实现 } else if(m_iShape == 0){//圆水箱 立式 if(m_iShowType == 0){ double nLength = m_nLength * 1000; double nHoleWidth = m_nHoleWidth * 1000; XCircle cir(m_ptLocation, nLength/2); dc << cir; if(m_bNeedHole){ XCircle cir2(m_ptHoleInsert, nHoleWidth/2); dc << cir2; } } else DrawCircleSect0(dc); } else if(m_iShape == 2){//圆水箱 卧式 if(m_iShowType == 0) DrawCirclePlan2(dc); else if(m_iShowType == 1) DrawCircleMainSect2(dc); else if(m_iShowType == 2) DrawCircleLeftSect2(dc); } return Acad::eOk; } Acad::ErrorStatus TDbWaterTank::Draw3dBox(XExplodeDraw &dc) const { assertReadEnabled(); double nHeight = m_nHeight * 1000; double nLength = m_nLength * 1000; double nWidth = m_nWidth * 1000; double nHoleWidth = m_nHoleWidth * 1000; double nSleeperWidth = m_nSleeperWidth * 1000; double dSleeperWidth = m_nSpare * 1000; //modified by cet 2009.11.11 double dSleeperHeight = m_nSleeperWidth * 1000; XPoint ptLoc = m_ptLocation; if(m_bNeedSleeper) //ptLoc.z = dSleeperHeight; // zxl 2012.11.29 modify ptLoc.z += dSleeperHeight; TDbRect rect1; rect1.SetSizeX(nLength); rect1.SetSizeY(nWidth); rect1.SetCenter(ptLoc); rect1.SetRotation(m_nRotation); XPoint ptLowLeft=rect1.GetLowLeft(); XPoint ptLowRight=rect1.GetLowRight(); XPoint ptUpRight=rect1.GetUpRight(); XPoint ptUpLeft=rect1.GetUpLeft(); XPoly2D poly2d(1); poly2d.AppendNode(ptLowLeft); poly2d.AppendNode(ptLowRight); poly2d.AppendNode(ptUpRight); poly2d.AppendNode(ptUpLeft); XVector3D vt = XVector3D(0,0,1); vt.Normalize(); vt *= nHeight; dc.DrawBody(poly2d, vt); if(m_bNeedHole){ if (!m_bHoleIsRect) { XPoint ptHole = m_ptHoleInsert; ptHole.z += nHeight + nSleeperWidth; TDbRect rect2; rect2.SetSizeX(nHoleWidth); rect2.SetSizeY(nHoleWidth); rect2.SetCenter(ptHole); rect2.SetRotation(m_nRotation); ptLowLeft=rect2.GetLowLeft(); ptLowRight=rect2.GetLowRight(); ptUpRight=rect2.GetUpRight(); ptUpLeft=rect2.GetUpLeft(); XPoly2D poly2d2(1); poly2d2.AppendNode(ptLowLeft); poly2d2.AppendNode(ptLowRight); poly2d2.AppendNode(ptUpRight); poly2d2.AppendNode(ptUpLeft); XVector3D vt2 = XVector3D(0,0,1); vt2.Normalize(); vt2 *= 1* PSCALE; dc.DrawBody(poly2d2, vt2); } else { XPoint pt1 = m_ptHoleInsert; pt1.z += nHeight + nSleeperWidth; XPoint pt2 = pt1; pt2 += AcGeVector3d::kZAxis*PSCALE; DrawPolyMesh(pt1,pt2,m_nHoleWidth*1000/2,dc); } } if(m_bNeedSleeper){ XPoint ptTmp1, ptTmp2; XCurveSegment seg; if(m_iSleeperPos == 0){ XLine line1(rect1.GetUpLeft(), rect1.GetUpRight(), 1); ptTmp1 = line1.MidPoint(); XLine line2(rect1.GetLowLeft(), rect1.GetLowRight(), 1); ptTmp2 = line2.MidPoint(); XLine line3(ptTmp1, ptTmp2); seg = line3; } else{ XLine line1(rect1.GetUpLeft(), rect1.GetLowLeft(), 1); ptTmp1 = line1.MidPoint(); XLine line2(rect1.GetUpRight(), rect1.GetLowRight(), 1); ptTmp2 = line2.MidPoint(); XLine line3(ptTmp1, ptTmp2); seg = line3; } XPointList lstPt; GetPointList(seg, m_iSleeperNum, lstPt, 1); for(int i=0;i 0 && nAng < PI) mat.setToRotation(nAng, vtNormal.crossProduct(v1), insert.position()); else if(fabs(nAng - PI) < 0.00001){ AcGePlane plan(insert.position(), vtNormal); mat.setToMirroring(plan); } insert.transformBy(mat); if(_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0) { AcGeMatrix3d mat=insert.blockTransform(); AcGiGeometry *geom=((XAcGiViewDraw &)dc).GetCommonDraw()->rawGeometry(); geom->pushModelTransform(mat); geom->draw(pBlock); geom->popModelTransform(); } else if(_tcscmp(dc.Desc(), XExplodeStream::Descriptor())==0) { ((XExplodeStream &)dc).Append((AcDbEntity *)insert.clone()); } } OPENOBJ_END(); return Acad::eOk; } Acad::ErrorStatus TDbWaterTank::ExplodeOrDraw3d(XExplodeDraw &dc) const { double nHeight = m_nHeight * 1000; double nLength = m_nLength * 1000; double nWidth = m_nWidth * 1000; double nHoleWidth = m_nHoleWidth * 1000; double nSleeperWidth = m_nSleeperWidth * 1000; if(m_iShape == 1){ Draw3dBox(dc); } if(m_iShape == 0){ //圆 立式 XPoint pt1, pt2; pt1 = pt2 = m_ptLocation; pt1.z += nWidth; pt2.z += (nWidth+nHeight); DrawPolyMesh(pt1, pt2, nLength/2, dc); XVector3D vt(pt2.x - m_ptLocation.x, pt2.y - m_ptLocation.y, pt2.z - m_ptLocation.z); Draw3dCover(dc, vt, pt2); XVector3D vt2(m_ptLocation.x - pt2.x, m_ptLocation.y - pt2.y, m_ptLocation.z - pt2.z); Draw3dCover(dc, vt2, pt1); ads_polar(m_ptLocation, m_nRotation, nLength/2-nSleeperWidth, pt1); //pt1.z = 0;//zxl del 2012.12.03 pt2 = pt1; // pt2.z = nWidth; pt2.z += nWidth;//zxl modify 2012.12.03 DrawPolyMesh(pt1, pt2, nSleeperWidth, dc); ads_polar(m_ptLocation, m_nRotation+PI*2/3, nLength/2-nSleeperWidth, pt1); //pt1.z = 0;//zxl del 2012.12.03 pt2 = pt1; // pt2.z = nWidth; pt2.z += nWidth;//zxl modify 2012.12.03 DrawPolyMesh(pt1, pt2, nSleeperWidth, dc); ads_polar(m_ptLocation, m_nRotation+PI*4/3, nLength/2-nSleeperWidth, pt1); //pt1.z = 0;//zxl del 2012.12.03 pt2 = pt1; // pt2.z = nWidth; pt2.z += nWidth;//zxl modify 2012.12.03 DrawPolyMesh(pt1, pt2, nSleeperWidth, dc); } else if(m_iShape == 2){ //圆卧式 XPoint pt1, pt2, ptCen; ptCen = m_ptLocation; ptCen.z += nWidth+nLength/2; ads_polar(ptCen, m_nRotation, nHeight/2, pt1); ads_polar(ptCen, m_nRotation, -nHeight/2, pt2); DrawPolyMesh(pt1, pt2, nLength/2, dc); XVector3D vt(pt2.x - ptCen.x, pt2.y - ptCen.y, pt2.z - ptCen.z); Draw3dCover(dc, vt, pt2); XVector3D vt2(ptCen.x - pt2.x, ptCen.y - pt2.y, ptCen.z - pt2.z); Draw3dCover(dc, vt2, pt1); ads_polar(m_ptLocation, m_nRotation, nHeight/4, pt1); ads_polar(m_ptLocation, m_nRotation, -nHeight/4, pt2); TDbRect rect1; rect1.SetSizeX(nHoleWidth/2); rect1.SetSizeY(nLength*0.8); rect1.SetCenter(pt1); rect1.SetRotation(m_nRotation); XPoint ptLowLeft=rect1.GetLowLeft(); XPoint ptLowRight=rect1.GetLowRight(); XPoint ptUpRight=rect1.GetUpRight(); XPoint ptUpLeft=rect1.GetUpLeft(); XPoly2D poly2d(1); poly2d.AppendNode(ptLowLeft); poly2d.AppendNode(ptLowRight); poly2d.AppendNode(ptUpRight); poly2d.AppendNode(ptUpLeft); XVector3D vt3 = XVector3D(0,0,1); vt3.Normalize(); vt3 *= nWidth*2; dc.DrawBody(poly2d, vt3); TDbRect rect2; rect2.SetSizeX(nHoleWidth/2); rect2.SetSizeY(nLength*0.8); rect2.SetCenter(pt2); rect2.SetRotation(m_nRotation); ptLowLeft=rect2.GetLowLeft(); ptLowRight=rect2.GetLowRight(); ptUpRight=rect2.GetUpRight(); ptUpLeft=rect2.GetUpLeft(); XPoly2D poly2d2(1); poly2d2.AppendNode(ptLowLeft); poly2d2.AppendNode(ptLowRight); poly2d2.AppendNode(ptUpRight); poly2d2.AppendNode(ptUpLeft); XVector3D vt4 = XVector3D(0,0,1); vt4.Normalize(); vt4 *= nWidth*2; dc.DrawBody(poly2d2, vt4); } return Acad::eOk; } //取动态属性显示数据 void TDbWaterTank::GetTips(DList &info) const { info.Append(new TObjInfoUnit(_T("对象类型"), _T("水箱"))); } double TDbWaterTank::GetOldSleeperLen() const { double dSleeperLen = 0.0; if(m_iSleeperPos == 0) { dSleeperLen = m_nLength+ PSCALE * 0.001; } else { dSleeperLen = m_nWidth + PSCALE * 0.001; } return dSleeperLen; } void InitDbWaterTank(BOOL bTrue) { if(bTrue) { TDbWaterTank::rxInit(); TDbWaterTank::InitMatchProtocol(TRUE); // static TArchMatchProp *pMatchProp=NULL; // pMatchProp = new TArchMatchProp; // TDbWaterTank::desc()->addX(AcDbMatchProperties::desc(), pMatchProp); // AcRxObject* pRxobj = TDbWaterTank::desc()->getX(TArchMatchProp::desc()); } else { TDbWaterTank::InitMatchProtocol(FALSE); deleteAcRxClass(TDbWaterTank::desc()); } }