#include "stdafx.h" #include "TDbColumn.h" ////////////////////////////////////////////////// // ver: 0-TArch8 const Adesk::UInt8 TDbAutoStair::g_nVersion = 0; ACRX_DXF_DEFINE_MEMBERS(ATSAutoStair, ATSPolyPathEnt, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_AUTOSTAIR, "ATS_AUTOSTAIR图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbAutoStair); TDbAutoStair::TDbAutoStair() { m_nStepHeight=_AS_SYS_UNIT(220.0); //踏步高 m_nStepWidth=_AS_SYS_UNIT(300); //踏步宽 m_nStairWidth=_AS_SYS_UNIT(1200); //梯段宽 m_nRotation=0.0; //旋转角度 m_nRailHeight=_AS_SYS_UNIT(900); //扶手高 m_nStairFlag=1; //楼层标记 m_nRailWidth=_AS_SYS_UNIT(60.0); //扶手宽度 m_nStepDist=_AS_SYS_UNIT(949); //平步伸出距离 m_nSlabSize=_AS_SYS_UNIT(2200); //平台尺寸 m_nStartSide=OFFSET_LEFT; //双梯起步的一侧 m_nFlagEx=0; m_nSlabThick=_AS_SYS_UNIT(120); //板厚或梁厚 m_nViewCtrl=0; //自动确定 m_dTextHeight=3.5; m_dFloorHeight=_AS_SYS_UNIT(3000); m_dSlopeAngle=30; m_dSlopeLength=_AS_SYS_UNIT(6000); m_dSpaceWidth=_AS_SYS_UNIT(100); m_dHoleLength=m_nSlabSize; m_rSectPos=0.6; //右侧剖切位置 m_lSectPos=0.4; //左侧剖切位置 } TDbAutoStair::~TDbAutoStair() { } BOOL TDbAutoStair::IsValid() const { BOOL bRet=TDbEntity::IsValid(); if(!bRet) return bRet; bRet=(m_nStepWidth>_DIST_SNAP && //踏步宽 m_nStairWidth>_DIST_SNAP && //梯段宽 m_nRailHeight>_DIST_SNAP && //扶手高 m_nRailWidth>_DIST_SNAP && //扶手宽 m_dTextHeight>0&& //字高 m_dFloorHeight>0&& //楼层高 m_nSlabSize>_DIST_SNAP&& //平台宽 m_dSlopeLength>_DIST_SNAP&& //坡道长 GreatEqual(m_nStepDist, 0.0)&& //平步距离 GreatEqual(m_dSpaceWidth, 0.0)&&//双梯间距 GreatEqual(m_nSlabThick, 0.0)); //休息台厚 if(bRet) { if(m_nStairFlag!=SF_TOP) //剖切位置 { bRet=(m_lSectPos>0&& m_lSectPos<1&& m_rSectPos>0&& m_rSectPos<1); } } return bRet; } // 提供对格式刷的支持 void TDbAutoStair::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbPolyPathEnt::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbAutoStair *pSrc=TDbAutoStair::cast(pSrcEntity); if(pSrc) { m_nStepHeight=pSrc->m_nStepHeight; m_nStepWidth=pSrc->m_nStepWidth; m_nStairWidth=pSrc->m_nStairWidth; m_dSpaceWidth=pSrc->m_dSpaceWidth; m_nRailHeight=pSrc->m_nRailHeight; m_nRailWidth=pSrc->m_nRailWidth; m_nStairFlag=pSrc->m_nStairFlag; m_nStartSide=pSrc->m_nStartSide; m_nStepDist=pSrc->m_nStepDist; m_nSlabSize=pSrc->m_nSlabSize; m_dTextHeight=pSrc->m_dTextHeight; m_dFloorHeight=pSrc->m_dFloorHeight; m_dSlopeAngle=pSrc->m_dSlopeAngle; m_dSlopeLength=pSrc->m_dSlopeLength; m_dHoleLength=pSrc->m_dHoleLength; m_lSectPos=pSrc->m_lSectPos; m_rSectPos=pSrc->m_rSectPos; m_nFlagEx=pSrc->m_nFlagEx; m_nSlabThick=pSrc->m_nSlabThick; //板厚或梁厚 //add by xlc on 090426箭头文字 SetTextUp(pSrc->GetTextUp()); SetTextDown(pSrc->GetTextDown()); if(database()==NULL|| pSrcEntity->database()==NULL|| database()==pSrcEntity->database()) { m_idLayerStep3d=pSrc->m_idLayerStep3d; m_idLayerArrow=pSrc->m_idLayerArrow; m_idLayerText=pSrc->m_idLayerText; m_idTextStyle=pSrc->m_idTextStyle; } m_nViewCtrl=pSrc->m_nViewCtrl; } } Acad::ErrorStatus TDbAutoStair::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 从DWG读入数据: Acad::ErrorStatus TDbAutoStair::dwgInFields (AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbPolyPathEnt::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(&m_nRotation); //旋转角度 pFiler->readItem(&m_nStepHeight); //踏步高 pFiler->readItem(&m_nStepWidth); //踏步宽 pFiler->readItem(&m_nStairWidth); //梯段宽 pFiler->readItem(&m_nSlabSize); //休息平台尺寸 pFiler->readItem(&m_dSpaceWidth); //梯段间距 pFiler->readItem(&m_nRailHeight); //扶手高 pFiler->readItem(&m_nStairFlag); //楼层标记 pFiler->readItem(&m_nRailWidth); //扶手宽 pFiler->readItem(&m_lSectPos); //左侧剖切位置 pFiler->readItem(&m_rSectPos); //右侧剖切位置 pFiler->readItem(&m_nStepDist); //平步伸出距离 pFiler->readItem(&m_dTextHeight); //字高 pFiler->readItem(&m_dFloorHeight); //楼层高 pFiler->readItem(&m_dSlopeAngle); //坡角(角度值) pFiler->readItem(&m_dSlopeLength); //坡长 pFiler->readItem(&m_dHoleLength); //洞口长度 pFiler->readItem(&m_nStartSide); //双梯起步侧 pFiler->readItem(&m_nFlagEx); pFiler->readItem(&m_nSlabThick); pFiler->readItem(&m_idLayerStep3d); pFiler->readItem(&m_idLayerText); pFiler->readItem(&m_idTextStyle); pFiler->readItem(&m_idLayerArrow); pFiler->readItem(&m_nViewCtrl); return pFiler->filerStatus(); } Acad::ErrorStatus TDbAutoStair::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbPolyPathEnt::dwgOutFields(pFiler); if(es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem((AcGePoint3d &)m_ptLocation); pFiler->writeItem(m_nRotation); //旋转角度 pFiler->writeItem(m_nStepHeight); //踏步高 pFiler->writeItem(m_nStepWidth); //踏步宽 pFiler->writeItem(m_nStairWidth); //梯段宽 pFiler->writeItem(m_nSlabSize); //平台尺寸 pFiler->writeItem(m_dSpaceWidth); //梯段间距 pFiler->writeItem(m_nRailHeight); //扶手高度 pFiler->writeItem(m_nStairFlag); //楼层标记 pFiler->writeItem(m_nRailWidth); //扶手宽 pFiler->writeItem(m_lSectPos); //左侧剖切位置 pFiler->writeItem(m_rSectPos); //右侧剖切位置 pFiler->writeItem(m_nStepDist); //平步伸出距离 pFiler->writeItem(m_dTextHeight); //字高 pFiler->writeItem(m_dFloorHeight); //楼层高 pFiler->writeItem(m_dSlopeAngle); //坡角(角度值) pFiler->writeItem(m_dSlopeLength); //坡长 pFiler->writeItem(m_dHoleLength); //洞口长度 pFiler->writeItem(m_nStartSide); //双梯起步侧 pFiler->writeItem(m_nFlagEx); pFiler->writeItem(m_nSlabThick); pFiler->writeItem(m_idLayerStep3d); pFiler->writeItem(m_idLayerText); pFiler->writeItem(m_idTextStyle); pFiler->writeItem(m_idLayerArrow); pFiler->writeItem(m_nViewCtrl); return pFiler->filerStatus(); } Acad::ErrorStatus TDbAutoStair::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbPolyPathEnt::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbAutoStair"))) { return Acad::eBadDxfSequence; } Adesk::Int32 fieldsFlags=0; resbuf rb; double r1, r2, r3, r4, r5, r6, r7, r9; int i1; XPoint pt; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfXCoord: pt=rb.resval.rpoint; fieldsFlags |= 0x01; break; case AcDb::kDxfReal: r1=rb.resval.rreal; fieldsFlags |= 0x02; break; case AcDb::kDxfReal+1: r2=rb.resval.rreal; fieldsFlags |= 0x04; break; case AcDb::kDxfReal+2: r3=rb.resval.rreal; fieldsFlags |= 0x08; break; case AcDb::kDxfReal+3: r4=rb.resval.rreal; fieldsFlags |= 0x10; break; case AcDb::kDxfReal+4: r5=rb.resval.rreal; fieldsFlags |= 0x20; break; case AcDb::kDxfReal+5: r6=rb.resval.rreal; fieldsFlags |= 0x40; break; case AcDb::kDxfReal+6: r7=rb.resval.rreal; fieldsFlags |= 0x80; break; case AcDb::kDxfReal+7: m_dSlopeAngle=rb.resval.rreal; break; case AcDb::kDxfReal+8: m_dSlopeLength=rb.resval.rreal; break; case AcDb::kDxfReal+9: m_nStepDist=rb.resval.rreal; break; case AcDb::kDxfReal+11: m_dFloorHeight=rb.resval.rreal; break; case AcDb::kDxfReal+12: m_dTextHeight=rb.resval.rreal; break; case AcDb::kDxfReal+13: m_lSectPos=rb.resval.rreal; break; case AcDb::kDxfReal+14: m_rSectPos=rb.resval.rreal; break; case AcDb::kDxfReal+15: m_dHoleLength=rb.resval.rreal; break; case AcDb::kDxfAngle: r9 = rb.resval.rreal; fieldsFlags |= 0x200; break; case AcDb::kDxfInt16: i1=rb.resval.rint; fieldsFlags |= 0x400; break; case AcDb::kDxfInt16+1: m_nStartSide=(Adesk::UInt8)rb.resval.rint; break; case AcDb::kDxfInt16+2: m_nViewCtrl=(Adesk::UInt8)rb.resval.rint; break; case 90: m_nFlagEx=rb.resval.rlong; break; case 147: m_nSlabThick=rb.resval.rreal; break; case 412: m_idLayerStep3d=GetLayerIdFromString(rb.resval.rstring, database()); free(rb.resval.rstring); break; case 416: m_idLayerText=GetLayerIdFromString(rb.resval.rstring, database()); free(rb.resval.rstring); break; case 417: m_idTextStyle=GetLayerIdFromString(rb.resval.rstring, database()); free(rb.resval.rstring); break; case 418: m_idLayerArrow=GetLayerIdFromString(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; } } // 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&0x01)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 10")); return Acad::eMissingDxfField; } 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: 42")); return Acad::eMissingDxfField; } if (!(fieldsFlags&0x10)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 43")); return Acad::eMissingDxfField; } if (!(fieldsFlags&0x20)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 44")); return Acad::eMissingDxfField; } m_ptLocation=pt; SetStepHeight(r1); SetSpaceWidth(r2); SetSlabSize(r3); SetStepWidth(r4); SetStairWidth(r5); if(fieldsFlags&0x40) SetRailHeight(r6); if(fieldsFlags&0x80) SetRailWidth(r7); if(fieldsFlags&0x200) SetRotation(r9); if(fieldsFlags&0x400) SetStairFlag(i1); return pFiler->filerStatus(); } Acad::ErrorStatus TDbAutoStair::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es; es = TDbPolyPathEnt::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbAutoStair")); assert(es == Acad::eOk); pFiler->writePoint3d(AcDb::kDxfXCoord, m_ptLocation); pFiler->writeDouble(AcDb::kDxfReal, GetStepHeight()); pFiler->writeDouble(AcDb::kDxfReal+1, GetSpaceWidth()); pFiler->writeDouble(AcDb::kDxfReal+2, GetSlabSize()); pFiler->writeDouble(AcDb::kDxfReal+3, GetStepWidth()); pFiler->writeDouble(AcDb::kDxfReal+4, GetStairWidth()); pFiler->writeDouble(AcDb::kDxfReal+5, GetRailHeight()); pFiler->writeDouble(AcDb::kDxfReal+6, GetRailWidth()); pFiler->writeDouble(AcDb::kDxfReal+7, GetSlopeAngle()); pFiler->writeDouble(AcDb::kDxfReal+8, GetSlopeLength()); pFiler->writeDouble(AcDb::kDxfReal+11, GetFloorHeight()); pFiler->writeDouble(AcDb::kDxfReal+12, GetTextHeight()); pFiler->writeDouble(AcDb::kDxfReal+13, GetLSectPos()); pFiler->writeDouble(AcDb::kDxfReal+14, GetRSectPos()); pFiler->writeDouble(AcDb::kDxfReal+15, GetHoleLength()); pFiler->writeDouble(AcDb::kDxfReal+9, GetStepDist()); pFiler->writeDouble(AcDb::kDxfAngle, GetRotation()); pFiler->writeInt16(AcDb::kDxfInt16, GetStairFlag()); pFiler->writeInt16(AcDb::kDxfInt16+1, GetStartSide()); pFiler->writeInt16(AcDb::kDxfInt16+2, m_nViewCtrl); pFiler->writeInt32(90, m_nFlagEx); pFiler->writeDouble(147, m_nSlabThick); pFiler->writeString(412, (const TCHAR *)LayerId2String(m_idLayerStep3d)); pFiler->writeString(416, (const TCHAR *)LayerId2String(m_idLayerText)); pFiler->writeString(417, (const TCHAR *)LayerId2String(m_idTextStyle)); pFiler->writeString(418, (const TCHAR *)LayerId2String(m_idLayerArrow)); return pFiler->filerStatus(); } Acad::ErrorStatus TDbAutoStair::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); double dWidth=_AS_SYS_UNIT(205.5); double dLength=GetLength(); XPoint ptLocation; //扶梯定位点 ads_polar(GetUpLeft2d(),m_nRotation-PI/2,m_nSlabSize+dLength,ptLocation); ads_polar(ptLocation,m_nRotation,dWidth*4/3+m_nStairWidth*0.5,ptLocation); XPoint ptMid; // 0,1--扶梯长度 ads_polar(ptLocation, m_nRotation-PI*0.5, m_nSlabSize, ptMid); gripPoints.append(ptMid); ads_polar(ptLocation, m_nRotation+PI*0.5, dLength+m_nSlabSize, ptMid); gripPoints.append(ptMid); // 2,3--梯段宽度 ads_polar(ptLocation, m_nRotation+PI, m_nStairWidth*0.5+dWidth*4.0/3, ptMid); ads_polar(ptMid, m_nRotation+PI*0.5, dLength*0.5, ptMid); gripPoints.append(ptMid); if(IsSingleStair()) { ads_polar(ptMid, m_nRotation, m_nStairWidth+dWidth*8.0/3, ptMid); } else { ads_polar(ptMid, m_nRotation, m_nStairWidth*2+dWidth*16.0/3+m_dSpaceWidth, ptMid); } gripPoints.append(ptMid); // 4,5,6,7--移动梯段 gripPoints.append(GetUpLeft2d()); gripPoints.append(GetUpRight2d()); XPoint ptLeft, ptRight; ads_polar(GetUpLeft2d(), m_nRotation-PI/2.0, GetTotalLength(), ptLeft); ads_polar(GetUpRight2d(), m_nRotation-PI/2.0, GetTotalLength(), ptRight); gripPoints.append(ptLeft); gripPoints.append(ptRight); // 8,9--平步距离 if(!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP)) //步道时没有平步 { ads_polar(ptLocation, m_nRotation-PI*0.5, m_nStepDist, ptMid); gripPoints.append(ptMid); ads_polar(ptLocation, m_nRotation+PI*0.5, dLength+m_nStepDist, ptMid); gripPoints.append(ptMid); } if(!IsSingleStair()) { // 梯段间距 ads_polar(ptLocation, m_nRotation, m_nStairWidth*0.5+dWidth*4.0/3+m_dSpaceWidth, ptMid); ads_polar(ptMid, m_nRotation-PI*0.5, m_nSlabSize, ptMid); gripPoints.append(ptMid); ads_polar(ptMid, m_nRotation+PI*0.5, m_nSlabSize*2+dLength, ptMid); gripPoints.append(ptMid); // 扶梯长度 ads_polar(GetUpRight2d(), m_nRotation-PI, m_nStairWidth*0.5+dWidth*4/3, ptMid); gripPoints.append(ptMid); ads_polar(ptMid, m_nRotation-PI*0.5, dLength+m_nSlabSize*2, ptMid); gripPoints.append(ptMid); // 平步距离 if(!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP)) //步道时有平步 { ads_polar(GetUpRight2d(), m_nRotation-PI, m_nStairWidth*0.5+dWidth*4/3, ptMid); ads_polar(ptMid, m_nRotation-PI*0.5, m_nSlabSize-m_nStepDist, ptMid); gripPoints.append(ptMid); ads_polar(ptMid, m_nRotation-PI*0.5, dLength+m_nStepDist*2, ptMid); gripPoints.append(ptMid); } } if(m_nStairFlag==SF_TOP&&(IsSingleStair()||(!IsSingleStair()&&!IsCross()))&&(!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP))) { double length=0; if(IsHasHole()) length=m_dHoleLength; ads_polar(ptLeft, m_nRotation, m_nStairWidth+dWidth*4/3, ptLeft); ads_polar(ptLeft, m_nRotation+PI*0.5, length, ptLeft); gripPoints.append(ptLeft); } // 剖切位置 if(m_nStairFlag!=SF_TOP) { ads_polar(ptLocation, m_nRotation+PI, m_nStairWidth*0.5+dWidth*4.0/3, ptMid); ads_polar(ptMid, m_nRotation+PI*0.5, dLength*m_lSectPos, ptMid); gripPoints.append(ptMid); if(IsSingleStair()) { ads_polar(ptLocation, m_nRotation, m_nStairWidth*0.5+dWidth*4.0/3, ptMid); } else { ads_polar(ptLocation, m_nRotation, m_nStairWidth*1.5+dWidth*4.0+m_dSpaceWidth, ptMid); } ads_polar(ptMid, m_nRotation+PI*0.5, dLength*m_rSectPos, ptMid); gripPoints.append(ptMid); } return Acad::eOk; } Acad::ErrorStatus TDbAutoStair::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); XPoint ptUpLeft=GetLocation(); stretchPoints.append(ptUpLeft); return Acad::eOk; } Acad::ErrorStatus TDbAutoStair::GetGripText(int i, CString &cs) const { BOOL bStepDist=!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP); switch(i) { case 0: case 1: cs=_T("改平台距离"); break; case 2: case 3: cs=_T("改梯段宽度"); break; case 4: case 6: cs=_T("移动楼梯"); break; case 5: case 7: if(!bStepDist) cs=_T("改步道长"); else cs=_T("移动楼梯"); break; case 8: case 9: if(bStepDist)//有平步 { cs=_T("改平步距离"); break; } else { if(!IsSingleStair()) { cs=_T("改梯段间距"); break; } } case 10: case 11: if(bStepDist)//有平步 { if(!IsSingleStair()) { cs=_T("改梯段间距"); break; } } else { if(!IsSingleStair()) { cs=_T("改平台距离"); break; } } case 12: case 13: if(bStepDist)//有平步 { if(!IsSingleStair()) { cs=_T("改平台距离"); break; } } case 14: case 15: if(bStepDist)//有平步 { if(!IsSingleStair()) { cs=_T("改平步距离"); break; } } case 16: if(bStepDist&&m_nStairFlag==SF_TOP&&(IsSingleStair()||(!IsSingleStair()&&!IsCross()))) { cs=_T("改洞口长度"); break; } case 17: cs=_T("移动剖切位置"); break; default: break; } return Acad::eOk; } Acad::ErrorStatus TDbAutoStair::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); TDbEntity::subTransformBy(xform); double dWidth=_AS_SYS_UNIT(205.5); double dTotalWidth=dWidth*8/3+m_nStairWidth; if(!IsSingleStair()) { dTotalWidth = dTotalWidth*2+m_dSpaceWidth; } XPoint ptX, ptY; ads_polar(m_ptLocation, m_nRotation, dTotalWidth, ptX); ads_polar(m_ptLocation, m_nRotation+PI/2.0, 1000.0, ptY); ((AcGePoint3d &)ptX).transformBy(xform); ((AcGePoint3d &)ptY).transformBy(xform); ((AcGePoint3d &)m_ptLocation).transformBy(xform); double nAng = CT_std_angle(ads_angle(m_ptLocation, ptY)- ads_angle(m_ptLocation, ptX)); if(fabs(nAng-PI*1.5)<_angSnap) { TchPrivate::Exchange(m_ptLocation, ptX); double dSectPos=m_lSectPos; m_lSectPos=m_rSectPos; m_rSectPos=dSectPos; if(!IsSingleStair()) { m_nStartSide = !m_nStartSide; } } m_nRotation = ads_angle(m_ptLocation, ptX); return Acad::eOk; } Acad::ErrorStatus TDbAutoStair::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); XPoint vtOffset=*(XPoint *)&offset; vtOffset.z = 0; double dWidth=_AS_SYS_UNIT(205.5); double nVtRot=CT_std_angle(ads_angle(XPoint(), vtOffset)-m_nRotation); double nIncWidth=ads_distance(XPoint(), vtOffset) * cos(nVtRot); double nIncLen=ads_distance(XPoint(), vtOffset) * sin(nVtRot); int nLen=indices.length(); BOOL bStepDist=!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP); for (int i = 0; i < nLen; i++) { int idx = indices[i]; switch(idx) { case 0: //改扶梯长度 if(m_nSlabSize-nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize -= nIncLen*0.5; } else { m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } break; case 1: //改扶梯长度 { double dist=nIncLen; if(m_nSlabSize+nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize += nIncLen*0.5; } else { dist = -(m_nSlabSize - m_nStepDist-dWidth-m_nRailHeight*0.5)*2; m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } ads_polar(m_ptLocation, m_nRotation+PI*0.5, dist, m_ptLocation); } break; case 2: //改梯段宽度 if(IsSingleStair()) { if(m_nStairWidth-nIncWidth > _DIST_SNAP) { m_nStairWidth -= nIncWidth; ads_polar(m_ptLocation, m_nRotation, nIncWidth, m_ptLocation); } } else { if(m_nStairWidth-nIncWidth*0.5 > _DIST_SNAP) { m_nStairWidth -= nIncWidth*0.5; ads_polar(m_ptLocation, m_nRotation, nIncWidth, m_ptLocation); } } break; case 3: //改梯段宽度 if(IsSingleStair()) { if(m_nStairWidth+nIncWidth > _DIST_SNAP) { m_nStairWidth += nIncWidth; } } else { if(m_nStairWidth+nIncWidth*0.5 > _DIST_SNAP) { m_nStairWidth += nIncWidth*0.5; } } break; case 4: case 6: //移动楼梯 if(nLen==1) { m_ptLocation += vtOffset; } break; case 5: case 7: if(!bStepDist) //改步道长 { int nScale=idx==5?1:(-1); double dMinLength=_AS_SYS_UNIT(1000); if(m_dSlopeLength+nIncLen*nScale>dMinLength+_DIST_SNAP) { m_dSlopeLength+=nIncLen*nScale; if(idx==5) ads_polar(m_ptLocation, m_nRotation+PI*0.5, nIncLen, m_ptLocation); } else { if(idx==5) ads_polar(m_ptLocation, m_nRotation+PI*0.5, dMinLength-m_dSlopeLength, m_ptLocation); m_dSlopeLength=dMinLength; } } else { //移动楼梯 if(nLen==1) { m_ptLocation += vtOffset; } } break; case 8: if(bStepDist)//改平步距离 { if(m_nStepDist-nIncLen > _DIST_SNAP&&m_nStepDist-nIncLen _DIST_SNAP&&m_nStepDist+nIncLen _DIST_SNAP) { m_dSpaceWidth += nIncWidth; } else { m_dSpaceWidth = 0; } break; } } case 10: case 11: if(bStepDist)//改平步距离 { if(!IsSingleStair()) { //改楼梯间距 if(m_dSpaceWidth+nIncWidth > _DIST_SNAP) { m_dSpaceWidth += nIncWidth; } else { m_dSpaceWidth = 0; } break; } } else { if(!IsSingleStair()) { if(idx==10) { // 平台长度 double dist=nIncLen; if(m_nSlabSize+nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize += nIncLen*0.5; } else { dist = -(m_nSlabSize - m_nStepDist-dWidth-m_nRailHeight*0.5)*2; m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } ads_polar(m_ptLocation, m_nRotation+PI*0.5, dist, m_ptLocation); } else { // 平台长度 if(m_nSlabSize-nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize -= nIncLen*0.5; } else { m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } } break; } } case 12: if(!IsSingleStair()&&bStepDist) { // 平台长度 double dist=nIncLen; if(m_nSlabSize+nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize += nIncLen*0.5; } else { dist = -(m_nSlabSize - m_nStepDist-dWidth-m_nRailHeight*0.5)*2; m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } ads_polar(m_ptLocation, m_nRotation+PI*0.5, dist, m_ptLocation); break; } case 13: if(!IsSingleStair()&&bStepDist) { // 平台长度 if(m_nSlabSize-nIncLen*0.5 > m_nStepDist+dWidth+m_nRailHeight*0.5+_DIST_SNAP) { m_nSlabSize -= nIncLen*0.5; } else { m_nSlabSize = m_nStepDist+dWidth+m_nRailHeight*0.5; } break; } case 14: if(!IsSingleStair()&&bStepDist) { if(!(IsAscent()&&GetSlopeAngle()<_DIST_SNAP))//改平步距离 { if(m_nStepDist+nIncLen > _DIST_SNAP&&m_nStepDist+nIncLen _DIST_SNAP&&m_nStepDist-nIncLen_DIST_SNAP && lengthm_nSlabSize+GetLength()) { m_dHoleLength=m_nSlabSize+GetLength(); SetHasHole(TRUE); } break; } case 17: //剖切位置 if(m_nStairFlag!=SF_TOP) { double dSectPos=0; if(idx%2==0) { dSectPos=m_lSectPos; } else { dSectPos=m_rSectPos; } double dLength=GetLength(); double dist=dLength*dSectPos+nIncLen; if(dist_DIST_SNAP) { dSectPos=dist/dLength; if(idx%2==0) { m_lSectPos=dSectPos; } else { m_rSectPos=dSectPos; } } break; } break; default: break; } } return Acad::eOk; //return TDbEntity::moveGripPointsAt(indices, offset); } Acad::ErrorStatus TDbAutoStair::subMoveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); if(indices.length()) { AcGeMatrix3d mat; mat.setToTranslation(offset); subTransformBy(mat); } return Acad::eOk; } const TCHAR * TDbAutoStair::GetDefaultLayer() const { return LAY_STAIR; } void TDbAutoStair::GetTips(DList &lstInfo) const { lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("自动扶梯"))); if(IsAscent()) { lstInfo.Append(new TObjInfoUnit(_T("坡道长"), Dist2Str(GetSlopeLength()))); } else { lstInfo.Append(new TObjInfoUnit(_T("楼层高"), Dist2Str(GetFloorHeight()))); } // sg modify 100412,保持与对象特性表及对话框中的表达一致 // lstInfo.Append(new TObjInfoUnit(_T("梯阶宽度"), Dist2Str(GetStairWidth()))); lstInfo.Append(new TObjInfoUnit(_T("梯段宽度"), Dist2Str(GetStairWidth()))); // sg modify 100322,保持与对象特性表及对话框中的表达一致 // lstInfo.Append(new TObjInfoUnit(_T("总长"), Dist2Str(GetTotalLength()))); lstInfo.Append(new TObjInfoUnit(_T("水平长度"), Dist2Str(GetTotalLength()))); // lstInfo.Append(new TObjInfoUnit(_T("总宽"), Dist2Str(GetTotalWidth()))); lstInfo.Append(new TObjInfoUnit(_T("扶梯总宽"), Dist2Str(GetTotalWidth()))); lstInfo.Append(new TObjInfoUnit(_T("底标高"), Dist2Str(GetElevation()))); const TCHAR *pszFloor=_T("首层"); if(m_nStairFlag==1) pszFloor=_T("中间层"); else if(m_nStairFlag==2) pszFloor=_T("顶层"); lstInfo.Append(new TObjInfoUnit(_T("楼层标记"), pszFloor)); } Acad::ErrorStatus TDbAutoStair::ExplodeTo(TDbLineStair &stair1, //[in/out]左梯段 TDbLineStair &stair2 //[in/out]右梯段 ) const { assertReadEnabled(); //设置梯段宽度 stair1.SetStairWidth(m_nStairWidth); stair2.SetStairWidth(m_nStairWidth); //设置踏步高度 stair1.SetStepHeight(m_nStepHeight); stair2.SetStepHeight(m_nStepHeight); //设置踏步宽度 stair1.SetStepWidth(m_nStepWidth); stair2.SetStepWidth(m_nStepWidth); double length=GetLength(); int nStepNum=(int)(length/m_nStepWidth); if(!IsAscent()) { nStepNum += 1; } //设置踏步数 stair1.SetStepNum(nStepNum); stair2.SetStepNum(nStepNum); stair1.SetAscent(IsAscent()); stair2.SetAscent(IsAscent()); //设置踏步旋转角度 stair1.SetRotation(m_nRotation); if(!IsSingleStair()) { if(IsCross()) { stair2.SetRotation(CT_std_angle(m_nRotation-PI)); } else { stair2.SetRotation(m_nRotation); } } double dLength=GetLength(); //计算梯段位置 XPoint ptLoc1, ptLoc2; double dWidth=_AS_SYS_UNIT(205.5); if(IsSingleStair()||(!IsSingleStair()&&m_nStartSide==OFFSET_LEFT)) { ads_polar(GetUpLeft2d(), m_nRotation-PI*0.5, m_nSlabSize+dLength, ptLoc1); ads_polar(ptLoc1, m_nRotation, dWidth*4/3, ptLoc1); ptLoc1.z=m_ptLocation.z; if(IsCross()) { ads_polar(GetUpRight2d(), m_nRotation+PI, dWidth*4/3, ptLoc2); ads_polar(ptLoc2, m_nRotation-PI*0.5, m_nSlabSize, ptLoc2); ptLoc2.z=m_ptLocation.z; } else { ads_polar(ptLoc1, stair1.GetRotation(), m_nStairWidth+dWidth*8/3+m_dSpaceWidth, ptLoc2); } } else { ads_polar(GetUpRight2d(), m_nRotation-PI*0.5, m_nSlabSize+dLength, ptLoc1); ads_polar(ptLoc1, m_nRotation+PI, dWidth*4/3+m_nStairWidth, ptLoc1); ptLoc1.z=m_ptLocation.z; if(IsCross()) { ads_polar(GetUpLeft2d(), m_nRotation, dWidth*4/3+m_nStairWidth, ptLoc2); ads_polar(ptLoc2, m_nRotation-PI*0.5, m_nSlabSize, ptLoc2); ptLoc2.z=m_ptLocation.z; } else { ads_polar(ptLoc1, stair1.GetRotation()+PI, m_nStairWidth+dWidth*8/3+m_dSpaceWidth, ptLoc2); } } //设置梯段位置 stair1.SetLocation(ptLoc1); stair2.SetLocation(ptLoc2); //设置梯段标记 stair1.Set3DFlag(m_nStairFlag==SF_TOP? 0 : SF_HAS3D); stair2.Set3DFlag(m_nStairFlag==SF_TOP? 0 : SF_HAS3D); stair1.Set2DFlag(SF_NOSECT); stair2.Set2DFlag(SF_NOSECT); if(m_nStairFlag==SF_FIRST) //首层 { stair1.Set2DFlag(SF_1SECT); stair2.Set2DFlag(SF_1SECT); } else if(m_nStairFlag==SF_MIDDLE) //中间层 { stair1.Set2DFlag(SF_2SECT); stair2.Set2DFlag(SF_2SECT); } stair1.setPropertiesFrom(this); stair2.setPropertiesFrom(this); if(m_idLayerStep3d.isValid()) { stair1.SetLayerStep3d(m_idLayerStep3d); stair2.SetLayerStep3d(m_idLayerStep3d); } return Acad::eOk; } void TDbAutoStair::GetDefaultArrow(TDbSymbArrow*pArrowUp,TDbSymbArrow*pArrowUp2, TDbSymbArrow*pArrowDown,TDbSymbArrow*pArrowDown2)const { assertReadEnabled(); double dWidth=_AS_SYS_UNIT(205.5); double dLength=GetLength(); XPoint pt1,pt2,pt3,pt4,pt5,pt6,pt7,pt8,pt9,pt10,pt11,pt12,pt; /*----------点相对位置示意---------------------- _________________________________________________ *pt1----------*pt2 *pt3--------------*pt4 * *pt5-------------*pt6 *pt7-----------*pt8 ------------------------------------------------*/ { XPoint ptLocation; //扶梯定位点 ads_polar(GetUpLeft2d(),m_nRotation-PI/2,m_nSlabSize+dLength,ptLocation); ads_polar(ptLocation,m_nRotation,dWidth*4/3+m_nStairWidth*0.5,ptLocation); ads_polar(ptLocation,m_nRotation-PI/2,m_nStepDist+m_nRailHeight*0.5+dWidth,pt1); ads_polar(ptLocation,m_nRotation+PI/2,dLength+m_nStepDist+m_nRailHeight*0.5+dWidth,pt4); ads_polar(pt1,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt5); ads_polar(pt4,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt8); if(m_nStairFlag!=SF_TOP) { if(IsSingleStair()) { ads_polar(ptLocation,m_nRotation+PI/2,dLength*(m_lSectPos+m_rSectPos)*0.5-m_nStepWidth,pt2); ads_polar(pt2,m_nRotation+PI/2,m_nStepWidth*2,pt3); } else { double rSect=(m_rSectPos-m_lSectPos)*(m_nStairWidth+dWidth*8.0/3)/(m_nStairWidth*2+dWidth*16.0/3+m_dSpaceWidth)+m_lSectPos, lSect=(m_rSectPos-m_lSectPos)*(m_nStairWidth+dWidth*8.0/3+m_dSpaceWidth)/(m_nStairWidth*2+dWidth*16.0/3+m_dSpaceWidth)+m_lSectPos; ads_polar(ptLocation,m_nRotation+PI/2,dLength*(m_lSectPos+rSect)*0.5-m_nStepWidth,pt2); ads_polar(pt2,m_nRotation+PI/2,m_nStepWidth*2,pt3); ads_polar(ptLocation,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt); ads_polar(pt,m_nRotation+PI/2,dLength*(lSect+m_rSectPos)*0.5-m_nStepWidth,pt6); ads_polar(pt6,m_nRotation+PI/2,m_nStepWidth*2,pt7); } } else { if(IsHasHole()&&(IsSingleStair()||(!IsSingleStair()&&!IsCross()))&&m_dHoleLength>m_nSlabSize)//存在洞口时箭头随洞口移动 { ads_polar(ptLocation,m_nRotation+PI/2,m_nStepWidth+m_dHoleLength-m_nSlabSize,pt2); ads_polar(pt2,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt6); } else { if(!IsSingleStair()&&IsCross()) { if(m_nStartSide==OFFSET_LEFT) { ads_polar(ptLocation,m_nRotation+PI/2,m_nStepWidth,pt2); ads_polar(ptLocation,m_nRotation+PI/2,dLength-m_nStepWidth,pt); ads_polar(pt,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt6); } else { ads_polar(ptLocation,m_nRotation+PI/2,dLength-m_nStepWidth,pt2); ads_polar(ptLocation,m_nRotation+PI/2,m_nStepWidth,pt); ads_polar(pt,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt6); } } else { ads_polar(ptLocation,m_nRotation+PI/2,m_nStepWidth,pt2); if(IsCross()) { ads_polar(ptLocation,m_nRotation+PI/2,dLength-m_nStepWidth,pt); ads_polar(pt,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt6); } else { ads_polar(pt2,m_nRotation,m_nStairWidth+m_dSpaceWidth+dWidth*8/3,pt6); } } } } } XPoly2D poly; if(IsSameDir()) //上下同向(顶层时同为下楼) { if(m_nStairFlag!=SF_TOP) //首层或中间层 { if(!IsSingleStair()&&m_nStartSide!=OFFSET_LEFT)//镜像后右侧起步 { poly.AppendNode(pt5); poly.AppendNode(pt6); pArrowUp->SetPoly2D(poly); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt7); poly2.AppendNode(pt8); pArrowUp2->SetPoly2D(poly2); } } else { poly.AppendNode(pt1); poly.AppendNode(pt2); pArrowUp->SetPoly2D(poly); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt3); poly2.AppendNode(pt4); pArrowUp2->SetPoly2D(poly2); } } } else { if(!IsSingleStair()&&m_nStartSide!=OFFSET_LEFT)//镜像后右侧起步 { poly.AppendNode(pt8); poly.AppendNode(pt6); pArrowDown->SetPoly2D(poly); } else { poly.AppendNode(pt4); poly.AppendNode(pt2); pArrowDown->SetPoly2D(poly); } } if(!IsSingleStair()) { if(IsCross()) //交叉放置 { XPoly2D poly1; if(m_nStartSide==OFFSET_LEFT) { if(m_nStairFlag!=SF_TOP) { poly1.AppendNode(pt8); poly1.AppendNode(pt7); //modify by xlc on 090114首层同为上行方向 if(m_nStairFlag==SF_FIRST) { pArrowUp2->SetPoly2D(poly1); } else { poly1.Reverse(); pArrowDown->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt5); poly2.AppendNode(pt6); pArrowDown2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt5); poly1.AppendNode(pt6); pArrowDown2->SetPoly2D(poly1); } } else //镜像后右侧起步 { if(m_nStairFlag!=SF_TOP) { poly1.AppendNode(pt4); poly1.AppendNode(pt3); //modify by xlc on 090114首层同为上行方向 if(m_nStairFlag==SF_FIRST) { pArrowUp2->SetPoly2D(poly1); } else { poly1.Reverse(); pArrowDown->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt1); poly2.AppendNode(pt2); pArrowDown2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt1); poly1.AppendNode(pt2); pArrowDown2->SetPoly2D(poly1); } } } else //并列放置 { XPoly2D poly1; if(m_nStartSide==OFFSET_LEFT) { if(m_nStairFlag!=SF_TOP) { //modify by xlc on 090114 首层同为上行方向 if(m_nStairFlag==SF_FIRST) { poly1.AppendNode(pt5); poly1.AppendNode(pt6); pArrowUp2->SetPoly2D(poly1); } else { poly1.AppendNode(pt6); poly1.AppendNode(pt5); pArrowDown->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt8); poly2.AppendNode(pt7); pArrowDown2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt8); poly1.AppendNode(pt6); pArrowDown2->SetPoly2D(poly1); } } else //镜像后右侧起步 { if(m_nStairFlag!=SF_TOP) { //modify by xlc on 090114 首层同为上行方向 if(m_nStairFlag==SF_FIRST) { poly1.AppendNode(pt1); poly1.AppendNode(pt2); pArrowUp2->SetPoly2D(poly1); } else { poly1.AppendNode(pt2); poly1.AppendNode(pt1); pArrowDown->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt4); poly2.AppendNode(pt3); pArrowDown2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt4); poly1.AppendNode(pt2); pArrowDown2->SetPoly2D(poly1); } } } } } else //上下梯逆向 { if(m_nStairFlag!=SF_TOP) { if(!IsSingleStair()&&m_nStartSide!=OFFSET_LEFT)//镜像后右侧起步 { poly.AppendNode(pt5); poly.AppendNode(pt6); pArrowUp->SetPoly2D(poly); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt8); poly2.AppendNode(pt7); pArrowDown->SetPoly2D(poly2); } } else { poly.AppendNode(pt1); poly.AppendNode(pt2); pArrowUp->SetPoly2D(poly); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt4); poly2.AppendNode(pt3); pArrowDown->SetPoly2D(poly2); } } } else { if(!IsSingleStair()&&m_nStartSide!=OFFSET_LEFT)//镜像后右侧起步 { poly.AppendNode(pt8); poly.AppendNode(pt6); pArrowDown->SetPoly2D(poly); } else { poly.AppendNode(pt4); poly.AppendNode(pt2); pArrowDown->SetPoly2D(poly); } } if(!IsSingleStair()) //第二个梯段 { if(IsCross()) //交叉放置 { XPoly2D poly1; if(m_nStartSide==OFFSET_LEFT) { if(m_nStairFlag!=SF_TOP) { //modify by xlc on 090114 首层不同为上行方向 if(m_nStairFlag==SF_FIRST) { poly1.AppendNode(pt7); poly1.AppendNode(pt8); pArrowDown2->SetPoly2D(poly1); } else { //modify by xlc on 090601 交叉放置不同向时上行方向 poly1.AppendNode(pt7); poly1.AppendNode(pt8); //pArrowUp2->SetPoly2D(poly1); pArrowDown2->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt6); poly2.AppendNode(pt5); //pArrowDown2->SetPoly2D(poly2); pArrowUp2->SetPoly2D(poly2); } } else { XPoly2D poly1; //modify by xlc on 090114 顶层不同为上行方向 // poly1.AppendNode(pt5); // poly1.AppendNode(pt6); // pArrowDown2->SetPoly2D(poly1); poly1.AppendNode(pt6); poly1.AppendNode(pt5); pArrowUp2->SetPoly2D(poly1); } } else //镜像后右侧起步 { if(m_nStairFlag!=SF_TOP) { //modify by xlc on 090114 首层不同为上行方向 if(m_nStairFlag==SF_FIRST) { poly1.AppendNode(pt3); poly1.AppendNode(pt4); pArrowDown2->SetPoly2D(poly1); } else { poly1.AppendNode(pt3); poly1.AppendNode(pt4); //pArrowUp2->SetPoly2D(poly1); pArrowDown2->SetPoly2D(poly1); } if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt2); poly2.AppendNode(pt1); //pArrowDown2->SetPoly2D(poly2); pArrowUp2->SetPoly2D(poly2); } } else { XPoly2D poly1; //modify by xlc on 090114 顶层不同为上行方向 // poly1.AppendNode(pt1); // poly1.AppendNode(pt2); // pArrowDown2->SetPoly2D(poly1); poly1.AppendNode(pt2); poly1.AppendNode(pt1); pArrowUp2->SetPoly2D(poly1); } } } else //并列放置 { XPoly2D poly1; if(m_nStartSide==OFFSET_LEFT) { if(m_nStairFlag!=SF_TOP) { poly1.AppendNode(pt6); poly1.AppendNode(pt5); pArrowDown2->SetPoly2D(poly1); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt7); poly2.AppendNode(pt8); pArrowUp2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt6); poly1.AppendNode(pt8); pArrowUp2->SetPoly2D(poly1); } } else { if(m_nStairFlag!=SF_TOP) { poly1.AppendNode(pt1); poly1.AppendNode(pt2); pArrowDown2->SetPoly2D(poly1); if(m_nStairFlag==SF_MIDDLE) { XPoly2D poly2; poly2.AppendNode(pt3); poly2.AppendNode(pt4); pArrowUp2->SetPoly2D(poly2); } } else { XPoly2D poly1; poly1.AppendNode(pt2); poly1.AppendNode(pt4); pArrowUp2->SetPoly2D(poly1); } } } } } //modify by xlc on 090205 //XString upText=_T("上"),downText=_T("下"); XString upText=GetTextUp(),downText=GetTextDown(); if(IsAscent()&&GetSlopeAngle()<_DIST_SNAP) { upText=_T(""); downText=_T(""); } double dist=((DocGetText2Base()+m_dTextHeight))*GetPScale(); { pArrowUp->setPropertiesFrom(this); //modify by xlc on 090205 pArrowUp->SetLayoutRotation(GetLayoutRotation()); pArrowUp->SetText(upText); pArrowUp->SetTextHeight(m_dTextHeight); pArrowUp->SetTextAlign(TDbSymbArrow::kAtSide); pArrowUp->SetTextLocation(pArrowUp->GetDefaultTextLocation()); pArrowUp->SetTextLayerId(m_idLayerText); pArrowUp->SetTextStyleId(m_idTextStyle); pArrowUp2->setPropertiesFrom(this); pArrowUp2->SetLayoutRotation(GetLayoutRotation()); pArrowUp2->SetText(upText); pArrowUp2->SetTextHeight(m_dTextHeight); pArrowUp2->SetTextAlign(TDbSymbArrow::kAtSide); if(IsSameDir()) { XPoint pt=pt4; if(!IsSingleStair()&&m_nStairFlag==SF_FIRST) { pt=pArrowUp2->GetDefaultTextLocation(); } else if(!IsSingleStair()&&m_nStartSide!=OFFSET_LEFT) { ads_polar(pt8,m_nRotation+PI*0.5,dist,pt); } else { ads_polar(pt4,m_nRotation+PI*0.5,dist,pt); } pArrowUp2->SetTextLocation(pt); } else { if(!IsSingleStair()&&!IsCross()&&m_nStartSide==OFFSET_LEFT) { XPoint pt=pt8; ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowUp2->SetTextLocation(pt); } else if(!IsSingleStair()&&!IsCross()&& !IsSameDir()&&m_nStartSide!=OFFSET_LEFT) { XPoint pt=pt4; ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowUp2->SetTextLocation(pt); } //modify by xlc on 090414 交叉放置时顶层增加上下方向运行 else if(!IsSingleStair()&&IsCross()&&m_nStairFlag!=SF_FIRST&&(!IsSameDir())) { XPoint pt=pt1; if(m_nStartSide==OFFSET_LEFT) { pt=pt5; } ads_polar(pt,m_nRotation-PI*0.5,dist,pt); pArrowUp2->SetTextLocation(pt); } else if(!IsSingleStair()&&IsCross()&&m_nStairFlag==SF_FIRST&&(!IsSameDir())) { XPoint pt=pt1; if(m_nStartSide==OFFSET_LEFT) { pt=pt8; } ads_polar(pt,m_nRotation-PI*0.5,dist,pt); pArrowUp2->SetTextLocation(pt); } else { pArrowUp2->SetTextLocation(pArrowUp2->GetDefaultTextLocation()); } } pArrowUp2->SetTextLayerId(m_idLayerText); pArrowUp2->SetTextStyleId(m_idTextStyle); pArrowDown->setPropertiesFrom(this); pArrowDown->SetLayoutRotation(GetLayoutRotation()); pArrowDown->SetText(downText); pArrowDown->SetTextHeight(m_dTextHeight); pArrowDown->SetTextAlign(TDbSymbArrow::kAtSide); if(!IsSingleStair()&&IsSameDir()&&!IsCross()&&m_nStairFlag!=SF_TOP) { XPoint pt=pt5; if(m_nStartSide!=OFFSET_LEFT) pt=pt1; ads_polar(pt,m_nRotation-PI*0.5,dist,pt); pArrowDown->SetTextLocation(pt); } //modify by xlc on 090601 交叉放置同向时下行方向 else if(!IsSingleStair()&&IsSameDir()&&IsCross()&&m_nStairFlag==SF_MIDDLE) { XPoint pt=pt8; if(m_nStartSide!=OFFSET_LEFT) pt=pt4; ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowDown->SetTextLocation(pt); } else { pArrowDown->SetTextLocation(pArrowDown->GetDefaultTextLocation()); } pArrowDown->SetTextLayerId(m_idLayerText); pArrowDown->SetTextStyleId(m_idTextStyle); pArrowDown2->setPropertiesFrom(this); pArrowDown2->SetLayoutRotation(GetLayoutRotation()); pArrowDown2->SetText(downText); pArrowDown2->SetTextHeight(m_dTextHeight); pArrowDown2->SetTextAlign(TDbSymbArrow::kAtSide); //modify by xlc on 090601 交叉放置同向时下行方向 /*if(!IsSingleStair()&&IsSameDir()&&IsCross()&&m_nStairFlag!=SF_TOP) { XPoint pt=pt5; if(m_nStartSide!=OFFSET_LEFT) pt=pt1; ads_polar(pt,m_nRotation-PI*0.5,dist,pt); pArrowDown2->SetTextLocation(pt); } else */if(!IsSingleStair()&&!IsSameDir()&&!IsCross()&&m_nStartSide==OFFSET_LEFT) { XPoint pt=pt5; ads_polar(pt,m_nRotation-PI*0.5,dist,pt); pArrowDown2->SetTextLocation(pt); } //modify by xlc on 090414 else if(!IsSingleStair()&&!IsSameDir()&&IsCross()&&m_nStartSide!=OFFSET_LEFT&&m_nStairFlag==SF_FIRST) { XPoint pt=pt4; ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowDown2->SetTextLocation(pt); } else if(!IsSingleStair()&&!IsSameDir()&&m_nStartSide==OFFSET_LEFT&&m_nStairFlag==SF_FIRST) { XPoint pt=pt8; ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowDown2->SetTextLocation(pt); } else if(!IsSingleStair()&&!IsSameDir()&&IsCross()&&m_nStairFlag==SF_MIDDLE) { XPoint pt=pt4; if (m_nStartSide==OFFSET_LEFT) { pt=pt8; } ads_polar(pt,m_nRotation+PI*0.5,dist,pt); pArrowDown2->SetTextLocation(pt); } else { pArrowDown2->SetTextLocation(pArrowDown2->GetDefaultTextLocation()); } pArrowDown2->SetTextLayerId(m_idLayerText); pArrowDown2->SetTextStyleId(m_idTextStyle); if(m_idLayerArrow.isValid()) { pArrowUp->setLayer(m_idLayerArrow); pArrowUp2->setLayer(m_idLayerArrow); pArrowDown->setLayer(m_idLayerArrow); pArrowDown2->setLayer(m_idLayerArrow); } } } Acad::ErrorStatus TDbAutoStair::ExplodeOrDraw3d(XExplodeDraw &dc) const { if(m_nViewCtrl==1) return Acad::eOk; //三维被禁止 assertReadEnabled(); return Acad::eOk; } bool TDbAutoStair::IsClipMe(const TEntityBase* pEnt)const { if(TDbEntity::IsClipMe(pEnt)) return true; if(pEnt->GetMe()->isKindOf(TDbColumn::desc())) return true; return false; } Acad::ErrorStatus TDbAutoStair::DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase) { Acad::ErrorStatus es=Acad::eOk; es=TDbEntity::DownGradeSave(nDrawMode,entSet,bErase); return es; } Acad::ErrorStatus TDbAutoStair::ExplodeOrDraw2d(XExplodeDraw &dc) const { if(m_nViewCtrl==2) return Acad::eOk; //二维被禁止 assertReadEnabled(); if(_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())==0 || g_bOsnapExpl) { XPushMemVar bExpl(g_bOsnapExpl, FALSE); XPushMemVar bFull(XExplodeStream::m_bFullExplode, TRUE); AcDbVoidPtrArray entSet; XExplodeStream dcExp(entSet); dcExp.SetPropertiesFrom(this); ExplodeOrDraw2d(dcExp); INT_PTR nQuickMarker=GetQuickMarker(); int nGsMarker=1; int nCount=entSet.length(); for(int i=0; i_DIST_SNAP) { XPoint ptLeft,ptRight; ads_polar(GetUpLeft2d(), m_nRotation-PI*0.5, m_nSlabSize*2+GetLength(), ptLeft); ads_polar(GetUpRight2d(), m_nRotation-PI*0.5, m_nSlabSize*2+GetLength(), ptRight); XPoly2D poly(1); poly.AppendNode(ptLeft); poly.AppendNode(ptRight); ads_polar(ptRight, m_nRotation+PI*0.5, m_dHoleLength, ptRight); ads_polar(ptLeft, m_nRotation+PI*0.5, m_dHoleLength, ptLeft); poly.AppendNode(ptRight); poly.AppendNode(ptLeft); if(poly.Length()>0) { dc.PushClip(poly); clipCount++; } } } } } else { //计算剖切线 if(IsSingleStair()) { GetSectionPoly(m_lSectPos,m_rSectPos,0,polyDown,polyUp,polyMid); } else { double rSect=(m_rSectPos-m_lSectPos)*(m_nStairWidth+dWidth*8.0/3)/(m_nStairWidth*2+dWidth*16.0/3+m_dSpaceWidth)+m_lSectPos, lSect=(m_rSectPos-m_lSectPos)*(m_nStairWidth+dWidth*8.0/3+m_dSpaceWidth)/(m_nStairWidth*2+dWidth*16.0/3+m_dSpaceWidth)+m_lSectPos; GetSectionPoly(m_lSectPos,rSect,0,polyDown,polyUp,polyMid); GetSectionPoly(lSect,m_rSectPos,2,polyDown1,polyUp1,polyMid1); } { //画剖切线 if(nFlag2d==SF_2SECT) { if(polyDown.Length()==5&&polyUp.Length()==5) { dc<0&&polyMid.Length()>0) dc<0) { dc.PushClip(poly); clipCount++; } if(!IsSingleStair()) { poly.Reset(); for(int i=0;i0) { dc.PushClip(poly); clipCount++; } } } else { for(int i=0;i2) { dc.PushClip(poly); clipCount++; } if(!IsSingleStair()) { poly.Reset(); for(int i=0;i2) { dc.PushClip(poly); clipCount++; } } } } //显示梯段 if(!IsAscent()) { stair1.ExplodeOrDraw2d(dc); if(!IsSingleStair()) stair2.ExplodeOrDraw2d(dc); } // 扶手线和垫板线 XPoint ptS,ptE,ptTmp; ads_polar(ptLocation, m_nRotation+PI, m_nStairWidth*0.5, ptS); ads_polar(ptS, m_nRotation+PI*0.5, dLength, ptE); XPoint ptLeft,ptRight; ads_polar(ptS, m_nRotation-PI*0.5, m_nStepDist, ptLeft); ads_polar(ptLeft, m_nRotation, m_nStairWidth, ptRight); dc<_DIST_SNAP) { double length=m_dFloorHeight/tan(m_dSlopeAngle*PI/180); int num=(int)(length/m_nStepWidth); return m_nStepWidth*num; } } return m_dSlopeLength; } double TDbAutoStair::GetRailHeight() const { assertReadEnabled(); return m_nRailHeight; } double TDbAutoStair::GetRailWidth() const { assertReadEnabled(); return m_nRailWidth; } double TDbAutoStair::GetStepDist() const { assertReadEnabled(); return m_nStepDist; } double TDbAutoStair::GetStairWidth() const { assertReadEnabled(); return m_nStairWidth; } double TDbAutoStair::GetStepWidth() const { assertReadEnabled(); return m_nStepWidth; } Adesk::UInt8 TDbAutoStair::GetStairFlag() const { assertReadEnabled(); return m_nStairFlag; } double TDbAutoStair::GetElevation() const { assertReadEnabled(); return m_ptLocation.z; } XPoint TDbAutoStair::GetLocation() const { assertReadEnabled(); return m_ptLocation; } XPoint TDbAutoStair::GetUpRight2d() const { assertReadEnabled(); XPoint pt=GetUpLeft2d(); double dWidth=_AS_SYS_UNIT(205.5); double dTotalWidth=dWidth*8/3+m_nStairWidth; if(!IsSingleStair()) { dTotalWidth = dTotalWidth*2+m_dSpaceWidth; } ads_polar(XPoint(pt), m_nRotation, dTotalWidth, pt); return pt; } XPoint TDbAutoStair::GetUpLeft2d() const { assertReadEnabled(); XPoint pt=m_ptLocation; pt.z=0; return pt; } double TDbAutoStair::GetRotation() const { assertReadEnabled(); return m_nRotation; } double TDbAutoStair::GetSlabSize() const { assertReadEnabled(); return m_nSlabSize; } void TDbAutoStair::SetSlabSize(double s) { assertWriteEnabled(); m_nSlabSize=s; } double TDbAutoStair::GetFloorHeight()const { assertReadEnabled(); return m_dFloorHeight; } void TDbAutoStair::SetFloorHeight(double h) { assertWriteEnabled(); m_dFloorHeight=h; } double TDbAutoStair::GetTextHeight()const { assertReadEnabled(); return m_dTextHeight; } void TDbAutoStair::SetTextHeight(double h) { assertWriteEnabled(); m_dTextHeight=h; } double TDbAutoStair::GetSlopeAngle()const { assertReadEnabled(); return m_dSlopeAngle; } void TDbAutoStair::SetSlopeAngle(double a) { assertWriteEnabled(); m_dSlopeAngle=a; } double TDbAutoStair::GetHoleLength()const { assertReadEnabled(); return m_dHoleLength; } void TDbAutoStair::SetHoleLength(double a) { assertWriteEnabled(); m_dHoleLength=a; } double TDbAutoStair::GetSlopeLength()const { assertReadEnabled(); return m_dSlopeLength; } void TDbAutoStair::SetSlopeLength(double a) { assertWriteEnabled(); m_dSlopeLength=a; } double TDbAutoStair::GetLSectPos()const { assertReadEnabled(); return m_lSectPos; } double TDbAutoStair::GetRSectPos()const { assertReadEnabled(); return m_rSectPos; } void TDbAutoStair::SetLSectPos(double l) { assertWriteEnabled(); m_lSectPos=l; } void TDbAutoStair::SetRSectPos(double l) { assertWriteEnabled(); m_rSectPos=l; } double TDbAutoStair::GetSpaceWidth() const { assertReadEnabled(); return m_dSpaceWidth; } void TDbAutoStair::SetSpaceWidth(double w) { assertWriteEnabled(); m_dSpaceWidth=w; } int TDbAutoStair::GetStartSide() const { assertReadEnabled(); return m_nStartSide; } void TDbAutoStair::SetStartSide(int nSide) { assertWriteEnabled(); m_nStartSide=nSide; } void TDbAutoStair::SetRailHeight(double l) { assertWriteEnabled(); m_nRailHeight=l; } void TDbAutoStair::SetRailWidth(double w) { assertWriteEnabled(); m_nRailWidth=w; } void TDbAutoStair::SetStepDist(double l) { assertWriteEnabled(); m_nStepDist=l; } void TDbAutoStair::SetStairFlag(Adesk::UInt8 flag) { assertWriteEnabled(); m_nStairFlag=flag; } void TDbAutoStair::SetStepWidth(double w) { assertWriteEnabled(); m_nStepWidth=w; } void TDbAutoStair::SetStairWidth(double w) { assertWriteEnabled(); m_nStairWidth=w; } void TDbAutoStair::SetElevation(double elev) { assertWriteEnabled(); m_ptLocation.z = elev; } void TDbAutoStair::SetLocation(const XPoint &pt) { assertWriteEnabled(); m_ptLocation = pt; } void TDbAutoStair::SetRotation(double rot) { assertWriteEnabled(); m_nRotation=rot; } void TDbAutoStair::SetStepHeight(double h) { assertWriteEnabled(); m_nStepHeight=h; } void TDbAutoStair::SetArrow(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx|=SFEX_ARROW; else m_nFlagEx&=~SFEX_ARROW; } BOOL TDbAutoStair::IsArrow() const { return ((m_nFlagEx&SFEX_ARROW)!=0); } BOOL TDbAutoStair::IsHasHole()const { return ((m_nFlagEx&SFEX_HASHOLE)!=0); } void TDbAutoStair::SetHasHole(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx|=SFEX_HASHOLE; else m_nFlagEx&=~SFEX_HASHOLE; } BOOL TDbAutoStair::IsCross()const { return ((m_nFlagEx&SFEX_CROSSSTAIR)!=0); } void TDbAutoStair::SetCross(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx|=SFEX_CROSSSTAIR; else m_nFlagEx&=~SFEX_CROSSSTAIR; } BOOL TDbAutoStair::IsSameDir()const { return ((m_nFlagEx&SFEX_SAMEDIR)!=0); } void TDbAutoStair::SetSameDir(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx|=SFEX_SAMEDIR; else m_nFlagEx&=~SFEX_SAMEDIR; } BOOL TDbAutoStair::IsSingleStair()const { return ((m_nFlagEx&SFEX_SINGLESTAIR)!=0); } void TDbAutoStair::SetSingleStair(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx|=SFEX_SINGLESTAIR; else m_nFlagEx&=~SFEX_SINGLESTAIR; } BOOL TDbAutoStair::IsAscent() const { return ((m_nFlagEx&SFEX_ASCENT)!=0); } BOOL TDbAutoStair::IsOnGround() const { return ((m_nFlagEx&SFEX_GROUND)!=0); } BOOL TDbAutoStair::HasSlant() const { return ((m_nFlagEx&SFEX_SLANT)!=0); } void TDbAutoStair::SetAscent(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx |= SFEX_ASCENT; else m_nFlagEx &= ~SFEX_ASCENT; } void TDbAutoStair::SetOnGround(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx |= SFEX_GROUND; else m_nFlagEx &= ~SFEX_GROUND; } void TDbAutoStair::SetSlant(BOOL bTrue) { assertWriteEnabled(); if(bTrue) m_nFlagEx |= SFEX_SLANT; else m_nFlagEx &= ~SFEX_SLANT; } double TDbAutoStair::GetSlabThick() const { return m_nSlabThick; } AcDbObjectId TDbAutoStair::GetLayerStep3d() const { return m_idLayerStep3d; } AcDbObjectId TDbAutoStair::GetLayerText() const { return m_idLayerText; } AcDbObjectId TDbAutoStair::GetTextStyle() const { return m_idTextStyle; } AcDbObjectId TDbAutoStair::GetLayerArrow() const { return m_idLayerArrow; } void TDbAutoStair::SetSlabThick(double val) { assertWriteEnabled(); m_nSlabThick=val; } void TDbAutoStair::SetLayerStep3d(AcDbObjectId idLayer) { assertWriteEnabled(); m_idLayerStep3d=idLayer; } void TDbAutoStair::SetLayerText(AcDbObjectId idLayer) { assertWriteEnabled(); m_idLayerText=idLayer; } void TDbAutoStair::SetTextStyle(AcDbObjectId idStyle) { assertWriteEnabled(); m_idTextStyle=idStyle; } void TDbAutoStair::SetLayerArrow(AcDbObjectId idLayer) { assertWriteEnabled(); m_idLayerArrow=idLayer; } //add by xlc 090426,箭头文字,动态数据 CString TDbAutoStair::GetTextUp() const { assertReadEnabled(); CString sVal(_T("上")); const TEntityFields &fd = GetFields(); fd.GFD(_T("上楼箭头文字"), sVal); return sVal; } void TDbAutoStair::SetTextUp(const TCHAR *sVal) { assertWriteEnabled(); TEntityFields &fd = Fields(); fd.SFD(_T("上楼箭头文字"), sVal); } CString TDbAutoStair::GetTextDown() const { assertReadEnabled(); CString sVal(_T("下")); const TEntityFields &fd = GetFields(); fd.GFD(_T("下楼箭头文字"), sVal); return sVal; } void TDbAutoStair::SetTextDown(const TCHAR *sVal) { assertWriteEnabled(); TEntityFields &fd = Fields(); fd.SFD(_T("下楼箭头文字"), sVal); } ////////////////////////////////////////////////// void InitDbAutoStair(BOOL bTrue) { if(bTrue) { TDbAutoStair::rxInit(); acrxBuildClassHierarchy(); TDbAutoStair::InitMatchProtocol(TRUE); } else { TDbAutoStair::InitMatchProtocol(FALSE); deleteAcRxClass(TDbAutoStair::desc()); } }