#include "stdafx.h" const Adesk::UInt8 TDbNetshelf::g_nVersion = 1; ACRX_DXF_DEFINE_MEMBERS(ATSNetshelf, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_NETSHELF, "ATS_NETSHELF图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbNetshelf); static void RemoveAll(DList& lstPoint,const XPoint& ptDest) { for (int i=0; i1.0E-3 && m_dRadiusPole>1.0E-3 && m_lstPole.Length()>0; return bRet; } void TDbNetshelf::SetLayerSphere(AcDbObjectId idLayer) { assertWriteEnabled(); m_idLayerSphere = idLayer; } void TDbNetshelf::SetLayerSphere(CString sLayer) { assertWriteEnabled(); if (sLayer.IsEmpty()) { XString sCurLayer; xg_getvar(_T("CLAYER"), (TCHAR*)sCurLayer); m_idLayerSphere=GetLayerIdFromString((const TCHAR*)sCurLayer); } else { m_idLayerSphere=InitLayer(sLayer,FALSE); } } void TDbNetshelf::SetRadiusSphere(double dRadius) { assertWriteEnabled(); m_dRadiusSphere = dRadius; } void TDbNetshelf::SetRadiusPole(double dRadius) { assertWriteEnabled(); m_dRadiusPole = dRadius; } void TDbNetshelf::SetMonoAdded(BOOL bFlag) { assertWriteEnabled(); m_bMonoAdded = bFlag; } BOOL TDbNetshelf::IsMonoAdded() const { assertReadEnabled(); return m_bMonoAdded; } double TDbNetshelf::GetRadiusSphere() const { assertReadEnabled(); return m_dRadiusSphere; } double TDbNetshelf::GetRadiusPole() const { assertReadEnabled(); return m_dRadiusPole; } AcDbObjectId TDbNetshelf::GetLayerSphere() const { assertReadEnabled(); return m_idLayerSphere; } CString TDbNetshelf::GetSphereLayer() const { assertReadEnabled(); CString sLayer=GetSymbolName(m_idLayerSphere).cs(); return sLayer; } void TDbNetshelf::SetLayer(CString sLayer) { assertWriteEnabled(); if (sLayer.IsEmpty()) { XString sCurLayer; xg_getvar(_T("CLAYER"), (TCHAR*)sCurLayer); AcDbObjectId idLayer= GetLayerIdFromString((const TCHAR*)sCurLayer); setLayer(idLayer); } else { AcDbObjectId idLayer=InitLayer(sLayer,FALSE); setLayer(idLayer); } } CString TDbNetshelf::GetLayer() const { assertReadEnabled(); CString sLayer=GetSymbolName(layerId()).cs(); return sLayer; } BOOL TDbNetshelf::IsExit(const XLine& line) const { assertReadEnabled(); int nCount = m_lstPole.Length(); for (int i=0; i=2) break; } else { XPoint& ptTemp2=lineTemp.EndPoint(); if (ptTemp2 == ptNode) { nNum++; if (nNum>=2) break; } } } if (nNum == 1) { m_lstMono.NewAppend(ptNode); int nCount = m_lstMulti.Length(); for (int i=0; i& lstLine, const BOOL bRemoveSame) { assertWriteEnabled(); m_lstPole.Reset(); m_lstMono.Reset(); m_lstMulti.Reset(); //杆 int nCount = lstLine.Length(); for (int i=0; iflag &&*/ ((line.StartPoint()==m_lstPole[j]->StartPoint() && line.EndPoint()==m_lstPole[j]->EndPoint()) || (line.StartPoint()==m_lstPole[j]->EndPoint() && line.EndPoint()==m_lstPole[j]->StartPoint()))) { m_lstPole.Remove(); j--; } } } } //节点 nCount = m_lstPole.Length(); for (i=0; iStartPoint()); AddNode(m_lstPole[i]->EndPoint()); } } const XPointList& TDbNetshelf::GetMonoNode() const { assertReadEnabled(); return m_lstMono; } const XPointList& TDbNetshelf::GetMultiNode() const { assertReadEnabled(); return m_lstMulti; } const DList& TDbNetshelf::GetPole() const { assertReadEnabled(); return m_lstPole; } // 提供对格式刷的支持 void TDbNetshelf::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbNetshelf *pSrc=TDbNetshelf::cast(pSrcEntity); if(pSrc) { if(database()==NULL|| pSrcEntity->database()==NULL|| database()==pSrcEntity->database())//add by whl on 060317 { m_idLayerSphere=pSrc->m_idLayerSphere; } m_bMonoAdded=pSrc->m_bMonoAdded; m_dRadiusSphere=pSrc->m_dRadiusSphere; m_dRadiusPole=pSrc->m_dRadiusPole; } } Acad::ErrorStatus TDbNetshelf::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 从DWG读入数据: Acad::ErrorStatus TDbNetshelf::dwgInFields (AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es=Acad::eOk; es = TDbEntity::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(&m_idLayerSphere); //网架参数 pFiler->readItem(&m_dRadiusSphere); pFiler->readItem(&m_dRadiusPole); pFiler->readItem(&m_bMonoAdded); Adesk::UInt16 nCount=0; //杆 m_lstPole.Reset(); pFiler->readItem(&nCount); for(Adesk::UInt16 i=0; ireadItem(&(AcGePoint3d &)ptStart); m_lstPole.Append(new XLine(ptStart,XPoint(0,0,0))); } assert(m_lstPole.Length()==nCount); for(i=0; ireadItem(&(AcGePoint3d &)ptEnd); } //单甩节点 m_lstMono.Reset(); pFiler->readItem(&nCount); for(i=0; ireadItem((AcGePoint3d *)pPtTemp); m_lstMono.Append(pPtTemp); } //公用节点 m_lstMulti.Reset(); pFiler->readItem(&nCount); for(i=0; ireadItem((AcGePoint3d *)pPtTemp); m_lstMulti.Append(pPtTemp); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbNetshelf::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = Acad::eOk; //del by xlc on 100416 //R18平台在进行编辑时删除最后一根杆件后返回Acad::eInvalidInput时程序崩溃退出 //低平台在图形导出时崩溃 // if (!IsValid()) // { // return Acad::eInvalidInput; // } es = TDbEntity::dwgOutFields(pFiler); if(es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); //图层 pFiler->writeItem(m_idLayerSphere); //网架参数 pFiler->writeItem(m_dRadiusSphere); pFiler->writeItem(m_dRadiusPole); pFiler->writeItem(m_bMonoAdded); Adesk::UInt16 nCount=0; //杆 nCount = m_lstPole.Length(); pFiler->writeItem(nCount); for(Adesk::UInt16 i=0; iwriteItem((AcGePoint3d &)m_lstPole[i].StartPoint()); } for(i=0; iwriteItem((AcGePoint3d &)m_lstPole[i].EndPoint()); } //单甩节点 nCount = m_lstMono.Length(); pFiler->writeItem(nCount); for(i=0; iwriteItem((AcGePoint3d &)m_lstMono[i]); } //公用节点 nCount = m_lstMulti.Length(); pFiler->writeItem(nCount); for(i=0; iwriteItem((AcGePoint3d &)m_lstMulti[i]); } return pFiler->filerStatus(); } Acad::ErrorStatus TDbNetshelf::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = Acad::eOk; es = TDbEntity::dxfInFields(pFiler); if(es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbNetshelf"))) { return Acad::eBadDxfSequence; } m_lstPole.Reset(); m_lstMono.Reset(); m_lstMulti.Reset(); resbuf rb; DList lstStart; DList lstEnd; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfHardPointerId+0: acdbGetObjectId(m_idLayerSphere,rb.resval.rlname); break; case AcDb::kDxfXReal+0: m_dRadiusSphere=rb.resval.rreal; break; case AcDb::kDxfXReal+1: m_dRadiusPole=rb.resval.rreal; break; case AcDb::kDxfBool+0: m_bMonoAdded=rb.resval.rint; break; case AcDb::kDxfXCoord+0: lstStart.Append(new XPoint(rb.resval.rpoint)); break; case AcDb::kDxfXCoord+1: lstEnd.Append(new XPoint(rb.resval.rpoint)); break; case AcDb::kDxfXCoord+2: m_lstMono.Append(new XPoint(rb.resval.rpoint)); break; case AcDb::kDxfXCoord+3: m_lstMulti.Append(new XPoint(rb.resval.rpoint)); break; default: pFiler->pushBackItem(); es = Acad::eEndOfFile; break; } } if (es != Acad::eEndOfFile) return Acad::eInvalidResBuf; int nCount = lstStart.Length(); if(nCount<=0 || nCount!=lstEnd.Length()) { pFiler->setError(_T("\nError DXF group code: 10, 11")); return Acad::eMissingDxfField; } for (int i=0; ifilerStatus(); } Acad::ErrorStatus TDbNetshelf::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = Acad::eOk; if (!IsValid()) return Acad::eInvalidInput; es = TDbEntity::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbNetshelf")); assert(es == Acad::eOk); //图层 pFiler->writeObjectId(AcDb::kDxfHardPointerId+0,m_idLayerSphere); //网架参数 pFiler->writeDouble(AcDb::kDxfXReal+0,m_dRadiusSphere); pFiler->writeDouble(AcDb::kDxfXReal+1,m_dRadiusPole); pFiler->writeBoolean(AcDb::kDxfBool+0,m_bMonoAdded); //杆 int nCount = m_lstPole.Length(); for(int i=0; iwritePoint3d(AcDb::kDxfXCoord+0,m_lstPole[i].StartPoint()); } for(i=0; iwritePoint3d(AcDb::kDxfXCoord+1,m_lstPole[i].EndPoint()); } //单甩节点 nCount = m_lstMono.Length(); for(i=0; iwritePoint3d(AcDb::kDxfXCoord+2,m_lstMono[i]); } //公用节点 nCount = m_lstMulti.Length(); for(i=0; iwritePoint3d(AcDb::kDxfXCoord+3,m_lstMulti[i]); } assert(es == Acad::eOk); return pFiler->filerStatus(); } Acad::ErrorStatus TDbNetshelf::subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& ptPick, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { assertReadEnabled(); if( osnapMode==AcDb::kOsModeCen || osnapMode==AcDb::kOsModeNode ) { int nCount = m_lstMulti.Length(); for (int i=0; i=0 && idx=nMono && idx=0 && idx=nMono && idx1) { m_lstMono.Remove(); //此处不真正删除点,只是将单节点给双节点链表 int nOldDelFlag = m_lstMono.GetDelFlag(); XPoint& ptMove = *m_lstMono[nPrevious]; m_lstMono.SetDelFlag(0); m_lstMono.Remove(nPrevious); m_lstMulti.Append(&ptMove); m_lstMono.SetDelFlag(nOldDelFlag); break; } nPrevious=i; } } } } else if (IsMultiNode(ptDest)) {//公用节点 int nCount = m_lstMulti.Length(); for (int nNum=0,i=0; i1) { m_lstMulti.Remove(); break; } } } } } Acad::ErrorStatus TDbNetshelf::MovePoleGripPoints(const XPoint& ptDest, const AcGeVector3d& offset) { int nCount = m_lstPole.Length(); for (int i=0; i &lstInfo) const { assertReadEnabled(); lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("网架"))); } void InitDbNetshelf(BOOL bTrue) { if(bTrue) { TDbNetshelf::rxInit(); acrxBuildClassHierarchy(); TDbNetshelf::InitMatchProtocol(TRUE); } else { TDbNetshelf::InitMatchProtocol(FALSE); deleteAcRxClass(TDbNetshelf::desc()); } }