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

511 lines
12 KiB
C++

#include "stdafx.h"
#include "AecDbSymbSymmetry.h"
#include "globalFunc.h"
const Adesk::UInt8 AecXDbSymbSymmetry::g_nVersion = 1;
ACRX_DXF_DEFINE_MEMBERS(AecXDbSymbSymmetry, AecXDbEntityBaseEx, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
1, AEC_DUICHENZHOU, "AEC_DUICHENZHOU|缺乏上华解释器, 请下载上华软件|网址: www.shanghuasoft.com");
AecXDbSymbSymmetry::AecXDbSymbSymmetry()
{
m_nTermLen = 8.0;
m_nDist2 = 2.5;
m_nDist1 = 2.0;
}
AecXDbSymbSymmetry::~AecXDbSymbSymmetry()
{
}
BOOL AecXDbSymbSymmetry::IsValid() const
{
//BOOL bRet = AecXDbEntityBaseEx::IsValid();
//if (!bRet)
// return bRet;
BOOL bRet = (m_ptStart.Distance2d(m_ptEnd) > (GetDist2(FALSE) + GetDist1(FALSE)) * 2.0);
return bRet;
}
/*
Acad::ErrorStatus
AecXDbSymbSymmetry::getClassID(CLSID* pClsid) const
{
*pClsid = CLSID_LineText;
return Acad::eOk;
}
*/
// 提供对格式刷的支持
void AecXDbSymbSymmetry::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
{
AssertWriteEnabled();
AecXDbEntityBaseEx::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
AecXDbSymbSymmetry *pSrc = AecXDbSymbSymmetry::cast(pSrcEntity);
if (pSrc) {
m_nDist1 = pSrc->m_nDist1;
m_nDist2 = pSrc->m_nDist2; //第一端线距离端点, 第二端线距离第一端线
m_nTermLen = pSrc->m_nTermLen; //端线长度
//m_idLayerCenter=pSrc->m_idLayerCenter;
}
}
// 从DWG读入数据:
Acad::ErrorStatus AecXDbSymbSymmetry::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_nTermLen);
pFiler->readItem(&m_nDist1);
pFiler->readItem(&m_nDist2);
/*
if(nVer>1) {
pFiler->readItem(&m_idLayerCenter);
} else { // 升级TArch5
if(this->database()==curDwg())
m_idLayerCenter=InitLayer(LAY_AXIS);
}*/
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbSymmetry::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_nTermLen);
pFiler->writeItem(m_nDist1);
pFiler->writeItem(m_nDist2);
//pFiler->writeItem(m_idLayerCenter);
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbSymmetry::dxfInFields(AcDbDxfFiler* pFiler)
{
AssertWriteEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfInFields(pFiler);
if (es != Acad::eOk)
return es;
if (!pFiler->atSubclassData(_T("AecXDbSymbSymmetry"))) {
return Acad::eBadDxfSequence;
}
ADSGePoint3d ptStart, ptEnd;
double nDist0, nDist1, nDist2;
Adesk::UInt32 fieldsFlags = 0;
resbuf rb;
while ((es == Acad::eOk)
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) {
switch (rb.restype) {
case AcDb::kDxfXCoord:
ptStart = rb.resval.rpoint;
fieldsFlags |= 0x1;
break;
case AcDb::kDxfXCoord + 1:
ptEnd = rb.resval.rpoint;
fieldsFlags |= 0x2;
break;
case AcDb::kDxfReal:
fieldsFlags |= 0x4;
nDist0 = rb.resval.rreal;
break;
case AcDb::kDxfReal + 1:
fieldsFlags |= 0x8;
nDist1 = rb.resval.rreal;
break;
case AcDb::kDxfReal + 2:
fieldsFlags |= 0x10;
nDist2 = rb.resval.rreal;
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;
// Now check to be sure all necessary group codes were present.
//
// Mandatory fields:
// - center
// - start point
// - normal
// - number of sides
// - elevation (if version > 1)
short required[] =
{ AcDb::kDxfXCoord, AcDb::kDxfXCoord + 1,
AcDb::kDxfReal, AcDb::kDxfReal + 1, AcDb::kDxfReal + 2 };
Adesk::UInt32 nFlags = fieldsFlags;
for (short i = 0; i < 2; i++) {
if (!nFlags & 0x1) {
pFiler->setError(Acad::eMissingDxfField,
_T("\nMissing DXF group code: %d"), required[i]);
return Acad::eMissingDxfField;
}
else
nFlags >>= 1;
}
m_ptStart = ptStart;
m_ptEnd = ptEnd;
if (fieldsFlags & 0x04)
m_nTermLen = nDist0;
if (fieldsFlags & 0x08)
m_nDist1 = nDist1;
if (fieldsFlags & 0x10)
m_nDist2 = nDist2;
return pFiler->filerStatus();
}
Acad::ErrorStatus AecXDbSymbSymmetry::dxfOutFields(AcDbDxfFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es = AecXDbEntityBaseEx::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass, _T("AecXDbSymbSymmetry"));
assert(es == Acad::eOk);
pFiler->writePoint2d(AcDb::kDxfXCoord, m_ptStart.AsAcGePoint2d()); //10
pFiler->writePoint2d(AcDb::kDxfXCoord + 1, m_ptEnd.AsAcGePoint2d());
pFiler->writeDouble(AcDb::kDxfReal, m_nTermLen); //40
pFiler->writeDouble(AcDb::kDxfReal + 1, m_nDist1); //41
pFiler->writeDouble(AcDb::kDxfReal + 2, m_nDist2); //42
return pFiler->filerStatus();
}
// -----------------------------------------------------------------------
// Overriden functions for edit
// to do:
// 允许通过夹点改变边界
Acad::ErrorStatus AecXDbSymbSymmetry::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
gripPoints.append(m_ptStart); //0
gripPoints.append(m_ptEnd); //1
ADSGePoint3d pt[3];
double nDir = ads_angle(m_ptStart, m_ptEnd);
ads_polar(m_ptStart, nDir, GetDist1(FALSE), pt[0]);
ads_polar(pt[0], nDir, GetDist2(FALSE), pt[1]);
ads_polar(pt[0], nDir + PI / 2, GetTermLen(FALSE) / 2, pt[2]);
for (int i = 0; i < 3; i++) {
gripPoints.append(pt[i]);
}
return Acad::eOk;
}
// stretch points is diffrent from grep points, with no midpoint included
Acad::ErrorStatus
AecXDbSymbSymmetry::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
AcDbIntArray ar;
return subGetGripPoints(stretchPoints, ar, ar);
}
// Active when being rotated, scaled, moved, etc.
// Scale is disabled here
Acad::ErrorStatus AecXDbSymbSymmetry::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 AecXDbSymbSymmetry::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];
double nDir = ads_angle(m_ptStart, m_ptEnd);
Vector3D vt1(cos(nDir), sin(nDir));
Vector3D vt2(cos(nDir + PI / 2), sin(nDir + PI / 2));
if (idx == 0) { // Move vertex
m_ptStart += vtOffset;
}
else if (idx == 1) {
m_ptEnd += vtOffset;
}
else if (idx == 2) {
double nInc = (vtOffset & vt1);
m_nDist1 += nInc / GetPScale();
if (m_nDist1 < 0.0)
m_nDist1 = 0.0;
}
else if (idx == 3) {
double nInc = (vtOffset & vt1);
m_nDist2 += nInc / GetPScale();
if (m_nDist2 < 0.0)
m_nDist2 = 0.0;
}
else if (idx == 4) {
double nInc = (vtOffset & vt2);
m_nTermLen += 2.0 * nInc / GetPScale();
if (m_nTermLen < 0.0)
m_nTermLen = 0.0;
}
}
return Acad::eOk;
}
// 功能: 夹点操作
Acad::ErrorStatus AecXDbSymbSymmetry::subMoveStretchPointsAt(
const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
AssertWriteEnabled();
// sg add 090219,整体strech后,端线长变大的问题
DualPtrList<int> indices1;
for (long i = 0; i < indices.length(); i++)
indices1.FindOrAddTail(indices[i]);
indices1.Arrange();
AcDbIntArray indices2;
if (indices1.Find(0) > -1 && indices1.Find(1) > -1) // 可认为是整体strech
{
indices2.append(0);
indices2.append(1);
}
else
{
for (i = 0; i < indices1.GetLength(); i++)
{
indices2.append(indices1[i]);
}
}
// return moveGripPointsAt(indices, offset); // sg modify 090219
return subMoveGripPointsAt(indices2, offset);
}
// 取得夹点说明
Acad::ErrorStatus AecXDbSymbSymmetry::GetGripText(int i, CString &cs) const
{
Acad::ErrorStatus es = Acad::eOk;
if (i == 0)
cs = _T("移动端点1");
else if (i == 1)
cs = _T("移动端点2");
else if (i == 2)
cs = _T("更改外间距");
else if (i == 3)
cs = _T("更改内间距");
else if (i == 4)
cs = _T("更改端线长");
return es;
}
Acad::ErrorStatus
AecXDbSymbSymmetry::Draw2d(AcGiDraw &dc) const
{
assertReadEnabled();
GlobalFunc::_LoadConfig();
if (Has2DBuffer() && !dc.IsDragging())
{
dc.SetColor(colorIndex());
dc.SetLayer(layerId());
BaseEx::_Draw2DBuffers(dc, true);
return Acad::eOk;
}
if (!IsValid())
return Acad::eInvalidInput;
AcDbObjectId idLayOld = dc.GetLineTypeId();
//TDbConfig *pConfig = GetDwgGlobal(AcDb::kForRead, database());
//if (pConfig) {
// dc.SetLineType(pConfig->GetLinetypeDote());
// pConfig->close();
//}
dc.SetLineType(GlobalFunc::InitLineType(_T("DOTE"), NULL));
//dc << GeLine(m_ptStart, m_ptEnd);
DrawLine(dc, m_ptStart, m_ptEnd);
dc.SetLineType(idLayOld);
double nDir = ads_angle(m_ptStart, m_ptEnd);
ADSGePoint3d pt[3];
ads_polar(m_ptStart, nDir, GetDist1(FALSE), pt[0]);
ads_polar(pt[0], nDir - PI / 2, GetTermLen(FALSE) / 2, pt[1]);
ads_polar(pt[0], nDir + PI / 2, GetTermLen(FALSE) / 2, pt[2]);
GeLine ln1(pt[1], pt[2]);
//dc << ln1;
//dc << ln1.Offset(GetDist2(FALSE));
DrawLine(dc, ln1);
DrawLine(dc, ln1.Offset(GetDist2(FALSE)));
ads_polar(m_ptEnd, nDir + PI, GetDist1(FALSE), pt[0]);
ads_polar(pt[0], nDir - PI / 2, GetTermLen(FALSE) / 2, pt[1]);
ads_polar(pt[0], nDir + PI / 2, GetTermLen(FALSE) / 2, pt[2]);
GeLine ln2(pt[1], pt[2]);
//dc << ln2;
//dc << ln2.Offset(-GetDist2(FALSE));
DrawLine(dc, ln2);
DrawLine(dc, ln2.Offset(-GetDist2(FALSE)));
return Acad::eOk;
}
const TCHAR *AecXDbSymbSymmetry::GetDefaultLayer() const
{
extern TCHAR* LAY_OTHER_DIM;
return LAY_OTHER_DIM;
}
DrawModeType
AecXDbSymbSymmetry::GetDrawType() const
{
return k2DOnly;
}
/* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */
void AecXDbSymbSymmetry::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("外间距(P)"), TCString(_T("%.1f"), m_nDist1)));
lstInfo.Append(new ObjInfoUnit(_T("内间距(P)"), TCString(_T("%.1f"), m_nDist2)));
lstInfo.Append(new ObjInfoUnit(_T("端线长(P)"), TCString(_T("%.1f"), m_nTermLen)));
}
double AecXDbSymbSymmetry::GetDist1(BOOL bAsPaperUnit) const
{
double val = m_nDist1;
if (!bAsPaperUnit)
val *= GetPScale();
return val;
}
double AecXDbSymbSymmetry::GetDist2(BOOL bAsPaperUnit) const
{
double val = m_nDist2;
if (!bAsPaperUnit)
val *= GetPScale();
return val;
}
double AecXDbSymbSymmetry::GetTermLen(BOOL bAsPaperUnit) const
{
double val = m_nTermLen;
if (!bAsPaperUnit)
val *= GetPScale();
return val;
}
ADSGePoint3d AecXDbSymbSymmetry::GetStartPoint() const
{
return m_ptStart;
}
ADSGePoint3d AecXDbSymbSymmetry::GetEndPoint() const
{
return m_ptEnd;
}
void AecXDbSymbSymmetry::SetDist1(double nDist1, BOOL bAsPaperUnit)
{
AssertWriteEnabled();
m_nDist1 = nDist1;
if (!bAsPaperUnit)
m_nDist1 /= GetPScale();
}
void AecXDbSymbSymmetry::SetDist2(double nDist2, BOOL bAsPaperUnit)
{
AssertWriteEnabled();
m_nDist2 = nDist2;
if (!bAsPaperUnit)
m_nDist2 /= GetPScale();
}
void AecXDbSymbSymmetry::SetTermLen(double nLen, BOOL bAsPaperUnit)
{
AssertWriteEnabled();
m_nTermLen = nLen;
if (!bAsPaperUnit)
m_nTermLen /= GetPScale();
}
void AecXDbSymbSymmetry::SetStartPoint(ADSGePoint3d pt)
{
AssertWriteEnabled();
m_ptStart = pt;
}
void AecXDbSymbSymmetry::SetEndPoint(ADSGePoint3d pt)
{
AssertWriteEnabled();
m_ptEnd = pt;
}
// sg add 110301,支持统一标高
bool AecXDbSymbSymmetry::UnifyElevation(double dElevation)
{
AssertWriteEnabled();
m_ptStart.z = dElevation;
m_ptEnd.z = dElevation;
return true;
}