#include "stdafx.h" #include "StdArx.h" #include "TEImpCabReducer.h" #include "TDbInterfaceRecord.h" #include "TDbXDataMap.h" #include "TDbInterfaceMsgWrite.h" #include "math.h" #include "dbray.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif TEImpCabReducer::TEImpCabReducer() { } TEImpCabReducer::~TEImpCabReducer() { } Adesk::Boolean acedPostCommand( const TCHAR * ); // 接口描述对象 BOOL TEImpCabReducer::GetInterface(int nIndex,TInterface& pipeInterface) const { if (m_pXDataMap != NULL) { AcGePoint3d ptSta,ptEnd,ptGeM; AcDbObjectId id1,id2; int nType = 0; m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); m_pXDataMap->GetAt(KEY_REDUCER,nType); ptGeM = TSupportFunc::Mid(ptSta,ptEnd); AcGeVector3d vtDir = ptSta - ptGeM; AcGeVector3d vtDir2 = ptEnd - ptGeM; if (nType == TDb::eRbotHorOffsetDifR || nType == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtDir); vtDir *= -1; // 2012/6/14 wzh 支持非桥架中心线偏移变径联动 vtDir2 = -vtDir; } switch(nIndex) { case 0: { if (m_pXDataMap->GetAt(KEY_IDCNT1,id1)) { if (MakesureInterfaceValidate(id1,ptSta,vtDir,pipeInterface)) { return TRUE; } } if (m_pXDataMap->GetAt(KEY_IDCNT2,id2)) { if (MakesureInterfaceValidate(id2,ptSta,vtDir,pipeInterface)) { return TRUE; } } pipeInterface.SetOutDir(vtDir); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptSta); return TRUE; break; } case 1: { if (m_pXDataMap->GetAt(KEY_IDCNT1,id1)) { if (MakesureInterfaceValidate(id1,ptEnd,vtDir2,pipeInterface)) { return TRUE; } } if (m_pXDataMap->GetAt(KEY_IDCNT2,id2)) { if (MakesureInterfaceValidate(id2,ptEnd,vtDir2,pipeInterface)) { return TRUE; } } pipeInterface.SetOutDir(vtDir2); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptEnd); return TRUE; break; } default: break; } } return FALSE; } BOOL TEImpCabReducer::GetInterface(const AcGePoint3d& ptCon,TInterface& pipeInterface) const { AcGePoint3d ptSta,ptEnd,ptGeM; AcGeVector3d vtDir; if (m_pXDataMap != NULL) { int nType = 0; m_pXDataMap->GetAt(KEY_REDUCER,nType); m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); ptGeM = TSupportFunc::Mid(ptSta,ptEnd); double dDis1 = ptCon.distanceTo(ptSta); double dDis2 = ptCon.distanceTo(ptEnd); if (dDis1 < 1.e-3 || dDis2 < 1.e-3) { //判断点是否在接口对象上 AcGeVector3d vtDir = ptCon - ptGeM; if (nType == TDb::eRbotHorOffsetDifR || nType == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtDir); } AcDbObjectId id1,id2; BOOL bSuc = FALSE; if (m_pXDataMap->GetAt(KEY_IDCNT1,id1)) { bSuc = MakesureInterfaceValidate(id1,ptCon,vtDir,pipeInterface); if (!bSuc) { if (m_pXDataMap->GetAt(KEY_IDCNT2,id2)) { bSuc = MakesureInterfaceValidate(id2,ptCon,vtDir,pipeInterface); } } return bSuc; } if (m_pXDataMap->GetAt(KEY_IDCNT2,id2)) { bSuc = MakesureInterfaceValidate(id2,ptCon,vtDir,pipeInterface); if (!bSuc) { if (m_pXDataMap->GetAt(KEY_IDCNT1,id1)) { bSuc = MakesureInterfaceValidate(id1,ptCon,vtDir,pipeInterface); } } return bSuc; } if (dDis1 < 1.e-3) { vtDir = ptSta - ptGeM; pipeInterface.SetOutDir(vtDir); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptSta); } if (dDis2 < 1.e-3) { vtDir = ptEnd - ptGeM; pipeInterface.SetOutDir(vtDir); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptEnd); } return TRUE; } } return FALSE; } BOOL TEImpCabReducer::HasInterface(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir) { AcGePoint3d ptSta,ptEnd,ptGeM; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); double dDis1 = ptCon.distanceTo(ptSta); double dDis2 = ptCon.distanceTo(ptEnd); ptGeM = TSupportFunc::Mid(ptSta,ptEnd); if (dDis1 < 1.e-3 || dDis2 < 1.e-3) { AcGeVector3d vtT = ptCon - ptGeM; int nReducerStyle = 0; m_pXDataMap->GetAt(KEY_REDUCER,nReducerStyle); if (nReducerStyle == TDb::eRbotHorOffsetDifR || nReducerStyle == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtT); } if (vtT.isParallelTo(vtDir)) { return TRUE; } } } return FALSE; } int TEImpCabReducer::GetInterfaceCount() const { return 2; } BOOL TEImpCabReducer::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { if ( !idConnect.isValid()) return FALSE; BOOL bSuccess = FALSE; if (m_pXDataMap != NULL) { AcGePoint3d ptSta,ptEnd,ptGeM; int nStyle = 0; m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); m_pXDataMap->GetAt(KEY_REDUCER,nStyle); ptGeM = TSupportFunc::Mid(ptSta,ptEnd); double dDis1 = ptConnect.distanceTo(ptSta); double dDis2 = ptConnect.distanceTo(ptEnd); if (dDis1 < 1.e-3 || dDis2 < 1.e-3) { AcGeVector3d vtT = ptConnect - ptGeM; if (nStyle == TDb::eRbotHorOffsetDifR || nStyle == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtT); } AcDbEntity* pEnt = NULL; if (Acad::eOk == acdbOpenAcDbEntity(pEnt,idConnect,AcDb::kForRead)) { TDbPipeBase* pPipe = TDbPipeBase::cast(pEnt); if (pPipe != NULL) { if (pPipe->HasInterface(ptConnect,vtT)) { if (dDis1 < 1.e-3) m_pXDataMap->SetAt(KEY_IDCNT1,idConnect); if (dDis2 < 1.e-3) m_pXDataMap->SetAt(KEY_IDCNT2,idConnect); bSuccess = TRUE; } } TDbFittingBase* pFitting = TDbFittingBase::cast(pEnt); if (pFitting != NULL) { if (pFitting->HasInterface(ptConnect,vtT)) { if (dDis1 < 1.e-3) m_pXDataMap->SetAt(KEY_IDCNT1,idConnect); if (dDis2 < 1.e-3) m_pXDataMap->SetAt(KEY_IDCNT2,idConnect); bSuccess = TRUE; } } pEnt->close(); } } } return bSuccess; } BOOL TEImpCabReducer::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { //浅层次删除; 命名字典中的关系,需要外面移除关系,只移除内部关系 AcDbObjectId id1,id2; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_IDCNT1,id1); m_pXDataMap->GetAt(KEY_IDCNT2,id2); AcDbObjectId idNull; BOOL bRemoved = FALSE; if (id1 == idConnect) { m_pXDataMap->SetAt(KEY_IDCNT1,idNull); bRemoved = TRUE; } if (id2 == idConnect) { m_pXDataMap->SetAt(KEY_IDCNT2,idNull); bRemoved = TRUE; } return bRemoved; } return FALSE; } BOOL TEImpCabReducer::NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { BOOL bMsgTranslate = FALSE; //接口更改通知 TDb::InterfaceOper eOper = iModiMsg.GetInterfaceOper(); switch(eOper) { case TDb::eMoveGripPoint: { bMsgTranslate = OnMoveGripPointMsgNotify(iModiMsg,iModiMsgs); break; } case TDb::eTransformBy: { bMsgTranslate = OnTransformByMsgNotify(iModiMsg,iModiMsgs); break; } case TDb::eSize: { bMsgTranslate = OnSizeMsgNotify(iModiMsg,iModiMsgs); break; } default: break; } if (m_pOwnerEnt != NULL) m_pOwnerEnt->recordGraphicsModified(); return bMsgTranslate; } Acad::ErrorStatus TEImpCabReducer::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { if (m_pXDataMap != NULL) { int nType = 0; m_pXDataMap->GetAt(KEY_REDUCER,nType); switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: case TDb::eRbotHorNormalDifR: // 槽式下平普通异径接头 { OnBottomHorDifRMoveGripPointsAt(indices,offset); } break; default: break; } } return Acad::eOk; } Acad::ErrorStatus TEImpCabReducer::OnBottomHorDifRMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset) { int nSize = indices.length(); if (nSize > 0) { AcGePoint3d ptGeS,ptGeM,ptGeE; int nStyle = 0; m_pXDataMap->GetAt(KEY_REDUCER,nStyle); m_pXDataMap->GetAt(KEY_START,ptGeS); m_pXDataMap->GetAt(KEY_END,ptGeE); ptGeM = TSupportFunc::Mid(ptGeS, ptGeE); AcGePoint3d ptGeSOld = ptGeS; AcGePoint3d ptGeMOld = ptGeM; AcGePoint3d ptGeEOld = ptGeE; AcGeVector3d vtDir = ptGeS - ptGeE; if (nStyle == TDb::eRbotHorOffsetDifR || nStyle == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtDir); } // 选择多个夹点,以first为准 int nIndex = indices.first(); TDb::Position ePos = ExplainGripIndex(nIndex); switch(ePos) { case TDb::eBr1: { // 修改原因: 对于非正交的移动会使连接的桥架做错误图形变化 // 修改人 : tsj // 修改时间:2009.11.24 //平行,或垂直按moveGrip 接口消息逻辑 //非平行,按transform 接口消息逻辑 // TDb::InterfaceOper eOper = TDb::eMoveGripPoint; // AcGeVector3d vtIntf = ptGeS - ptGeM; // int nStyle = 0; // m_pXDataMap->GetAt(KEY_REDUCER,nStyle); // if (nStyle == TDb::eRbotHorOffsetDifR || // nStyle == TDb::eRbotHorOffsetDifR2) // { // m_pXDataMap->GetAt(KEY_MAINDIR,vtIntf); // } // AcGeVector3d vtMove = offset; // if (vtIntf.isParallelTo(offset))//平行 // { // } // else if (vtIntf.isPerpendicularTo(offset))//垂直 // { // } // else // { // eOper = TDb::eTransformBy; // } ptGeE += offset; ptGeS += offset; m_pXDataMap->SetAt(KEY_END,ptGeE); m_pXDataMap->SetAt(KEY_START,ptGeS); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { // 写入接口更改消息 if (vtDir.isParallelTo(offset) || vtDir.isPerpendicularTo(offset)) { TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptGeEOld);//new pos iMsg.SetGripPosition(TDb::eBr1); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); } //更新接口记录接口信息 AcGeMatrix3d xform; xform.setToTranslation(offset); UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); } } break; case TDb::eMid: { // 修改原因: 对于非正交的移动会使连接的桥架做错误图形变化 // 修改人 : tsj // 修改时间:2009.11.24 if (offset.isZeroLength()) return Acad::eOk; ptGeE += offset; ptGeS += offset; m_pXDataMap->SetAt(KEY_END,ptGeE); m_pXDataMap->SetAt(KEY_START,ptGeS); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { if (vtDir.isParallelTo(offset) || vtDir.isPerpendicularTo(offset)) { // 写入接口更改消息 TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptGeMOld);//new pos iMsg.SetGripPosition(TDb::eMid); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); } //更新接口记录接口信息 AcGeMatrix3d xform; xform.setToTranslation(offset); UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); } } break; case TDb::eBr2: { // 修改原因: 对于非正交的移动会使连接的桥架做错误图形变化 // 修改人 : tsj // 修改时间:2009.11.24 //平行,或垂直按moveGrip 接口消息逻辑 //非平行,按transform 接口消息逻辑 // TDb::InterfaceOper eOper = TDb::eMoveGripPoint; // AcGeVector3d vtIntf = ptGeE - ptGeM; // int nStyle = 0; // m_pXDataMap->GetAt(KEY_REDUCER,nStyle); // if (nStyle == TDb::eRbotHorOffsetDifR || // nStyle == TDb::eRbotHorOffsetDifR2) // { // m_pXDataMap->GetAt(KEY_MAINDIR,vtIntf); // } // AcGeVector3d vtMove = offset; // if (vtIntf.isParallelTo(offset))//平行 // { // } // else if (vtIntf.isPerpendicularTo(offset))//垂直 // { // } // else // { // eOper = TDb::eTransformBy; // } ptGeE += offset; ptGeS += offset; m_pXDataMap->SetAt(KEY_END,ptGeE); m_pXDataMap->SetAt(KEY_START,ptGeS); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { if (vtDir.isParallelTo(offset) || vtDir.isPerpendicularTo(offset)) { // 写入接口更改消息 TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptGeEOld);//new pos iMsg.SetGripPosition(TDb::eBr2); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); } //更新接口记录接口信息 AcGeMatrix3d xform; xform.setToTranslation(offset); UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); } } break; case TDb::eCommand0: { // 写入接口更改消息 double dH = 0.0,dB = 0.0; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_H1,dH); m_pXDataMap->GetAt(KEY_B1,dB); } TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptGeS);//new pos iMsg.SetGripPosition(TDb::eCommand0); iMsg.SetMoveGripOffset(vtDir); iMsg.SetMsgValidate(TRUE); iMsg.SetSize(dB,dH); iMsg.SetInterfaceOper(TDb::eNewCommand); iMsg.SetPreviewObjToCreate(TDb::eReduce,TDb::eRbotHorOffsetDifR); AcDbSoftPointerId idOwner; m_pXDataMap->GetAt(KEY_THISID,idOwner); iMsg.SetMsgOperateOn(idOwner); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); acedPostCommand(_T("\33")); CString sCmd; GetGlobalContext(KEY_CABGRIPCMD,sCmd); if (!sCmd.IsEmpty()) { sCmd += _T("\n"); acedPostCommand(sCmd); } } break; case TDb::eCommand1: { // 写入接口更改消息 double dH = 0.0,dB = 0.0; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_H2,dH); m_pXDataMap->GetAt(KEY_B2,dB); } TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptGeE);//new pos iMsg.SetGripPosition(TDb::eCommand0); iMsg.SetMoveGripOffset(vtDir); iMsg.SetMsgValidate(TRUE); iMsg.SetSize(dB,dH); iMsg.SetInterfaceOper(TDb::eNewCommand); iMsg.SetPreviewObjToCreate(TDb::eReduce,TDb::eRbotHorOffsetDifR); AcDbSoftPointerId idOwner; m_pXDataMap->GetAt(KEY_THISID,idOwner); iMsg.SetMsgOperateOn(idOwner); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); acedPostCommand(_T("\33")); CString sCmd; GetGlobalContext(KEY_CABGRIPCMD,sCmd); if (!sCmd.IsEmpty()) { sCmd += _T("\n"); acedPostCommand(sCmd); } } break; default: break; } } return Acad::eOk; } TDb::Position TEImpCabReducer::ExplainGripIndex(int nIndex) const { TDb::Position ePos = TDb::eBr1; switch(nIndex) { case 0: { ePos = TDb::eBr1; break; } case 1: { ePos = TDb::eMid; break; } case 2: { ePos = TDb::eBr2; break; } case 3: { ePos = TDb::eCommand0; break; } case 4: { ePos = TDb::eCommand1; break; } default: break; } return ePos; } void TEImpCabReducer::GetKindName(CString& sName) { sName = _T("TCH_EREDUCER"); } Acad::ErrorStatus TEImpCabReducer::transformBy(const AcGeMatrix3d& xform) { AcGePoint3d ptSta,ptEnd; AcGeVector3d vtOffSet, vtReducer,vtClap; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); m_pXDataMap->GetAt(KEY_BRDIR,vtOffSet); m_pXDataMap->GetAt(KEY_MAINDIR,vtReducer); m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtClap); ptSta.transformBy(xform); ptEnd.transformBy(xform); vtOffSet.transformBy(xform); vtReducer.transformBy(xform); vtClap.transformBy(xform); m_pXDataMap->SetAt(KEY_START,ptSta); m_pXDataMap->SetAt(KEY_END,ptEnd); m_pXDataMap->SetAt(KEY_BRDIR,vtOffSet); m_pXDataMap->SetAt(KEY_MAINDIR,vtReducer); m_pXDataMap->SetAt(KEY_CLAPBOARD_MAINBR,vtClap); if (m_pOwnerEnt->objectId().isValid()) { // 写入接口更改消息 TInterfaceModifyMsg iMsg; iMsg.SetInterfaceOper(TDb::eTransformBy); iMsg.SetMsgValidate(TRUE); iMsg.SetTransform(xform); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); //更新接口记录接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); } } return Acad::eOk; } Acad::ErrorStatus TEImpCabReducer::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { if (m_pXDataMap != NULL) { AcGePoint3d ptGeS,ptGeE,ptGeM; int nType = 0; AcGeVector3d vtNormal; if ( m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_REDUCER,nType) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) ) { AcGeVector3d vtTemp = ptGeE - ptGeS; switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 { /************************************************************************/ /* 0 6 + | \ 1 2 | +------+ ptGeS | |ptGeE | | | +------+3 | / 4 5 + /************************************************************************/ ptGeM = TSupportFunc::Mid(ptGeS, ptGeE); } break; case TDb::eRbotHorNormalDifR: { /************************************************************************/ /* 0 ptGeS 4 + | \ | \1 dWidthL | | dWidthS ptGeS | /2 ptGeE | / 3 + /************************************************************************/ ptGeM = TSupportFunc::Mid(ptGeS, ptGeE); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: { // 槽式下平右偏异径接头 /************************************************************************/ /* 0 ptGeS 1 ptGeE 6 +-----------------+ | | dWidthS | | dWidthL | +-----+2 | /3 dLen2 | / 5 +--------+4 dLen1 /************************************************************************/ m_pXDataMap->GetAt(KEY_MAINDIR,vtTemp); ptGeM = TSupportFunc::Mid(ptGeS, ptGeE); // 槽式下平左偏异径接头 /************************************************************************/ /* 0 dLen1 1 6 +-----------+ | \ dWidthL | \ 2 dLen2 3 | +---------+ | | dWidthS ptGeS | | 5 +------------------------+4 ptGeE /************************************************************************/ } break; default: break; } //传统夹点 gripPoints.append(ptGeS); //STA gripPoints.append(ptGeM); //MID gripPoints.append(ptGeE); //END //增加2个命令夹点 AcGePoint3d ptGeT; vtTemp.normalize(); //按 10 个像素点 double dCmd = TSupportFunc::PixelToWcs(10); ptGeT = ptGeS + vtTemp * dCmd; gripPoints.append(ptGeT); //cmd1 ptGeT = ptGeE - vtTemp * dCmd; gripPoints.append(ptGeT); //cmd2 } } return Acad::eOk; } BOOL TEImpCabReducer::OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { BOOL bMsgTranslate = FALSE; AcDbObjectId id = iModiMsg.GetMsgOperateOn(); if (id == m_pOwnerEnt->objectId()) // 消息发送目标正确 { AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset(); if (vtOffset.isZeroLength()) return FALSE; int nType = 0; AcGePoint3d ptGeS,ptGeE,ptGeM; m_pXDataMap->GetAt(KEY_START,ptGeS); m_pXDataMap->GetAt(KEY_END,ptGeE); m_pXDataMap->GetAt(KEY_REDUCER,nType); ptGeM = TSupportFunc::Mid(ptGeS,ptGeE); AcGeVector3d vtSta = ptGeS - ptGeM; AcGeVector3d vtEnd = ptGeE - ptGeM; if (nType == TDb::eRbotHorOffsetDifR || nType == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtSta); vtEnd = -vtSta; } AcGePoint3d ptGeSOld = ptGeS; AcGePoint3d ptGeEOld = ptGeE; int nPos = iModiMsg.GetGripPosition(); switch (nPos) { case TDb::eStart: case TDb::eEnd: case TDb::eBr1: case TDb::eBr2: case TDb::eBr3: case TDb::eBr4: case TDb::eMid: { if ( vtOffset.isParallelTo(vtSta) || vtOffset.isPerpendicularTo(vtSta)) //平行或者垂直 { ptGeS += vtOffset; ptGeE += vtOffset; m_pXDataMap->SetAt(KEY_START,ptGeS); m_pXDataMap->SetAt(KEY_END,ptGeE); AcDbObjectId id1,id2; m_pXDataMap->GetAt(KEY_IDCNT1,id1); m_pXDataMap->GetAt(KEY_IDCNT2,id2); // 构造接口消息传递 开始端检查 AcDbObjectId idT; if (FindConnect(ptGeSOld,vtSta,m_pOwnerEnt->objectId(),idT)) // sta 点的接口 { if ((idT == id1 || idT == id2) && !idT.isNull()) { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeSOld); msg.SetTransform(vtOffset); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } } // 构造接口消息传递 末端检查 if (FindConnect(ptGeEOld,vtEnd,m_pOwnerEnt->objectId(),idT)) // end 点的接口 { if ((idT == id1 || idT == id2) && !idT.isNull()) { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeEOld); msg.SetTransform(vtOffset); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } } // 更新模型空间的扩展字典的注册的接口数据 AcGeMatrix3d xform; xform.setToTranslation(vtOffset); UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); return bMsgTranslate; } else // 倾斜,不传递消息,只改变自身 { ptGeS += vtOffset; ptGeE += vtOffset; m_pXDataMap->SetAt(KEY_START,ptGeS); m_pXDataMap->SetAt(KEY_END,ptGeE); // 更新模型空间的扩展字典的注册的接口数据 AcGeMatrix3d xform; xform.setToTranslation(vtOffset); UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); return FALSE; } break; } default: break; } } return bMsgTranslate; } BOOL TEImpCabReducer::OnTransformByMsgNotify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { // 不考虑其所属的接口的关系,变化后相当于断开关系 // 新位置的关系建立,由外部管理对象处理; AcGePoint3d ptSta,ptEnd,ptGeM; BOOL bMsgTranslate = FALSE; if (m_pXDataMap != NULL) { AcGeMatrix3d xform = iModiMsg.GetTransform(); m_pXDataMap->GetAt(KEY_START,ptSta); m_pXDataMap->GetAt(KEY_END,ptEnd); AcGePoint3d ptGeSOld = ptSta; AcGePoint3d ptGeEOld = ptEnd; ptGeM = TSupportFunc::Mid(ptSta,ptEnd); AcGeVector3d vtSta = ptSta - ptGeM; AcGeVector3d vtEnd = ptEnd - ptGeM; int nReducerStyle = 0; m_pXDataMap->GetAt(KEY_REDUCER,nReducerStyle); if (nReducerStyle == TDb::eRbotHorOffsetDifR || nReducerStyle == TDb::eRbotHorOffsetDifR2) { m_pXDataMap->GetAt(KEY_MAINDIR,vtSta); vtEnd = -vtSta; } ptSta.transformBy(xform); ptEnd.transformBy(xform); m_pXDataMap->SetAt(KEY_START,ptSta); m_pXDataMap->SetAt(KEY_END,ptEnd); //产生新的接口消息 AcDbObjectId id1,id2; m_pXDataMap->GetAt(KEY_IDCNT1,id1); m_pXDataMap->GetAt(KEY_IDCNT2,id2); // 构造接口消息传递 开始端检查 AcDbObjectId idT; if (FindConnect(ptGeSOld,vtSta,m_pOwnerEnt->objectId(),idT)) // sta 点的接口 { if (idT == id1 || idT == id2) { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeSOld); msg.SetTransform(xform); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } } // 构造接口消息传递 末端检查 if (FindConnect(ptGeEOld,vtEnd,m_pOwnerEnt->objectId(),idT)) // end 点的接口 { if (idT == id1 || idT == id2) { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeEOld); msg.SetTransform(xform); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } } if (m_pOwnerEnt->objectId().isValid()) { //更新接口记录接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(),xform); } } return bMsgTranslate; } BOOL TEImpCabReducer::OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { //尺寸更改涉及到相关接口的更改 return FALSE; } Acad::ErrorStatus TEImpCabReducer::ExplodeOrDraw3d(XExplodeDraw &mode) const { Acad::ErrorStatus errorState = Acad::eOk; if (m_pXDataMap == NULL) return Acad::eNotImplementedYet; int nStyle = eC; m_pXDataMap->GetAt(KEY_STYLE,nStyle); switch (nStyle) { case TDb::eP:// 盘式桥架 { errorState = ExplodeOrDraw3dOfP(mode); break; } case TDb::eC:// 槽式桥架 { errorState = ExplodeOrDraw3dOfC(mode); break; } case TDb::eT:// 梯式桥架 { errorState = ExplodeOrDraw3dOfT(mode); break; } default: break; } return errorState; } Acad::ErrorStatus TEImpCabReducer::ExplodeOrDraw3dOfC(XExplodeDraw &mode) const { if (m_pXDataMap != NULL) { int nType = 0; if (m_pXDataMap->GetAt(KEY_REDUCER,nType)) { switch(nType) { case TDb::eRbotHorDifR: { ExplodeOrDraw3dDifR(mode); } break; case TDb::eRbotHorNormalDifR: { ExplodeOrDraw3dNorDifR(mode); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: { ExplodeOrDraw3dOffDifR(mode); } break; default: break; } } } return Acad::eOk; } Acad::ErrorStatus TEImpCabReducer::ExplodeOrDraw3dOfT(XExplodeDraw &mode) const { if (m_pXDataMap != NULL) { int nType = 0; if (m_pXDataMap->GetAt(KEY_REDUCER,nType)) { switch(nType) { case TDb::eRbotHorDifR: { //ExplodeOrDraw3dDifROfT(mode); } break; case TDb::eRbotHorNormalDifR: { ExplodeOrDraw3dNorDifROfT(mode); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: { ExplodeOrDraw3dOffDifROfT(mode); } break; default: break; } } } return Acad::eOk; } BOOL TEImpCabReducer::ExplodeOrDraw3dOffDifROfT(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return FALSE; double dLadderWidth = 50; //梯宽 double dSideWidth = 30; //侧面宽 double dThick = 10; //梯厚度 AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal; double dLen = 0.0; double dWidth = 0.0,dWidth2 = 0.0; double dHeight = 0.0,dHeight2 = 0.0;// 长高度 if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal)) { double dLen1 = dLen / 3.0; double dLen2 = dLen1; double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; AcGeVector3d vtRed,vtOff; if (m_pXDataMap->GetAt(KEY_MAINDIR,vtRed) && m_pXDataMap->GetAt(KEY_BRDIR,vtOff) ) { nRows = 4; vtRed.normalize(); vtOff.normalize(); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtNormal = vtOff; vtNormal.rotateBy(dAngle,vtRed); vtNormal.normalize(); } nColums = 4; lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS - vtOff * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; lstVertex[5] = ptTemp + vtRed * dLen1; lstVertex[1] = lstVertex[5] + vtNormal * dHeight; ptTemp = ptGeS + vtOff * (dWidth / 2.0); lstVertex[8] = ptTemp; lstVertex[12] = ptTemp + vtNormal * dHeight; lstVertex[9] = ptTemp + vtRed * dLen1; lstVertex[13] = lstVertex[9] + vtNormal * dHeight; ptTemp = ptGeE - vtOff * (dWidth2 / 2.0); lstVertex[7] = ptTemp; lstVertex[3] = ptTemp + vtNormal * dHeight2; lstVertex[6] = ptTemp - vtRed * dLen2; lstVertex[10] = lstVertex[6] + vtOff * dWidth2; lstVertex[2] = lstVertex[3] - vtRed * dLen2; ptTemp = ptGeE + vtOff * (dWidth2 / 2.0); lstVertex[11] = ptTemp; lstVertex[15] = ptTemp + vtNormal * dHeight2; lstVertex[14] = lstVertex[15] - vtRed * dLen2; Adesk::UInt16 curColor = m_pOwnerEnt->colorIndex(); mode.SetColor(curColor); AcGePoint3dArray arPt; arPt.append(lstVertex[0]); arPt.append(lstVertex[1]); arPt.append(lstVertex[4]); arPt.append(lstVertex[5]); DrawCube(mode, -vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[1]); arPt.append(lstVertex[2]); arPt.append(lstVertex[5]); arPt.append(lstVertex[6]); DrawCube(mode, -vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[2]); arPt.append(lstVertex[3]); arPt.append(lstVertex[6]); arPt.append(lstVertex[7]); DrawCube(mode, -vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[12]); arPt.append(lstVertex[13]); arPt.append(lstVertex[8]); arPt.append(lstVertex[9]); DrawCube(mode, vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[13]); arPt.append(lstVertex[14]); arPt.append(lstVertex[9]); arPt.append(lstVertex[10]); DrawCube(mode, vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[14]); arPt.append(lstVertex[15]); arPt.append(lstVertex[10]); arPt.append(lstVertex[11]); DrawCube(mode, vtOff, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[6]); arPt.append(lstVertex[10]); arPt.append(lstVertex[6] + vtRed * dLadderWidth); arPt.append(lstVertex[10] + vtRed * dLadderWidth); DrawCube(mode, vtNormal, arPt, dThick); arPt.setLogicalLength(0); arPt.append(lstVertex[5]); arPt.append(lstVertex[9]); arPt.append(lstVertex[5] - vtRed * dLadderWidth); arPt.append(lstVertex[9] - vtRed * dLadderWidth); DrawCube(mode, vtNormal, arPt, dThick); delete []lstVertex; lstVertex = NULL; } } return TRUE; } void TEImpCabReducer::DrawCube(XExplodeDraw &mode,const AcGeVector3d &vtDir, const AcGePoint3dArray &ptArr, double dThick) const { if (ptArr.length() == 4) { AcGePoint3d *pVerList1 = new AcGePoint3d[10]; int nRow = 0; int nCol = 0; if (pVerList1 != NULL) { nRow = 5; nCol = 2; pVerList1[0] = ptArr[0]; pVerList1[1] = ptArr[1]; pVerList1[2] = ptArr[2]; pVerList1[3] = ptArr[3]; pVerList1[4] = ptArr[2] + vtDir * dThick; pVerList1[5] = ptArr[3] + vtDir * dThick; pVerList1[6] = ptArr[0] + vtDir * dThick; pVerList1[7] = ptArr[1] + vtDir * dThick; pVerList1[8] = ptArr[0]; pVerList1[9] = ptArr[1]; mode.DrawMesh(nRow, nCol, pVerList1,NULL); AcGePoint3d *pVerList2 = new AcGePoint3d[4]; if (pVerList2 != NULL) { nRow = 2; nCol = 2; pVerList2[0] = pVerList1[1]; pVerList2[1] = pVerList1[3]; pVerList2[2] = pVerList1[7]; pVerList2[3] = pVerList1[5]; mode.DrawMesh(nRow, nCol, pVerList2,NULL); pVerList2[0] = pVerList1[0]; pVerList2[1] = pVerList1[2]; pVerList2[2] = pVerList1[6]; pVerList2[3] = pVerList1[4]; mode.DrawMesh(nRow, nCol, pVerList2,NULL); delete []pVerList2; pVerList2 = NULL; } delete []pVerList1; pVerList1 = NULL; } } } Acad::ErrorStatus TEImpCabReducer::ExplodeOrDraw3dOfP(XExplodeDraw &mode) const { return ExplodeOrDraw3dOfC(mode); } // 槽式下平异径3d BOOL TEImpCabReducer::ExplodeOrDraw3dDifR(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return FALSE; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal,vtDir; double dHeight2 = 0.0;// 长高度 int nCover = 0; double dHeight = 0.0,dWidth = 0.0,dWidth2 = 0.0,dLen = 0.0; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && // 确定变径点 m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { dLen /= 2.0; double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; if (nCover) { nRows = 5; } else { nRows = 4; } nColums = 3; AcGeVector3d vtH = vtDir; AcGeVector3d vtV = vtH; vtV.rotateBy(dAngle,vtNormal); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtH = ptGeE - ptGeS; vtV = vtDir; vtNormal = vtDir; vtNormal.rotateBy(dAngle, vtH); vtNormal.normalize(); } vtV.normalize(); vtH.normalize(); lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS + vtV * (dWidth / 2.0); lstVertex[3] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; lstVertex[4] = ptTemp + vtH * dLen; ptTemp = ptGeS - vtV * (dWidth / 2.0); lstVertex[6] = ptTemp; lstVertex[9] = ptTemp + vtNormal * dHeight; lstVertex[7] = ptTemp + vtH * dLen; ptTemp = ptGeE + vtV * (dWidth2 / 2.0); lstVertex[5] = ptTemp; lstVertex[2] = ptTemp + vtNormal * dHeight2; ptTemp = ptGeE - vtV * (dWidth2 / 2.0); lstVertex[8] = ptTemp; lstVertex[11] = ptTemp + vtNormal * dHeight2; if (dWidth > dWidth2) { lstVertex[4] = lstVertex[5] - vtH * dLen; lstVertex[7] = lstVertex[8] - vtH * dLen; } lstVertex[1] = lstVertex[4] + vtNormal * dHeight; lstVertex[10] = lstVertex[7] + vtNormal * dHeight; if (nCover) { lstVertex[12] = lstVertex[0]; lstVertex[13] = lstVertex[1]; lstVertex[14] = lstVertex[2]; } Adesk::UInt16 curColor = m_pOwnerEnt->colorIndex(); mode.SetColor(curColor); mode.DrawMesh(nRows, nColums, lstVertex); delete []lstVertex; int nCalBoradShow = 0,nHaveClap = -1; m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nHaveClap); m_pXDataMap->GetAt(KEY_SHOW_CLAPBOARD,nCalBoradShow); if (nCalBoradShow == TDb::eShowBoard && nHaveClap == TDb::eBoard) { double dSubWidth1,dSubWidth2; m_pXDataMap->GetAt(KEY_B1,dSubWidth1); m_pXDataMap->GetAt(KEY_B2,dSubWidth2); AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtNor); vtNor.normalize(); TSupportFunc spFun; AcGeDoubleArray arDimeS,arDimeE; spFun.GetClapboardDimension(m_pXDataMap, arDimeS); spFun.GetClapboardDimension(m_pXDataMap,arDimeE,KEY_CLAPBOARD_DATA2); if (arDimeE.length() != arDimeS.length()) { return FALSE; } double dOffset1 = 0.0,dOffset2 = 0.0; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); for (int i = 0;i < arDimeS.length();++i) { dOffset1 = arDimeS[i]; dOffset2 = arDimeE[i]; AcGePoint3d ptVer[4]; ptVer[0] = ptGeS - vtNor * (dSubWidth1/2-dOffset1); ptVer[1] = ptGeE - vtNor * (dSubWidth2/2-dOffset2); ptVer[2] = ptVer[0] + vtNormal * dHeight; ptVer[3] = ptVer[1] + vtNormal * dHeight2; mode.DrawMesh(2,2,ptVer); } } } return TRUE; } // 槽式下平普通异径3d BOOL TEImpCabReducer::ExplodeOrDraw3dNorDifR(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return FALSE; int nCover = 0; AcGeVector3d vtNormal,vtDir; AcGePoint3d ptGeS,ptGeE; double dHeight = 0.0,dHeight2 = 0.0;// dHeight2 长高度 double dWidth = 0.0,dWidth2 = 0.0; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; if (nCover) { nRows = 5; } else { nRows = 4; } nColums = 2; AcGeVector3d vtH = vtDir; AcGeVector3d vtV = vtH; vtV.rotateBy(dAngle,vtNormal); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtH = ptGeE - ptGeS; vtV = vtDir; vtNormal = vtDir; vtNormal.rotateBy(dAngle, vtH); vtNormal.normalize(); } vtV.normalize(); vtH.normalize(); lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS + vtV * (dWidth / 2.0); lstVertex[2] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; ptTemp = ptGeS - vtV * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[6] = ptTemp + vtNormal * dHeight; ptTemp = ptGeE + vtV * (dWidth2 / 2.0); lstVertex[3] = ptTemp; lstVertex[1] = ptTemp + vtNormal * dHeight2; ptTemp = ptGeE - vtV * (dWidth2 / 2.0); lstVertex[5] = ptTemp; lstVertex[7] = ptTemp + vtNormal * dHeight2; if (nCover == 1) { lstVertex[8] = lstVertex[0]; lstVertex[9] = lstVertex[1]; } Adesk::UInt16 curColor = m_pOwnerEnt->colorIndex(); mode.SetColor(curColor); mode.DrawMesh(nRows, nColums, lstVertex); delete []lstVertex; int nCalBoradShow = 0,nHaveClap = -1; m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nHaveClap); m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nCalBoradShow); if (nCalBoradShow == TDb::eShowBoard && nHaveClap == TDb::eBoard) { double dSubWidth1,dSubWidth2; m_pXDataMap->GetAt(KEY_B1,dSubWidth1); m_pXDataMap->GetAt(KEY_B2,dSubWidth2); AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtNor); vtNor.normalize(); TSupportFunc spFun; AcGeDoubleArray arDimeS,arDimeE; spFun.GetClapboardDimension(m_pXDataMap, arDimeS); spFun.GetClapboardDimension(m_pXDataMap,arDimeE,KEY_CLAPBOARD_DATA2); if (arDimeE.length() != arDimeS.length()) { return FALSE; } double dOffset1 = 0.0,dOffset2 = 0.0; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); for (int i = 0;i < arDimeS.length();++i) { dOffset1 = arDimeS[i]; dOffset2 = arDimeE[i]; AcGePoint3d ptVer[4]; ptVer[0] = ptGeS - vtNor * (dSubWidth1/2-dOffset1); ptVer[1] = ptGeE - vtNor * (dSubWidth2/2-dOffset2); ptVer[2] = ptVer[0] + vtNormal * dHeight; ptVer[3] = ptVer[1] + vtNormal * dHeight2; mode.DrawMesh(2,2,ptVer); } } } return TRUE; } BOOL TEImpCabReducer::ExplodeOrDraw3dNorDifROfT(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return FALSE; double dLadderWidth = 50; //梯宽 double dSideWidth = 30; //侧面宽 double dThick = 10; //梯厚度 AcGeVector3d vtNormal,vtDir; AcGePoint3d ptGeS,ptGeE; double dHeight = 0.0,dHeight2 = 0.0;// dHeight2 长高度 double dWidth = 0.0,dWidth2 = 0.0; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; nRows = 4; nColums = 2; AcGeVector3d vtH = vtDir; AcGeVector3d vtV = vtH; vtV.rotateBy(dAngle,vtNormal); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtH = ptGeE - ptGeS; vtV = vtDir; vtNormal = vtDir; vtNormal.rotateBy(dAngle, vtH); vtNormal.normalize(); } vtV.normalize(); vtH.normalize(); lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS + vtV * (dWidth / 2.0); lstVertex[2] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; ptTemp = ptGeS - vtV * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[6] = ptTemp + vtNormal * dHeight; ptTemp = ptGeE + vtV * (dWidth2 / 2.0); lstVertex[3] = ptTemp; lstVertex[1] = ptTemp + vtNormal * dHeight2; ptTemp = ptGeE - vtV * (dWidth2 / 2.0); lstVertex[5] = ptTemp; lstVertex[7] = ptTemp + vtNormal * dHeight2; Adesk::UInt16 curColor = m_pOwnerEnt->colorIndex(); mode.SetColor(curColor); AcGePoint3dArray arPt; arPt.append(lstVertex[0]); arPt.append(lstVertex[1]); arPt.append(lstVertex[2]); arPt.append(lstVertex[3]); AcGeVector3d vtr = lstVertex[4] - lstVertex[2]; vtr.normalize(); DrawCube(mode ,-vtr, arPt, dSideWidth); arPt.setLogicalLength(0); arPt.append(lstVertex[6]); arPt.append(lstVertex[7]); arPt.append(lstVertex[4]); arPt.append(lstVertex[5]); DrawCube(mode ,vtr, arPt, dSideWidth); AcGePoint3dArray arPt2; double dDist = lstVertex[2].distanceTo(lstVertex[3]) / 3; vtr = lstVertex[3] - lstVertex[2]; vtr.normalize(); arPt.setLogicalLength(0); arPt.append(lstVertex[2] + vtr * (dDist + dLadderWidth / 2)); arPt.append(lstVertex[2] + vtr * (dDist + dLadderWidth / 2) - vtr * dLadderWidth); arPt2.append(lstVertex[2] + vtr * 2 * (dDist + dLadderWidth / 2)); arPt2.append(lstVertex[2] + vtr * 2 * (dDist + dLadderWidth / 2) - vtr * dLadderWidth); vtr = lstVertex[5] - lstVertex[4]; vtr.normalize(); arPt.append(lstVertex[4] + vtr * (dDist + dLadderWidth / 2)); arPt.append(lstVertex[4] + vtr * (dDist + dLadderWidth / 2) - vtr * dLadderWidth); arPt2.append(lstVertex[4] + vtr * 2 * (dDist + dLadderWidth / 2)); arPt2.append(lstVertex[4] + vtr * 2 * (dDist + dLadderWidth / 2) - vtr * dLadderWidth); DrawCube(mode, vtNormal, arPt, dThick); DrawCube(mode, vtNormal, arPt2, dThick); delete []lstVertex; lstVertex = NULL; } return TRUE; } // 槽式下平偏移异径3d BOOL TEImpCabReducer::ExplodeOrDraw3dOffDifR(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return FALSE; int nCover = 0; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal; double dLen = 0.0; double dWidth = 0.0,dWidth2 = 0.0; double dHeight = 0.0,dHeight2 = 0.0;// 长高度 if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover)) { double dLen1 = dLen / 3.0; double dLen2 = dLen1; double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; AcGeVector3d vtRed,vtOff; if (m_pXDataMap->GetAt(KEY_MAINDIR,vtRed) && m_pXDataMap->GetAt(KEY_BRDIR,vtOff) ) { if (nCover) { nRows = 5; } else { nRows = 4; } vtRed.normalize(); vtOff.normalize(); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtNormal = vtOff; vtNormal.rotateBy(dAngle,vtRed); vtNormal.normalize(); } nColums = 4; lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS - vtOff * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; lstVertex[5] = ptTemp + vtRed * dLen1; lstVertex[1] = lstVertex[5] + vtNormal * dHeight; ptTemp = ptGeS + vtOff * (dWidth / 2.0); lstVertex[8] = ptTemp; lstVertex[12] = ptTemp + vtNormal * dHeight; lstVertex[9] = ptTemp + vtRed * dLen1; lstVertex[13] = lstVertex[9] + vtNormal * dHeight; ptTemp = ptGeE - vtOff * (dWidth2 / 2.0); lstVertex[7] = ptTemp; lstVertex[3] = ptTemp + vtNormal * dHeight2; lstVertex[6] = ptTemp - vtRed * dLen2; lstVertex[10] = lstVertex[6] + vtOff * dWidth2; lstVertex[2] = lstVertex[3] - vtRed * dLen2; ptTemp = ptGeE + vtOff * (dWidth2 / 2.0); lstVertex[11] = ptTemp; lstVertex[15] = ptTemp + vtNormal * dHeight2; lstVertex[14] = lstVertex[15] - vtRed * dLen2; if (nCover) { lstVertex[16] = lstVertex[0]; lstVertex[17] = lstVertex[1]; lstVertex[18] = lstVertex[2]; lstVertex[19] = lstVertex[3]; } Adesk::UInt16 curColor = m_pOwnerEnt->colorIndex(); mode.SetColor(curColor); mode.DrawMesh(nRows, nColums, lstVertex); delete []lstVertex; int nCalBoradShow = 0,nHaveClap = -1; m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nHaveClap); m_pXDataMap->GetAt(KEY_SHOW_CLAPBOARD,nCalBoradShow); if (nCalBoradShow = TDb::eShowBoard && nHaveClap == TDb::eBoard) { double dSubWidth1,dSubWidth2; m_pXDataMap->GetAt(KEY_B1,dSubWidth1); m_pXDataMap->GetAt(KEY_B2,dSubWidth2); AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtNor); vtNor.normalize(); TSupportFunc spFun; AcGeDoubleArray arDimeS,arDimeE; spFun.GetClapboardDimension(m_pXDataMap, arDimeS); spFun.GetClapboardDimension(m_pXDataMap,arDimeE,KEY_CLAPBOARD_DATA2); if (arDimeE.length() != arDimeS.length()) { return FALSE; } double dOffset1 = 0.0,dOffset2 = 0.0; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); for (int i = 0;i < arDimeS.length();++i) { dOffset1 = arDimeS[i]; dOffset2 = arDimeE[i]; AcGePoint3d ptVer[4]; ptVer[0] = ptGeS - vtNor * (dSubWidth1/2-dOffset1); ptVer[1] = ptGeE - vtNor * (dSubWidth2/2-dOffset2); ptVer[2] = ptVer[0] + vtNormal * dHeight; ptVer[3] = ptVer[1] + vtNormal * dHeight; mode.DrawMesh(2,2,ptVer); } } } } return TRUE; } Acad::ErrorStatus TEImpCabReducer::ExplodeOrDraw2d(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) { return Acad::eNotImplementedYet; } TComplexCurve cplCurve; MakeCurves(cplCurve); TDbExtentsEdge edage; edage.SetEdage(cplCurve); BOOL bWeight = FALSE; m_pXDataMap->GetAt(KEY_EDAGEWEIGHT,bWeight); AcDbObjectId idReal = ((TDbInterfacesObj*)m_pOwnerEnt)->layerId(); AcDbObjectId idDash = ((TDbInterfacesObj*)m_pOwnerEnt)->DashLayer(); AcDbObjectId idCent = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer(); edage.ExplodeOrDraw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE); /* TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < cplCurve.length();i++) { el = cplCurve.at(i); if (el.ptGe[1].distanceTo(el.ptGe[2]) < 1.e-10) { mode->geometry().polyline(2,el.ptGe); } else { if (el.ptGe[0].distanceTo(el.ptGe[1]) > 1.e-10 && el.ptGe[1].distanceTo(el.ptGe[2]) > 1.e-10) { mode->geometry().circularArc(el.ptGe[0],el.ptGe[1],el.ptGe[2]); } } }*/ return Acad::eOk; } void TEImpCabReducer::FreeBuffer(AcDbVoidPtrArray& arCurves) { for (int i = 0;i < arCurves.length();i++) { AcDbEntity* pEnt = (AcDbEntity*)arCurves.at(i); if (pEnt != NULL) { delete pEnt; } } arCurves.setLogicalLength(0); } BOOL TEImpCabReducer::MakeCurves(TComplexCurve& cplCurve) const { if (m_pXDataMap == NULL) return FALSE; int nType = 0; m_pXDataMap->GetAt(KEY_REDUCER,nType); int nVetexNum = 0; switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 { MakeCurvesOfHorDifR2D(cplCurve,nVetexNum); } break; case TDb::eRbotHorNormalDifR: // 槽式下平普通异径接头 { MakeCurvesOfHorNorDifR2D(cplCurve,nVetexNum); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: // 槽式下平偏移异径接头 { MakeCurvesOfHorOffDifR2D(cplCurve,nVetexNum); } break; default: break; } if (cplCurve.length() > 0) { // 是否显示连接线 int nCnt = -1; m_pXDataMap->GetAt(KEY_SHOWCNTLINE,nCnt); if (nCnt == 0) { int nSize = cplCurve.length(); NoneConectLineIfNeed(cplCurve); nSize -= cplCurve.length(); nVetexNum -= nSize; } // 设置边线宽 double dWidth = 0.0; m_pXDataMap->GetAt(KEY_EDAGEWIDTH,dWidth); TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int j = 0;j < nVetexNum;j++) { el = cplCurve[j]; el.dWidth = dWidth; cplCurve.setAt(j,el); } // 设置边线颜色 int nColor = -1; if (m_pXDataMap->GetAt(KEY_BORLINECOLOR,nColor)) { TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int j = 0;j < nVetexNum;j++) { el = cplCurve[j]; el.nColorIndex = nColor; cplCurve.setAt(j,el); } } return TRUE; } return FALSE; } BOOL TEImpCabReducer::NoneConectLineIfNeed(TComplexCurve& cplCurve) const { TInterface inf; int nIndex = -1; int nInfCount = GetInterfaceCount(); for (int i = 0;i < nInfCount;i++) { // 获取接口 if (GetInterface(i,inf)) { // 判断是否有连接物 if (GetInterface(inf.GetPosition(),inf)) { // 获取连接点所在的线段索引号 if (GetIndexOfPointIsOn(cplCurve,inf.GetPosition(),nIndex)) { cplCurve.removeAt(nIndex); } } } } return TRUE; } BOOL TEImpCabReducer::GetIndexOfPointIsOn(TComplexCurve& cplCurv,const AcGePoint3d& ptOn,int& nIndex) const { AcDbLine line; AcGePoint3d ptFind; for (int i = 0;i < cplCurv.length();i++) { line.setStartPoint(cplCurv[i].ptGe[0]); line.setEndPoint(cplCurv[i].ptGe[1]); line.getClosestPointTo(ptOn,ptFind); // 是否和最近点相同 if (ptOn.distanceTo(ptFind) < 1.0e-3) { nIndex = i; return TRUE; } } return FALSE; } // 槽式下平异径2d void TEImpCabReducer::MakeCurvesOfHorDifR2D(TComplexCurve& cplCurve,int& nNum) const { AcGePoint3d* pVetex = NULL; if (m_pXDataMap == NULL) return; int nCover = 0; double dLen = 0.0; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal,vtDir; double dHeight = 0.0,dHeight2 = 0.0; double dWidthL = 0.0, dWidthS = 0.0; if ( m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidthL) && m_pXDataMap->GetAt(KEY_B2,dWidthS) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { // ptGeS 长宽度的中点,ptGee短宽度的中点 dLen /= 2.0; int nPtNum = 0; double dAngle = PI / 2.0; AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { /************************************************************************/ /* 0 3 |\ /| | \ 4 5 / | | | | | | | | | | |6 7 | | 1 +--+--+--+--+2 ptGeS ptGeE /************************************************************************/ AcGeVector3d vtPerRe = vtDir; AcGeVector3d vtT = ptGeE - ptGeS; //z vtPerRe.rotateBy(dAngle,vtT); // 87方向 vtPerRe.normalize(); vtDir.normalize(); AcGePoint3d* pVetex = new AcGePoint3d[8]; if (pVetex == NULL) return; pVetex[6] = ptGeS - vtDir * (dWidthL / 2); pVetex[7] = ptGeS + vtDir * (dWidthL / 2); pVetex[1] = ptGeS - vtDir * (dWidthS / 2); pVetex[2] = ptGeS + vtDir * (dWidthS / 2); pVetex[0] = pVetex[1] + vtPerRe * dHeight2; pVetex[3] = pVetex[2] + vtPerRe * dHeight2; pVetex[4] = pVetex[6] + vtPerRe * dHeight; pVetex[5] = pVetex[7] + vtPerRe * dHeight; TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 3;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCurve.append(el); } el.ptGe[0] = pVetex[0]; el.ptGe[1] = pVetex[4]; el.ptGe[2] = pVetex[4]; cplCurve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[6]; el.ptGe[2] = pVetex[6]; cplCurve.append(el); el.ptGe[0] = pVetex[3]; el.ptGe[1] = pVetex[5]; el.ptGe[2] = pVetex[5]; cplCurve.append(el); el.ptGe[0] = pVetex[5]; el.ptGe[1] = pVetex[7]; el.ptGe[2] = pVetex[7]; cplCurve.append(el); if (nCover) //conver { /************************************************************************/ /* 0 5 8 +-----------+ | \ 1 4 / | | 9|-----|10| | | | | | |2 3| | 7 +--+--+--+--+6 ptGeS ptGeE /************************************************************************/ el.ptGe[0] = pVetex[0]; el.ptGe[1] = pVetex[3]; el.ptGe[2] = pVetex[3]; cplCurve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[5]; el.ptGe[2] = pVetex[5]; cplCurve.append(el); } nNum = 3; } else //Normal:Z { /************************************************************************/ /* 0 6 + | \ 1 2 | +------+ ptGeS | |ptGeE | | | +------+3 | / 4 5 + /************************************************************************/ AcGeVector3d vt = vtDir; vt.rotateBy(dAngle,vtNormal); vt.normalize(); vtDir.normalize(); pVetex = new AcGePoint3d[7]; if (pVetex == NULL) return; pVetex[0] = ptGeS + vt * (dWidthL / 2.0); pVetex[6] = pVetex[0]; pVetex[5] = ptGeS - vt * (dWidthL / 2.0); pVetex[2] = ptGeE + vt * (dWidthS / 2.0); pVetex[3] = ptGeE - vt * (dWidthS / 2.0); if (dWidthL < dWidthS) { pVetex[1] = pVetex[0] + vtDir * dLen; pVetex[4] = pVetex[5] + vtDir * dLen; } else { pVetex[1] = pVetex[2] - vtDir * dLen; pVetex[4] = pVetex[3] - vtDir * dLen; } TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 6;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCurve.append(el); } nNum = 6; } } if (pVetex != NULL) { delete []pVetex; pVetex = NULL; } } // 槽式下平普通异径2d void TEImpCabReducer::MakeCurvesOfHorNorDifR2D(TComplexCurve& cplCuve,int& nNum) const { AcGePoint3d* pVetex = NULL; if (m_pXDataMap == NULL) return; int nType = 0; int nCover = 0; AcGeVector3d vtNormal,vtDir; AcGePoint3d ptGeS,ptGeE; double dHeight = 0.0,dHeight2 = 0.0; double dWidthL = 0.0, dWidthS = 0.0; if ( m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_B1,dWidthL) && m_pXDataMap->GetAt(KEY_B2,dWidthS) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { // ptGeS 长宽度的中点,ptGee短宽度的中点 double dAngle = PI / 2.0; AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { /************************************************************************/ /* 0 3 |\ /| | \ 4 5 / | | | | | | | | | | |6 7 | | 1 +--+--+--+--+2 ptGeS ptGeE /************************************************************************/ AcGeVector3d vtPerRe = vtDir; AcGeVector3d vtT = ptGeE - ptGeS; //z vtPerRe.rotateBy(dAngle,vtT); // 87方向 vtPerRe.normalize(); vtDir.normalize(); AcGePoint3d* pVetex = new AcGePoint3d[8]; if (pVetex == NULL) return; pVetex[6] = ptGeS - vtDir * (dWidthS / 2); pVetex[7] = ptGeS + vtDir * (dWidthS / 2); pVetex[1] = ptGeS - vtDir * (dWidthL / 2); pVetex[2] = ptGeS + vtDir * (dWidthL / 2); pVetex[0] = pVetex[1] + vtPerRe * dHeight; pVetex[3] = pVetex[2] + vtPerRe * dHeight; pVetex[4] = pVetex[6] + vtPerRe * dHeight2; pVetex[5] = pVetex[7] + vtPerRe * dHeight2; TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 3;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCuve.append(el); } if (nCover) //conver { /************************************************************************/ /* 0 5 8 +-----------+ | \ 1 4 / | | 9|-----|10| | | | | | |2 3| | 7 +--+--+--+--+6 ptGeS ptGeE /************************************************************************/ el.ptGe[0] = pVetex[0]; el.ptGe[1] = pVetex[3]; el.ptGe[2] = pVetex[3]; cplCuve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[5]; el.ptGe[2] = pVetex[5]; cplCuve.append(el); } el.ptGe[0] = pVetex[0]; el.ptGe[1] = pVetex[4]; el.ptGe[2] = pVetex[4]; cplCuve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[6]; el.ptGe[2] = pVetex[6]; cplCuve.append(el); el.ptGe[0] = pVetex[3]; el.ptGe[1] = pVetex[5]; el.ptGe[2] = pVetex[5]; cplCuve.append(el); el.ptGe[0] = pVetex[5]; el.ptGe[1] = pVetex[7]; el.ptGe[2] = pVetex[7]; cplCuve.append(el); nNum = 3; } else //Normal:z { /************************************************************************/ /* 0 ptGeS 4 + | \ | \1 dWidthL | | dWidthS ptGeS | /2 ptGeE | / 3 + /************************************************************************/ AcGeVector3d vt = vtDir; vt.rotateBy(dAngle,vtNormal); vt.normalize(); vtDir.normalize(); pVetex = new AcGePoint3d[5]; if (pVetex == NULL) return; pVetex[0] = ptGeS + vt * (dWidthL / 2.0); pVetex[4] = pVetex[0]; pVetex[3] = ptGeS - vt * (dWidthL / 2.0); pVetex[1] = ptGeE + vt * (dWidthS / 2.0); pVetex[2] = ptGeE - vt * (dWidthS / 2.0); TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 4;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCuve.append(el); } nNum = 4; } } if (pVetex != NULL) { delete []pVetex; pVetex = NULL; } } // 槽式下平偏移异径2d void TEImpCabReducer::MakeCurvesOfHorOffDifR2D(TComplexCurve& cplCurve,int& nNum) const { AcGePoint3d* pVetex = NULL; if (m_pXDataMap == NULL) return; int nType = 0; int nCover = 0; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal; double dHeight = 0.0,dHeight2 = 0.0; double dWidthL = 0.0, dWidthS = 0.0,dLen = 0.0; if ( m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidthL) && m_pXDataMap->GetAt(KEY_B2,dWidthS) && m_pXDataMap->GetAt(KEY_REDUCER,nType) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_COVER,nCover) ) { // ptGeS 长宽度的中点,ptGee短宽度的中点 double dLen1 = dLen / 3.0; double dLen2 = dLen1; AcGeVector3d vtReduc; double dAngle = PI / 2.0; AcGeVector3d vtOffDir; if (m_pXDataMap->GetAt(KEY_BRDIR,vtOffDir) && m_pXDataMap->GetAt(KEY_MAINDIR,vtReduc) ) { /************************************************************************ 0 1 2 3 8 +--------+--+-----+ | | | | dWidthS | | | | ptGeE dWidthL | | +-----+4 ptGeS | | /5 | |/ 7 +--------+6 ************************************************************************/ AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) // Normal:x { /************************************************************************/ /* 0 3 | /| 6 | 4 / | | | | | | | | 5 | | 1 +-----+--+--+ 2 ptGeS ptGeE /************************************************************************/ AcGeVector3d vtPerRe = vtOffDir; //z vtPerRe.rotateBy(dAngle,vtReduc); vtPerRe.normalize(); vtReduc.normalize(); vtOffDir.normalize(); pVetex = new AcGePoint3d[7]; if (pVetex == NULL) return; pVetex[1] = ptGeS - vtOffDir * (dWidthL / 2.0); pVetex[0] = pVetex[1] + vtPerRe * dHeight; pVetex[2] = ptGeS + vtOffDir * (dWidthL / 2.0); pVetex[3] = pVetex[2] + vtPerRe * dHeight; pVetex[5] = ptGeS + vtOffDir * (dWidthS - dWidthL / 2.0); pVetex[4] = pVetex[5] + vtPerRe * dHeight2; pVetex[6] = pVetex[0] - vtPerRe * fabs((dHeight - dHeight2)); TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 3;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCurve.append(el); } if (nCover) // cover { /************************************************************************/ /* 8 9 0 +-----------+ 3 | 4 / | 7 |--------|6 | | | | | 5| | 1 +--+--+--+--+ 2 ptGeS ptGeE /************************************************************************/ el.ptGe[0] = pVetex[3]; el.ptGe[1] = pVetex[0]; el.ptGe[2] = pVetex[0]; cplCurve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[6]; el.ptGe[2] = pVetex[6]; cplCurve.append(el); } el.ptGe[0] = pVetex[3]; el.ptGe[1] = pVetex[4]; el.ptGe[2] = pVetex[4]; cplCurve.append(el); el.ptGe[0] = pVetex[4]; el.ptGe[1] = pVetex[5]; el.ptGe[2] = pVetex[5]; cplCurve.append(el); nNum = 3; } else // Normal:z { vtOffDir.normalize(); pVetex = new AcGePoint3d[9]; if (pVetex == NULL) return; pVetex[0] = ptGeS - vtOffDir * (dWidthL / 2.0); pVetex[8] = pVetex[0]; pVetex[7] = ptGeS + vtOffDir * (dWidthL / 2.0); vtReduc.normalize(); pVetex[3] = ptGeE - vtOffDir * (dWidthS / 2.0); pVetex[4] = ptGeE + vtOffDir * (dWidthS / 2.0); pVetex[5] = pVetex[4] - vtReduc * dLen2; pVetex[6] = pVetex[7] + vtReduc * dLen1; pVetex[1] = pVetex[6] - vtOffDir * dWidthL; pVetex[2] = pVetex[5] - vtOffDir * dWidthS; TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int i = 0;i < 8;i++) { el.ptGe[0] = pVetex[i]; el.ptGe[1] = pVetex[i + 1]; el.ptGe[2] = pVetex[i + 1]; cplCurve.append(el); } nNum = 8; } } } if (pVetex != NULL) { delete []pVetex; pVetex = NULL; } } Acad::ErrorStatus TEImpCabReducer::getOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { if (m_pXDataMap != NULL) { switch(osnapMode) { case AcDb::kOsModeEnd: { TComplexCurve cpl; MakeCurves(cpl); for (int i = 0;i < cpl.length();i++) { snapPoints.append(cpl[i].ptGe[0]); } AcGePoint3d ptGeS,ptGeE,ptGeM; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) ) { snapPoints.append(ptGeS); snapPoints.append(ptGeE); } } break; case AcDb::kOsModeMid: { AcGePoint3d ptGeS,ptGeE,ptGeM; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) ) { ptGeM = TSupportFunc::Mid(ptGeS,ptGeE); snapPoints.append(ptGeM); } } break; case AcDb::kOsModePerp: { AcGePoint3d ptVerFoot; if (GetVerticalFootPoint(pickPoint, lastPoint, ptVerFoot)) { snapPoints.append(ptVerFoot); } } break; case AcDb::kOsModeNear: { AcGePoint3d ptNear; if (GetNearestPoint(pickPoint, ptNear)) { snapPoints.append(ptNear); } } break; case AcDb::kOsModeNode: // 三维用到,暂时不实现 break; } } return Acad::eNotImplementedYet; } // 获取垂足点 BOOL TEImpCabReducer::GetVerticalFootPoint(const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, AcGePoint3d& ptVerFoot) const { BOOL bIsSuc = FALSE; TComplexCurve cplCurve; if (MakeCurves(cplCurve)) { GetReducerMidLine(cplCurve); TSupportFunc spFun; bIsSuc = spFun.GetVerticalFootPoint(cplCurve, pickPoint, lastPoint, ptVerFoot); } return bIsSuc; } // 获取中心线 BOOL TEImpCabReducer::GetReducerMidLine(TComplexCurve& compCurve) const { return GetCurvesInSide(compCurve); } // 获取最近点 BOOL TEImpCabReducer::GetNearestPoint(const AcGePoint3d& pickPoint, AcGePoint3d& ptNear) const { BOOL bIsFind = FALSE; TComplexCurve cplCurve; if (MakeCurves(cplCurve)) { GetReducerMidLine(cplCurve); TSupportFunc spFun; bIsFind = spFun.GetNearestPoint(cplCurve, pickPoint, ptNear); } return bIsFind; } AcDbPolyline* TEImpCabReducer::MakePolyCurve() const { AcDbPolyline* pPl = new AcDbPolyline; if (m_pXDataMap != NULL) { int nType = 0; if (m_pXDataMap->GetAt(KEY_REDUCER,nType)) { switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 { MakePolyCurveOfBHDifR(pPl); break; } case TDb::eRbotHorNormalDifR: // 槽式下平普通异径接头 { MakePolyCurveOfNorDifR(pPl); break; } case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: // 槽式下平偏移异径接头 { MakePolyCurveOfOffDifR(pPl); break; } default: break; } } } if (pPl != NULL && pPl->numVerts() == 0) { delete pPl; pPl = NULL; } return pPl; } void TEImpCabReducer::MakePolyCurveOfBHDifR(AcDbPolyline*& pPl) const { TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorDifR2D(cplCurve,nNum); FormatPolyline(pPl,cplCurve,nNum); } void TEImpCabReducer::MakePolyCurveOfNorDifR(AcDbPolyline*& pPl) const { TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorNorDifR2D(cplCurve,nNum); FormatPolyline(pPl,cplCurve,nNum); } void TEImpCabReducer::MakePolyCurveOfOffDifR(AcDbPolyline*& pPl) const { TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorOffDifR2D(cplCurve,nNum); if (cplCurve.length() < 3) { return; } AcGePlane plan(cplCurve.at(0).ptGe[0],cplCurve.at(3).ptGe[0],cplCurve.at(3).ptGe[1]); AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan); plan.set(ptOrth,plan.normal()); double dEl = ptOrth.asVector().length(); if (!ptOrth.asVector().isCodirectionalTo(plan.normal())) { dEl *= -1.0; } for (int i = 0;i < nNum;i++) { pPl->addVertexAt(i,cplCurve.at(i).ptGe[0].convert2d(plan)); } pPl->setClosed(Adesk::kTrue); pPl->setElevation(dEl); pPl->setNormal(plan.normal()); } void TEImpCabReducer::FormatPolyline(AcDbPolyline*& pPl,TComplexCurve& cplCurve,int nNum) const { if (cplCurve.length() < 3) { return; } AcGePlane plan(cplCurve.at(0).ptGe[0],cplCurve.at(1).ptGe[0],cplCurve.at(2).ptGe[0]); AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan); plan.set(ptOrth,plan.normal()); double dEl = ptOrth.asVector().length(); if (!ptOrth.asVector().isCodirectionalTo(plan.normal())) { dEl *= -1.0; } for (int i = 0;i < nNum;i++) { pPl->addVertexAt(i,cplCurve.at(i).ptGe[0].convert2d(plan)); } pPl->setClosed(Adesk::kTrue); pPl->setElevation(dEl); pPl->setNormal(plan.normal()); } BOOL TEImpCabReducer::GetCurvesInSide(TComplexCurve& compCurve) const { if (m_pXDataMap == NULL) { return FALSE; } AcGePoint3d ptGeS,ptGeE; m_pXDataMap->GetAt(KEY_START,ptGeS); m_pXDataMap->GetAt(KEY_END,ptGeE); AcGeVector3d vtNorm; m_pXDataMap->GetAt(KEY_NORMAL,vtNorm); TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); int nShowCenLine = 0; m_pXDataMap->GetAt(KEY_HASCENLINE,nShowCenLine); if (nShowCenLine) { AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNorm); if (line.isPerpendicularTo(AcGePlane::kXYPlane)) { el.ptGe[0] = ptGeS; el.ptGe[1] = ptGeE; el.ptGe[2] = ptGeE; el.gsMark = -1; compCurve.append(el); } if (compCurve.length() > 0) { // 设置中心线宽 double dWidth = 0.0; m_pXDataMap->GetAt(KEY_CENLWIDTH,dWidth); if (dWidth > 0) { TDb::TCurveElement el; memset(&el,0,sizeof(TDb::TCurveElement)); for (int j = 0;j < compCurve.length();j++) { el = compCurve[j]; el.dWidth = dWidth; compCurve.setAt(j,el); } } } } //显示隔板线 double dWith2 = 0.0; m_pXDataMap->GetAt(KEY_EDAGEWIDTH, dWith2); int bShowBorad = 0,bHaveClap = -1; m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,bHaveClap); m_pXDataMap->GetAt(KEY_SHOW_CLAPBOARD,bShowBorad); if(bShowBorad == TDb::eShowBoard && bHaveClap == TDb::eBoard) { double dSubWidth1,dSubWidth2; m_pXDataMap->GetAt(KEY_B1,dSubWidth1); m_pXDataMap->GetAt(KEY_B2,dSubWidth2); AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtNor); vtNor.normalize(); TSupportFunc spFun; AcGeDoubleArray arDimeS,arDimeE; spFun.GetClapboardDimension(m_pXDataMap, arDimeS); spFun.GetClapboardDimension(m_pXDataMap,arDimeE,KEY_CLAPBOARD_DATA2); if (arDimeE.length() != arDimeS.length()) { return FALSE; } double dOffset1 = 0.0,dOffset2 = 0.0; for (int i = 0;i < arDimeS.length();++i) { dOffset1 = arDimeS[i]; dOffset2 = arDimeE[i]; el.ptGe[0] = ptGeS - vtNor * (dSubWidth1/2-dOffset1); el.ptGe[1] = ptGeE - vtNor * (dSubWidth2/2-dOffset2); el.ptGe[2] = el.ptGe[1]; el.dWidth = dWith2; el.gsMark = -2; el.nColorIndex = KEY_CLP_COLORINDEX; compCurve.append(el); } } return TRUE; } BOOL TEImpCabReducer::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces) { if (m_pXDataMap != NULL) { int nType = 0; m_pXDataMap->GetAt(KEY_REDUCER,nType); switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 { MakePolyCurveFacesOfBHDifR(arFaces); break; } case TDb::eRbotHorNormalDifR: // 槽式下平普通异径接头 { MakePolyCurveFacesOfNorDifR(arFaces); break; } case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: // 槽式下平偏移异径接头 { MakePolyCurveFacesOfOffDifR(arFaces); break; } default: break; } } return arFaces.length() > 0; } void TEImpCabReducer::MakePolyCurveFacesOfBHDifR(AcDbVoidPtrArray& arFaces) { if (m_pXDataMap != NULL) { AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_NORMAL,vtNor); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNor); if (line.isPerpendicularTo(AcGePlane::kXYPlane)) // Z { MakePolyCurveFacesOfBHDifRZNor(arFaces); } else { MakePolyCurveFacesOfBHDifRNoZNor(arFaces); } } } void TEImpCabReducer::MakePolyCurveFacesOfBHDifRZNor(AcDbVoidPtrArray& arFaces) { /*********************************************************************** 0 + | \ 1 2 | +------+ ptGeS | |ptGeE | | | +------+3 | / 4 5 + ***********************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(0).ptGe[0],cplCurve.at(0).ptGe[1], cplCurve.at(4).ptGe[0],cplCurve.at(4).ptGe[1])); arFaces.append(CreateAcDbFace(cplCurve.at(1).ptGe[0],cplCurve.at(1).ptGe[1], cplCurve.at(3).ptGe[0],cplCurve.at(3).ptGe[1])); } } void TEImpCabReducer::MakePolyCurveFacesOfBHDifRNoZNor(AcDbVoidPtrArray& arFaces) { /************************************************************************ 0 3 |\ /| | \ 4 5 / | | | | | | | | | | |6 7 | | 1 +--+--+--+--+2 ptGeS ptGeE ************************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(0).ptGe[0],cplCurve.at(0).ptGe[1], cplCurve.at(4).ptGe[0],cplCurve.at(4).ptGe[1])); arFaces.append(CreateAcDbFace(cplCurve.at(2).ptGe[0],cplCurve.at(2).ptGe[1], cplCurve.at(6).ptGe[0],cplCurve.at(6).ptGe[1])); } } void TEImpCabReducer::MakePolyCurveFacesOfNorDifR(AcDbVoidPtrArray& arFaces) { if (m_pXDataMap != NULL) { AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_NORMAL,vtNor); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNor); if (line.isPerpendicularTo(AcGePlane::kXYPlane)) // Z { MakePolyCurveFacesOfNorDifRZNor(arFaces); } else { MakePolyCurveFacesOfNorDifRNoZNor(arFaces); } } } void TEImpCabReducer::MakePolyCurveFacesOfNorDifRZNor(AcDbVoidPtrArray& arFaces) { /*********************************************************************** 0 ptGeS + | \ | \1 dWidthL | | dWidthS ptGeS | /2 ptGeE | / 3 + ************************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorNorDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(0).ptGe[0],cplCurve.at(0).ptGe[1], cplCurve.at(2).ptGe[0],cplCurve.at(2).ptGe[1])); } } void TEImpCabReducer::MakePolyCurveFacesOfNorDifRNoZNor(AcDbVoidPtrArray& arFaces) { /************************************************************************ 0 3 |\ /| | \ 4 5 / | | | | | | | | | | |6 7 | | 1 +--+--+--+--+2 ptGeS ptGeE ************************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorNorDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(0).ptGe[0],cplCurve.at(0).ptGe[1], cplCurve.at(4).ptGe[0],cplCurve.at(4).ptGe[1])); arFaces.append(CreateAcDbFace(cplCurve.at(2).ptGe[0],cplCurve.at(2).ptGe[1], cplCurve.at(6).ptGe[0],cplCurve.at(6).ptGe[1])); } } void TEImpCabReducer::MakePolyCurveFacesOfOffDifR(AcDbVoidPtrArray& arFaces) { if (m_pXDataMap != NULL) { AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_NORMAL,vtNor); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNor); if (line.isPerpendicularTo(AcGePlane::kXYPlane)) // Z { MakePolyCurveFacesOfOffDifRZNor(arFaces); } else { MakePolyCurveFacesOfOffDifRNoZNor(arFaces); } } } void TEImpCabReducer::MakePolyCurveFacesOfOffDifRZNor(AcDbVoidPtrArray& arFaces) { /*********************************************************************** 0 1 2 3 +--------+--+-----+ | | | | dWidthS | | | | ptGeE dWidthL | | +-----+4 ptGeS | | /5 | |/ 7 +--------+6 ************************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorOffDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(0).ptGe[0],cplCurve.at(0).ptGe[1], cplCurve.at(6).ptGe[0],cplCurve.at(6).ptGe[1])); arFaces.append(CreateAcDbFace(cplCurve.at(1).ptGe[0],cplCurve.at(1).ptGe[1], cplCurve.at(5).ptGe[0],cplCurve.at(5).ptGe[1])); arFaces.append(CreateAcDbFace(cplCurve.at(2).ptGe[0],cplCurve.at(2).ptGe[1], cplCurve.at(4).ptGe[0],cplCurve.at(4).ptGe[1])); } } void TEImpCabReducer::MakePolyCurveFacesOfOffDifRNoZNor(AcDbVoidPtrArray& arFaces) { /************************************************************************ 0 3 | /| 6 | 4 / | | | | | | | | 5 | | 1 +-----+--+--+ 2 ptGeS ptGeE /************************************************************************/ TComplexCurve cplCurve; int nNum = 0; MakeCurvesOfHorOffDifR2D(cplCurve,nNum); if (cplCurve.length() > 0) { arFaces.append(CreateAcDbFace(cplCurve.at(2).ptGe[0],cplCurve.at(2).ptGe[1], cplCurve.at(4).ptGe[0],cplCurve.at(4).ptGe[1])); } } BOOL TEImpCabReducer::EnsureCurViewPortIs3D(const AcGeVector3d& vtNormal) const { AcGeVector3d vtViewDir = AcGeVector3d::kZAxis; struct resbuf rb; memset (&rb, 0, sizeof (struct resbuf)); acedGetVar(_T("VIEWDIR"), &rb); vtViewDir.set(rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]); vtViewDir.normalize(); if (vtViewDir.isPerpendicularTo(vtNormal)) // 平行代表3d { return TRUE; } return FALSE; } AcDbFace* TEImpCabReducer::CreateAcDbFace(const AcGePoint3d& pt1,const AcGePoint3d& pt2,const AcGePoint3d& pt3,const AcGePoint3d& pt4) { AcDbFace* pFace = NULL; pFace = new AcDbFace; if (pFace != NULL) { pFace->setVertexAt(0, pt1); pFace->setVertexAt(1, pt2); pFace->setVertexAt(2, pt3); pFace->setVertexAt(3, pt4); } return pFace; } Acad::ErrorStatus TEImpCabReducer::getClassID(CLSID* pClsid) const { // #if (ADS < 16) // CLSID CLSID_FittingBaseEntity = {0x1F6683C6,0xD6BF,0x415f,{0x9D,0xF1,0xDB,0xAA,0x8F,0x77,0xC6,0x7C}}; // #endif // // #if (ADS == 16) // CLSID CLSID_FittingBaseEntity = {0x1F6683C6,0xD6BF,0x415f,{0x9D,0xF1,0xDB,0xAA,0x8F,0x77,0xC6,0x7D}}; // #endif // // #if (ADS == 17) // CLSID CLSID_FittingBaseEntity = {0x1F6683C6,0xD6BF,0x415f,{0x9D,0xF1,0xDB,0xAA,0x8F,0x77,0xC6,0x7E}}; // #endif // // #if (ADS == 18) // CLSID CLSID_FittingBaseEntity = {0x1F6683C6,0xD6BF,0x415f,{0x9D,0xF1,0xDB,0xAA,0x8F,0x77,0xC6,0x7F}}; // #endif // // #if (ADS == 19) // CLSID CLSID_FittingBaseEntity = {0x1F6683C6,0xD6BF,0x415f,{0x9D,0xF1,0xDB,0xAA,0x8F,0x77,0xC6,0x7F}}; // #endif return Acad::eOk; } CString TEImpCabReducer::GetCurrentTypeName() const { CString strName = _T(""); if (m_pXDataMap != NULL) { int nType = -1; int nStyle = 0; m_pXDataMap->GetAt(KEY_STYLE,nStyle); m_pXDataMap->GetAt(KEY_REDUCER,nType); switch(nType) { case TDb::eRbotHorDifR: // 槽式下平异径接头 { strName = (_T("槽式下平异径接头")); break; } case TDb::eRbotHorNormalDifR: // 槽式下平普通异径接头 { strName = (_T("槽式下平普通异径接头")); break; } case TDb::eRbotHorOffsetDifR2: // 槽式下平偏移(右)异径接头 { strName = (_T("槽式下平右偏移异径接头")); break; } case TDb::eRbotHorOffsetDifR: // 槽式下平偏移(左)异径接头 { strName = (_T("槽式下平左偏移异径接头")); break; } default: break; } switch(nStyle) { case TDb::eP: { strName.Replace(_T("槽式"),_T("盘式")); break; } case TDb::eT: { strName.Replace(_T("槽式"),_T("梯式")); break; } default: break; } } return strName; } void TEImpCabReducer::list() const { if (m_pXDataMap != NULL) { int nType = -1; double dL = 0.0,dB1 = 0.0,dB2 = 0.0; double dH1 = 0.0,dH2 = 0.0; CString strType = _T(""); m_pXDataMap->GetAt(KEY_TYPE,strType); m_pXDataMap->GetAt(KEY_B1,dB1); m_pXDataMap->GetAt(KEY_B2,dB2); m_pXDataMap->GetAt(KEY_H1,dH1); m_pXDataMap->GetAt(KEY_H2,dH2); m_pXDataMap->GetAt(KEY_L,dL); acutPrintf(_T("\n\t\t\t\t\t\t\t\t%s\n"),GetCurrentTypeName()); acutPrintf(_T("\n\t\t\t\t\t型号: %s"),strType); acutPrintf(_T("\n\t\t\t\t\t长度: %.0f"),dL); acutPrintf(_T("\n\t\t\t\t\t宽度1: %.0f"),dB1); acutPrintf(_T("\n\t\t\t\t\t宽度2: %.0f"),dH2); acutPrintf(_T("\n\t\t\t\t\t高度1: %.0f"),dH1); acutPrintf(_T("\n\t\t\t\t\t高度2: %.0f\n"),dH2); } } void TEImpCabReducer::GetTips(CMapStringToString& mapLable2Tip) const { if (m_pXDataMap != NULL) { double dH1 = 0.0,dH2 = 0.0,dB1 = 0.0,dB2 = 0.0; AcGePoint3d ptS; CString strTemp = _T(""); m_pXDataMap->GetAt(KEY_START,ptS); m_pXDataMap->GetAt(KEY_H1,dH1); m_pXDataMap->GetAt(KEY_H2,dH2); m_pXDataMap->GetAt(KEY_B1,dB1); m_pXDataMap->GetAt(KEY_B2,dB2); m_pXDataMap->GetAt(KEY_TYPE,strTemp); mapLable2Tip.SetAt(_T("对象类型"), GetCurrentTypeName()); mapLable2Tip.SetAt(_T("型号"), strTemp); strTemp.Format(_T("%d"),(int)ptS.z); mapLable2Tip.SetAt(_T("中心标高"), strTemp); strTemp.Format(_T("%d"),(int)dB1); mapLable2Tip.SetAt(_T("宽度1"), strTemp); strTemp.Format(_T("%d"),(int)dB2); mapLable2Tip.SetAt(_T("宽度2"), strTemp); strTemp.Format(_T("%d"),(int)dH1); mapLable2Tip.SetAt(_T("高度1"), strTemp); strTemp.Format(_T("%d"),(int)dH2); mapLable2Tip.SetAt(_T("高度2"), strTemp); } } //获取三维的壳对象 int TEImpCabReducer::GetXBaseShell(TXShell& xShell) { int nRet = 0; if (m_pXDataMap != NULL) { int nType = 0; if (m_pXDataMap->GetAt(KEY_REDUCER,nType)) { switch(nType) { case TDb::eRbotHorDifR: { } break; case TDb::eRbotHorNormalDifR: { nRet = GetXBaseShellNorDifR(xShell); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: { nRet = GetXBaseShellOffDifR(xShell); } break; default: break; } } } return nRet; } //获取体的范围方块 int TEImpCabReducer::GetBodyBox(AcDbExtents& ext) { int nRet = 0; if (m_pXDataMap != NULL) { int nType = 0; if (m_pXDataMap->GetAt(KEY_REDUCER,nType)) { switch(nType) { case TDb::eRbotHorDifR: { } break; case TDb::eRbotHorNormalDifR: { nRet = GetBodyBoxNorDifR(ext); } break; case TDb::eRbotHorOffsetDifR2: case TDb::eRbotHorOffsetDifR: { nRet = GetBodyBoxOffDifR(ext); } break; default: break; } } } return nRet; } //通过点得到最大范围 int TEImpCabReducer::GetBoxExtendByPts(const AcGePoint3dArray &arPts,AcDbExtents& ext) { if (arPts.length() > 0) { std::vector vecX; std::vector vecY; std::vector vecZ; for (int i = 0; i < arPts.length(); ++i) { vecX.push_back(arPts[i].x); vecY.push_back(arPts[i].y); vecZ.push_back(arPts[i].z); } AcGePoint3d ptLow,ptUp; ptLow.x = *(std::min_element(vecX.begin(),vecX.end())); ptLow.y = *(std::min_element(vecY.begin(),vecY.end())); ptLow.z = *(std::min_element(vecZ.begin(),vecZ.end())); ptUp.x = *(std::max_element(vecX.begin(),vecX.end())); ptUp.y = *(std::max_element(vecY.begin(),vecY.end())); ptUp.z = *(std::max_element(vecZ.begin(),vecZ.end())); ext.set(ptLow,ptUp); } return 0; } //获取外壳 int TEImpCabReducer::GetXBaseShellNorDifR(TXShell& xShell) { int nRet = 0; if (m_pXDataMap == NULL) return 0; int nCover = 0; AcGeVector3d vtNormal,vtDir; AcGePoint3d ptGeS,ptGeE; double dHeight = 0.0,dHeight2 = 0.0;// dHeight2 长高度 double dWidth = 0.0,dWidth2 = 0.0; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; nRows = 5; nColums = 2; AcGeVector3d vtH = vtDir; AcGeVector3d vtV = vtH; vtV.rotateBy(dAngle,vtNormal); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtH = ptGeE - ptGeS; vtV = vtDir; vtNormal = vtDir; vtNormal.rotateBy(dAngle, vtH); vtNormal.normalize(); } vtV.normalize(); vtH.normalize(); lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return 0; AcGePoint3d ptTemp; ptTemp = ptGeS + vtV * (dWidth / 2.0); lstVertex[2] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; ptTemp = ptGeS - vtV * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[6] = ptTemp + vtNormal * dHeight; ptTemp = ptGeE + vtV * (dWidth2 / 2.0); lstVertex[3] = ptTemp; lstVertex[1] = ptTemp + vtNormal * dHeight2; ptTemp = ptGeE - vtV * (dWidth2 / 2.0); lstVertex[5] = ptTemp; lstVertex[7] = ptTemp + vtNormal * dHeight2; xShell.AppendFace(new AcDbFace(lstVertex[2],lstVertex[0],lstVertex[6],lstVertex[4])); xShell.AppendFace(new AcDbFace(lstVertex[2],lstVertex[0],lstVertex[1],lstVertex[3])); xShell.AppendFace(new AcDbFace(lstVertex[3],lstVertex[1],lstVertex[7],lstVertex[5])); xShell.AppendFace(new AcDbFace(lstVertex[4],lstVertex[6],lstVertex[7],lstVertex[5])); xShell.AppendFace(new AcDbFace(lstVertex[2],lstVertex[4],lstVertex[5],lstVertex[3])); xShell.AppendFace(new AcDbFace(lstVertex[0],lstVertex[6],lstVertex[7],lstVertex[1])); delete []lstVertex; nRet = 1; } return nRet; } int TEImpCabReducer::GetXBaseShellOffDifR(TXShell& xShell) { int nRet = 0; if (m_pXDataMap == NULL) return 0; int nCover = 0; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal; double dLen = 0.0; double dWidth = 0.0,dWidth2 = 0.0; double dHeight = 0.0,dHeight2 = 0.0;// 长高度 if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) ) { double dLen1 = dLen / 3.0; double dLen2 = dLen1; double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; AcGeVector3d vtRed,vtOff; if (m_pXDataMap->GetAt(KEY_MAINDIR,vtRed) && m_pXDataMap->GetAt(KEY_BRDIR,vtOff) ) { nRows = 5; vtRed.normalize(); vtOff.normalize(); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtNormal = vtOff; vtNormal.rotateBy(dAngle,vtRed); vtNormal.normalize(); } nColums = 4; lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS - vtOff * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; lstVertex[5] = ptTemp + vtRed * dLen1; lstVertex[1] = lstVertex[5] + vtNormal * dHeight; ptTemp = ptGeS + vtOff * (dWidth / 2.0); lstVertex[8] = ptTemp; lstVertex[12] = ptTemp + vtNormal * dHeight; lstVertex[9] = ptTemp + vtRed * dLen1; lstVertex[13] = lstVertex[9] + vtNormal * dHeight; ptTemp = ptGeE - vtOff * (dWidth2 / 2.0); lstVertex[7] = ptTemp; lstVertex[3] = ptTemp + vtNormal * dHeight2; lstVertex[6] = ptTemp - vtRed * dLen2; lstVertex[10] = lstVertex[6] + vtOff * dWidth2; lstVertex[2] = lstVertex[3] - vtRed * dLen2; ptTemp = ptGeE + vtOff * (dWidth2 / 2.0); lstVertex[11] = ptTemp; lstVertex[15] = ptTemp + vtNormal * dHeight2; lstVertex[14] = lstVertex[15] - vtRed * dLen2; lstVertex[16] = lstVertex[0]; lstVertex[17] = lstVertex[1]; lstVertex[18] = lstVertex[2]; lstVertex[19] = lstVertex[3]; xShell.AppendFace(new AcDbFace(lstVertex[0],lstVertex[1],lstVertex[5],lstVertex[4])); xShell.AppendFace(new AcDbFace(lstVertex[1],lstVertex[2],lstVertex[6],lstVertex[5])); xShell.AppendFace(new AcDbFace(lstVertex[2],lstVertex[3],lstVertex[7],lstVertex[6])); xShell.AppendFace(new AcDbFace(lstVertex[4],lstVertex[5],lstVertex[9],lstVertex[8])); xShell.AppendFace(new AcDbFace(lstVertex[5],lstVertex[6],lstVertex[10],lstVertex[9])); xShell.AppendFace(new AcDbFace(lstVertex[6],lstVertex[7],lstVertex[11],lstVertex[10])); xShell.AppendFace(new AcDbFace(lstVertex[8],lstVertex[9],lstVertex[13],lstVertex[12])); xShell.AppendFace(new AcDbFace(lstVertex[9],lstVertex[10],lstVertex[14],lstVertex[13])); xShell.AppendFace(new AcDbFace(lstVertex[10],lstVertex[11],lstVertex[15],lstVertex[14])); xShell.AppendFace(new AcDbFace(lstVertex[12],lstVertex[13],lstVertex[17],lstVertex[16])); xShell.AppendFace(new AcDbFace(lstVertex[13],lstVertex[14],lstVertex[18],lstVertex[17])); xShell.AppendFace(new AcDbFace(lstVertex[14],lstVertex[15],lstVertex[19],lstVertex[18])); xShell.AppendFace(new AcDbFace(lstVertex[0],lstVertex[4],lstVertex[8],lstVertex[12])); xShell.AppendFace(new AcDbFace(lstVertex[3],lstVertex[7],lstVertex[11],lstVertex[15])); delete []lstVertex; nRet = 1; } } return nRet; } //获取体的范围方块 int TEImpCabReducer::GetBodyBoxNorDifR(AcDbExtents& ext) { int nRet = 0; if (m_pXDataMap == NULL) return 0; int nCover = 0; AcGeVector3d vtNormal,vtDir; AcGePoint3d ptGeS,ptGeE; double dHeight = 0.0,dHeight2 = 0.0;// dHeight2 长高度 double dWidth = 0.0,dWidth2 = 0.0; if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) && m_pXDataMap->GetAt(KEY_MAINDIR,vtDir) ) { double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; nRows = 5; nColums = 2; AcGeVector3d vtH = vtDir; AcGeVector3d vtV = vtH; vtV.rotateBy(dAngle,vtNormal); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtH = ptGeE - ptGeS; vtV = vtDir; vtNormal = vtDir; vtNormal.rotateBy(dAngle, vtH); vtNormal.normalize(); } vtV.normalize(); vtH.normalize(); lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return 0; AcGePoint3d ptTemp; ptTemp = ptGeS + vtV * (dWidth / 2.0); lstVertex[2] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; ptTemp = ptGeS - vtV * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[6] = ptTemp + vtNormal * dHeight; ptTemp = ptGeE + vtV * (dWidth2 / 2.0); lstVertex[3] = ptTemp; lstVertex[1] = ptTemp + vtNormal * dHeight2; ptTemp = ptGeE - vtV * (dWidth2 / 2.0); lstVertex[5] = ptTemp; lstVertex[7] = ptTemp + vtNormal * dHeight2; AcGePoint3dArray arPts; for (int i = 0; i < 8; ++i) { arPts.append(lstVertex[i]); } GetBoxExtendByPts(arPts,ext); delete []lstVertex; nRet = 1; } return nRet; } int TEImpCabReducer::GetBodyBoxOffDifR(AcDbExtents& ext) { int nRet = 0; if (m_pXDataMap == NULL)return 0; int nCover = 0; AcGePoint3d ptGeS,ptGeE; AcGeVector3d vtNormal; double dLen = 0.0; double dWidth = 0.0,dWidth2 = 0.0; double dHeight = 0.0,dHeight2 = 0.0;// 长高度 if (m_pXDataMap->GetAt(KEY_START,ptGeS) && m_pXDataMap->GetAt(KEY_END,ptGeE) && m_pXDataMap->GetAt(KEY_L,dLen) && m_pXDataMap->GetAt(KEY_B1,dWidth) && m_pXDataMap->GetAt(KEY_B2,dWidth2) && m_pXDataMap->GetAt(KEY_H1,dHeight) && m_pXDataMap->GetAt(KEY_H2,dHeight2) && m_pXDataMap->GetAt(KEY_NORMAL,vtNormal) && m_pXDataMap->GetAt(KEY_COVER,nCover) ) { double dLen1 = dLen / 3.0; double dLen2 = dLen1; double dAngle = PI / 2.0; Adesk::UInt32 nRows = 0; Adesk::UInt32 nColums = 0; AcGePoint3d* lstVertex = NULL; AcGeVector3d vtRed,vtOff; if (m_pXDataMap->GetAt(KEY_MAINDIR,vtRed) && m_pXDataMap->GetAt(KEY_BRDIR,vtOff) ) { nRows = 5; vtRed.normalize(); vtOff.normalize(); AcGeLine3d line; line.set(AcGePoint3d::kOrigin,vtNormal); if (AcGePlane::kXYPlane.isParallelTo(line)) { vtNormal = vtOff; vtNormal.rotateBy(dAngle,vtRed); vtNormal.normalize(); } nColums = 4; lstVertex = new AcGePoint3d[nRows * nColums]; if (lstVertex == NULL) return FALSE; AcGePoint3d ptTemp; ptTemp = ptGeS - vtOff * (dWidth / 2.0); lstVertex[4] = ptTemp; lstVertex[0] = ptTemp + vtNormal * dHeight; lstVertex[5] = ptTemp + vtRed * dLen1; lstVertex[1] = lstVertex[5] + vtNormal * dHeight; ptTemp = ptGeS + vtOff * (dWidth / 2.0); lstVertex[8] = ptTemp; lstVertex[12] = ptTemp + vtNormal * dHeight; lstVertex[9] = ptTemp + vtRed * dLen1; lstVertex[13] = lstVertex[9] + vtNormal * dHeight; ptTemp = ptGeE - vtOff * (dWidth2 / 2.0); lstVertex[7] = ptTemp; lstVertex[3] = ptTemp + vtNormal * dHeight2; lstVertex[6] = ptTemp - vtRed * dLen2; lstVertex[10] = lstVertex[6] + vtOff * dWidth2; lstVertex[2] = lstVertex[3] - vtRed * dLen2; ptTemp = ptGeE + vtOff * (dWidth2 / 2.0); lstVertex[11] = ptTemp; lstVertex[15] = ptTemp + vtNormal * dHeight2; lstVertex[14] = lstVertex[15] - vtRed * dLen2; AcGePoint3dArray arPts; for (int i = 0; i < 16; ++i) { arPts.append(lstVertex[i]); } GetBoxExtendByPts(arPts,ext); delete []lstVertex; nRet = 1; } } return nRet; } CString TEImpCabReducer::GetXml() const { if (m_pXDataMap == NULL || m_pOwnerEnt == NULL) { return _T(""); } int nValue(0); double dValue(0.0); int nSizePreci(3), nPtPreci(6); // 尺寸、位置精度 TXmlTree xmlTree; CString csText; AcGePoint3d pt; AcGePoint3dArray arPts; AcGeVector3d vtDir; CString csX, csY, csZ; POSITION posRoot = xmlTree.Insert(_T("ATS_EFITTING"), NULL, NULL); { CString sTemp = _T(""); sTemp.Format(_T("%d"),TDb::eReduce); xmlTree.SetAttribute(posRoot, _T("name"), sTemp); xmlTree.SetAttribute(posRoot, _T("comment"), _T("变径")); } POSITION nowPos = xmlTree.Insert(KEY_STYLE,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("类型")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:槽式,1:盘式,2:梯式")); m_pXDataMap->GetAt(KEY_STYLE,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_REDUCER,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("变径样式")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("1:槽式下平异径接头..")); m_pXDataMap->GetAt(KEY_REDUCER,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_START,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("起点")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("起点")); m_pXDataMap->GetAt(KEY_START,pt); TAuxTools::DoubleToString(pt.x,nPtPreci,csX); TAuxTools::DoubleToString(pt.y,nPtPreci,csY); TAuxTools::DoubleToString(pt.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_END,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("终点")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("终点")); m_pXDataMap->GetAt(KEY_END,pt); TAuxTools::DoubleToString(pt.x,nPtPreci,csX); TAuxTools::DoubleToString(pt.y,nPtPreci,csY); TAuxTools::DoubleToString(pt.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_L,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("长度")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("长度")); m_pXDataMap->GetAt(KEY_L,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_B1,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("宽度1")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("宽度1")); m_pXDataMap->GetAt(KEY_B1,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_H1,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("高度1")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("高度1")); m_pXDataMap->GetAt(KEY_H1,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_B2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("宽度2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("宽度2")); m_pXDataMap->GetAt(KEY_B2,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_H2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("高度2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("高度2")); m_pXDataMap->GetAt(KEY_H2,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_MAINDIR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("主分支向量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("主分支向量")); m_pXDataMap->GetAt(KEY_MAINDIR,vtDir); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_BRDIR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("分向量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("分支向量")); m_pXDataMap->GetAt(KEY_BRDIR,vtDir); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_NORMAL,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("法相量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("法相量")); m_pXDataMap->GetAt(KEY_NORMAL,vtDir); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_HAVE_CLAPBOARD,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("有无隔板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:无,1:有")); m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_SHOW_CLAPBOARD,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:不显示,1:显示")); m_pXDataMap->GetAt(KEY_SHOW_CLAPBOARD,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_MAJBR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板向量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板偏移向量")); m_pXDataMap->GetAt(KEY_MAJBR,vtDir); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_CLAPBOARD_DATA,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板数据")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板尺寸*通道码;隔板尺寸*通道码;")); m_pXDataMap->GetAt(KEY_CLAPBOARD_DATA,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_CLAPBOARD_DATA2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板数据2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板尺寸*通道码;隔板尺寸*通道码;")); m_pXDataMap->GetAt(KEY_CLAPBOARD_DATA2,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_COVER,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("盖板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:不显示,1:显示")); m_pXDataMap->GetAt(KEY_COVER,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(_T("Object_ID"),posRoot,NULL); { xmlTree.SetAttribute(nowPos,_T("name"),_T("ID")); xmlTree.SetAttribute(nowPos,_T("comment"),_T("桥架ID")); LONG_PTR nid = m_pOwnerEnt->objectId().asOldId(); csText.Format(_T("%ld"),nid); xmlTree.SetItemText(nowPos,csText); } CString csXml = xmlTree.GetXml(); return csXml; } CString TEImpCabReducer::GetXml(const AcGeMatrix3d& mat) const { if (m_pXDataMap == NULL || m_pOwnerEnt == NULL) { return _T(""); } int nValue(0); double dValue(0.0); int nSizePreci(3), nPtPreci(6); // 尺寸、位置精度 TXmlTree xmlTree; CString csText; AcGePoint3d pt; AcGePoint3dArray arPts; AcGeVector3d vtDir; CString csX, csY, csZ; POSITION posRoot = xmlTree.Insert(_T("ATS_EFITTING"), NULL, NULL); { CString sTemp = _T(""); sTemp.Format(_T("%d"),TDb::eReduce); xmlTree.SetAttribute(posRoot, _T("name"), sTemp); xmlTree.SetAttribute(posRoot, _T("comment"), _T("变径")); } POSITION nowPos = xmlTree.Insert(KEY_STYLE,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("类型")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:槽式,1:盘式,2:梯式")); m_pXDataMap->GetAt(KEY_STYLE,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_REDUCER,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("变径样式")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("1:槽式下平异径接头..")); m_pXDataMap->GetAt(KEY_REDUCER,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_START,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("起点")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("起点")); m_pXDataMap->GetAt(KEY_START,pt); pt.transformBy(mat); TAuxTools::DoubleToString(pt.x,nPtPreci,csX); TAuxTools::DoubleToString(pt.y,nPtPreci,csY); TAuxTools::DoubleToString(pt.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_END,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("终点")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("终点")); m_pXDataMap->GetAt(KEY_END,pt); pt.transformBy(mat); TAuxTools::DoubleToString(pt.x,nPtPreci,csX); TAuxTools::DoubleToString(pt.y,nPtPreci,csY); TAuxTools::DoubleToString(pt.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_L,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("长度")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("长度")); m_pXDataMap->GetAt(KEY_L,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_B1,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("宽度1")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("宽度1")); m_pXDataMap->GetAt(KEY_B1,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_H1,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("高度1")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("高度1")); m_pXDataMap->GetAt(KEY_H1,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_B2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("宽度2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("宽度2")); m_pXDataMap->GetAt(KEY_B2,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_H2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("高度2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("高度2")); m_pXDataMap->GetAt(KEY_H2,dValue); TAuxTools::DoubleToString(dValue,nSizePreci,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_MAINDIR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("主分支向量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("主分支向量")); m_pXDataMap->GetAt(KEY_MAINDIR,vtDir); vtDir.transformBy(mat); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_BRDIR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("分向量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("分支向量")); m_pXDataMap->GetAt(KEY_BRDIR,vtDir); vtDir.transformBy(mat); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_NORMAL,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("法相量")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("法相量")); m_pXDataMap->GetAt(KEY_NORMAL,vtDir); vtDir.transformBy(mat); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } int nHaveClapBoard = -1; nowPos = xmlTree.Insert(KEY_HAVE_CLAPBOARD,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("有无隔板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:无,1:有")); m_pXDataMap->GetAt(KEY_HAVE_CLAPBOARD,nHaveClapBoard); csText.Format(_T("%d"),nHaveClapBoard); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_SHOW_CLAPBOARD,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:不显示,1:显示")); m_pXDataMap->GetAt(KEY_SHOW_CLAPBOARD,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } //axc add 2013-11-28 if (TDb::eShowBoard == nValue && TDb::eBoard == nHaveClapBoard) { vtDir.set(0,0,0); nowPos = xmlTree.Insert(KEY_CLAPBOARD_MAINBR,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板向量1")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板偏移向量1")); m_pXDataMap->GetAt(KEY_CLAPBOARD_MAINBR,vtDir); vtDir.transformBy(mat); TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); csText.Format(_T("%s,%s,%s"),csX,csY,csZ); xmlTree.SetItemText(nowPos,csText); } //有隔板,则导出隔板数据 nowPos = xmlTree.Insert(KEY_CLAPBOARD_DATA,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板数据")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板尺寸*通道码;隔板尺寸*通道码;")); m_pXDataMap->GetAt(KEY_CLAPBOARD_DATA,csText); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(KEY_CLAPBOARD_DATA2,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板数据2")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板尺寸*通道码;隔板尺寸*通道码;")); m_pXDataMap->GetAt(KEY_CLAPBOARD_DATA2,csText); xmlTree.SetItemText(nowPos,csText); } } //nowPos = xmlTree.Insert(KEY_MAJBR,posRoot,NULL); //{ // vtDir.set(0,0,0); // xmlTree.SetAttribute(nowPos, _T("name"), _T("隔板向量")); // xmlTree.SetAttribute(nowPos, _T("comment"), _T("隔板偏移向量")); // m_pXDataMap->GetAt(KEY_MAJBR,vtDir); // vtDir.transformBy(mat); // TAuxTools::DoubleToString(vtDir.x,nPtPreci,csX); // TAuxTools::DoubleToString(vtDir.y,nPtPreci,csY); // TAuxTools::DoubleToString(vtDir.z,nPtPreci,csZ); // csText.Format(_T("%s,%s,%s"),csX,csY,csZ); // xmlTree.SetItemText(nowPos,csText); //} nowPos = xmlTree.Insert(KEY_COVER,posRoot,NULL); { xmlTree.SetAttribute(nowPos, _T("name"), _T("盖板")); xmlTree.SetAttribute(nowPos, _T("comment"), _T("0:不显示,1:显示")); m_pXDataMap->GetAt(KEY_COVER,nValue); csText.Format(_T("%d"),nValue); xmlTree.SetItemText(nowPos,csText); } nowPos = xmlTree.Insert(_T("Object_ID"),posRoot,NULL); { xmlTree.SetAttribute(nowPos,_T("name"),_T("ID")); xmlTree.SetAttribute(nowPos,_T("comment"),_T("桥架ID")); LONG_PTR nid = m_pOwnerEnt->objectId().asOldId(); csText.Format(_T("%ld"),nid); xmlTree.SetItemText(nowPos,csText); } CString csXml = xmlTree.GetXml(); return csXml; } bool TEImpCabReducer::GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs) const { if (NULL == m_pOwnerEnt || NULL == m_pXDataMap) return false; // 基本参数 AcDbObjectId idObj = m_pOwnerEnt->objectId(); AcDbObjectId idLayer = m_pOwnerEnt->layerId(); TGGeSectionPlane section_pln(face, vtPlaneSecDir); // 构造一个辅助剖面 AcDbVoidPtrArray arFaces; XExplodeStream dc(arFaces); ExplodeOrDraw3d(dc); double dElevation = 0; AcDbEntity* pEnt = NULL; AcDbFace* pFace = NULL; int i = 0; for(i = 0; i < arFaces.length(); ++i) { pEnt = (AcDbEntity*)arFaces[i]; if (NULL == pEnt) continue; pFace = AcDbFace::cast(pEnt); if (pFace) { TGGeSectionPlane pln(*pFace, vtPlaneSecDir); TGGePoly2D poly; dElevation = SectionUtility::Projection_plane2plane(section_pln, pln, poly); if (poly.Length()) sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_EFITTING, dElevation, poly)); } delete pEnt; } return true; } // 剖切用,返回Z坐标最高、最低点 Acad::ErrorStatus TEImpCabReducer::GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const { AcGePoint3d ptS,ptE; double dHight = 0.0; AcGeVector3d vtNor; m_pXDataMap->GetAt(KEY_START,ptS); m_pXDataMap->GetAt(KEY_END,ptE); m_pXDataMap->GetAt(KEY_H,dHight); ptLow = ptS; ptUp = ptE; ptUp.z += dHight; return Acad::eOk; }