#include "stdafx.h" #include "wall_xdata_key.h" ACRX_DXF_DEFINE_MEMBERS(ATSCurtainWall, ATSWall, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_CURTAIN_WALL, "ATS_CURTAIN_WALL图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbCurtainWall); //TArch6:1;TArch7:2 const Adesk::UInt8 TDbCurtainWall::g_nVersion=2; TDbCurtainWall::TDbCurtainWall() :m_colAlign(kCenter), //挺的对齐位置 m_uCol(_AS_SYS_UNIT(100.0)), m_vCol(_AS_SYS_UNIT(100.0)), //挺的截面参数,u为沿着墙的方向尺寸 m_uRow(_AS_SYS_UNIT(100.0)), m_vRow(_AS_SYS_UNIT(100.0)), //框的截面参数, u为竖直方向的尺寸 m_nGlazDist(0.0), //玻璃距离基线 m_nRowDist(0.0), //横框中心距离基线 m_nRowNum(1), m_nColNum(1) //横竖均分数目 { m_nWallFlag = WF_TOP_ROW|WF_BOT_ROW|WF_COL_AVERAGE|WF_ROW_AVERAGE; m_style=kCurtain; SetSimple2D(TRUE); UpdateWallWidth(); } void TDbCurtainWall::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbWall::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbCurtainWall *pSrc=TDbCurtainWall::cast(pSrcEntity); if(pSrc) { m_idLayerCol3d=pSrc->m_idLayerCol3d; m_idLayerRow3d=pSrc->m_idLayerRow3d; m_idLayerGlass3d=pSrc->m_idLayerGlass3d; m_colAlign=pSrc->m_colAlign; m_uCol=pSrc->m_uCol; m_vCol=pSrc->m_vCol; m_uRow=pSrc->m_uRow; m_vRow=pSrc->m_vRow; m_nGlazDist=pSrc->m_nGlazDist; m_nRowDist=pSrc->m_nRowDist; //wlw add 131125 非均分幕墙处理墙角崩溃 int nColCount = m_colSpaces.Length(); if (m_nColNum != nColCount) { SetColAverage(TRUE); } } } // Override from AcDbEntity // 从DWG读入数据: Acad::ErrorStatus TDbCurtainWall::dwgInFields(AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbWall::dwgInFields(pFiler); if(es != Acad::eOk) return es; Adesk::UInt8 nVer=0; pFiler->readItem(&nVer); if(nVer>g_nVersion) {// Version is too new return Acad::eMakeMeProxy; } if(nVer==1)//TArch6图 { //WF_COL_AVERAGE0->WM_COL_AVERAGE if((m_nWallFlag&WF_COL_AVERAGE0)!=0) { m_nWallFlag&=~WF_COL_AVERAGE0; m_nWallFlag|=WF_COL_AVERAGE; } } Adesk::UInt8 align; pFiler->readItem(&align); m_colAlign=(ColAlignment)align; //挺的对齐位置 pFiler->readItem(&m_uCol); pFiler->readItem(&m_vCol); //挺的截面参数,u为沿着墙的方向尺寸 pFiler->readItem(&m_uRow); pFiler->readItem(&m_vRow); //框的截面参数, u为竖直方向的尺寸 pFiler->readItem(&m_nGlazDist); //玻璃距离基线 pFiler->readItem(&m_nRowDist); //横框中心距离基线 pFiler->readItem(&m_nRowNum); pFiler->readItem(&m_nColNum); //横竖均分数目 m_rowSpaces.Reset(); m_colSpaces.Reset(); if(!IsRowAverage()) { for(Adesk::UInt8 i=0; ireadItem(&val); m_rowSpaces.Append(new double(val)); } } if(!IsColAverage()) { for(Adesk::UInt8 i=0; ireadItem(&val); m_colSpaces.Append(new double(val)); } } pFiler->readItem(&m_idLayerGlass3d); pFiler->readItem(&m_idLayerCol3d); pFiler->readItem(&m_idLayerRow3d); es = pFiler->filerStatus(); return es; } // 写出数据到dwg: Acad::ErrorStatus TDbCurtainWall::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); int nFlag0=GetWallFlag(); if(g_nSaveTArchVer==6) { int flag=nFlag0; //~WF_SECT_TERM flag&=~WF_SECTTERM; //WF_COL_AVERAGE if(flag&WF_COL_AVERAGE) { flag&=~WF_COL_AVERAGE; flag|=WF_COL_AVERAGE0; } TDbCurtainWall*pThis=(TDbCurtainWall*)this; pThis->SetFlagData(flag); } Acad::ErrorStatus es = TDbWall::dwgOutFields(pFiler); if(GetWallFlag()!=nFlag0) { TDbCurtainWall*pThis=(TDbCurtainWall*)this; pThis->SetFlagData(nFlag0);//复原 } if(es != Acad::eOk) return es; if(g_nSaveTArchVer==6) pFiler->writeItem((Adesk::UInt8)1); else pFiler->writeItem(g_nVersion); pFiler->writeItem((Adesk::UInt8)m_colAlign); pFiler->writeItem(m_uCol); pFiler->writeItem(m_vCol); //挺的截面参数,u为沿着墙的方向尺寸 pFiler->writeItem(m_uRow); pFiler->writeItem(m_vRow); //框的截面参数, u为竖直方向的尺寸 pFiler->writeItem(m_nGlazDist); //玻璃距离基线 pFiler->writeItem(m_nRowDist); //横框中心距离基线 pFiler->writeItem(m_nRowNum); pFiler->writeItem(m_nColNum); //横竖均分数目 Adesk::UInt8 i; if(!IsRowAverage()) { ASSERT(m_nRowNum==m_rowSpaces.Length()); for(i=0; iwriteItem(m_rowSpaces[i]); } if(!IsColAverage()) { //wlw add 131125 非均分幕墙处理墙角崩溃 int nColCount = m_colSpaces.Length(); if (m_nColNum != nColCount) { for(i=0; i< m_nColNum; i++) pFiler->writeItem(500.0); } else { for(i=0; i< m_nColNum; i++) pFiler->writeItem(m_colSpaces[i]); } } pFiler->writeItem(m_idLayerGlass3d); pFiler->writeItem(m_idLayerCol3d); pFiler->writeItem(m_idLayerRow3d); es=pFiler->filerStatus(); return es; } Acad::ErrorStatus TDbCurtainWall::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbWall::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbCurtainWall"))) { return Acad::eBadDxfSequence; } int n1=1, n2=1; DList lstRows, lstCols; resbuf rb; int fieldsFlags=0; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case 77: m_colAlign=(ColAlignment)rb.resval.rint; break; case 78: n1=rb.resval.rint; fieldsFlags |= 0x01; break; case 79: n2=rb.resval.rint; fieldsFlags |= 0x02; break; case 140: m_uRow=rb.resval.rreal; break; case 141: m_vRow=rb.resval.rreal; break; case 142: m_uCol=rb.resval.rreal; break; case 143: m_vCol=rb.resval.rreal; break; case 144: m_nGlazDist=rb.resval.rreal; break; case 145: m_nRowDist=rb.resval.rreal; break; case 148: fieldsFlags |= 0x04; lstRows.Append(new double(rb.resval.rreal)); break; case 149: fieldsFlags |= 0x08; lstCols.Append(new double(rb.resval.rreal)); break; case 415: m_idLayerGlass3d=LayerString2Id(rb.resval.rstring, database()); free(rb.resval.rstring); break; case 416: m_idLayerRow3d=LayerString2Id(rb.resval.rstring, database()); free(rb.resval.rstring); break; case 417: m_idLayerCol3d=LayerString2Id(rb.resval.rstring, database()); free(rb.resval.rstring); break; //fall through intentional default: // An unrecognized group. Push it back so that // the subclass can read it again. pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if (es != Acad::eEndOfFile) return Acad::eInvalidResBuf; if((fieldsFlags&0x01)) { m_nRowNum=n1; } else { m_nRowNum=1; } if((fieldsFlags&0x02)) { m_nColNum=n1; } else { m_nColNum=1; } m_rowSpaces.Reset(); m_colSpaces.Reset(); if(!IsRowAverage()) { if(lstRows.Length()!=m_nRowNum) SetRowAverage(TRUE); else { for(int n=0; nfilerStatus(); } Acad::ErrorStatus TDbCurtainWall::dxfOutFields(AcDbDxfFiler* pFiler) const { Acad::ErrorStatus es; es = TDbWall::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbCurtainWall")); assert(es == Acad::eOk); pFiler->writeInt16(77, (Adesk::UInt16)m_colAlign); pFiler->writeInt16(78, (Adesk::UInt16)m_nRowNum); pFiler->writeInt16(79, (Adesk::UInt16)m_nColNum); pFiler->writeDouble(140, m_uRow); pFiler->writeDouble(141, m_vRow); pFiler->writeDouble(142, m_uCol); pFiler->writeDouble(143, m_vCol); pFiler->writeDouble(144, m_nGlazDist); pFiler->writeDouble(145, m_nRowDist); if(!IsRowAverage()) { for(int i=0; iwriteDouble(146, m_rowSpaces[i]); } } if(!IsColAverage()) { for(int i=0; iwriteDouble(146, m_colSpaces[i]); } } pFiler->writeString(415, (const TCHAR *)LayerId2String(m_idLayerGlass3d)); pFiler->writeString(416, (const TCHAR *)LayerId2String(m_idLayerRow3d)); pFiler->writeString(417, (const TCHAR *)LayerId2String(m_idLayerCol3d)); return es; } Acad::ErrorStatus TDbCurtainWall::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } Acad::ErrorStatus TDbCurtainWall::subTransformBy(const AcGeMatrix3d& xform) { BOOL bRowHide=IsRowHide(); BOOL bColHide=IsColHide(); Acad::ErrorStatus es=TDbWall::subTransformBy(xform); SetRowHide(bRowHide); SetColHide(bColHide); return es; } // 绘制二维 // 尚未考虑门洞 Acad::ErrorStatus TDbCurtainWall::ExplodeOrDraw2d(XExplodeDraw &dc) const { if(IsSimple2D()) return TDbWall::ExplodeOrDraw2d(dc); double nGlazDist=20.0; //玻璃厚度扩大表示 XPoint ptCen; BOOL bLinear=TRUE; if(!Is(CURVE_LINE)) { ptCen=GetArc().GetCenterPt(); bLinear=FALSE; } int nExtSide=OFFSET_RIGHT; if((GetWallFlag()&WF_LEFTEXT)!=0) nExtSide=OFFSET_LEFT; DList segBars, segGlazes; //绘制挺 //XPointDir2d ptCenRect; double nAverDist=GetLength()/m_nColNum; double nCurDist=0.0; XPointDir2d ptLast, ptLastDir2d;; for(Adesk::UInt8 i=0; i<=m_nColNum; i++) { double nFactor=nExtSide? 1.0 : -1.0; XPointDir2d ptDir2d; Polar(nCurDist, ptDir2d); ptDir2d.z=0; XPointDir2d ptCenRect=ptDir2d; if(m_colAlign==kInside) ads_polar(ptDir2d, ptDir2d.nDirection-PI/2.0*nFactor, m_vCol/2.0, ptCenRect); else if(m_colAlign==kOutside) ads_polar(ptDir2d, ptDir2d.nDirection+PI/2.0*nFactor, m_vCol/2.0, ptCenRect); ptCenRect.z=0; XRectAngle box(ptCenRect, m_uCol, m_vCol); XPoly2D poly2d(1); box.AsPoly2D(poly2d); ads_matrix mat; ptCenRect.GetRotationMatrix(ptCenRect.nDirection, mat); poly2d.TransUCS(mat); ExplodePoly2D(poly2d, segBars); //dc << poly2d; //绘制竖挺 if(i>0) { XLine lnStartSide, lnEndSide; //竖挺的起始侧和结束侧 XPoint ptTemp1, ptTemp2; ads_polar(ptCenRect, ptDir2d.nDirection+PI/2.0, m_vCol/2.0, ptTemp1); ads_polar(ptCenRect, ptDir2d.nDirection-PI/2.0, m_vCol/2.0, ptTemp2); lnEndSide = XLine(ptTemp1, ptTemp2).Offset(m_uCol/2.0); ads_polar(ptLast, ptLast.nDirection+PI/2.0, m_vCol/2.0, ptTemp1); ads_polar(ptLast, ptLast.nDirection-PI/2.0, m_vCol/2.0, ptTemp2); lnStartSide = XLine(ptTemp1, ptTemp2).Offset(-m_uCol/2.0); XCurveSegment segExt, segInt; //外侧玻璃和内侧玻璃 double nGlazOffset=min(m_vCol, nGlazDist); //绘制玻璃 if(IsColHide()) { //隐式 XPoint pt1, pt2; ads_polar(ptCenRect, ptCenRect.nDirection - PI/2.0*nFactor, m_vCol/2.0, pt2); ads_polar(ptLast, ptLast.nDirection-PI/2.0*nFactor, m_vCol/2.0, pt1); if(Is(CURVE_LINE)) { segExt = XLine(pt1, pt2); //XLine(ptLast, ptDir2d); //外侧玻璃(关键) } else { double rad=ads_distance(ptCen, pt1); segExt = XArc(ptCen, rad, ads_angle(ptCen, pt1), ads_angle(ptCen, pt2)); } } else { //显框 segExt = Offset(m_nGlazDist/2, LS_INFINITE); segExt.SetElevation(0.0); XPoint ptInt[2]; XPoint pt1, pt2; int iNum=segExt.Intersection(lnStartSide, ptInt[0], ptInt[1]); ASSERT(iNum); if(iNum==1) pt1=ptInt[0]; else pt1=XLine(ptInt[0], ptInt[1]).NearPoint(ptLast); iNum=segExt.Intersection(lnEndSide, ptInt[0], ptInt[1]); ASSERT(iNum); if(iNum==1) pt2=ptInt[0]; else pt2=XLine(ptInt[0], ptInt[1]).NearPoint(ptCenRect); segExt.SetPoints(pt1, pt2); } segInt = segExt.Offset(-nGlazOffset*nFactor*(IsColHide()? -1.0 : 1.0), LS_INFINITE); if(!IsColHide()) { //segIn进行裁剪 XPoint ptInt[2]; XPoint pt1, pt2; int iNum=segInt.Intersection(lnStartSide, ptInt[0], ptInt[1]); ASSERT(iNum); if(iNum==1) pt1=ptInt[0]; else pt1=XLine(ptInt[0], ptInt[1]).NearPoint(ptLast); iNum=segInt.Intersection(lnEndSide, ptInt[0], ptInt[1]); ASSERT(iNum); if(iNum==1) pt2=ptInt[0]; else pt2=XLine(ptInt[0], ptInt[1]).NearPoint(ptCenRect); segInt.SetPoints(pt1, pt2); } else { //绘制垂直隐框的玻璃线端头 if(bLinear || nExtSide==OFFSET_RIGHT) segGlazes.Append(new XCurveSegment(segExt.StartPoint(), segInt.StartPoint(), 0.0)); else segGlazes.Append(new XCurveSegment(segExt.EndPoint(), segInt.EndPoint(), 0.0)); if(m_nColNum==i) { if(bLinear || nExtSide==OFFSET_RIGHT) segGlazes.Append(new XCurveSegment(segExt.EndPoint(), segInt.EndPoint(), 0.0)); else segGlazes.Append(new XCurveSegment(segExt.StartPoint(), segInt.StartPoint(), 0.0)); } } //dc << segExt << segInt; segGlazes.Append(new XCurveSegment(segExt)); //if(0) //4线表示 segGlazes.Append(new XCurveSegment(segInt)); } if(i < m_nColNum) { double nDist=nAverDist; if(!IsColAverage()) nDist=m_colSpaces[i]; nCurDist += nDist; ptLast = ptCenRect; ptLast.nDirection=ptDir2d.nDirection; ptLastDir2d = ptDir2d; } } //用门窗洞,扣减 DList lstOpenings; GetSortedOpenings(lstOpenings); DList segBarOuts, segGlazeOuts; for(int k=0; kGetSideLine2d(lnLeft, lnRight); for(int nIter=0; nIter<2; nIter++) { DList &lstSegs=nIter? segGlazes : segBars; DList &lstSegOuts=nIter? segGlazeOuts : segBarOuts; for(int m=0; mSetPoints(seg.StartPoint(), ptInt[0]); seg.SetPoints(ptInt[0], XPoint(seg.EndPoint())); } else if(nFlag2==OFFSET_LEFT) { segOut->SetPoints(ptInt[0], seg.EndPoint()); seg.SetPoints(XPoint(seg.StartPoint()), ptInt[0]); } else ASSERT(0); lstSegOuts.Append(segOut); if(nTag1!=OFFSET_RIGHT && nTag2!=OFFSET_RIGHT) { //都在右线左边,删除 lstSegs.Remove(m); m--; } else if(nTag1!=OFFSET_LEFT && nTag2!=OFFSET_LEFT) { //都在右线右边,不可能 ASSERT(0); } else { //与右线相交 XPoint ptInt[2]; int nIntNum=seg.Intersection(lnRight, ptInt[0], ptInt[1]); ASSERT(nIntNum==1); if(nTag2==OFFSET_RIGHT) seg.SetPoints(ptInt[0], XPoint(seg.EndPoint())); else if(nTag1==OFFSET_RIGHT) seg.SetPoints(seg.StartPoint(), ptInt[0]); else ASSERT(0); } } } } // end for Iter } // end for k // 输出玻璃 for(int j=0; j lstColPos; DList lstRow; //确定竖挺位置和转角 double nAverDist=GetLength()/m_nColNum; double nCurDist=0.0; double nElev=GetElevation(); for(Adesk::UInt8 i=0; i<=m_nColNum; i++) { XPointDir2d ptDir2d; Polar(nCurDist, ptDir2d); XPointDir2d ptCenRect=ptDir2d; if(m_colAlign==kInside) ads_polar(ptDir2d, ptDir2d.nDirection-PI/2.0*nFactor, m_vCol/2.0, ptCenRect); else if(m_colAlign==kOutside) ads_polar(ptDir2d, ptDir2d.nDirection+PI/2.0*nFactor, m_vCol/2.0, ptCenRect); ptCenRect.z=nElev; lstColPos.Append(new XPointDir2d(ptCenRect)); if(iSetElevation(nElevCur); lstRow.Append(segNew); } // 构造门窗洞 DList lstOpenings; GetOpenings(lstOpenings, FALSE); DList holes, holeExpands; for(i=0; iSetElevation(0.0); holeExpands.Append(polyExpand); } dc.SetColorLayer(colorIndex(), m_idLayerCol3d); double nExtrude=10.0; // 凸出距离以便造成隐框错觉 //绘制竖挺 for(i=0; i srcSegs, inSegs, outSegs, edgeSegs, *pSource, *pDest;; srcSegs.Append(pSeg); pSource=&srcSegs; pDest=&outSegs; for(int n=0; nReset(); PolyClip(*pSource, *holeExpands[n], inSegs, *pDest, edgeSegs); TchPrivate::Exchange(pSource, pDest); } for(int k=0; kLength(); k++) { XCurveSegment *segOut=(*pSource)[k]; double yMin=min(segOut->StartPoint().y, segOut->EndPoint().y); double yMax=max(segOut->StartPoint().y, segOut->EndPoint().y); XPoint ptBoxCen=pos; ptBoxCen.z = yMin; XRectAngle box(ptBoxCen, m_uCol, m_vCol); XPoly2D poly2d(1); box.AsPoly2D(poly2d); if(IsColHide()) { if(nExtSide) { XPoint ptAdd[4]; ptAdd[0].x=-nExtrude/2; ptAdd[0].y=-m_vCol/2; ptAdd[1].x=-nExtrude/2; ptAdd[1].y=-m_vCol/2-nExtrude; ptAdd[2].x=nExtrude/2; ptAdd[2].y=-m_vCol/2-nExtrude; ptAdd[3].x=nExtrude/2; ptAdd[3].y=-m_vCol/2; for(int mm=0; mm<4; mm++) ptAdd[mm] += XVector3D(ptBoxCen.x, ptBoxCen.y); poly2d.InsertNodeAt(1, ptAdd[0]); poly2d.InsertNodeAt(2, ptAdd[1]); poly2d.InsertNodeAt(3, ptAdd[2]); poly2d.InsertNodeAt(4, ptAdd[3]); } else { XPoint ptAdd[4]; ptAdd[0].x=nExtrude/2; ptAdd[0].y=m_vCol/2; ptAdd[1].x=nExtrude/2; ptAdd[1].y=m_vCol/2+nExtrude; ptAdd[2].x=-nExtrude/2; ptAdd[2].y=m_vCol/2+nExtrude; ptAdd[3].x=-nExtrude/2; ptAdd[3].y=m_vCol/2; for(int mm=0; mm<4; mm++) ptAdd[mm] += XVector3D(ptBoxCen.x, ptBoxCen.y); poly2d.InsertNodeAt(3, ptAdd[0]); poly2d.InsertNodeAt(4, ptAdd[1]); poly2d.InsertNodeAt(5, ptAdd[2]); poly2d.InsertNodeAt(6, ptAdd[3]); } } ads_matrix mat; pos.GetRotationMatrix(pos.nDirection, mat); poly2d.TransUCS(mat); poly2d.SetElevation(ptBoxCen.z); dc.DrawMesh(poly2d, XVector3D(0,0,yMax-yMin)); } } dc.RestoreProperties(prop); dc.SetColorLayer(colorIndex(), m_idLayerRow3d); XPoly2D polyShape; XRectAngle(XPoint(), m_vRow, m_uRow).AsPoly2D(polyShape); if(IsRowHide()) { if(nExtSide) { XPoint ptAdd[4]; ptAdd[0].x=m_vRow/2; ptAdd[0].y=-nExtrude/2; ptAdd[1].x=m_vRow/2+nExtrude; ptAdd[1].y=-nExtrude/2; ptAdd[2].x=m_vRow/2+nExtrude; ptAdd[2].y=nExtrude/2; ptAdd[3].x=m_vRow/2; ptAdd[3].y=nExtrude/2; polyShape.InsertNodeAt(2, ptAdd[0]); polyShape.InsertNodeAt(3, ptAdd[1]); polyShape.InsertNodeAt(4, ptAdd[2]); polyShape.InsertNodeAt(5, ptAdd[3]); } else { XPoint ptAdd[4]; ptAdd[0].x=-m_vRow/2; ptAdd[0].y=nExtrude/2; ptAdd[1].x=-m_vRow/2-nExtrude; ptAdd[1].y=nExtrude/2; ptAdd[2].x=-m_vRow/2-nExtrude; ptAdd[2].y=-nExtrude/2; ptAdd[3].x=-m_vRow/2; ptAdd[3].y=-nExtrude/2; polyShape.AppendNode(ptAdd[0]); polyShape.AppendNode(ptAdd[1]); polyShape.AppendNode(ptAdd[2]); polyShape.AppendNode(ptAdd[3]); } } //绘制横框 for(i=0; i srcSegs, inSegs, outSegs, edgeSegs, *pSource, *pDest;; srcSegs.Append(pSeg); pSource=&srcSegs; pDest=&outSegs; for(int n=0; nReset(); PolyClip(*pSource, *holeExpands[n], inSegs, *pDest, edgeSegs); TchPrivate::Exchange(pSource, pDest); } TDbCurveMesh obj; obj.setPropertiesFrom(this); obj.setLayer(m_idLayerRow3d); TPushProperty vProp(&obj, dc); for(int k=0; kLength(); k++) { XCurveSegment *segBase=(*pSource)[k]; segBase->SetElevation(z1); XCurveSegment segWcs(segRow); XPoint pt1=segOnZero.Ecs2Wcs(segBase->StartPoint()); XPoint pt2=segOnZero.Ecs2Wcs(segBase->EndPoint()); segWcs.SetPoints(pt1, pt2); XPoly2D polyBase; segWcs.AsPoly2D(polyBase); obj.setColorIndex(256); obj.SetBasePoly(polyBase); obj.SetShapePoly(polyShape); obj.ExplodeOrDraw3d(dc); } } dc.RestoreProperties(prop); dc.SetColorLayer(colorIndex(), m_idLayerGlass3d); XCurveSegment segGlazTemp=segGlaz.Offset(nFactor*nExtrude/2, LS_FINITE); segGlaz=segGlazTemp; // 绘制玻璃 //t20 wlw add 14.02.17 幕墙三维颜色 AcCmColor crRef; Adesk::UInt32 ncolor(0); m_XDataMap.GetAt(uKEY_CURTAIN_GLASS_COLOUR_INDEX, (int&)ncolor); if (ncolor > 0) { #if ADS > 23 #if defined(ZWCAD) && (ADS == 24 || defined(R24)) crRef.setRGB(GetRValue(ncolor), GetGValue(ncolor), GetBValue(ncolor)); #else crRef.setRGB(ncolor); #endif #else crRef.setColor(ncolor); #endif dc.SetTrueColor(crRef); } if(!holes) dc.DrawCurve(segGlaz, m_nHeight); else { if(Is(CURVE_ARC)) { XArc iAr=segGlaz.GetArc(); DrawArcFace(dc, iAr, m_nHeight, holes); } else { XPoly2D polyOut(1); polyOut.AppendNode(segGlaz.StartPoint()); polyOut.AppendNode(segGlaz.EndPoint()); XCurveSegment segTemp(segGlaz); segTemp.SetElevation(m_nHeight+segGlaz.StartPoint().z); polyOut.AppendNode(segTemp.EndPoint()); polyOut.AppendNode(segTemp.StartPoint()); // 要把holes投影到合适的polyOut XPlane plan; plan.SetFrom3p(segGlaz.StartPoint(), segGlaz.EndPoint(), segTemp.EndPoint()); for(int n=0; nProject(&plan); } dc.DrawShell(polyOut, holes); } } dc.RestoreProperties(prop); return Acad::eOk; } //取动态属性显示数据 void TDbCurtainWall::GetTips(DList &lstInfos) const { TDbWall::GetTips(lstInfos); } // SetData void TDbCurtainWall::SetRowNum(Adesk::UInt8 rowNum) { assertWriteEnabled(); if(rowNum) m_nRowNum=rowNum; /* if(IsRowAverage() && rowNum) { m_nRowNum=rowNum; m_rowSpaces.Reset(); for(Adesk::UInt8 i=0; iisKindOf(TDbCurtainWall::desc())) return; TDbCurtainWall* pWall = (TDbCurtainWall*)pNewWall; double dNewLenght = pWall->GetLength(); if(fabs(dNewLenght - dOldLenght) < 0.01) return; if(pWall->IsColAverage()) { int nColNum = pWall->GetColNum(); if(nColNum <= 0) nColNum = 1; pWall->SetColAverage(true); if(dOldLenght < DocGetMinLenWall()) { pWall->SetColNum(nColNum); return; } double dAveColLen = dOldLenght / nColNum; nColNum = ((int)dNewLenght) / (int)dAveColLen; double dTemp = dNewLenght - nColNum * dAveColLen; if( fabs(dTemp) < 0.01) //墙的长度刚好是pWallData->dFixedGapLen的倍数 { } else if(dTemp > 0.0) { ++nColNum; } else { --nColNum; } if(nColNum <= 0) nColNum = 1; pWall->SetColNum(nColNum); } else { pWall->SetColAverage(false); int nColNum = pWall->m_colSpaces.Length(); if(nColNum == 0) { nColNum = 1; pWall->SetColNum(1); pWall->m_colSpaces.Reset(); pWall->m_colSpaces.Append(new double(dNewLenght)); return; } double dFirstLen = *(pWall->m_colSpaces.GetAt(0)); double dTempLen; double dSumColLen = dFirstLen; bool bIsSame = true; //判断前nColNum - 1个是否相等 for(int i = 1; i < pWall->m_colSpaces.Length() - 1; ++i) { dTempLen = *(pWall->m_colSpaces.GetAt(i)); dSumColLen += dTempLen; if(bIsSame) { if(fabs(dTempLen - dFirstLen) > 0.01) { bIsSame = false; } } } dSumColLen += *(pWall->m_colSpaces.GetAt(pWall->m_colSpaces.Length() - 1)); if(bIsSame) { pWall->m_colSpaces.Reset(); nColNum = (int)(dNewLenght / dFirstLen); for(int i = 0; i < nColNum; ++i) pWall->m_colSpaces.Append(new double(dFirstLen)); double dOdd = dNewLenght - nColNum * dFirstLen; if(dOdd > 0.01) { pWall->m_colSpaces.Append(new double(dOdd)); ++nColNum; } pWall->SetColNum(nColNum); } else { if(dOldLenght < dNewLenght) { double dSumLen = dOldLenght; while(dSumLen + dFirstLen < dNewLenght) { pWall->m_colSpaces.Append(new double(dFirstLen)); dSumLen += dFirstLen; } if(fabs(dNewLenght - dSumLen) > 0.01) { pWall->m_colSpaces.Append(new double(dNewLenght - dSumLen)); } pWall->SetColNum(pWall->m_colSpaces.Length()); } else { int nColNum = pWall->m_colSpaces.Length(); double dLastLen; while(1) { dLastLen = *(pWall->m_colSpaces.GetAt(nColNum-1)); if(dSumColLen - dLastLen > dNewLenght) { pWall->m_colSpaces.Remove(nColNum -1); dSumColLen -= dLastLen; --nColNum; } else { pWall->m_colSpaces.Remove(nColNum -1); pWall->m_colSpaces.Append(new double(dNewLenght - dSumColLen)); break; } } pWall->SetColNum(nColNum); } } } } void TDbCurtainWall::WallSegmentateColumnAdjust(TDbCurtainWall* pWall, const double &lenght, double dSegmentatePos, BOOL& bFirstAve, UINT& nFirstColumnNum, std::vector& vecFirstColumnGap, BOOL& bSecondAve, UINT& nSecondColumnNum, std::vector& vecSecondColumnGap) { if(!pWall) return; double dWallLen = lenght; //如果分段位置不对 则对其进行容错性处理 if(dSegmentatePos < 0 || dSegmentatePos > dWallLen) { bFirstAve = TRUE; nFirstColumnNum = 1; bSecondAve = TRUE; nSecondColumnNum = 1; return ; } vecFirstColumnGap.clear(); vecSecondColumnGap.clear(); double dFirstWallLen = dSegmentatePos; double dSecondWallLen = dWallLen - dFirstWallLen; BOOL bAve = pWall->IsColAverage(); if(dWallLen < g_nMinLenWall) { bFirstAve = bAve; bSecondAve = bAve; if(bAve) { nFirstColumnNum = 1; nSecondColumnNum = 1; } else { vecFirstColumnGap.push_back(dFirstWallLen); vecSecondColumnGap.push_back(dSecondWallLen); } return; } bFirstAve = bAve; bSecondAve = bAve; if(bAve) { //认为是等分接近值 //那么分段后,两端新墙也将使用相同的等分接近值,但两端墙立柱间平均值不一定相当 UINT nColumnNum = pWall->GetColNum(); if(nColumnNum == 0) nColumnNum = 1; double dAveLen = dWallLen / nColumnNum; nFirstColumnNum = (UINT)(dFirstWallLen / dAveLen); if((dFirstWallLen - dAveLen * nFirstColumnNum) > 0.0) ++nFirstColumnNum; else if(fabs(dFirstWallLen - dAveLen * nFirstColumnNum) < 0.00001) nFirstColumnNum = nFirstColumnNum; else --nFirstColumnNum; nSecondColumnNum = (UINT)(dSecondWallLen / dAveLen); if((dSecondWallLen - dAveLen * nSecondColumnNum) > 0.0) ++nSecondColumnNum; else if(fabs(dSecondWallLen - dAveLen * nFirstColumnNum) < 0.00001) nSecondColumnNum = nSecondColumnNum; else --nSecondColumnNum; } else { //不等分, 分为两种情况, 先判断其是不是等间距的, 如果是等间距的,则新墙也将是等间距的 int nOldColNum = pWall->m_colSpaces.Length(); if(nOldColNum == 0) { vecFirstColumnGap.push_back(dFirstWallLen); vecSecondColumnGap.push_back(dSecondWallLen); return; } bool bIsEqualGap = true; double dFirstGap = *(pWall->m_colSpaces.GetAt(0)); double dNewGap; for(int i = 1; i < nOldColNum - 1; ++i) { dNewGap = *(pWall->m_colSpaces.GetAt(i)); if(fabs(dFirstGap - dNewGap) > 0.001) { bIsEqualGap = false; break; } } if(bIsEqualGap) //说明是等距的 { double dSum = dFirstGap; //第一段墙设置立柱间距 while(dSum < dFirstWallLen) { vecFirstColumnGap.push_back(dFirstGap); dSum += dFirstGap; } double dVestigialLen = dFirstWallLen - (dSum - dFirstGap); if(fabs(dVestigialLen) > 0.0) vecFirstColumnGap.push_back(dVestigialLen); dSum = dFirstGap; //第二段墙设置立柱间距 while(dSum < dSecondWallLen) { vecSecondColumnGap.push_back(dFirstGap); dSum += dFirstGap; } dVestigialLen = dSecondWallLen - (dSum - dFirstGap); if(fabs(dVestigialLen) > 0.0) vecSecondColumnGap.push_back(dVestigialLen); } else { bool bFirstWallHaveSet = false; double dFirstWallSumLen = 0.0; double dSecondWallSumLen = 0.0; for(int i = 0; i < nOldColNum; ++i) { dNewGap = *(pWall->m_colSpaces.GetAt(i)); if(dNewGap <= 0.0) continue; if(!bFirstWallHaveSet) { //先设置第一段墙 dFirstWallSumLen += dNewGap; if(dFirstWallSumLen < dFirstWallLen) { vecFirstColumnGap.push_back(dNewGap); } else { double dVestigialLen = dFirstWallLen - (dFirstWallSumLen - dNewGap); if(fabs(dVestigialLen) > 0.001) { vecFirstColumnGap.push_back(dVestigialLen); dFirstWallSumLen = dFirstWallLen; } bFirstWallHaveSet = true; } } else { dSecondWallSumLen += dNewGap; if(dSecondWallSumLen < dSecondWallLen) { vecSecondColumnGap.push_back(dNewGap); } else { double dVestigialLen = dSecondWallLen - (dSecondWallSumLen -dNewGap); if(fabs(dVestigialLen) > 0.001) { vecSecondColumnGap.push_back(dVestigialLen); dSecondWallSumLen = dSecondWallLen; } } } } //最后保证立柱的间距之和等于墙的长度 if(dFirstWallLen > dFirstWallSumLen) vecFirstColumnGap.push_back(dFirstWallLen - dFirstWallSumLen); if(dSecondWallLen > dSecondWallSumLen) vecSecondColumnGap.push_back(dSecondWallLen - dSecondWallSumLen); } } } Acad::ErrorStatus TDbCurtainWall::subMoveGripPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset ) { assertWriteEnabled(); Acad::ErrorStatus eRet; BOOL bColAve = IsColAverage(); if((eRet = TDbWall::subMoveGripPointsAt(indices, offset)) != Acad::eOk) return eRet; if(bColAve) return eRet; bool bWallLenghtChanged = false; for (int i = 0; i < indices.length(); i++) { if(indices[i] == 1 || indices[i] == 0) { bWallLenghtChanged = true; } } if(!bWallLenghtChanged) return eRet; int nColNum = m_colSpaces.Length(); if(nColNum == 0) return eRet; double dWallLen = GetLength(); bool bPreColLenSame = true; double dFirstColLen = *(m_colSpaces.GetAt(0)); double dCurColLen; double dColSum = dFirstColLen; if(dColSum >= dWallLen) { m_colSpaces.Reset(); m_colSpaces.Append(new double(dWallLen)); SetColNum(1); SetColAverage(FALSE); return eRet; } for(int i = 1; i < nColNum - 1; ++i) //最后一个列元素暂时不考虑,因为这个会影响判断前几个元素是否相等的判断 { dCurColLen = *(m_colSpaces.GetAt(i)); //判断前几个元素是否相等 if(bPreColLenSame) { if(fabs(dCurColLen - dFirstColLen) > 0.001) bPreColLenSame = false; } dColSum += dCurColLen; if(dColSum >= dWallLen) { //如果立柱长度之和大于墙的长度,说明墙缩短了, 此时删除后面的立柱 dColSum -= dCurColLen; //删除此位置后面的所有的元素 for(int j = i; j < nColNum; ++j) m_colSpaces.Remove(); nColNum = i; if(fabs(dWallLen - dColSum) > 0.001) { m_colSpaces.Append(new double(dWallLen - dColSum)); ++nColNum; } SetColNum(nColNum); SetColAverage(FALSE); return eRet; } } //考虑最后一个立柱 dCurColLen = *(m_colSpaces.GetAt(nColNum - 1)); m_colSpaces.Remove(); //上一句GetAt将指针置为最后一个元素位置, 此函数删除当前元素 nColNum = nColNum - 1; //新的立柱数目, 下面将会对此值进行修正 if(!bPreColLenSame) { if(dCurColLen > g_nMinLenWall) dFirstColLen = dCurColLen; } dColSum += dFirstColLen; while(dColSum < dWallLen) { m_colSpaces.Append(new double(dFirstColLen)); dColSum += dFirstColLen; ++nColNum; } double dLastColLen = dWallLen - (dColSum - dFirstColLen); if(dLastColLen > 0.001) { m_colSpaces.Append(new double(dLastColLen)); ++nColNum; } SetColNum(nColNum); SetColAverage(FALSE); return eRet; } #if (ADS == 17) void TDbCurtainWall::AppendForColSpaces(const double & d) { m_colSpaces.Append(new double(d)); } void TDbCurtainWall::AppendForRowSpaces(const double & d) { m_rowSpaces.Append(new double(d)); } #endif