511 lines
12 KiB
C++
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;
|
|
}
|
|
|