Files
envi-code/SourceCode/Code2026/Dimension/AecDbSymbRupture.cpp
T
2026-09-28 15:28:50 +08:00

451 lines
10 KiB
C++

#include "stdafx.h"
#include "AecDbSymbRupture.h"
#include "globalFunc.h"
#include "GePoly2D.h"
const Adesk::UInt8 AecXDbSymbRupture::g_nVersion = 1;
ACRX_DXF_DEFINE_MEMBERS(AecXDbSymbRupture, AecXDbEntityBaseEx, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, AEC_ZHEDUANXIAN, "AEC_ZHEDUANXIAN|缺乏上华解释器, 请下载上华软件|网址: www.shanghuasoft.com");
AecXDbSymbRupture::AecXDbSymbRupture()
{
m_nRuptureNum = 1;
}
AecXDbSymbRupture::~AecXDbSymbRupture()
{
}
BOOL AecXDbSymbRupture::IsValid() const
{
//BOOL bRet = AecXDbEntityBaseEx::IsValid();
//if (!bRet)
// return bRet;
BOOL bRet = (m_ptStart.Distance2d(m_ptEnd) > g_Option::instance()._DIST_SNAP && m_nRuptureNum >= 1);
return bRet;
}
//Acad::ErrorStatus
//AecXDbSymbRupture::subGetClassID(CLSID* pClsid) const
//{
// *pClsid = CLSID_ComSymbRupture;
// return Acad::eOk;
//}
// 提供对格式刷的支持
void AecXDbSymbRupture::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
AssertWriteEnabled();
AecXDbEntityBaseEx::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
AecXDbSymbRupture *pSrc = AecXDbSymbRupture::cast(pSrcEntity);
if (pSrc) {
}
}
// 从DWG读入数据:
Acad::ErrorStatus AecXDbSymbRupture::dwgInFields(AcDbDwgFiler* pFiler)
{
AssertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::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((AcGePoint2d *)&m_ptStart);
pFiler->readItem((AcGePoint2d *)&m_ptEnd);
pFiler->readItem(&m_nRuptureNum);
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbRupture::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
pFiler->writeItem(g_nVersion);
pFiler->writeItem((const AcGePoint2d &)m_ptStart);
pFiler->writeItem((const AcGePoint2d &)m_ptEnd);
pFiler->writeItem(m_nRuptureNum);
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbRupture::dxfInFields(AcDbDxfFiler* pFiler)
{
AssertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfInFields(pFiler);
if (es != Acad::eOk)
return es;
if (!pFiler->atSubclassData(_T("AecXDbSymbRupture"))) {
return Acad::eBadDxfSequence;
}
ADSGePoint3d pt1, pt2;
int num;
resbuf rb;
int fieldsFlags;
while ((es == Acad::eOk)
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) {
switch (rb.restype) {
case AcDb::kDxfXCoord:
pt1 = rb.resval.rpoint;
fieldsFlags |= 0x1;
break;
case AcDb::kDxfXCoord + 1:
pt2 = rb.resval.rpoint;
fieldsFlags |= 0x2;
break;
case AcDb::kDxfInt16:
num = rb.resval.rint;
fieldsFlags |= 0x04;
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: 11"));
return Acad::eMissingDxfField;
}
m_ptStart = pt1;
m_ptEnd = pt2;
if (fieldsFlags & 0x04)
m_nRuptureNum = num;
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbRupture::dxfOutFields(AcDbDxfFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass, _T("AecXDbSymbRupture"));
assert(es == Acad::eOk);
pFiler->writePoint2d(AcDb::kDxfXCoord, m_ptStart.AsAcGePoint2d());
pFiler->writePoint2d(AcDb::kDxfXCoord + 1, m_ptEnd.AsAcGePoint2d());
pFiler->writeInt16(AcDb::kDxfInt16, m_nRuptureNum);
return pFiler->filerStatus();
}
// -----------------------------------------------------------------------
// Overriden functions for edit
// to do:
// 允许通过夹点改变边界
Acad::ErrorStatus AecXDbSymbRupture::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
gripPoints.append(m_ptStart); //0
gripPoints.append(m_ptEnd); //1
ADSGePoint3d ptMid;
Midpoint(m_ptStart, m_ptEnd, ptMid);
gripPoints.append(ptMid);
return Acad::eOk;
}
// Modify on 2002/2/22 by ZJQ
// 解决普通线和折断线同时stretch 的时候,不能同步拉伸
//
Acad::ErrorStatus
AecXDbSymbRupture::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
stretchPoints.append(m_ptStart); //0
stretchPoints.append(m_ptEnd); //1
return Acad::eOk;
}
// Active when being rotated, scaled, moved, etc.
// Scale is disabled here
Acad::ErrorStatus AecXDbSymbRupture::subTransformBy(const AcGeMatrix3d& xform)
{
AssertWriteEnabled();
AecXDbEntityBaseEx::subTransformBy(xform);
ads_matrix mat;
GlobalFunc::AsAdsMatrix(xform, mat);
m_ptStart.TransformBy(mat);
m_ptEnd.TransformBy(mat);
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus AecXDbSymbRupture::subMoveGripPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
using namespace GlobalFunc;
AssertWriteEnabled();
ADSGePoint3d vtOffset(offset[0], offset[1]);
for (int i = 0; i < indices.length(); i++)
{
int idx = indices[i];
if (idx == 0) // Move vertex
{
// modify by lgy 20120321,移动起点终点时可以固定方向移动和不固定方向移动
// m_ptStart += vtOffset;
if (GetCtrlToggle()) // 不固定方向移动
{
m_ptStart += vtOffset;
}
else
{
GeLine lineTemp(m_ptStart, m_ptEnd);
double nDir = lineTemp.Direction();
Vector3D vt(cos(nDir), sin(nDir));
double dLength = vtOffset & vt;
vt.Scale(dLength);
m_ptStart += vt;
}
}
else if (idx == 1)
{
// modify by lgy 20120321,移动起点终点时可以固定方向移动和不固定方向移动
// m_ptEnd += vtOffset;
if (GetCtrlToggle()) // 不固定方向移动终点
{
m_ptEnd += vtOffset;
}
else
{
GeLine lineTemp(m_ptStart, m_ptEnd);
double nDir = lineTemp.Direction();
Vector3D vt(cos(nDir), sin(nDir));
double dLength = vtOffset & vt;
vt.Scale(dLength); // 根据距离求移动的向量
m_ptEnd += vt;
}
}
else if (idx == 2)
{
m_ptStart += vtOffset;
m_ptEnd += vtOffset;
}
}
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus AecXDbSymbRupture::subMoveStretchPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
AssertWriteEnabled();
ADSGePoint3d vtOffset(offset[0], offset[1]);
for (int i = 0; i < indices.length(); i++)
{
int idx = indices[i];
if (idx == 0) // Move vertex
{
m_ptStart += vtOffset;
}
else if (idx == 1)
{
m_ptEnd += vtOffset;
}
}
return Acad::eOk;
}
// 取得夹点说明
Acad::ErrorStatus AecXDbSymbRupture::GetGripText(int i, CString &cs) const
{
Acad::ErrorStatus es = Acad::eOk;
// modify by lgy 9.0要求CTRL切换固定方向和不固定方向
//if(i==0)
// cs=_T("移动起点");
//else if(i==1)
// cs=_T("移动终点");
if (i == 0)
{
cs = !GetCtrlToggle() ? _T("移动起点(ctrl-不固定方向)") : _T("移动起点(ctrl-固定方向)");
}
else if (i == 1)
{
cs = !GetCtrlToggle() ? _T("移动终点(ctrl-不固定方向)") : _T("移动终点(ctrl-固定方向)");
}
else if (i == 2)
cs = _T("平移");
return es;
}
BOOL GetStdRupture(ADSGePoint3d ptStart, ADSGePoint3d ptEnd, double scale, GePoly2D &poly2d)
{
double d = 0.3 * scale;
double L2 = (ads_distance(ptStart, ptEnd) - 7.5 * d) / 2.0;
if (L2 < 0.0)
{
return FALSE;
}
else
{
double nDist1 = 7 * d / cos(20.0 / 180.0 * PI);
double nDist2 = 7 * d / cos(10.0 / 180.0 * PI);
double nAng1 = ads_angle(ptStart, ptEnd);
ADSGePoint3d pt2, pt3, pt4, pt5;
ads_polar(ptStart, nAng1, L2, pt2);
ads_polar(pt2, nAng1 + 70.0 / 180.0 * PI, nDist1, pt3);
ads_polar(pt3, nAng1 - 80.0 / 180.0 * PI, nDist2 * 2, pt4);
ads_polar(pt2, nAng1, 7.5 * d, pt5);
poly2d.AppendNode(ptStart);
poly2d.AppendNode(pt2);
poly2d.AppendNode(pt3);
poly2d.AppendNode(pt4);
poly2d.AppendNode(pt5);
poly2d.AppendNode(ptEnd);
}
return TRUE;
}
Acad::ErrorStatus
AecXDbSymbRupture::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
GlobalFunc::_LoadConfig();
if (Has2DBuffer() && !dc.IsDragging())
{
dc.SetColor(colorIndex());
dc.SetLayer(layerId());
BaseEx::_Draw2DBuffers(dc, true);
return Acad::eOk;
}
double nAng = ads_angle(m_ptStart, m_ptEnd);
double nDist = m_ptStart.Distance2d(m_ptEnd);
ADSGePoint3d ptStart = m_ptStart;
for (Adesk::UInt8 i = 0; i < m_nRuptureNum; i++) {
ADSGePoint3d ptEnd;
ads_polar(ptStart, nAng, nDist / m_nRuptureNum, ptEnd);
GePoly2D poly(0);
if (GetStdRupture(ptStart, ptEnd, GetPScale(), poly)) {
//dc << poly;
DrawPoly2D(dc, poly);
}
else {
//dc << GeLine(ptStart, ptEnd);
DrawLine(dc, ptStart, ptEnd);
}
ptStart = ptEnd;
}
return Acad::eOk;
}
// sg add 110301,支持统一标高
bool AecXDbSymbRupture::UnifyElevation(double dElevation)
{
AssertWriteEnabled();
m_ptStart.z = dElevation;
m_ptEnd.z = dElevation;
return true;
}
const TCHAR *AecXDbSymbRupture::GetDefaultLayer() const
{
extern TCHAR* LAY_OTHER_DIM;
return LAY_OTHER_DIM;
}
DrawModeType
AecXDbSymbRupture::GetDrawType() const
{
return k2DOnly;
}
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
void AecXDbSymbRupture::GetTips(PtrList<ObjInfoUnit> &lstInfo) const
{
lstInfo.Append(new ObjInfoUnit(_T("对象类型"), _T("折断线")));
lstInfo.Append(new ObjInfoUnit(_T("折断线长"), GlobalFunc::Dist2Str(m_ptStart.Distance2d(m_ptEnd))));
lstInfo.Append(new ObjInfoUnit(_T("折断线角度:"), GlobalFunc::Angle2Str(ads_angle(m_ptStart, m_ptEnd) * 180.0 / PI)));
lstInfo.Append(new ObjInfoUnit(_T("折断数目"), TCString(_T("%d"), int(GetRuptureNum()))));
}
ADSGePoint3d AecXDbSymbRupture::GetStartPoint() const
{
return m_ptStart;
}
ADSGePoint3d AecXDbSymbRupture::GetEndPoint() const
{
return m_ptEnd;
}
Adesk::UInt8 AecXDbSymbRupture::GetRuptureNum() const
{
assertReadEnabled();
return m_nRuptureNum;
}
void AecXDbSymbRupture::SetRuptureNum(Adesk::UInt8 num)
{
AssertWriteEnabled();
m_nRuptureNum = num;
}
void AecXDbSymbRupture::SetStartPoint(ADSGePoint3d pt)
{
AssertWriteEnabled();
m_ptStart = pt;
}
void AecXDbSymbRupture::SetEndPoint(ADSGePoint3d pt)
{
AssertWriteEnabled();
m_ptEnd = pt;
}