Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/DbMultiStair.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

453 lines
12 KiB
C++

#ifndef __DBMULTISTAIR_H
#define __DBMULTISTAIR_H
#include "dbstair.h"
class TARCH_EXP TDbMultiStair: public TDbEntity { //为支持栏杆的绊定
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(TDbMultiStair);
private:
const static Adesk::UInt8 g_nVersion;
protected:
Adesk::UInt32 m_nFlagEx; //控制标记
Adesk::UInt8 m_nStairFlag; //楼层标记: 0--首层, 1--中间层, 2--顶层
Adesk::UInt8 m_nPathSide; //0--左边基线,1-右边基线
XPoly2D m_polySide2d;
double m_nElevation; //标高
double m_nStairWidth;
double m_nStairHeight; //楼梯总高
double m_nStepWidth;
double m_nStepHeight;
double m_nRailHeight; //扶手高度
double m_nRailWidth; //扶手宽度
double m_nRailDistToSide; //扶手距离边
double m_nSlabThick; //平台厚度
double m_nBeamHeight; //边梁高度
double m_nBeamThick; //边梁厚度
double m_lSectPos, m_rSectPos; //左右剖切位置距离起点的距离,在定制剖切标记下可用
AcDbHardPointerId m_idLayerStep3d, m_idLayerHand3d, m_idLayerRail3d, m_idLayerBeam3d;
Adesk::UInt8 m_nViewCtrl; //视图控制:0-自动(由楼层决定);1-禁止3D;2-禁止2D
//TArch8
DList<Adesk::UInt8> m_lstSegType;//每一段的类形,0,梯段;1,平台。
//add by xlc on 080718
//Tarch8 member
double m_nRailDistEnd; //终端扶手伸出距离
double m_nRailDist; //起始端扶手伸出距离
double m_dSectElev; //剖切高度
double m_dSectRotation; //剖断线旋转角度
double m_dTextHeight; //字高
AcDbHardPointerId m_idLayerText,m_idLayerArrow,m_idTextStyle;
protected:
long m_iActiveStep;//当前定位的梯段(不存盘,只是用于JIG绘制过程,其它情况都为-1;
public:
// 为导入到PDMS中,所新增接口 by gjm 2015/09/08
Adesk::UInt32 GetFlagEx(){ return m_nFlagEx; }
// Attribute Access method
void SetActiveStep(long i){m_iActiveStep=i;}//ok,0,最后一段,否则倒数第二个
// 0-Left Side, 1 or other-Right Side
void GetSidePoly2d(int nSide, XPoly2D &polySide) const;
const XPoly2D &GetPolySide2d() const {
return m_polySide2d;
}
Adesk::UInt8 GetPathSide() const {
return m_nPathSide;
}
double GetStairHeight() const {
return m_nStairHeight;
}
double GetStairWidth() const {
return m_nStairWidth;
}
double GetStepHeight() const {
return m_nStepHeight;
}
double GetStepWidth() const {
return m_nStepWidth;
}
Adesk::UInt8 GetStairFlag() const {
return m_nStairFlag;
}
double GetRailHeight() const {
return m_nRailHeight;
}
double GetRailWidth() const {
return m_nRailWidth;
}
double GetRailDistToSide() const {
return m_nRailDistToSide;
}
double GetSlabThick() const {
return m_nSlabThick;
}
double GetBeamThick() const {
return m_nBeamThick;
}
double GetBeamHeight() const {
return m_nBeamHeight;
}
double GetElevation() const {
return m_nElevation;
}
Adesk::UInt8 GetViewCtrl() const {
return m_nViewCtrl;
}
//看剖切位置命中的目标,ptHit为剖切位置,返回值:0-没有命中,否则为命中的第n个梯段
int HitTestSectPos(int nSide, XPoint &ptHit2d) const;
int HitTestSectPos(int nSide, const DList<TDbStair> &stairs, XPoint &ptHit2d) const;
void SetDefaultSectPos();
//add by xlc on 090426 箭头文字,动态数据
CString GetTextUp() const;
void SetTextUp(const TCHAR *sVal);
CString GetTextDown() const;
void SetTextDown(const TCHAR *sVal);
double GetSectPos(int nSide) const {
return (nSide? m_rSectPos : m_lSectPos);
}
BOOL IsManualSectPos() const {
return ((m_nFlagEx&SFEX_SECTPOS)!=0);
}
BOOL IsAutoRail() const{
return ((m_nFlagEx&SFEX_AUTORAIL)!=0);
}
BOOL HasHandRail(int nSide) const {
int nBitFlag=nSide? SFEX_RRAIL : SFEX_LRAIL;
return ((m_nFlagEx&nBitFlag)!=0);
}
BOOL HasSideBeam(int nSide) const {
int nBitFlag=nSide? SFEX_RBEAM : SFEX_LBEAM;
return ((m_nFlagEx&nBitFlag)!=0);
}
BOOL IsAscent() const{
return ((m_nFlagEx&SFEX_ASCENT)!=0);
}
BOOL IsOnGround() const{
return ((m_nFlagEx&SFEX_GROUND)!=0);
}
BOOL HasSlant() const {
return ((m_nFlagEx&SFEX_SLANT)!=0);
}
BOOL IsAlongWall(int nSide) const {
int nTestBit=nSide? SFEX_RWALL : SFEX_LWALL;
return ((m_nFlagEx&nTestBit)!=0);
}
AcDbObjectId GetLayerBeam3d() const{
return m_idLayerBeam3d;
}
AcDbObjectId GetLayerStep3d() const {
return m_idLayerStep3d;
}
AcDbObjectId GetLayerHand3d() const {
return m_idLayerHand3d;
}
AcDbObjectId GetLayerRail3d() const {
return m_idLayerRail3d;
}
void SetManualSectPos(BOOL bTrue) {
assertWriteEnabled();
if(bTrue) m_nFlagEx |= SFEX_SECTPOS;
else m_nFlagEx &= ~SFEX_SECTPOS;
}
void SetSectPos(int nSide, double nDist) {
assertWriteEnabled();
if(nSide) m_rSectPos=nDist;
else m_lSectPos=nDist;
}
void SetPolySide2d(const XPoly2D &polySide)
{
assertWriteEnabled();
m_polySide2d=polySide;
}
//add by xlc on 080718 Tarch8
double GetSectStepNum() const;
void SetSectStepNum(double d);
double GetSectElev()const
{
assertReadEnabled();
return m_dSectElev;
}
void SetSectElev(double r)
{
assertWriteEnabled();
m_dSectElev = r;
}
double GetTextHeight()const
{
assertReadEnabled();
return m_dTextHeight;
}
void SetTextHeight(double h)
{
assertWriteEnabled();
m_dTextHeight=h;
}
double GetSectRotation()const
{
assertReadEnabled();
return m_dSectRotation;
}
void SetSectRotation(double r)
{
assertWriteEnabled();
m_dSectRotation=r;
}
double GetRailDistEnd() const
{
assertReadEnabled();
return m_nRailDistEnd;
}
void SetRailDistEnd(double w)
{
assertWriteEnabled();
m_nRailDistEnd=w;
}
double GetRailDist() const
{
assertReadEnabled();
return m_nRailDist;
}
void SetRailDist(double w)
{
assertWriteEnabled();
m_nRailDist=w;
}
void SetArrow(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue)
m_nFlagEx|=SFEX_ARROW;
else
m_nFlagEx&=~SFEX_ARROW;
}
BOOL IsArrow() const//是否显示箭头
{
return ((m_nFlagEx&SFEX_ARROW)!=0);
}
AcDbObjectId GetLayerText() const
{
return m_idLayerText;
}
AcDbObjectId GetTextStyle() const
{
return m_idTextStyle;
}
AcDbObjectId GetLayerArrow() const
{
return m_idLayerArrow;
}
void SetLayerText(AcDbObjectId idLayer)
{
assertWriteEnabled();
m_idLayerText=idLayer;
}
void SetTextStyle(AcDbObjectId idStyle)
{
assertWriteEnabled();
m_idTextStyle=idStyle;
}
void SetLayerArrow(AcDbObjectId idLayer)
{
assertWriteEnabled();
m_idLayerArrow=idLayer;
}
// 计算剖切高度和剖切点
BOOL CalSectPos(const DList<TDbStair> &stairs,double &lSectPos,double &rSectPos,XPoint &ptLeft2d,XPoint &ptRight2d)const;
int GetSectStairPos(const DList<TDbStair> &stairs)const;//剖切梯段
// 由平面二维点推算命中的相对高度
double HitElevationByPoint2d(const DList<TDbStair> &stairs,XPoint ptHit2d) const;
Adesk::UInt8 GetSegType(long i)const;
void ResetSegType(){assertWriteEnabled();m_lstSegType.Reset();}//ok
void SetSegType(long i,Adesk::UInt8 type);
void SwapPolySide();//对齐方式变化,但楼梯形状不变
void SetRailHeight(double l) {
assertWriteEnabled();
m_nRailHeight=l;
}
void SetRailWidth(double w) {
assertWriteEnabled();
m_nRailWidth=w;
}
void SetRailDistToSide(double l) {
assertWriteEnabled();
m_nRailDistToSide=l;
}
void SetStepWidth(double w) {
assertWriteEnabled();
m_nStepWidth=w;
}
void SetStairWidth(double w){
assertWriteEnabled();
m_nStairWidth=w;
}
void SetElevation(double elev) {
assertWriteEnabled();
m_nElevation = elev;
}
void SetPathSide(int nSide) {
assertWriteEnabled();
m_nPathSide=nSide;
}
void SetStepHeight(double h){
assertWriteEnabled();
m_nStepHeight=h;
}
void SetStairHeight(double h) {
assertWriteEnabled();
m_nStairHeight=h;
}
void SetAutoRail(BOOL bTrue){
assertWriteEnabled();
if(bTrue)
m_nFlagEx |= SFEX_AUTORAIL;
else
m_nFlagEx &= ~SFEX_AUTORAIL;
}
void SetAscent(BOOL bTrue){
assertWriteEnabled();
if(bTrue)
m_nFlagEx |= SFEX_ASCENT;
else
m_nFlagEx &= ~SFEX_ASCENT;
}
void SetOnGround(BOOL bTrue){
assertWriteEnabled();
if(bTrue)
m_nFlagEx |= SFEX_GROUND;
else
m_nFlagEx &= ~SFEX_GROUND;
}
void SetSlant(BOOL bTrue){
assertWriteEnabled();
if(bTrue)
m_nFlagEx |= SFEX_SLANT;
else
m_nFlagEx &= ~SFEX_SLANT;
}
void SetSideBeam(int nSide, BOOL bTrue){
assertWriteEnabled();
int nBitFlag=nSide? SFEX_RBEAM : SFEX_LBEAM;
if(bTrue)
m_nFlagEx |= nBitFlag;
else
m_nFlagEx &= ~nBitFlag;
}
void SetHandRail(int nSide, BOOL bTrue) {
assertWriteEnabled();
int nBitFlag=nSide? SFEX_RRAIL : SFEX_LRAIL;
if(bTrue)
m_nFlagEx |= nBitFlag;
else
m_nFlagEx &= ~nBitFlag;
}
void SetAlongWall(int nSide, BOOL bTrue) {
assertWriteEnabled();
int nTestBit=nSide? SFEX_RWALL : SFEX_LWALL;
if(bTrue)
m_nFlagEx |= nTestBit;
else
m_nFlagEx &= ~nTestBit;
}
void SetStairFlag(Adesk::UInt8 flag) {
assertWriteEnabled();
m_nStairFlag = flag;
}
void SetBeamHeight(double val){
assertWriteEnabled();
m_nBeamHeight = val;
}
void SetSlabThick(double val) {
assertWriteEnabled();
m_nSlabThick=val;
}
void SetBeamThick(double val) {
assertWriteEnabled();
m_nBeamThick=val;
}
// 设置三维部件的图层
void SetLayerBeam3d(AcDbObjectId idLayer) {
assertWriteEnabled();
m_idLayerBeam3d=idLayer;
}
void SetLayerStep3d(AcDbObjectId idLayer) {
assertWriteEnabled();
m_idLayerStep3d=idLayer;
}
void SetLayerHand3d(AcDbObjectId idLayer) {
assertWriteEnabled();
m_idLayerHand3d=idLayer;
}
void SetLayerRail3d(AcDbObjectId idLayer) {
assertWriteEnabled();
m_idLayerRail3d=idLayer;
}
void SetViewCtrl(Adesk::UInt8 nCtrl) {
assertWriteEnabled();
m_nViewCtrl=nCtrl;
}
Adesk::UInt8 GetSegNum()const{return m_polySide2d.TotalSegments();}//ok
Adesk::UInt8 GetTotalStepNum() const;
Adesk::UInt8 GetStairNum() const;
Adesk::UInt8 GetSlabNum() const;
Acad::ErrorStatus ExplodeTo(DList<TDbEntity> &lstComponents) const;
public:
TDbMultiStair();
~TDbMultiStair();
virtual BOOL IsValid() const;
virtual bool IsClipMe(const TEntityBase* pEnt=NULL)const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
// Overriden function from AcDbEntity
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) const;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
//virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet) const;
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
// drived from TDbEntity
virtual bool IsModelEntity() const{return true;}
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual const TCHAR *GetDefaultLayer() const;
virtual void GetTips(DList<TObjInfoUnit> &) const; //取动态属性显示数据
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual int GetFirstVersion()const{return 6;}//ok
// sg add 101115,支持统一标高
virtual bool UnifyElevation(double dElevation = 0.0);
// cet 2013.9.6 add
CString GetXml(const AcGeMatrix3d& mat) const;
};
#endif