#include "stdafx.h" #include "TDbColumn.h" ///////////////////////////////////////////////////////////// // 屋顶对象类 ///////////////////////////////////////////////////////////// const Adesk::UInt8 TDbStep::g_nVersion = 1; ACRX_DXF_DEFINE_MEMBERS(ATSStep, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_STEP, "ATS_STEP图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbStep); TDbStep::TDbStep() :m_polyOutline(1), m_nStepFlag(0) { m_nStepWidth=m_nStepHeight=0; m_nStepNum=0; } TDbStep::~TDbStep() { } BOOL TDbStep::IsValid() const { BOOL bRet=TDbEntity::IsValid(); if(!bRet) return bRet; bRet=(m_polyOutline.Length()>1 && //m_nStepNum>1 && //踏步数目 m_nStepNum>0 && //踏步数目,refreshed by whl on 060209 //m_nStepHeight>_DIST_SNAP && //m_nStepWidth>_DIST_SNAP); //踏步高和踏步宽 fabs(m_nStepHeight)>_DIST_SNAP &&//refreshed by whl on 051214 fabs(m_nStepWidth)>_DIST_SNAP); //踏步高和踏步宽 return bRet; } Acad::ErrorStatus TDbStep::audit(AcDbAuditInfo* pAuditInfo) { Acad::ErrorStatus es = Acad::eOk; // sg add 090806,解决高版本下修复02图纸,对象丢失的问题 es = TDbEntity::audit(pAuditInfo); if (es != Acad::eOk) return es; if (m_polyOutline.PathArea() >= 0.0) { pAuditInfo->errorsFound(1); if (pAuditInfo->fixErrors() == Adesk::kTrue) { pAuditInfo->printError(_T("柱子"), _T("轮廓"), _T("必须为逆时针"), _T("")); if(m_polyOutline.PathArea()>0) { m_polyOutline.Reverse(); int nEdgeNum=GetEdgeNum(); DList lstEdgeFlag; for(int n=0; nerrorsFixed(1); es = Acad::eFixedAllErrors; } else es = Acad::eLeftErrorsUnfixed; } return es; } Acad::ErrorStatus TDbStep::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 提供对格式刷的支持 void TDbStep::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbStep *pSrc=TDbStep::cast(pSrcEntity); if(pSrc) { m_nStepNum=pSrc->m_nStepNum; //踏步数目 m_nStepHeight=pSrc->m_nStepHeight; m_nStepWidth=pSrc->m_nStepWidth; //踏步高和踏步宽 } } Acad::ErrorStatus TDbStep::SetPathPoly(const XPoly2D &polyPath,const AcGeVector3d&normal) { assertWriteEnabled(); m_polyOutline=polyPath; return Acad::eOk; } Acad::ErrorStatus TDbStep::GetPathPoly(XPoly2D &polyPath,AcGeVector3d&normal) const { assertReadEnabled(); polyPath=m_polyOutline; normal=AcGeVector3d::kZAxis; return Acad::eOk; } // 从DWG读入数据: Acad::ErrorStatus TDbStep::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(&m_nStepFlag); double nElev=0.0; pFiler->readItem(&nElev); ReadPoly2D(pFiler, m_polyOutline); m_polyOutline.SetElevation(nElev); pFiler->readItem(&m_nStepNum); pFiler->readItem(&m_nStepWidth); pFiler->readItem(&m_nStepHeight); return pFiler->filerStatus(); } Acad::ErrorStatus TDbStep::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbEntity::dwgOutFields(pFiler); if(es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem(m_nStepFlag); double nElev=0.0; if(!!m_polyOutline) nElev=m_polyOutline[0].z; pFiler->writeItem(nElev); WritePoly2D(pFiler, m_polyOutline); pFiler->writeItem(m_nStepNum); pFiler->writeItem(m_nStepWidth); pFiler->writeItem(m_nStepHeight); return pFiler->filerStatus(); } Acad::ErrorStatus TDbStep::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbEntity::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbStep"))) { return Acad::eBadDxfSequence; } double r1, r2, r3, nAng; int nFlag; Adesk::UInt32 nFlag32; XPoint pt; Adesk::UInt32 fieldsFlags = 0; resbuf rb; DList lstIds; AcDbObjectId id; DList pts; DList bulges; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case 148: r1=rb.resval.rreal; fieldsFlags |= 0x01; break; case AcDb::kDxfReal: fieldsFlags |= 0x02; r2 = rb.resval.rreal; break; case AcDb::kDxfReal+1: fieldsFlags |= 0x04; r3 = rb.resval.rreal; break; case AcDb::kDxfInt16: fieldsFlags |= 0x08; nFlag=rb.resval.rint; break; case AcDb::kDxfInt32: nFlag32=rb.resval.rlong; fieldsFlags |= 0x10; break; case AcDb::kDxfAngle: nAng=rb.resval.rreal; bulges.Append(new double(nAng)); break; case AcDb::kDxfXCoord: pt=rb.resval.rpoint; pts.Append(new XPoint(pt)); 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; } } // At this point the es variable must contain eEndOfFile // - either from readResBuf() or from pushback. If not, // it indicates that an error happened and we should // return immediately. // if (es != Acad::eEndOfFile) return Acad::eInvalidResBuf; if (!(fieldsFlags & 0x02)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 40")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x04)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 41")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x08)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 70")); return Acad::eMissingDxfField; } if (pts.Length()<2 || pts.Length()!=bulges.Length()) { pFiler->setError(Acad::eMissingDxfField, _T("\nError DXF group code: 10, 50")); return Acad::eMissingDxfField; } double nElev=0.0; if(fieldsFlags&0x01) nElev=r1; SetStepHeight(r2); SetStepWidth(r2); SetStepNum(nFlag); if(fieldsFlags&0x10) m_nStepFlag=nFlag; m_polyOutline.Reset(); for(int i=0; ifilerStatus(); } Acad::ErrorStatus TDbStep::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es= TDbEntity::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbStep")); assert(es == Acad::eOk); pFiler->writeDouble(148, GetElevation()); pFiler->writeDouble(AcDb::kDxfReal, GetStepHeight()); pFiler->writeDouble(AcDb::kDxfReal+1, GetStepWidth()); pFiler->writeInt16(AcDb::kDxfInt16, GetStepNum()); pFiler->writeInt32(AcDb::kDxfInt32, m_nStepFlag); for(int i=0; iwritePoint2d(AcDb::kDxfXCoord, m_polyOutline[i].AsAcGePoint2d()); pFiler->writeDouble(AcDb::kDxfAngle, m_polyOutline.GetBulge(i)); } return es; } // ----------------------------------------------------------------------- // Overriden functions for edit // to do: // 允许通过夹点改变边界 Acad::ErrorStatus TDbStep::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { int nEdgeNum=GetEdgeNum(); for(int i=0; iTransformBy(mat); //以第一个顶点的z坐标为基准 if(i==0) { nElev = pt->z; } else { pt->z = nElev; } } // Add on 2002/1/30 解决弧段镜像后的问题 if(IsMirrorMatrix(mat)) { for(int m=0; m0) { m_polyOutline.Reverse(); int nEdgeNum=GetEdgeNum(); DList lstEdgeFlag; for(int n=0; n=0 && nPrev=0 && nNext1.0E-5) { XArc prevArc=prevSeg.GetArc(); double nAngBeg=ads_angle(prevArc.GetCenterPt(), prevSeg.StartPoint()); double nAngEnd=ads_angle(prevArc.GetCenterPt(), ptStart); if(prevSeg.IsMinusArc()) { nPrevBulge=-CT_std_angle(nAngBeg-nAngEnd); } else { nPrevBulge=CT_std_angle(nAngEnd-nAngBeg); } } if(fabs(nextSeg.GetBulge())>1.0E-5) { XArc nextArc=nextSeg.GetArc(); double nAngBeg=ads_angle(nextArc.GetCenterPt(), ptEnd); double nAngEnd=ads_angle(nextArc.GetCenterPt(), nextSeg.EndPoint()); if(nextSeg.IsMinusArc()) { nNextBulge=-CT_std_angle(nAngBeg-nAngEnd); } else { nNextBulge=CT_std_angle(nAngEnd-nAngBeg); } } *m_polyOutline[nEdgeIndex] = ptStart; if(nNext>=0 && nNext=0 && nPrev15 void TDbStep::CreateGrip() { TDbEntity::CreateGrip(); ::CreateGrip(this,m_polyOutline,0); } Acad::ErrorStatus TDbStep::EntityToDim(long iGrip,long iDim,const AcDbEntity*pEnt) { TEntityBase *pCurve=TDbStep::cast(pEnt); if(pCurve==NULL) pCurve=this; XPoly2D polyPath; AcGeVector3d normal; pCurve->GetPathPoly(polyPath,normal); return ::EntityToDim(this,polyPath,iGrip,iDim,0); } Acad::ErrorStatus TDbStep::DimToEntity(long iGrip,long iDim,double newValue,const AcGeVector3d& offset) { assertWriteEnabled(); TDbStep curve; curve.CopyPropertiesFrom(this,0); Acad::ErrorStatus es=::DimToEntity(this,m_polyOutline,iGrip,iDim,newValue,offset,0); if(es==Acad::eOk&&!IsValid()) { CopyPropertiesFrom(&curve,0); return Acad::eInvalidInput; } return es; } #endif // 功能: 夹点操作 // 状态: 有待完成修改相关墙体门窗的操作 Acad::ErrorStatus TDbStep::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { int nCount=indices.length(); return subMoveGripPointsAt(indices, offset); } Acad::ErrorStatus TDbStep::ExplodeOrDraw3d(XExplodeDraw &dc) const { assertReadEnabled(); XPoly2D polyCur(1); polyCur=m_polyOutline; //modified by whl on 070213,支持下沉 //if(m_nStepWidth>0) if((m_nStepWidth>0&&m_nStepHeight>0)|| (m_nStepWidth<0&&m_nStepHeight<0)|| (m_nStepWidth>0&&m_nStepHeight<0)) {//绘制平台 dc.DrawShell(polyCur, DList ()); } // 绘制踏步 for(int i=0; i0) { for(j=nColumn-1; j<2*(nColumn-1); j++) pEdgeVisArray[j]=kAcGiVisible; } // 拐点处的边应当可见 j=nRow*(nColumn-1); for(int kk=0; kkDistance(ptVert)<_DIST_SNAP) { bOnNode=TRUE; break; } } if(bOnNode) pEdgeVisArray[j]=kAcGiVisible; } AcGiEdgeData edgeData; edgeData.setVisibility(pEdgeVisArray); dc.DrawMesh(nRow, nColumn, (AcGePoint3d *)ptArray, &edgeData); delete []pEdgeVisArray; delete []ptArray; double nNewElev=polyCur[0]->z-m_nStepHeight; polyCur.SetElevation(nNewElev); if(i!=m_nStepNum-1) { //绘制平的部分 XPoly2D polyNext(1); if(!Offset(polyCur, polyNext)) break; if(m_nStepFlag==0) { //所有边都有台阶 DList lstPolys; if(m_nStepWidth>0) { lstPolys.Append(new XPoly2D(polyCur)); dc.DrawShell(polyNext, lstPolys); } else { lstPolys.Append(new XPoly2D(polyNext)); dc.DrawShell(polyCur, lstPolys); } } else { DList lstPolys; if(m_nStepWidth>0) TchSubExport::Subtract(polyNext, polyCur, lstPolys); else TchSubExport::Subtract(polyCur, polyNext, lstPolys); for(int ii=0; ii()); } } polyCur=polyNext; } if(i==m_nStepNum-1 ) { //add by whl on 070213,支持下沉 if((m_nStepWidth>0&&m_nStepHeight>0)|| (m_nStepWidth<0&&m_nStepHeight<0)|| (m_nStepWidth<0&&m_nStepHeight>0)) dc.DrawShell(polyCur, DList()); } } return Acad::eOk; } Acad::ErrorStatus TDbStep::GetClipBoundary(XPoly2D& poly)const { return GetOutline2d(poly); } bool TDbStep::IsClipMe(const TEntityBase* pEnt)const { if(TDbEntity::IsClipMe(pEnt)) return true; if(pEnt->GetMe()->isKindOf(TDbColumn::desc())) return true; return false; } Acad::ErrorStatus TDbStep::ExplodeOrDraw2d(XExplodeDraw &dc) const { assertReadEnabled(); XPoly2D polyCur(1); polyCur=m_polyOutline; polyCur.SetElevation(0.0); XCurveStream dcCurve; // 绘制踏步 for(int i=0; iClipCurveByTrace(dcCurve.m_lstCurves); OPENOBJ_END(); } } dcCurve.CopyTo(dc); return Acad::eOk; } const TCHAR *TDbStep::GetDefaultLayer() const { return LAY_STAIR; } /* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */ void TDbStep::GetTips(DList &lstInfo) const { lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("台阶"))); lstInfo.Append(new TObjInfoUnit(_T("踏步宽度"), Dist2Str(fabs(GetStepWidth())))); lstInfo.Append(new TObjInfoUnit(_T("踏步高度"), Dist2Str(fabs(GetStepHeight())))); lstInfo.Append(new TObjInfoUnit(_T("踏步数目"), XString(_T("%d"), int(GetStepNum())))); lstInfo.Append(new TObjInfoUnit(_T("台阶总高"), Dist2Str(fabs(GetTotalHeight())))); lstInfo.Append(new TObjInfoUnit(_T("平台高度"), Dist2Str(GetElevation()))); lstInfo.Append(new TObjInfoUnit(_T("基面位置"), (GetStepWidth()>0 && GetStepHeight()>0.0)? _T("在顶部") : _T("在底部"))); } int TDbStep::GetEdgeNum() const { return m_polyOutline.TotalSegments(); } BOOL TDbStep::HasStepAt(int idx) const { ASSERT(idx_DIST_SNAP) // dest.AppendNode(lastSeg.EndPoint(), 0.0); //curPt=curSeg.StartPoint(); return FALSE; } } } else curPt=nextPt; //上次求得的下一点 int nextIndex= i>=nTotalSeg-1? 0 : i+1; // 当前段为最后时, 下一段为起始段 XDirectionCurve nextMidSeg; src.Nth(nextIndex, nextMidSeg); if(!nextMidSeg && fabs(src.GetBulge(nextIndex))<1.0E-6) { // 2001/8/20, 有可能出现长度为0的边 XCurveSegment lnTemp; m_polyOutline.Nth(nextIndex, lnTemp); (XLine &)nextMidSeg=XLine(src[nextIndex], ads_angle(lnTemp.StartPoint(), lnTemp.EndPoint())); } XDirectionCurve nextSeg=nextMidSeg.Offset(GetOffsetDist(nextIndex), LS_INFINITE); if(!nextSeg) return FALSE; int ptNum=curSeg.Intersection(nextSeg, pt1, pt2); if(ptNum==2) nextPt=XLine(pt1, pt2).NearPoint(curSeg.EndPoint()); else if(ptNum==1) nextPt=pt1; else { return FALSE; } lastSeg=curSeg; if(curSeg.Is(CURVE_ARC)) { XArc arc=curSeg.GetArc(); if(!curSeg.IsMinusArc()) { //逆时针 arc.SetStarAngle(ads_angle(arc.GetCenterPt(), curPt)); arc.SetEndAngle(ads_angle(arc.GetCenterPt(), nextPt)); curSeg.SetBulge(arc.Bulge()); } else { arc.SetStarAngle(ads_angle(arc.GetCenterPt(), nextPt)); arc.SetEndAngle(ads_angle(arc.GetCenterPt(), curPt)); curSeg.SetBulge(-arc.Bulge()); } curSeg.StartPoint()=curPt; curSeg.EndPoint()=nextPt; } //添一段 dest.Append(new XPoint(curPt)); dest.AppendBugle(curSeg.GetBulge()); } return TRUE; } Acad::ErrorStatus TDbStep::GetExtents2d(XPoint &ptLow, XPoint &ptUp) const { assertReadEnabled(); XPoly2D poly2d(1); GetOutline2d(poly2d); poly2d.GetExtend(ptLow, ptUp); return Acad::eOk; } Acad::ErrorStatus TDbStep::GetExtents(XPoint &ptLow, XPoint &ptUp) const { Acad::ErrorStatus es=Acad::eOk; es=GetExtents2d(ptLow, ptUp); double nElev=GetElevation(); double nElev1=nElev+GetStepHeight(); ptLow.z=min(nElev, nElev1); ptUp.z=max(nElev, nElev1); return es; } Acad::ErrorStatus TDbStep::GetOutline2d(XPoly2D &poly2d) const { assertReadEnabled(); poly2d=GetStepOutline(); poly2d.SetElevation(0.0); if(m_nStepWidth>0) { for(int i=1; i0) nOffDist=-nOffDist; XCurveSegment segRail=seg1.Offset(nOffDist, LS_INFINITE).GetCurve(); if(seg1.IsMinusArc() || seg1.Is(CURVE_ARC)) { XArc ar0=seg0.GetArc(); XArc ar1=seg1.GetArc(); XPoint ptOn; if(ar0.GetCenterPt().Distance(ar1.GetCenterPt())<_DIST_SNAP && fabs(ar0.GetRadius()-ar1.GetRadius()):"); XString sKeyword; int nRet=0; INITGET_BEG(0, _T("W H N T L")); nRet=ads_getkword(szPrompt1, sKeyword); INITGET_END(); if(nRet!=RTNORM) break; if(sKeyword[0]==_T('W')) { double nStepWidth=pStep->GetStepWidth(); nRet=GetReal(_T("\n踏步宽度"), nStepWidth); if(nRet==RTCAN) break; if(nRet==RTNORM) { if(pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetStepWidth(nStepWidth); if(nStepWidth>0) pStep->SetStepHeight(fabs(pStep->GetStepHeight())); else pStep->SetStepHeight(-fabs(pStep->GetStepHeight())); pStep->downgradeOpen(); } } else if(sKeyword[0]==_T('H')) { double nStepHeight=pStep->GetStepHeight(); nRet=GetReal(_T("\n踏步高度"), nStepHeight); if(nRet==RTCAN) break; if(nRet==RTNORM) { if(pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetStepHeight(nStepHeight); if(nStepHeight>0) pStep->SetStepWidth(fabs(pStep->GetStepWidth())); else pStep->SetStepWidth(-fabs(pStep->GetStepWidth())); pStep->downgradeOpen(); } } else if(sKeyword[0]==_T('N')) { int nStepNum=pStep->GetStepNum(); ads_initget(RSG_NOZERO|RSG_NONEG, NULL); adsout << _T("\n踏步数目<") << nStepNum << _T(">:"); nRet=ads_getint(_T(""), &nStepNum); if(nRet==RTCAN) break; if(nRet==RTNORM) { if(pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetStepNum(nStepNum); pStep->downgradeOpen(); } } else if(sKeyword[0]==_T('T')) { double nElev=pStep->GetElevation(); nRet=GetReal(_T("\n平台标高"), nElev); if(nRet==RTCAN) break; if(nRet==RTNORM) { if(pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetElevation(nElev); pStep->downgradeOpen(); } } else if(sKeyword[0]==_T('L')) { pStep->list(); } } OPENOBJ_END(); return RTNORM; }