#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 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 &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; }