574 lines
17 KiB
C++
574 lines
17 KiB
C++
#include "stdafx.h"
|
|
|
|
|
|
|
|
//Acad::ErrorStatus XBayWindow::GetPolyCurve(XPoint ptLoc, double nExtDir, double nWidth, double nWallThick,
|
|
// BOOL bLeftSlab, BOOL bRightSlab, DList<XPoly2D> &polyCurves,
|
|
// double dWallInsut, double dInsutAdd) const
|
|
Acad::ErrorStatus XBayWindow::GetPolyCurve(XPoint ptLoc, double nExtDir, double nWidth, double nWallThick,
|
|
BOOL bLeftSlab, BOOL bRightSlab, DList<XPoly2D> &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 && x1<t && y1>w0)
|
|
{
|
|
x = x1;
|
|
y = y1;
|
|
}
|
|
else if (x2>0.0 && x2<t && y2>w0)
|
|
{
|
|
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 && x1<t && y1>w0)
|
|
{
|
|
x=x1;
|
|
y=y1;
|
|
}
|
|
else if(x2>0.0 && x2<t && y2>w0)
|
|
{
|
|
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;
|
|
} |