#include "stdafx.h" #include "TImpSpecEquipment.h" #include "TDbInterfaceRecord.h" #include "TDbXDataMap.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif TImpSpecEquipment::TImpSpecEquipment() { m_pXDataMap = NULL; m_pOwnerEnt = NULL; } TImpSpecEquipment::~TImpSpecEquipment() { } void TImpSpecEquipment::Destroy() { delete this; } void TImpSpecEquipment::SetData(const TDbXDataMap* pMap) { m_pXDataMap->CopyFrom(pMap); } BOOL TImpSpecEquipment::GetInterface(int nIndex,TInterface& pipeInterface) const { CString sIntf; int nPos = 0,nCount = 0; AcGeMatrix3d xform; xform.setToIdentity(); if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_XFORM,xform); } while(TRUE) { if (m_pXDataMap != NULL && m_pXDataMap->GetAt(KEY_INTF,nIndex,sIntf)) { nCount += 1; } else { break; } if (nPos == nIndex) { //解析 //接口定义 (vt),(pt),(Descr),L(D),W,nType // (10,10,10),(200,200,200),("xxxx"),50,0,0 //圆接口 CString sScript; m_pXDataMap->GetAt(KEY_INTF,nPos,sScript); int nIndex = sScript.Find(_T(')'),0); int nIndex1 = sScript.Find(_T('('),0); if (nIndex1 == 0 && nIndex != -1) { CString sDir = sScript.Mid(nIndex1 + 1,nIndex - nIndex1 - 1); AcGeVector3d vtDir; if (!StringToAcGeVector3d(sDir,vtDir)) { return FALSE; } nIndex = sScript.Find(_T('('),nIndex); if (nIndex == -1) return FALSE; nIndex1 = sScript.Find(_T(')'),nIndex); CString sPt; AcGePoint3d ptGe; if (nIndex != -1 && nIndex1 != -1) { sPt = sScript.Mid(nIndex + 1,nIndex1 - nIndex - 1); } else { return FALSE; } StringToAcGePoint3d(sPt,ptGe); ptGe.transformBy(xform); vtDir.transformBy(xform); pipeInterface.SetPosition(ptGe); pipeInterface.SetOutDir(vtDir); nIndex = sScript.Find(_T('('),nIndex1); nIndex1 = sScript.Find(_T(')'),nIndex); if (nIndex == -1 || nIndex1 == -1) return FALSE; CString sDescr = sScript.Mid(nIndex + 1,nIndex1 - nIndex - 1); pipeInterface.SetDescr(sDescr); CString sSize = sScript.Mid(nIndex1 + 1); sSize.TrimLeft(_T(',')); CStringArray arSize; Script2StringArray(sSize,_T(','),arSize); if (arSize.GetSize() == 3) { double dSize = _ttof(arSize.GetAt(0)); double dSize1 = _ttof(arSize.GetAt(1)); pipeInterface.SetSize(dSize,dSize1); short nType = _ttoi(arSize.GetAt(2)); pipeInterface.SetType(nType); } return TRUE; } break; } nIndex += 1; } return FALSE; } BOOL TImpSpecEquipment::GetInterface(const AcGePoint3d& ptCon,TInterface& pipeInterface) const { TInterface intf; int nCount = GetInterfaceCount(); for (int i = 0;i < nCount;i++) { GetInterface(i,intf); if (intf.GetPosition().distanceTo(ptCon) < 1.e-3) { return TRUE; } } return FALSE; } BOOL TImpSpecEquipment::HasInterface(const AcGePoint3d& ptCon,const AcGeVector3d& vtDir) { TInterface intf; if (GetInterface(ptCon,intf)) { if (vtDir.isParallelTo(intf.GetOutDir())) { return TRUE; } } return FALSE; } int TImpSpecEquipment::GetInterfaceCount() const { CString sIntf; int nIndex = 0,nCount = 0; while(TRUE) { if (m_pXDataMap != NULL && m_pXDataMap->GetAt(KEY_INTF,nIndex,sIntf)) { nCount += 1; } else { break; } nIndex += 1; } return nCount; } BOOL TImpSpecEquipment::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { return FALSE; } BOOL TImpSpecEquipment::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { return FALSE; } BOOL TImpSpecEquipment::NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { return FALSE; } TDbXDataMap* TImpSpecEquipment::GetSpecialtyData() { return m_pXDataMap; } Acad::ErrorStatus TImpSpecEquipment::setNormal(const AcGeVector3d& vtNorm) { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::copyFrom(const TImpSpecEquipment* pSrc) { m_pXDataMap->CopyFrom(pSrc->m_pXDataMap); return Acad::eOk; } AcGeVector3d TImpSpecEquipment::normal() const { AcGeVector3d vt = AcGeVector3d::kZAxis; if (m_pXDataMap != NULL) { m_pXDataMap->GetAt(KEY_NORMAL,vt); } return vt; } BOOL TImpSpecEquipment::MakeCurves(TComplexCurve& cplCurve) const { return FALSE; } BOOL TImpSpecEquipment::GetCurvesInSide(TComplexCurve& compCurve) const { return FALSE; } AcDbPolyline* TImpSpecEquipment::MakePolyCurve() const { return NULL; } BOOL TImpSpecEquipment::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces) { return FALSE; } void TImpSpecEquipment::GetKindName(CString& sName) { sName = _T("TCH_sEEQUIPMENT"); } BOOL TImpSpecEquipment::GetGeomExtentsEdge(TComplexCurve& crLoop) { return FALSE; } TDb::Position TImpSpecEquipment::ExplainGripIndex(int nIndex) const { return TDb::eStart; } Acad::ErrorStatus TImpSpecEquipment::GetGripText(int i, CString &cs) const { return Acad::eOk; } void TImpSpecEquipment::GetTips(CMapStringToString& mapLable2Tip) const { } Acad::ErrorStatus TImpSpecEquipment::ExplodeOrDraw3d(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) return Acad::eOk; //1.获取基本放置信息 AcGeMatrix3d xform; m_pXDataMap->GetAt(KEY_XFORM,xform); CString sScript; int nIndex = 0,nGsMark = 1; TDbXDataMap xDataMap; while(TRUE) { xDataMap.Empty(); if (m_pXDataMap->GetAt(KEY_BODY,nIndex,xDataMap)) { //长方体 面 L x W x H + 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_BOX,sScript)) { ExplodeOrDraw3d_Box(sScript,xform,mode,nGsMark); } //圆锥体 面 R x h + 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_CONE,sScript)) { ExplodeOrDraw3d_Cone(sScript,xform,mode,nGsMark); } //圆台 R x r x h + 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_ECONE,sScript)) { ExplodeOrDraw3d_ECone(sScript,xform,mode,nGsMark); } //圆柱面 r x h + 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_CYLN,sScript)) { ExplodeOrDraw3d_Cyln(sScript,xform,mode,nGsMark); } //四边形台柱 L1,W1 L2,W2, H + 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_DUCTR,sScript)) { ExplodeOrDraw3d_Ductr(sScript,xform,mode,nGsMark); } //半椭球封头 R,r (r=h),+ 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_HELB,sScript))//半椭球封头 { ExplodeOrDraw3d_Helb(sScript,xform,mode,nGsMark); } //半球体面 R,+ 中心点pt + entry[4] 坐标系 if (xDataMap.GetAt(KEY_HESP,sScript))//半球体面 { ExplodeOrDraw3d_Hesp(sScript,xform,mode,nGsMark); } nGsMark += 1; } else { break; } nIndex += 1; } return Acad::eOk; } BOOL TImpSpecEquipment::StringToAcGeVector3d(CString& sText,AcGeVector3d& vt) const { //x,y,z AcGePoint3d ptGe; if (StringToAcGePoint3d(sText,ptGe)) { vt = ptGe.asVector(); return TRUE; } return FALSE; } BOOL TImpSpecEquipment::StringToAcGePoint3d(CString& sText,AcGePoint3d& ptGe) const { //x,y,z CString sX,sY,sZ; int nFr = sText.Find(_T(","),0); if (nFr != -1) { CString sTemp; sX = sText.Mid(0,nFr); if (nFr + 1 < sText.GetLength()) { sTemp = sText.Mid(nFr + 1); sText = sTemp; nFr = sText.Find(_T(","),0); if (nFr != -1) { sY = sText.Mid(0,nFr); if (nFr + 1 < sText.GetLength()) { sZ = sText.Mid(nFr + 1); ptGe.set(_ttof(sX),_ttof(sY),_ttof(sZ)); return TRUE; } } } } return FALSE; } BOOL TImpSpecEquipment::Script2StringArray(const CString& sScript,TCHAR tSpace,CStringArray& arTexts) const { //x,y,z,d,a int nPos = -1,nStart = 0; CString sText; while(TRUE) { nPos = sScript.Find(tSpace,nStart); if (nPos != -1) { sText = sScript.Mid(nStart,nPos - nStart); arTexts.Add(sText); nStart = nPos + 1; } else { if (nStart < sScript.GetLength()) { sText = sScript.Mid(nStart); arTexts.Add(sText); break; } else { break; } } } return arTexts.GetSize() > 0; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Box(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //长方体 面 L x W x H ,中心点pt + 坐标系 //200,200,300,(10,10,12.5),(x,y,z),(x,y,z),(x,y,z) int nIndex = sScript.Find(_T("("),0); if (nIndex != -1) { //1. 尺寸 CString sLWH = sScript.Mid(0,nIndex); sLWH.TrimRight(_T(",")); int nPos1 = sLWH.Find(_T(','),0); int nPos2 = sLWH.ReverseFind(_T(',')); if (nPos1 == -1 || nPos2 == -1) { return FALSE; } CString sL,sW,sH; sL = sLWH.Mid(0,nPos1); sW = sLWH.Mid(nPos1 + 1,nPos2 - nPos1 - 1); sH = sLWH.Mid(nPos2 + 1); double dL = _ttof(sL); double dW = _ttof(sW); double dH = _ttof(sH); //2.中心点 nPos2 = sScript.Find(_T(')')); if (nPos2 == -1) return FALSE; CString sPt = sScript.Mid(nIndex + 1,nPos2 - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) { return FALSE; } //3.坐标系 //(x,y,z),(x,y,z),(x,y,z) CString sCoord = sScript.Mid(nPos2 + 1); sCoord.TrimLeft(_T('(')); sCoord.TrimRight(_T(')')); sCoord.Replace(_T('('),_T(' ')); sCoord.Replace(_T(')'),_T(' ')); sCoord.TrimLeft(); sCoord.TrimRight(); sCoord.TrimLeft(_T(',')); CStringArray arTexts; Script2StringArray(sCoord,_T(','),arTexts); if (arTexts.GetSize() != 9) return FALSE; AcGeVector3d vtL,vtW,vtH; vtL.set(_ttof(arTexts.GetAt(0)),_ttof(arTexts.GetAt(1)),_ttof(arTexts.GetAt(2))); vtW.set(_ttof(arTexts.GetAt(3)),_ttof(arTexts.GetAt(4)),_ttof(arTexts.GetAt(5))); vtH.set(_ttof(arTexts.GetAt(6)),_ttof(arTexts.GetAt(7)),_ttof(arTexts.GetAt(8))); vtL.normalize(); vtW.normalize(); vtH.normalize(); //4.画BOX AcGePoint3d ptGeFace[4]; //4.1 上 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] += dL * 0.5 * vtL; ptGeFace[0] -= dW * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] + dW * vtW; ptGeFace[2] = ptGeFace[1] - dL * vtL; ptGeFace[3] = ptGeFace[2] - dW * vtW; //再变换到当前位置 AcDbFace face; for (int i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.2 下 ptGeFace[0] = ptGeCen; ptGeFace[0] += dL * 0.5 * vtL; ptGeFace[0] -= dW * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] + dW * vtW; ptGeFace[2] = ptGeFace[1] - dL * vtL; ptGeFace[3] = ptGeFace[2] - dW * vtW; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.3 前 ptGeFace[0] = ptGeCen; ptGeFace[0] += dW * 0.5 * vtW; ptGeFace[0] += dH * vtH; ptGeFace[0] += dL * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] - dH * vtH; ptGeFace[2] = ptGeFace[1] - dL * vtL; ptGeFace[3] = ptGeFace[2] + dH * vtH; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.4 后 ptGeFace[0] = ptGeCen; ptGeFace[0] -= dW * 0.5 * vtW; ptGeFace[0] += dH * vtH; ptGeFace[0] += dL * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] - dH * vtH; ptGeFace[2] = ptGeFace[1] - dL * vtL; ptGeFace[3] = ptGeFace[2] + dH * vtH; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.5 右 ptGeFace[0] = ptGeCen; ptGeFace[0] += dL * 0.5 * vtL; ptGeFace[0] += dH * vtH; ptGeFace[0] -= dW * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] - dH * vtH; ptGeFace[2] = ptGeFace[1] + dW * vtW; ptGeFace[3] = ptGeFace[2] + dH * vtH; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.6 左 ptGeFace[0] = ptGeCen; ptGeFace[0] -= dL * 0.5 * vtL; ptGeFace[0] += dH * vtH; ptGeFace[0] -= dW * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] - dH * vtH; ptGeFace[2] = ptGeFace[1] + dW * vtW; ptGeFace[3] = ptGeFace[2] + dH * vtH; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); return TRUE; } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Cone(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //圆锥体面 R,h,(中心点pt),(中心向量) // 500,400,(10,10,10),(0,0,1) int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sRh; sRh = sScript.Mid(0,nIndex); sRh.TrimRight(_T(',')); sRh.TrimLeft(); CStringArray arTexts; Script2StringArray(sRh,_T(','),arTexts); if (arTexts.GetSize() != 2) return FALSE; double dR = _ttof(arTexts.GetAt(0)); double dH = _ttof(arTexts.GetAt(1)); CString sPt; int nPos2 = sScript.Find(_T(')'),0); if (nPos2 != -1) { sPt = sScript.Mid(nIndex + 1,nPos2 - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) return FALSE; CString sVt; nIndex = sScript.Find(_T('('),nPos2 + 1); sVt = sScript.Mid(nIndex); sVt.TrimLeft(_T('(')); sVt.TrimRight(_T(')')); AcGeVector3d vtH; if (!StringToAcGeVector3d(sVt,vtH)) return FALSE; vtH.normalize(); AcGePoint3d ptGe[3]; ptGe[0] = ptGeCen; ptGe[1] = ptGeCen + dH * vtH; AcGeVector3d vtX = vtH.perpVector(); vtX.normalize(); ptGe[2] = ptGeCen + dR * vtX; AcDbCircle cir; cir.setCenter(ptGeCen); cir.setRadius(dR); cir.setNormal(vtH); AcGeCircArc3d geCir(ptGeCen,vtH,dR); AcGePoint3dArray points; points.setPhysicalLength(41); geCir.getSamplePoints(41,points); AcDbFace face; for (int i = 0;i <= 38;i++) { face.setVertexAt(0,points.at(i)); face.setVertexAt(1,points.at(i + 1)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,points.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,points.at(i)); face.setVertexAt(1,points.at(i + 1)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,points.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); if (i == 38) { face.setVertexAt(0,points.at(i)); face.setVertexAt(1,points.at(0)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,points.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,points.at(i)); face.setVertexAt(1,points.at(0)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,points.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); break; } } return TRUE; } } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_ECone(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //圆台 R,r,h,(中心点pt),(中心向量) // 500,400,300,(10,10,10),(0,0,1) int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sRh; sRh = sScript.Mid(0,nIndex); sRh.TrimRight(_T(',')); sRh.TrimLeft(); CStringArray arTexts; Script2StringArray(sRh,_T(','),arTexts); if (arTexts.GetSize() != 3) return FALSE; double dR = _ttof(arTexts.GetAt(0)); double dr = _ttof(arTexts.GetAt(1)); double dH = _ttof(arTexts.GetAt(2)); CString sPt; int nPos2 = sScript.Find(_T(')'),0); if (nPos2 != -1) { sPt = sScript.Mid(nIndex + 1,nPos2 - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) return FALSE; CString sVt; nIndex = sScript.Find(_T('('),nPos2 + 1); sVt = sScript.Mid(nIndex); sVt.TrimLeft(_T('(')); sVt.TrimRight(_T(')')); AcGeVector3d vtH; if (!StringToAcGeVector3d(sVt,vtH)) return FALSE; vtH.normalize(); AcGePoint3d ptGe[2]; ptGe[0] = ptGeCen; ptGe[1] = ptGeCen + dH * vtH; AcDbCircle cir; cir.setCenter(ptGeCen); cir.setRadius(dR); cir.setNormal(vtH); AcGeCircArc3d geCirB(ptGeCen,vtH,dR); AcGePoint3dArray pointsB; pointsB.setPhysicalLength(41); geCirB.getSamplePoints(41,pointsB); AcGeCircArc3d geCirT(ptGe[1],vtH,dr); AcGePoint3dArray pointsT; pointsT.setPhysicalLength(41); geCirT.getSamplePoints(41,pointsT); AcDbFace face; for (int i = 0;i <= 38;i++) { face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(i + 1)); face.setVertexAt(2,pointsT.at(i + 1)); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(i + 1)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,pointsB.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsT.at(i)); face.setVertexAt(1,pointsT.at(i + 1)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); if (i == 38) { face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(0)); face.setVertexAt(2,pointsT.at(0)); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(0)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,pointsB.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsT.at(i)); face.setVertexAt(1,pointsT.at(0)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); break; } } return TRUE; } } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Cyln(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //圆柱面 r,h,(中心点pt),(中心向量) // 500,400,(10,10,10),(0,0,1) int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sRh; sRh = sScript.Mid(0,nIndex); sRh.TrimRight(_T(',')); sRh.TrimLeft(); CStringArray arTexts; Script2StringArray(sRh,_T(','),arTexts); if (arTexts.GetSize() != 2) return FALSE; double dR = _ttof(arTexts.GetAt(0)); double dr = dR; double dH = _ttof(arTexts.GetAt(1)); CString sPt; int nPos2 = sScript.Find(_T(')'),0); if (nPos2 != -1) { sPt = sScript.Mid(nIndex + 1,nPos2 - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) return FALSE; CString sVt; nIndex = sScript.Find(_T('('),nPos2 + 1); sVt = sScript.Mid(nIndex); sVt.TrimLeft(_T('(')); sVt.TrimRight(_T(')')); AcGeVector3d vtH; if (!StringToAcGeVector3d(sVt,vtH)) return FALSE; vtH.normalize(); AcGePoint3d ptGe[2]; ptGe[0] = ptGeCen; ptGe[1] = ptGeCen + dH * vtH; AcDbCircle cir; cir.setCenter(ptGeCen); cir.setRadius(dR); cir.setNormal(vtH); AcGeCircArc3d geCirB(ptGeCen,vtH,dR); AcGePoint3dArray pointsB; pointsB.setPhysicalLength(41); geCirB.getSamplePoints(41,pointsB); AcGeCircArc3d geCirT(ptGe[1],vtH,dr); AcGePoint3dArray pointsT; pointsT.setPhysicalLength(41); geCirT.getSamplePoints(41,pointsT); AcDbFace face; for (int i = 0;i <= 38;i++) { face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(i + 1)); face.setVertexAt(2,pointsT.at(i + 1)); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(i + 1)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,pointsB.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsT.at(i)); face.setVertexAt(1,pointsT.at(i + 1)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); if (i == 38) { face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(0)); face.setVertexAt(2,pointsT.at(0)); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsB.at(i)); face.setVertexAt(1,pointsB.at(0)); face.setVertexAt(2,ptGe[0]); face.setVertexAt(3,pointsB.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); face.setVertexAt(0,pointsT.at(i)); face.setVertexAt(1,pointsT.at(0)); face.setVertexAt(2,ptGe[1]); face.setVertexAt(3,pointsT.at(i)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); break; } } return TRUE; } } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Ductr(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //四边形台柱 L1,W1,L2,W2,H,(中心点pt),(x,y,z),(x,y,z),(x,y,z)坐标系 int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sSize = sScript.Mid(0,nIndex); CStringArray arSizes; Script2StringArray(sSize,_T(','),arSizes); if (arSizes.GetSize() != 5) { return FALSE; } double dL1 = _ttof(arSizes.GetAt(0)); double dW1 = _ttof(arSizes.GetAt(1)); double dL2 = _ttof(arSizes.GetAt(2)); double dW2 = _ttof(arSizes.GetAt(3)); double dH = _ttof(arSizes.GetAt(4)); int nPos = sScript.Find(_T(')'),nIndex); CString sText = sScript.Mid(nIndex + 1,nPos - nIndex -1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sText,ptGeCen)) return FALSE; nIndex = sScript.Find(_T('('),nPos); if (nIndex == -1) return FALSE; CString sCoord = sScript.Mid(nIndex); sCoord.TrimLeft(_T('(')); sCoord.TrimRight(_T(')')); sCoord.Replace(_T('('),_T(' ')); sCoord.Replace(_T(')'),_T(' ')); sCoord.TrimLeft(); sCoord.TrimRight(); sCoord.TrimLeft(_T(',')); CStringArray arTexts; Script2StringArray(sCoord,_T(','),arTexts); if (arTexts.GetSize() != 9) return FALSE; AcGeVector3d vtL,vtW,vtH; vtL.set(_ttof(arTexts.GetAt(0)),_ttof(arTexts.GetAt(1)),_ttof(arTexts.GetAt(2))); vtW.set(_ttof(arTexts.GetAt(3)),_ttof(arTexts.GetAt(4)),_ttof(arTexts.GetAt(5))); vtH.set(_ttof(arTexts.GetAt(6)),_ttof(arTexts.GetAt(7)),_ttof(arTexts.GetAt(8))); vtL.normalize(); vtW.normalize(); vtH.normalize(); //4.画BOX AcGePoint3d ptGeFace[4]; //4.1 上 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] += dL2 * 0.5 * vtL; ptGeFace[0] -= dW2 * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] + dW2 * vtW; ptGeFace[2] = ptGeFace[1] - dL2 * vtL; ptGeFace[3] = ptGeFace[2] - dW2 * vtW; //再变换到当前位置 AcDbFace face; for (int i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.2 下 ptGeFace[0] = ptGeCen; ptGeFace[0] += dL1 * 0.5 * vtL; ptGeFace[0] -= dW1 * 0.5 * vtW; ptGeFace[1] = ptGeFace[0] + dW1 * vtW; ptGeFace[2] = ptGeFace[1] - dL1 * vtL; ptGeFace[3] = ptGeFace[2] - dW1 * vtW; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.3 左 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] += dW2 * 0.5 * vtW; ptGeFace[0] += dL2 * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] - dW2 * vtW; ptGeFace[2] = ptGeCen; ptGeFace[2] += dL1 * 0.5 * vtL; ptGeFace[2] -= dW1 * 0.5 * vtW; ptGeFace[3] = ptGeFace[2] + dW1 * vtW; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.4 右 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] += dW2 * 0.5 * vtW; ptGeFace[0] -= dL2 * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] - dW2 * vtW; ptGeFace[2] = ptGeCen; ptGeFace[2] -= dL1 * 0.5 * vtL; ptGeFace[2] -= dW1 * 0.5 * vtW; ptGeFace[3] = ptGeFace[2] + dW1 * vtW; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.5 前 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] += dW2 * 0.5 * vtW; ptGeFace[0] -= dL2 * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] + dL2 * vtL; ptGeFace[2] = ptGeCen; ptGeFace[2] += dW1 * 0.5 * vtW; ptGeFace[2] += dL1 * 0.5 * vtL; ptGeFace[3] = ptGeFace[2] - dL1 * vtL; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); //4.6 后 ptGeFace[0] = ptGeCen; ptGeFace[0] += dH * vtH; ptGeFace[0] -= dW2 * 0.5 * vtW; ptGeFace[0] -= dL2 * 0.5 * vtL; ptGeFace[1] = ptGeFace[0] + dL2 * vtL; ptGeFace[2] = ptGeCen; ptGeFace[2] -= dW1 * 0.5 * vtW; ptGeFace[2] += dL1 * 0.5 * vtL; ptGeFace[3] = ptGeFace[2] - dL1 * vtL; for (i = 0;i < 4;i++) { ptGeFace[i].transformBy(xform); face.setVertexAt(i,ptGeFace[i]); } mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); return TRUE; } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Helb(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //半椭球封头 R,h,(中心点pt),(中心向量) //500,300,(10,10,10),(0,0,1) int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sRh = sScript.Mid(0,nIndex - 1); CStringArray arRh; Script2StringArray(sRh,_T(','),arRh); if (arRh.GetSize() != 2) return FALSE; double dR = _ttof(arRh.GetAt(0)); double dh = _ttof(arRh.GetAt(1)); CString sPt; int nPos = sScript.Find(_T(')'),nIndex); if (nPos == -1) return FALSE; sPt = sScript.Mid(nIndex + 1,nPos - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) return FALSE; nPos = sScript.Find(_T('('),nPos); if (nPos == -1) return FALSE; CString sVt = sScript.Mid(nPos); sVt.TrimLeft(_T('(')); sVt.TrimRight(_T(')')); AcGeVector3d vt; if (!StringToAcGeVector3d(sVt,vt)) { return FALSE; } AcGeVector3d vtNorm = vt.perpVector(); vtNorm.normalize(); AcGeEllipArc3d elArc; AcGeVector3d vtMaj,vtMin; vtMaj = vt.crossProduct(vtNorm); vtMin = vt; elArc.set(ptGeCen,vtMaj,vtMin,dR,dh,0,PI / 2.0); AcGePoint3dArray arPts; arPts.setPhysicalLength(30); elArc.getSamplePoints(30,arPts); AcDbLine line(ptGeCen,ptGeCen + 100 * vt); AcGePoint3d ptGe,ptGeOrig; AcGePoint3dArray arPts2; AcDbFace face; //按10度每一旋转 for (int j = 0;j < 36;j++) { arPts2.setLogicalLength(0); for (int i = 0;i < arPts.length();i++) { ptGe = arPts.at(i); line.getClosestPointTo(ptGe,ptGeOrig,Adesk::kTrue); ptGe.rotateBy(PI / 18.0,vt,ptGeOrig); arPts2.append(ptGe); } //创建面 for (int n = 0;n < arPts2.length() - 1;n++) { face.setVertexAt(0,arPts.at(n)); face.setVertexAt(1,arPts2.at(n)); face.setVertexAt(2,arPts2.at(n+1)); face.setVertexAt(3,arPts.at(n+1)); mode.DrawEntity(face); } //上次调换 arPts.setLogicalLength(0); arPts.append(arPts2); } return TRUE; } return FALSE; } BOOL TImpSpecEquipment::ExplodeOrDraw3d_Hesp(CString& sScript,const AcGeMatrix3d& xform,XExplodeDraw &mode,int nGsMark) const { //球缺面封头 R,h,(中心点pt),(中心向量) //500,300,(10,10,10),(0,0,1) int nIndex = sScript.Find(_T('('),0); if (nIndex != -1) { CString sRh = sScript.Mid(0,nIndex - 1); CStringArray arRh; Script2StringArray(sRh,_T(','),arRh); if (arRh.GetSize() != 2) return FALSE; double dR = _ttof(arRh.GetAt(0)); double dh = _ttof(arRh.GetAt(1)); if (dh - dR > 1.e-10) return FALSE; CString sPt; int nPos = sScript.Find(_T(')'),nIndex); if (nPos == -1) return FALSE; sPt = sScript.Mid(nIndex + 1,nPos - nIndex - 1); AcGePoint3d ptGeCen; if (!StringToAcGePoint3d(sPt,ptGeCen)) return FALSE; nPos = sScript.Find(_T('('),nPos); if (nPos == -1) return FALSE; CString sVt = sScript.Mid(nPos); sVt.TrimLeft(_T('(')); sVt.TrimRight(_T(')')); AcGeVector3d vt; if (!StringToAcGeVector3d(sVt,vt)) { return FALSE; } AcGeVector3d vtNorm = vt.perpVector(); vtNorm.normalize(); double dStaAng = PI / 2.0 - acos((dR - dh) / dR); AcGeVector3d vtRef = vt.crossProduct(vtNorm); AcGeCircArc3d Arc; Arc.set(ptGeCen,vtNorm,vtRef,dR,dStaAng,PI / 2.0); AcGePoint3dArray arPts; arPts.setPhysicalLength(30); Arc.getSamplePoints(30,arPts); AcDbLine line(ptGeCen,ptGeCen + 100 * vt); AcGePoint3d ptGe,ptGeOrig; AcGePoint3dArray arPts2; AcDbFace face; //按10度每一旋转 for (int j = 0;j < 36;j++) { arPts2.setLogicalLength(0); for (int i = 0;i < arPts.length();i++) { ptGe = arPts.at(i); line.getClosestPointTo(ptGe,ptGeOrig,Adesk::kTrue); ptGe.rotateBy(PI / 18.0,vt,ptGeOrig); arPts2.append(ptGe); } //创建面 for (int n = 0;n < arPts2.length() - 1;n++) { face.setVertexAt(0,arPts.at(n)); face.setVertexAt(1,arPts2.at(n)); face.setVertexAt(2,arPts2.at(n+1)); face.setVertexAt(3,arPts.at(n+1)); mode.SetSelectionMarker(nGsMark); mode.DrawEntity(face); } //上次调换 arPts.setLogicalLength(0); arPts.append(arPts2); } return TRUE; } return FALSE; } Acad::ErrorStatus TImpSpecEquipment::ExplodeOrDrawBlock2d(XExplodeDraw &mode) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::ExplodeOrDrawText2d(XExplodeDraw &mode) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::ExplodeOrDraw2d(XExplodeDraw &mode) const { return Acad::eOk; } void TImpSpecEquipment::list() const { } Acad::ErrorStatus TImpSpecEquipment::transformBy(const AcGeMatrix3d& xform) { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::getStretchPoints(AcGePoint3dArray& stretchPoints) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::intersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::intersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::getOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { // change by hh 2011-07-12 支持捕捉设备上所有的点。大部分设备均可用同样 // 的方法来处理,不需要该功能或其他不同需求时,请在子类中重写该函数 AcDbVoidPtrArray arEnts, arBlocks; XExplodeStream mode(arEnts); ExplodeOrDrawBlock2d(mode); for(int i = 0; i < arEnts.length(); i++) { AcDbObject* pObj = (AcDbObject*)arEnts[i]; if(NULL == pObj) continue; AcDbBlockReference* pBloclRef = AcDbBlockReference::cast(pObj); if(NULL == pBloclRef) { AcDbEntity* pEntity = AcDbEntity::cast(pObj); if(NULL != pEntity) { pEntity->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds); pEntity->close(); } } else { pBloclRef->explode(arBlocks); pBloclRef->close(); for(int j = 0; j < arBlocks.length(); j++) { AcDbObject* pObjSub = (AcDbObject*)arBlocks[j]; if(NULL == pObjSub) continue; AcDbEntity *pEntSub = AcDbEntity::cast(pObjSub); if(NULL != pEntSub) { pEntSub->getOsnapPoints(osnapMode, gsSelectionMark, pickPoint, lastPoint, viewXform, snapPoints, geomIds); pEntSub->close(); } delete pObjSub; } arBlocks.setLogicalLength(0); } delete pObj; } return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::getGeomExtents(AcDbExtents& extents) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::getClassID(CLSID* pClsid) const { return Acad::eOk; } Acad::ErrorStatus TImpSpecEquipment::explode(AcDbVoidPtrArray& entitySet) const { return Acad::eOk; } BOOL TImpSpecEquipment::MakesureInterfaceValidate(const AcDbObjectId& id,const AcGePoint3d& ptCon,const AcGeVector3d& vtDir,TInterface& pipeInterface) const { //到命名对象字典中找; BOOL bSuccess = FALSE; // add by hh 2011-08-09 接口记录从字典移动到数据库中 TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB(); if(NULL != pIntfRec) { if (pIntfRec->Find(ptCon,vtDir,m_pOwnerEnt->objectId(),pipeInterface)) { if (pipeInterface.GetConnectObject().asOldId() == id.asOldId()) { bSuccess = TRUE; } } pIntfRec->close(); return bSuccess; } // add end AcDbDictionary* pNamedDict = NULL; if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead)) { AcDbDictionary* pDict = NULL; if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead)) { pNamedDict->close(); TDbInterfaceRecord* pInterfaceRec = NULL; if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForRead)) { pDict->close(); if (pInterfaceRec->Find(ptCon,vtDir,m_pOwnerEnt->objectId(),pipeInterface)) { if (pipeInterface.GetConnectObject().asOldId() == id.asOldId()) { bSuccess = TRUE; } } pInterfaceRec->close(); } else { pDict->close(); } } else { pNamedDict->close(); } } return bSuccess; } BOOL TImpSpecEquipment::MakesureInterfaceValidate(const AcDbObjectId& id,const AcGePoint3d& ptCon,const AcGeVector3d& vtDir) const { //到命名对象字典中找; BOOL bSuccess = FALSE; // add by hh 2011-08-09 接口记录从字典移动到数据库中 TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB(); if(NULL != pIntfRec) { TInterface pipeInterface; if (pIntfRec->Find(ptCon,vtDir,m_pOwnerEnt->objectId(),pipeInterface)) { if (pipeInterface.GetConnectObject().asOldId() == id.asOldId()) { bSuccess = TRUE; } } pIntfRec->close(); return bSuccess; } // add end AcDbDictionary* pNamedDict = NULL; if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead)) { AcDbDictionary* pDict = NULL; if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead)) { pNamedDict->close(); TDbInterfaceRecord* pInterfaceRec = NULL; if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForRead)) { pDict->close(); TInterface pipeInterface; if (pInterfaceRec->Find(ptCon,vtDir,m_pOwnerEnt->objectId(),pipeInterface)) { if (pipeInterface.GetConnectObject().asOldId() == id.asOldId()) { bSuccess = TRUE; } } pInterfaceRec->close(); } else { pDict->close(); } } else { pNamedDict->close(); } } return bSuccess; } BOOL TImpSpecEquipment::FindConnect(const AcGePoint3d& ptGePos,const AcGeVector3d& vtDir,const AcDbObjectId& idOwner,AcDbObjectId& idInterface) { //到命名对象字典中找; BOOL bSuccess = FALSE; // add by hh 2011-08-09 接口记录从字典移动到数据库中 TDbInterfaceRecord* pIntfRec = TAuxTools::GetIntfPtrFromDB(); if(NULL != pIntfRec) { TInterface iInterface; if (pIntfRec->PairFind(ptGePos,vtDir,idOwner,iInterface)) { idInterface = iInterface.GetConnectObject(); bSuccess = TRUE; } pIntfRec->close(); return bSuccess; } // add end AcDbDictionary* pNamedDict = NULL; if (Acad::eOk == acdbCurDwg()->getNamedObjectsDictionary(pNamedDict,AcDb::kForRead)) { AcDbDictionary* pDict = NULL; if (Acad::eOk == pNamedDict->getAt(KEY_IRECORD,(AcDbObject*&)pDict,AcDb::kForRead)) { pNamedDict->close(); TDbInterfaceRecord* pInterfaceRec = NULL; if (Acad::eOk == pDict->getAt(KEY_IRECORD,(AcDbObject*&)pInterfaceRec,AcDb::kForRead)) { pDict->close(); TInterface iInterface; if (pInterfaceRec->PairFind(ptGePos,vtDir,idOwner,iInterface)) { idInterface = iInterface.GetConnectObject(); bSuccess = TRUE; } pInterfaceRec->close(); } else { pDict->close(); } } else { pNamedDict->close(); } } return bSuccess; } BOOL TImpSpecEquipment::OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo) { return FALSE; } BOOL TImpSpecEquipment::IsValid(TDbXDataMap* pXMap) { return FALSE; } BOOL TImpSpecEquipment::IsParallelToZ() const { // 获得法向量 AcGeVector3d vtNor; m_pXDataMap->GetAt(HVAC_Normal, vtNor); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtNor.isParallelTo(vtZAxis); } BOOL TImpSpecEquipment::IsParallelToY() const { // 获得法向量 AcGeVector3d vtNor; m_pXDataMap->GetAt(HVAC_Normal, vtNor); AcDbDatabase* pDb = acdbCurDwg(); return vtNor.isParallelTo(pDb->ucsydir()); } BOOL TImpSpecEquipment::IsParallelToX() const { // 获得法向量 AcGeVector3d vtNor; m_pXDataMap->GetAt(HVAC_Normal, vtNor); AcDbDatabase* pDb = acdbCurDwg(); return vtNor.isParallelTo(pDb->ucsxdir()); } void TImpSpecEquipment::OnSubErase( Adesk::Boolean erasing ) { } LRESULT TImpSpecEquipment::UserCall( long i,LPVOID pData ) { return 0l; } int TImpSpecEquipment::GetXBaseShell(TXShell& xShell) { return 0; } int TImpSpecEquipment::GetBodyBox(AcDbExtents& ext) const { return 0; } CString TImpSpecEquipment::GetXml(const AcGeMatrix3d& mat) const { return _T(""); } bool TImpSpecEquipment::GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs) const { // change by hh 2013-03-25 暖通标准版ID从6改成15 // if(6 != g_nProductId && 5 != g_nProductId) // 以下处理仅限暖通使用 if(15 != g_nProductId && 5 != g_nProductId) return false; if(NULL == m_pXDataMap) return false; // 基本参数 AcDbObjectId idObj = m_pOwnerEnt->objectId(); AcDbObjectId idLayer = m_pOwnerEnt->layerId(); TGGeSectionPlane section_pln(face, vtPlaneSecDir); // 构造一个辅助剖面 AcDbObjectId idBlock2d, idBlock3d; m_pXDataMap->GetAt(KEY_Part2D, idBlock2d); m_pXDataMap->GetAt(KEY_Part3D, idBlock3d); if(idBlock2d != idBlock3d) { // 法向量 AcGeVector3d vtNor; m_pXDataMap->GetAt(HVAC_Normal, vtNor); // 主方向 AcGeVector3d vtMain; m_pXDataMap->GetAt(KEY_MainDir, vtMain); // 中心点 AcGePoint3d ptCenter; m_pXDataMap->GetAt(KEY_StartPoint, ptCenter); // 取得图块尺寸 AcGeVector3d vtBlkSize; m_pXDataMap->GetAt(KEY_Scale3D, vtBlkSize); vtBlkSize.x = 1 / vtBlkSize.x; vtBlkSize.y = 1 / vtBlkSize.y; vtBlkSize.z = 1 / vtBlkSize.z; // 长宽高 double dLength = 0, dWidth = 0, dHeight = 0; m_pXDataMap->GetAt(KEY_Length, dLength); m_pXDataMap->GetAt(KEY_Width, dWidth); m_pXDataMap->GetAt(KEY_Thick, dHeight); // 取得投影图块ID AcGeScale3d scale(dLength / vtBlkSize.x, dWidth / vtBlkSize.y, dHeight / vtBlkSize.z); // 原始比例 AcDbObjectId idProj = TAuxTools::GetProjBlockId(idBlock3d, vtNor, vtMain, vtPlaneSecDir, scale); if(AcDbObjectId::kNull == idProj) return false; AcGePlane plane = section_pln.AsAcGePlane(); AcGePoint3d ptTemp = ptCenter.orthoProject(plane); double dDist = ptTemp.distanceTo(ptCenter); // 计算最大点和最小点 AcDbExtents extBlock; GetBodyBox(extBlock); AcGePoint3d ptMin = extBlock.minPoint().orthoProject(plane); AcGePoint3d ptMax = extBlock.maxPoint().orthoProject(plane); BlockRefInfo info(idProj, scale, ptTemp, dDist * (-1), ptMax, ptMin); TSectionFill *pFill = new TSectionFill(info, idLayer); arFillPtrs.append(pFill); } else { TImpSpecEquipment* pThis = (TImpSpecEquipment*)this; TXShell xFace; if(!pThis->GetXBaseShell(xFace)) // GetXBaseShell为非const函数,使用代理方式调用 return false; double dElevation = 0; AcDbFace* pFace = NULL; for(int i = 0; i < xFace.GetCount(); i++) { if(NULL == (pFace = xFace.GetFace(i))) continue; TGGeSectionPlane pln(*pFace, vtPlaneSecDir); TGGePoly2D poly; dElevation = SectionUtility::Projection_plane2plane(section_pln, pln, poly); if(!!poly) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断 sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHEQUIPMENT, dElevation, poly)); delete pFace; } } return true; } Acad::ErrorStatus TImpSpecEquipment::GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const { // change by hh 2013-03-25 暖通标准版ID从6改成15 // if(6 != g_nProductId && 5 != g_nProductId) // 以下处理仅限暖通使用 if(15 != g_nProductId && 5 != g_nProductId) return Acad::eNotImplementedYet; AcDbExtents ext; if(!GetBodyBox(ext)) return Acad::eNotImplementedYet; ptLow = ext.minPoint(); ptUp = ext.maxPoint(); return Acad::eOk; } BOOL TImpSpecEquipment::GetBlockComplexCurve(TComplexCurve& comCurve) const { return FALSE; } // add by hh 2014-08-06 支持设备与水管遮挡 Acad::ErrorStatus TImpSpecEquipment::GetClipBoundary(TGGePoly2D& poly)const { return Acad::eNotImplementedYet; } bool TImpSpecEquipment::IsMeClip() const { return false; } bool TImpSpecEquipment::IsClipMe(const TEntityBase* pEnt)const//ok是否被裁剪 { return false; }