#include "stdafx.h" //Acad::ErrorStatus XBayWindow::GetPolyCurve(XPoint ptLoc, double nExtDir, double nWidth, double nWallThick, // BOOL bLeftSlab, BOOL bRightSlab, DList &polyCurves, // double dWallInsut, double dInsutAdd) const Acad::ErrorStatus XBayWindow::GetPolyCurve(XPoint ptLoc, double nExtDir, double nWidth, double nWallThick, BOOL bLeftSlab, BOOL bRightSlab, DList &polyCurves, double dWallInsut, double dInsutAdd, BOOL bAllInsut) const { // sg modify 120518,不使用固定值,而是使用保存在对象中的值 // double nBayThick = 120.0; double nBayThick = m_dBayThick; XPoint ptBase, ptVert, ptVertInst, ptInsBack; // modify by xlc on 110624 解决梯形凸窗,三角凸窗,圆弧凸窗所在墙上有保温时保温线豁口的问题 // ads_polar(ptLoc, nExtDir, nWallThick/2.0, ptBase); double dWallThick = nWallThick/2.0; double dWallInsutOld = dWallInsut; if (m_nStyle == BWS_TRAPEZIA || m_nStyle == BWS_TRIANGLE || m_nStyle == BWS_ARC) { dWallThick -= dWallInsut; dWallInsut = 0.0; } ads_polar(ptLoc, nExtDir, dWallThick, ptBase); m_dInsback = nBayThick; if (m_nStyle == BWS_TRAPEZIA) // 梯形 { // 墙有保温时,出挑长需要去掉保温层厚度 double h = m_nProtrude - dWallInsut; double w0 = nWidth/2; double d = nBayThick; double t = m_nTrapezia/2; double a = h/(d*d) - 1/h; double b = 2*t/h - 2*h*w0/(d*d); double c = h*w0*w0/(d*d) - t*t/h -h; ASSERT(b*b-4*a*c>0.0); double y1 = (-b + sqrt(b*b-4*a*c))/2/a; double y2 = (-b - sqrt(b*b-4*a*c))/2/a; double x1 = w0+t-t*d/h+(d/h-1)*y1; double x2 = w0+t-t*d/h+(d/h-1)*y2; double x, y = 0.0; if (x1>0.0 && x1w0) { x = x1; y = y1; } else if (x2>0.0 && x2w0) { x = x2; y = y2; } else { ASSERT(0); } XPoint vt0[4], vt2[4], vt1[4]; double t0 = x, w = y; ads_polar(ptBase, nExtDir-PI/2, w0, vt0[0]); ads_polar(ptBase, nExtDir-PI/2, t0, vt0[1]); ads_polar(XPoint(vt0[1]), nExtDir, h-d, vt0[1]); ads_polar(ptBase, nExtDir+PI/2, w0, vt0[3]); ads_polar(ptBase, nExtDir+PI/2, t0, vt0[2]); ads_polar(XPoint(vt0[2]), nExtDir, h-d, vt0[2]); ads_polar(ptBase, nExtDir-PI/2, w, vt2[0]); ads_polar(ptBase, nExtDir-PI/2, t, vt2[1]); ads_polar(XPoint(vt2[1]), nExtDir, h, vt2[1]); ads_polar(ptBase, nExtDir+PI/2, w, vt2[3]); ads_polar(ptBase, nExtDir+PI/2, t, vt2[2]); ads_polar(XPoint(vt2[2]), nExtDir, h, vt2[2]); for (int i=0; i<4; i++) { // sg modify 120521,凸窗2侧窗台板延伸长度不再是固定的120,而是可以设置的,但是玻璃线的40是固定的 //vt1[i].x = vt0[i].x + (vt2[i].x-vt0[i].x)/3.0; //vt1[i].y = vt0[i].y + (vt2[i].y-vt0[i].y)/3.0; //vt1[i].z = vt0[i].z + (vt2[i].z-vt0[i].z)/3.0; vt1[i].x = vt0[i].x + (vt2[i].x-vt0[i].x)*40/d; vt1[i].y = vt0[i].y + (vt2[i].y-vt0[i].y)*40/d; vt1[i].z = vt0[i].z + (vt2[i].z-vt0[i].z)*40/d; } // wlw add 有保温层时,需要延长至墙线上 m_dInsback = vt0[0].Distance(vt2[0]); // modify by xlc on 110624 解决梯形凸窗所在墙上有保温时保温线豁口的问题 m_dInsback -= (w0-t0) * dWallInsutOld /(h - d); // 梯形斜边影响的保温长度 if (dWallInsut > 0.01) { dWallInsut = dWallInsut * (vt0[0].Distance(vt0[1])) / (m_nProtrude - dWallInsut - nBayThick); AcGeVector3d vtTemp; vtTemp = vt0[0] - vt0[1]; vtTemp.normalize(); vt0[0] += vtTemp * dWallInsut; vtTemp = vt0[3] - vt0[2]; vtTemp.normalize(); vt0[3] += vtTemp * dWallInsut; vtTemp = vt1[0] - vt1[1]; vtTemp.normalize(); vt1[0] += vtTemp * dWallInsut; vtTemp = vt1[3] - vt1[2]; vtTemp.normalize(); vt1[3] += vtTemp * dWallInsut; vtTemp = vt2[0] - vt2[1]; vtTemp.normalize(); vt2[0] += vtTemp * dWallInsut; vtTemp = vt2[3] - vt2[2]; vtTemp.normalize(); vt2[3] += vtTemp * dWallInsut; } XPoly2D *pPoly1 = new XPoly2D(0); for (i=0; i<4; i++) pPoly1->AppendNode(vt0[i]); polyCurves.Append(pPoly1); XPoly2D *pPoly2 = new XPoly2D(0); for(i=0; i<4; i++) pPoly2->AppendNode(vt1[i]); polyCurves.Append(pPoly2); XPoly2D *pPoly3 = new XPoly2D(0); for (i=0; i<4; i++) pPoly3->AppendNode(vt2[i]); polyCurves.Append(pPoly3); return Acad::eOk; } // sg modify 120521,凸窗2侧窗台板延伸长度不再是固定的120,而是可以设置的,但是玻璃线的40是固定的 //double nOffsetDist[3] = {0.0, nBayThick/3, nBayThick}; double nOffsetDist[3] = {0.0, 40, nBayThick}; // wlw add 补豁口dInsutAdd for (int idx=0; idx<3; idx++) { XPoly2D poly2d(0); if (m_nStyle == BWS_RECT) { if (bLeftSlab && bRightSlab) { ads_polar(ptBase, nExtDir-PI/2, nWidth/2, ptVert); //if (dInsutAdd > 0.01 && dWallInsut < 0.01) if (dInsutAdd > 0.01 && (dWallInsut < 0.01 || bAllInsut)) { // 补豁口 ads_polar(ptVert, nExtDir-PI/2, dInsutAdd, ptVert); } if (dWallInsut > 0.01) { // 外墙有保温 ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - dWallInsut + dInsutAdd - nBayThick + nOffsetDist[idx], ptVert); } else { ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - nBayThick + nOffsetDist[idx], ptVert); } poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth, ptVert); //if (dInsutAdd > 0.01 && dWallInsut < 0.01) if (dInsutAdd > 0.01 && (dWallInsut < 0.01 || bAllInsut)) { // 补豁口 ads_polar(ptVert, nExtDir+PI/2, dInsutAdd*2, ptVert); } poly2d.AppendNode(ptVert); } else if (bRightSlab) { ads_polar(ptBase, nExtDir-PI/2, nWidth/2, ptVert); // if (dInsutAdd > 0.01 && dWallInsut < 0.01) if (dInsutAdd > 0.01 && (dWallInsut < 0.01 || bAllInsut)) { // 补豁口 ads_polar(ptVert, nExtDir-PI/2, dInsutAdd, ptVert); } if (dWallInsut > 0.01) { ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - dWallInsut + dInsutAdd - nBayThick + nOffsetDist[idx], ptVert); } else { ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - nBayThick + nOffsetDist[idx], ptVert); } poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth+nOffsetDist[idx], ptVert); if (dInsutAdd > 0.01 && dWallInsut < 0.01) { // 补豁口 ads_polar(ptVert, nExtDir+PI/2, dInsutAdd, ptVert); } poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffsetDist[idx], ptVert); if (dWallInsut > 0.01) { ads_polar(ptVert, nExtDir - PI, dWallInsut, ptVert); } poly2d.AppendNode(ptVert); } else if (bLeftSlab) { ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffsetDist[idx], ptVert); if (dWallInsut > 0.01) { ads_polar(ptVert, nExtDir - PI, dWallInsut, ptVertInst); poly2d.AppendNode(ptVertInst); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - dWallInsut + dInsutAdd - nBayThick + nOffsetDist[idx], ptVert); } else { poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - nBayThick + nOffsetDist[idx], ptVert); } poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth+nOffsetDist[idx], ptVert); // if (dInsutAdd > 0.01 && dWallInsut < 0.01) if (dInsutAdd > 0.01 && (dWallInsut < 0.01 || bAllInsut)) { // 补豁口 ads_polar(ptVert, nExtDir+PI/2, dInsutAdd, ptVert); } poly2d.AppendNode(ptVert); } else { ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffsetDist[idx], ptVert); if (dWallInsut > 0.01) { ads_polar(ptVert, nExtDir - PI, dWallInsut, ptVertInst); poly2d.AppendNode(ptVertInst); // sg add 110816,没有挡板的时候,也就不用考虑挡板的保温厚度 //ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - dWallInsut + dInsutAdd - nBayThick + nOffsetDist[idx], ptVert); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - dWallInsut - nBayThick + nOffsetDist[idx], ptVert); } else { poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude - nBayThick + nOffsetDist[idx], ptVert); } poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth+nOffsetDist[idx]*2, ptVert); poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffsetDist[idx], ptVert); if (dWallInsut > 0.01) { ads_polar(ptVert, nExtDir - PI, dWallInsut, ptVert); } poly2d.AppendNode(ptVert); } } else if (m_nStyle == BWS_TRIANGLE) { double a = ((m_nProtrude - dWallInsut)/(nWidth/2))*((m_nProtrude- dWallInsut)/(nWidth/2))+1.0; double b = -2.0* (m_nProtrude - dWallInsut)*nBayThick/(nWidth*nWidth/4); double c = (nBayThick/(nWidth/2))*(nBayThick/(nWidth/2))-1.0; ASSERT(b*b-4*a*c>0.0); double y1 = (-b + sqrt(b*b-4*a*c))/2/a; double y2 = (-b - sqrt(b*b-4*a*c))/2/a; double y = 0.0; if (y1>0.0 && y1<1.0) y = y1; else if (y2>-0.0 && y2<1.0) y = y2; else ASSERT(0); double x = ((m_nProtrude - dWallInsut)*y-nBayThick)/(nWidth/2); //sqrt(1.0-y*y); ASSERT(x>0.0 && x<1.0); ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffsetDist[idx]/fabs(x), ptVert); poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir, (m_nProtrude - dWallInsut)-nBayThick/fabs(y)+nOffsetDist[idx]/fabs(y), ptVert); poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffsetDist[idx]/fabs(x), ptVert); poly2d.AppendNode(ptVert); } else if (m_nStyle == BWS_ARC) { double h0 = m_nProtrude - dWallInsut-nBayThick; double r0 = (nWidth*nWidth/4.0/h0+h0)/2.0; double dh = nOffsetDist[idx]; double l = sqrt(2*r0*h0 + dh*dh + 2*dh*r0 - h0*h0); //double p1=m_nProtrude-nBayThick; //double p=p1+nOffsetDist[idx]; //double nOffHor=nWidth/2.0*(p/p1-1.0); //double l=nWidth/2.0+nOffHor; //弦长的一半 if (l < _DIST_SNAP) return Acad::eInvalidInput; double nSweepAng = 4*atan((h0+nOffsetDist[idx])/l); ads_polar(ptBase, nExtDir-PI/2, l, ptVert); poly2d.AppendNode(ptVert, nSweepAng); ads_polar(ptBase, nExtDir+PI/2, l, ptVert); poly2d.AppendNode(ptVert); } else { return Acad::eInvalidInput; } if (!!poly2d) { // wlw add 110216 保温需要的回退值m_dInsback if (idx == 0) { ptInsBack = *poly2d[0]; } if (idx == 2) { m_dInsback = ptInsBack.Distance(*poly2d[0]); // add by xlc on 110624 解决三角凸窗,圆弧凸窗所在墙上有保温时保温线豁口的问题 if(m_nStyle == BWS_TRIANGLE) { m_dInsback -= (ptBase.Distance(*poly2d[0])) * dWallInsutOld /(ptBase.Distance(*poly2d[1])); // 三角形斜边影响的保温长度 } else if(m_nStyle == BWS_ARC) { // 圆弧影响的保温长度 m_dInsback = sqrt((m_nProtrude-dWallInsutOld)*((m_dInsback+nWidth*0.5)*(m_dInsback+nWidth*0.5)/(m_nProtrude) +dWallInsutOld))-nWidth*0.5; } } polyCurves.Append(new XPoly2D(poly2d)); } } return Acad::eOk; } Acad::ErrorStatus GetClipBoundary(const XBayWindow *pBayWin, XPoint ptLoc, double nExtDir, double nWidth, double nWallThick, double nSlabThick, BOOL bLeftSlab, BOOL bRightSlab, XPoly2D &poly2d) { // 不使用固定值,而是使用保存在对象中的值 // double nBayThick = 120.0; double nBayThick = pBayWin->m_dBayThick; XPoint ptBase, ptVert; ads_polar(ptLoc, nExtDir, nWallThick/2.0, ptBase); if (pBayWin->m_nStyle == XBayWindow::BWS_TRAPEZIA) // 梯形 { double h=pBayWin->m_nProtrude; double w0=nWidth/2; double d=nBayThick; double t=pBayWin->m_nTrapezia/2; double a = h/(d*d) - 1/h; double b = 2*t/h - 2*h*w0/(d*d); double c = h*w0*w0/(d*d) - t*t/h -h; ASSERT(b*b-4*a*c>0.0); double y1= (-b + sqrt(b*b-4*a*c))/2/a; double y2= (-b - sqrt(b*b-4*a*c))/2/a; double x1=w0+t-t*d/h+(d/h-1)*y1; double x2=w0+t-t*d/h+(d/h-1)*y2; double x, y=0.0; if(x1>0.0 && x1w0) { x=x1; y=y1; } else if(x2>0.0 && x2w0) { x=x2; y=y2; } else { ASSERT(0); } XPoint vt0[4], vt2[4], vt1[4]; double t0=x, w=y; ads_polar(ptBase, nExtDir-PI/2, w0, vt0[0]); ads_polar(ptBase, nExtDir-PI/2, t0, vt0[1]); ads_polar(XPoint(vt0[1]), nExtDir, h-d, vt0[1]); ads_polar(ptBase, nExtDir+PI/2, w0, vt0[3]); ads_polar(ptBase, nExtDir+PI/2, t0, vt0[2]); ads_polar(XPoint(vt0[2]), nExtDir, h-d, vt0[2]); ads_polar(ptBase, nExtDir-PI/2, w, vt2[0]); ads_polar(ptBase, nExtDir-PI/2, t, vt2[1]); ads_polar(XPoint(vt2[1]), nExtDir, h, vt2[1]); ads_polar(ptBase, nExtDir+PI/2, w, vt2[3]); ads_polar(ptBase, nExtDir+PI/2, t, vt2[2]); ads_polar(XPoint(vt2[2]), nExtDir, h, vt2[2]); for (int i=0; i<4; i++) { // sg modify 120521,凸窗2侧窗台板延伸长度不再是固定的120,而是可以设置的,但是玻璃线的40是固定的 //vt1[i].x = vt0[i].x + (vt2[i].x-vt0[i].x)/3.0; //vt1[i].y = vt0[i].y + (vt2[i].y-vt0[i].y)/3.0; //vt1[i].z = vt0[i].z + (vt2[i].z-vt0[i].z)/3.0; vt1[i].x = vt0[i].x + (vt2[i].x-vt0[i].x)*40/d; vt1[i].y = vt0[i].y + (vt2[i].y-vt0[i].y)*40/d; vt1[i].z = vt0[i].z + (vt2[i].z-vt0[i].z)*40/d; } for (i=0; i<4; i++) poly2d.AppendNode(vt2[i]); poly2d.SetFlag(1); return Acad::eOk; } double nOffset = nBayThick; if (pBayWin->m_nStyle == XBayWindow::BWS_RECT) { //if(bLeftSlab&&bRightSlab) //{ // ads_polar(ptBase, nExtDir-PI/2, nWidth/2, ptVert); // ads_polar(XPoint(ptVert), nExtDir, pBayWin->m_nProtrude-nBayThick+nOffset, ptVert); // poly2d.AppendNode(ptVert); // ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth, ptVert); // poly2d.AppendNode(ptVert); //} //else if(bRightSlab) //{ // ads_polar(ptBase, nExtDir-PI/2, nWidth/2, ptVert); // ads_polar(XPoint(ptVert), nExtDir, pBayWin->m_nProtrude-nBayThick+nOffset, ptVert); // poly2d.AppendNode(ptVert); // ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth+nOffset, ptVert); // poly2d.AppendNode(ptVert); // ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffset, ptVert); // poly2d.AppendNode(ptVert); //} //else if(bLeftSlab) //{ // ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffset, ptVert); // poly2d.AppendNode(ptVert); // ads_polar(XPoint(ptVert), nExtDir, pBayWin->m_nProtrude-nBayThick+nOffset, ptVert); // poly2d.AppendNode(ptVert); // ads_polar(XPoint(ptVert), nExtDir+PI/2, nWidth+nOffset, ptVert); // poly2d.AppendNode(ptVert); //} //else { if (bRightSlab) ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nSlabThick, ptVert); else ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffset, ptVert); poly2d.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir, pBayWin->m_nProtrude, ptVert); poly2d.AppendNode(ptVert); double width1 = nWidth; width1 += bRightSlab ? nSlabThick : nOffset; width1 += bLeftSlab ? nSlabThick : nOffset; ads_polar(XPoint(ptVert), nExtDir+PI/2, width1, ptVert); poly2d.AppendNode(ptVert); if (bLeftSlab) ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nSlabThick, ptVert); else ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffset, ptVert); poly2d.AppendNode(ptVert); } } else if (pBayWin->m_nStyle == XBayWindow::BWS_TRIANGLE) { double a = (pBayWin->m_nProtrude/(nWidth/2))*(pBayWin->m_nProtrude/(nWidth/2))+1.0; double b = -2.0*pBayWin->m_nProtrude*nBayThick/(nWidth*nWidth/4); double c = (nBayThick/(nWidth/2))*(nBayThick/(nWidth/2))-1.0; ASSERT(b*b-4*a*c>0.0); double y1 = (-b + sqrt(b*b-4*a*c))/2/a; double y2 = (-b - sqrt(b*b-4*a*c))/2/a; double y = 0.0; if (y1>0.0 && y1<1.0) y=y1; else if (y2>-0.0 && y2<1.0) y=y2; else ASSERT(0); double x = (pBayWin->m_nProtrude*y-nBayThick)/(nWidth/2); //sqrt(1.0-y*y); ASSERT(x>0.0 && x<1.0); ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nOffset/fabs(x), ptVert); poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir, pBayWin->m_nProtrude-nBayThick/fabs(y)+nOffset/fabs(y), ptVert); poly2d.AppendNode(ptVert); ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nOffset/fabs(x), ptVert); poly2d.AppendNode(ptVert); } else if (pBayWin->m_nStyle == XBayWindow::BWS_ARC) { double h0 = pBayWin->m_nProtrude-nBayThick; double r0 = (nWidth*nWidth/4.0/h0+h0)/2.0; double dh = nOffset; double l = sqrt(2*r0*h0 + dh*dh + 2*dh*r0 - h0*h0); //double p1=m_nProtrude-nBayThick; //double p=p1+nOffsetDist[idx]; //double nOffHor=nWidth/2.0*(p/p1-1.0); //double l=nWidth/2.0+nOffHor; //弦长的一半 if(l<_DIST_SNAP) return Acad::eInvalidInput; double nSweepAng = 4*atan((h0+nOffset)/l); ads_polar(ptBase, nExtDir-PI/2, l, ptVert); poly2d.AppendNode(ptVert, nSweepAng); ads_polar(ptBase, nExtDir+PI/2, l, ptVert); poly2d.AppendNode(ptVert); } else { return Acad::eInvalidInput; } poly2d.SetFlag(1); return Acad::eOk; } Acad::ErrorStatus XBayWindow::GetVertSlabPoly(XPoint ptLoc, double nExtDir, double nWidth, double nWallThick, double nSlabThick, XPoly2D &polyLeft,XPoly2D&polyRight)const { XPoint ptBase, ptVert; ads_polar(ptLoc, nExtDir, nWallThick/2.0, ptBase); { ads_polar(ptBase, nExtDir-PI/2, nWidth/2+nSlabThick, ptVert); polyRight.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude, ptVert); polyRight.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir+PI/2, nSlabThick, ptVert); polyRight.AppendNode(ptVert); ads_polar(ptBase, nExtDir-PI/2, nWidth/2, ptVert); polyRight.AppendNode(ptVert); } { ads_polar(ptBase, nExtDir+PI/2, nWidth/2+nSlabThick, ptVert); polyLeft.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir, m_nProtrude, ptVert); polyLeft.AppendNode(ptVert); ads_polar(XPoint(ptVert), nExtDir-PI/2, nSlabThick, ptVert); polyLeft.AppendNode(ptVert); ads_polar(ptBase, nExtDir+PI/2, nWidth/2, ptVert); polyLeft.AppendNode(ptVert); polyLeft.Reverse(); } return Acad::eOk; }