#include "stdafx.h" #include "StdArx.h" #include "THImpHvacReducer.h" #include "TDbInterfaceRecord.h" #include "TDbXDataMap.h" #include "TDbInterfaceMsgWrite.h" #include "math.h" #include "dbxutil.h" #include "dbsymutl.h" using namespace TDb; THImpHvacReducer::THImpHvacReducer() { } THImpHvacReducer::~THImpHvacReducer() { } Acad::ErrorStatus THImpHvacReducer::getClassID(CLSID* pClsid) const { // #if (ADS < 16) // // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E5} // CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE5 }}; // #endif // // #if (ADS == 16) // // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E5} // CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE6 }}; // #endif // // #if (ADS == 17) // // {C7DFDF6A-A5F2-4add-ADCC-7AC0675AB6E7} // CLSID CLSID_PipeBaseEntity = {0xC7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE7 }}; // #endif // // #if (ADS == 18) // CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE8 }}; // #endif // // #if (ADS == 19) // CLSID CLSID_PipeBaseEntity = {0xD7DFDF6B, 0xA5F2, 0x4ADE, { 0xAD, 0xCC, 0x7A, 0xC0, 0x67, 0x5A, 0xB6, 0xE8 }}; // #endif return Acad::eOk; } BOOL THImpHvacReducer::OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo) { ASSERT(NULL != pszName && NULL != pInfo); // 暖通基本参数设置 if (0 == _tcsicmp(pszName, KEY_RUNTIME)) { pInfo->bVisible = TRUE; pInfo->bEditable = FALSE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("变径")); pInfo->parlValues->Add(TDb::eReduce); } // 全局属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { pInfo->pXData->nVt = TXINT; pInfo->pXData->nVal = TDb::eReduce; } // 设置数据 else { pInfo->pXData->nVt = 0; // 设置处理完成标识 } } return TRUE; } if (0 == _tcsicmp(pszName, KEY_Type)) { pInfo->bVisible = TRUE; pInfo->bEditable = FALSE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { HvacSectType eStartSect(TDb::eRectangular); HvacSectType eEndSect = eStartSect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect); if (eStartSect == eEndSect) { pInfo->parsValues->Add(_T("变径")); pInfo->parlValues->Add(0); } else { pInfo->parsValues->Add(_T("天圆地方")); pInfo->parlValues->Add(0); } } return TRUE; } if (0 == _tcsicmp(pszName, HVAC_HasBaseLine)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("隐藏")); pInfo->parlValues->Add(0); pInfo->parsValues->Add(_T("显示")); pInfo->parlValues->Add(1); } return TRUE; } if (0 == _tcsicmp(pszName, HVAC_IsSingleLine)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("双线")); pInfo->parlValues->Add(0); pInfo->parsValues->Add(_T("单线")); pInfo->parlValues->Add(1); } TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); return TRUE; } // 获得单线状态,当状态为单线时不显示 BOOL bSingleLine = FALSE; m_pXDataMap->GetAt(HVAC_IsSingleLine, bSingleLine); // 变径参数数据设置 // HRED_StartSectType和HVAC_SectType定义相同,为同一个值 // 为区分显示名称,借用未被使用的KEY_StartSectType值来表达 if (0 == _tcsicmp(pszName, KEY_StartSectType)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("矩形")); pInfo->parlValues->Add(TDb::eRectangular); pInfo->parsValues->Add(_T("圆形")); pInfo->parlValues->Add(TDb::eCircular); } // 替代属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { m_pXDataMap->GetAt(HRED_StartSectType, *pInfo->pXData); } // 设置数据 else { m_pXDataMap->SetAt(HRED_StartSectType, *pInfo->pXData); pInfo->pXData->nVt = 0; // 设置处理完成标识 } } return TRUE; } if (0 == _tcsicmp(pszName, HRED_EndSectType)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("矩形")); pInfo->parlValues->Add(TDb::eRectangular); pInfo->parsValues->Add(_T("圆形")); pInfo->parlValues->Add(TDb::eCircular); } return TRUE; } // 尺寸计算方式 if (0 == _tcsicmp(pszName, HRED_ComputeType)) { pInfo->bVisible = TRUE; pInfo->bEditable = FALSE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("自动计算")); pInfo->parlValues->Add(TDb::eAuto); pInfo->parsValues->Add(_T("角度")); pInfo->parlValues->Add(TDb::eAngle); pInfo->parsValues->Add(_T("长度")); pInfo->parlValues->Add(TDb::eLength); } return TRUE; } // 具体设置角度或长度 HvacReduComType eComTyep = TDb::eAuto; m_pXDataMap->GetAt(HRED_ComputeType, (int&)eComTyep); if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle || 0 == _tcsicmp(pszName, HRED_Length) && eComTyep == TDb::eLength) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle) { m_pXDataMap->GetAt(HRED_Angle, *pInfo->pXData); pInfo->pXData->dVal[0] *= 180/PI; } } else // 设置数据 { if (0 == _tcsicmp(pszName, HRED_Angle) && eComTyep == TDb::eAngle) m_pXDataMap->SetAt(HRED_Angle, pInfo->pXData->dVal[0] * PI / 180); else m_pXDataMap->SetAt(HRED_Length, pInfo->pXData->dVal[0]); // 先记录更新前信息 AcGePoint3dArray ptArrOrig; AcDbObjectIdArray idArr; TAuxTools::GetInterfacePoint(this, ptArrOrig); TAuxTools::GetInterfaceId(this, idArr); IsValid(NULL); // 更新连接实体 if (NULL != m_pOwnerEnt) { AcGePoint3dArray ptArrNew; TAuxTools::GetInterfacePoint(this, ptArrNew); TAuxTools::DealWithConEnt(idArr, ptArrOrig, ptArrNew, m_pOwnerEnt->objectId()); m_pOwnerEnt->close(); acedPostCommand(_T("redraw\n")); } pInfo->pXData->nVt = 0; } } return TRUE; } if (0 == _tcsicmp(pszName, HRED_StartWidth)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = pInfo->bVisible; TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); return TRUE; } if (0 == _tcsicmp(pszName, HRED_StartThick)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = pInfo->bVisible; return TRUE; } if (0 == _tcsicmp(pszName, HRED_EndWidth)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = pInfo->bVisible; TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); return TRUE; } if (0 == _tcsicmp(pszName, HRED_EndThick)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = pInfo->bVisible; return TRUE; } // HRED_StartDiameter和HRED_StartWidth定义相同,为同一个值 // 为区分显示名称,借用未被使用的KEY_StartDiameter值来表达 if (0 == _tcsicmp(pszName, KEY_StartDiameter)) { // 获得截面,当截面为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular == eSectType); pInfo->bEditable = pInfo->bVisible; // 替代属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { m_pXDataMap->GetAt(HRED_StartDiameter, *pInfo->pXData); } // 设置数据 else { TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, HRED_StartDiameter, pInfo); } } return TRUE; } // HRED_EndDiameter和HRED_EndWidth定义相同,为同一个值 // 为区分显示名称,借用未被使用的KEY_EndDiameter值来表达 if (0 == _tcsicmp(pszName, KEY_EndDiameter)) { // 获得截面,当截面为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular == eSectType); pInfo->bEditable = pInfo->bVisible; // 替代属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { m_pXDataMap->GetAt(HRED_EndDiameter, *pInfo->pXData); } // 设置数据 else { TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, HRED_EndDiameter, pInfo); } } return TRUE; } if (0 == _tcsicmp(pszName, HRED_StartPoint)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 整体移动 if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt) { // 改变顶点变换行为 AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - ptStart; AcGeMatrix3d mat; mat.setToTranslation(offset); transformBy(mat); // pInfo->pXData->nVt = 0; // 设置处理完成标识 TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); } return TRUE; } if (0 == _tcsicmp(pszName, HRED_EndPoint)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 整体移动 if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt) { // 改变顶点变换行为 AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcGeVector3d offset = asPnt3d(pInfo->pXData->dVal) - ptEnd; AcGeMatrix3d mat; mat.setToTranslation(offset); transformBy(mat); // pInfo->pXData->nVt = 0; // 设置处理完成标识 TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); } return TRUE; } return FALSE; } void THImpHvacReducer::GetTips(CMapStringToString& mapLable2Tip) const { } void THImpHvacReducer::list() const { ASSERT(NULL != m_pXDataMap); // 管件类型 acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:变径")); // 截面类型 HvacSectType eStartSectType = eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); switch (eStartSectType) { case TDb::eRectangular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:矩形")); break; case TDb::eCircular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:圆形")); break; case TDb::eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 始端截面:扁圆形")); break; } HvacSectType eEndSectType = eRectangular; m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); switch (eEndSectType) { case TDb::eRectangular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:矩形")); break; case TDb::eCircular: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:圆形")); break; case TDb::eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t 末端截面:扁圆形")); break; } // double dOffset = 0.0; // m_pXDataMap->GetAt(HRED_Offset, dOffset); // acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t偏心距离:%.2f"), dOffset); // 圆型截面显示直径 if (TDb::eCircular == eStartSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HRED_StartDiameter, dDiameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端直径:%.2f"), dDiameter); } // 非圆型截面显示宽度和厚度 else { double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(HRED_StartWidth, dWidth); m_pXDataMap->GetAt(HRED_StartThick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t始端宽度:%.2f 始端厚度:%.2f"), dWidth, dThick); } // 圆型截面显示直径 if (TDb::eCircular == eEndSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HRED_EndDiameter, dDiameter); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端直径:%.2f"), dDiameter); } // 非圆型截面显示宽度和厚度 else { double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(HRED_EndWidth, dWidth); m_pXDataMap->GetAt(HRED_EndThick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t末端宽度:%.2f 末端厚度:%.2f"), dWidth, dThick); } // 起点 AcGePoint3d pt; m_pXDataMap->GetAt(HRED_StartPoint, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t自 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); // 终点 m_pXDataMap->GetAt(HRED_EndPoint, pt); acutPrintf(_T("\n\t\t\t\t\t\t\t\t到 点,X=%.4f\t Y=%.4f\t Z=%.4f"), pt.x, pt.y, pt.z); } BOOL THImpHvacReducer::IsHorzAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtSect.isPerpendicularTo(vtZAxis); } BOOL THImpHvacReducer::IsVertAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return vtSect.isParallelTo(vtZAxis); } BOOL THImpHvacReducer::IsInclineAlignment() const { // 获得法向量 AcGeVector3d vtSect; m_pXDataMap->GetAt(HRED_StartDir, vtSect); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); return !vtSect.isPerpendicularTo(vtZAxis) && !vtSect.isParallelTo(vtZAxis); } BOOL THImpHvacReducer::IsSingleLine() const { ASSERT(NULL != m_pXDataMap); BOOL bSingleLine = FALSE; m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine); return bSingleLine; } AcGeVector3d THImpHvacReducer::GetSectNormal() const { ASSERT(NULL != m_pXDataMap); AcGeVector3d vtSta; m_pXDataMap->GetAt(HRED_StartDir, vtSta); if (!vtSta.isParallelTo(TAuxTools::GetUcsZvt())) { // Lixl变径为倾斜方向时(不平行Z轴,不垂直Z轴)返回map里面的方向,不向XY平面投影 if (!vtSta.isPerpendicularTo(TAuxTools::GetUcsZvt())) return vtSta; else vtSta = vtSta.orthoProject(TAuxTools::GetUcsZvt()); } return vtSta; // 获取变径各点位置 // double dOffsetH = 0.0; // AcGePoint3d ptStart, ptEnd; // AcGeVector3d vtNormal = AcGeVector3d::kZAxis; // m_pXDataMap->GetAt(HRED_Offset, dOffsetH); // m_pXDataMap->GetAt(HRED_StartPoint, ptStart); // m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // // // 计算起始侧面法向量 // AcGePlane plan; // plan.set(ptStart, vtNormal); // ptEnd = ptEnd.orthoProject(plan); // AcGeVector3d vtStart = ptStart - ptEnd; // double dAngle = asin(dOffsetH / ptStart.distanceTo(ptEnd)); // vtStart.rotateBy(-dAngle, vtNormal); // return vtStart.normalize(); } void THImpHvacReducer::GetKindName(CString& sName) { sName = _T("TCH_HREDUCER"); } int THImpHvacReducer::GetInterfaceCount() const { // 返回接口个数 return 2; } BOOL THImpHvacReducer::GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const { ASSERT(NULL != m_pXDataMap); // 获取截面类型 TDb::HvacSectType eSectType = TDb::eRectangular; // 获取接口截面、宽度、厚度数据key值 LPCTSTR pszWidthKey, pszThickKey; switch (nIndex) { case 0: m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType); pszWidthKey = ((TDb::eCircular == eSectType) ? HRED_StartDiameter : HRED_StartWidth); pszThickKey = HRED_StartThick; break; case 1: m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectType); pszWidthKey = ((TDb::eCircular == eSectType) ? HRED_EndDiameter : HRED_EndWidth); pszThickKey = HRED_EndThick; break; default: return FALSE; } // 获取尺寸 double dWidth = 0.0, dThick = 0.0; m_pXDataMap->GetAt(pszWidthKey, dWidth); m_pXDataMap->GetAt(pszThickKey, dThick); // 设置接口数据 pipeInterface.SetType(eSectType); pipeInterface.SetSize(dWidth, dThick); return TRUE; } BOOL THImpHvacReducer::GetInterface(int nIndex, TInterface& pipeInterface) const { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = GetSectNormal(); AcGeVector3d vtEnd = -vtStart; AcDbObjectId id; switch(nIndex) { case 0: // 如果起始接口和第一个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface)) { GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; } // 如果起始接口和第二个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface)) { GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; } // 没有管件连接 pipeInterface.SetOutDir(vtStart); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptStart); GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; case 1: // 如果末尾接口和第一个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface)) { GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; } // 如果末尾接口和第二个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface)) { GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; } // 没有管件连接 pipeInterface.SetOutDir(vtEnd); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptEnd); GetInterfaceSizeData(nIndex, pipeInterface); return TRUE; } return FALSE; } BOOL THImpHvacReducer::GetInterface(const AcGePoint3d& ptConnect,TInterface& pipeInterface) const { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = GetSectNormal(); AcGeVector3d vtEnd = -vtStart; // 计算测试点到始末点的距离 double dDist1 = ptConnect.distanceTo(ptStart); double dDist2 = ptConnect.distanceTo(ptEnd); AcDbObjectId id; // 位于起始点 if (dDist1 < 1.e-3) { // 如果起始接口和第一个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface)) { GetInterfaceSizeData(0, pipeInterface); return TRUE; } // 如果起始接口和第二个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptStart, vtStart, pipeInterface)) { GetInterfaceSizeData(0, pipeInterface); return TRUE; } // 没有管件连接 pipeInterface.SetOutDir(vtStart); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptStart); GetInterfaceSizeData(0, pipeInterface); return TRUE; } // 位于末尾点 if (dDist2 < 1.e-3) { // 如果末尾接口和第一个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT1, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface)) { GetInterfaceSizeData(1, pipeInterface); return TRUE; } // 如果末尾接口和第二个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtEnd, pipeInterface)) { GetInterfaceSizeData(1, pipeInterface); return TRUE; } // 没有管件连接 pipeInterface.SetOutDir(vtEnd); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptEnd); GetInterfaceSizeData(1, pipeInterface); return TRUE; } return FALSE; } BOOL THImpHvacReducer::HasInterface(const AcGePoint3d& ptConnect,const AcGeVector3d& vtDir) { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = GetSectNormal(); AcGeVector3d vtEnd = -vtStart; // 计算测试点到始末点的距离 double dDist1 = ptConnect.distanceTo(ptStart); double dDist2 = ptConnect.distanceTo(ptEnd); // 位于起始点 if (dDist1 < 1.e-3) return (vtDir.isParallelTo(vtStart)); // 位于末尾点 if (dDist2 < 1.e-3) return (vtDir.isParallelTo(vtEnd)); return FALSE; } BOOL THImpHvacReducer::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { if (NULL == m_pXDataMap) return FALSE; // 打开对象 AcDbEntity* pEnt; if (Acad::eOk != acdbOpenObject(pEnt, idConnect, AcDb::kForRead)) return FALSE; // 检查对象类型,是否是暖通管件 if (!(pEnt->isKindOf(TDbHvacDuct::desc()) || pEnt->isKindOf(TDbHvacFitting::desc()) || pEnt->isKindOf(TDbHvacEquipment::desc()))) { pEnt->close(); return FALSE; } // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = GetSectNormal(); AcGeVector3d vtEnd = -vtStart; // 计算测试点到始末点的距离 double dDist1 = ptConnect.distanceTo(ptStart); double dDist2 = ptConnect.distanceTo(ptEnd); // 基类指针 TDbInterfacesObj* pInterfaceObj = TDbInterfacesObj::cast(pEnt); ASSERT(NULL != pInterfaceObj); // 位于起始点 if (dDist1 < 1.e-3 && pInterfaceObj->HasInterface(ptStart, vtStart)) { m_pXDataMap->SetAt(KEY_IDCNT1, idConnect); pEnt->close(); return TRUE; } // 位于末尾点 if (dDist2 < 1.e-3 && pInterfaceObj->HasInterface(ptEnd, vtEnd)) { m_pXDataMap->SetAt(KEY_IDCNT2, idConnect); pEnt->close(); return TRUE; } pEnt->close(); return FALSE; } BOOL THImpHvacReducer::RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { if (NULL == m_pXDataMap) return FALSE; // 浅层次删除; 命名字典中的关系,需要外面移除关系,只移除内部关系 AcDbObjectId id; m_pXDataMap->GetAt(KEY_IDCNT1, id); if (id == idConnect) { m_pXDataMap->SetAt(KEY_IDCNT1, AcDbObjectId::kNull); return TRUE; } m_pXDataMap->GetAt(KEY_IDCNT2, id); if (id == idConnect) { m_pXDataMap->SetAt(KEY_IDCNT2, AcDbObjectId::kNull); return TRUE; } return FALSE; } BOOL THImpHvacReducer::NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs) { if (NULL == m_pXDataMap) return FALSE; // 获得消息传递设置, 确定是否传递消息 CString sDispatch = _T("0"); GetGlobalContext(KEY_DISPATCHMSG, sDispatch); BOOL bDispatch = (_ttoi(sDispatch) != 0); BOOL bMsgTranslate = FALSE; // 获得消息类型, 根据消息类型处理 TDb::InterfaceOper eOper = iModiMsg.GetInterfaceOper(); switch (eOper) { case TDb::eMoveGripPoint: // 夹点移动消息处理 bMsgTranslate = OnMoveGripPointMsgNotify(iModiMsg, iModiMsgs); break; case TDb::eTransformBy: // 对象移动消息处理 bMsgTranslate = OnTransformMsgNotify(iModiMsg, iModiMsgs); break; case TDb::eSize: // 尺寸调整消息处理 bMsgTranslate = OnSizeMsgNotify(iModiMsg, iModiMsgs); break; default: return bMsgTranslate; } // 记录修改标识 if (m_pOwnerEnt != NULL) m_pOwnerEnt->recordGraphicsModified(); return bMsgTranslate; } Acad::ErrorStatus THImpHvacReducer::ExplodeOrDraw3d(XExplodeDraw& mode) const { if (NULL == m_pXDataMap) return Acad::eOk; // 变径类型 TDb::HvacSectType eStartSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); // 始端截面 switch (eStartSectType) { case TDb::eRectangular: // 矩形 // 末端截面 switch (eEndSectType) { case TDb::eRectangular: // 矩形 ExplodeRect2Rect3d(mode); break; case TDb::eCircular: // 园形 ExplodeRect2Cir3d(mode); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 // 末端截面 switch (eEndSectType) { case TDb::eRectangular: // 矩形 ExplodeCir2Rect3d(mode); break; case TDb::eCircular: // 园形 ExplodeCir2Cir3d(mode); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 // 末端截面 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } return Acad::eOk; } Acad::ErrorStatus THImpHvacReducer::ExplodeOrDraw2d(XExplodeDraw& mode) const { if (m_pXDataMap == NULL) { return Acad::eNotImplementedYet; } TComplexCurve cplCurve; MakeCurves(cplCurve); TDbExtentsEdge edage; edage.SetEdage(cplCurve); BOOL bWeight = FALSE; 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); return Acad::eOk; } AcDbPolyline* THImpHvacReducer::MakePolyCurve() const { if (NULL == m_pXDataMap) return NULL; // 变径类型 TDb::HvacSectType eStartSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType,(int&) eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2RectPolyCurve(); break; case TDb::eCircular: // 园形 return MakeRect2CirPolyCurve(); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2RectPolyCurve(); break; case TDb::eCircular: // 园形 return MakeCir2CirPolyCurve(); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2RectPolyCurveVer(); break; case TDb::eCircular: // 园形 return MakeRect2CirPolyCurveVer(); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2RectPolyCurveVer(); break; case TDb::eCircular: // 园形 return MakeCir2CirPolyCurveVer(); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if (IsInclineAlignment()) { switch (eStartSectType) { case TDb::eRectangular: switch (eEndSectType) { case TDb::eRectangular: // 方对方 return MakeRect2RectPolyCurve(); break; case TDb::eCircular: // 方对圆 return MakeRect2CirPolyCurve(); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: switch (eEndSectType) { case TDb::eRectangular: // 圆对方 return MakeCir2RectPolyCurve(); break; case TDb::eCircular: // 圆对圆 return MakeIncCir2CirPolyCurve(); break; case TDb::eOblate: // 扁圆形 break; } break; } } return NULL; } BOOL THImpHvacReducer::MakeCurves(TComplexCurve& cplCurve) const { if (NULL == m_pXDataMap) return FALSE; // 变径类型 TDb::HvacSectType eStartSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); int nType = 0; if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurves(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeRect2Cir2DCurves(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurves(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeCir2Cir2DCurves(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurvesVer(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeRect2Cir2DCurvesVer(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurvesVer(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeCir2Cir2DCurvesVer(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 圆形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if (IsInclineAlignment()) //倾斜变径二维Lixl { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurves(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeRect2Cir2DCurves(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurves(cplCurve,nType); break; case TDb::eCircular: // 圆形 return MakeIncCir2Cir2DCurves(cplCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; } } return FALSE; } BOOL THImpHvacReducer::GetCurvesInSide(TComplexCurve& compCurve) const { if (NULL == m_pXDataMap) return FALSE; // 变径类型 TDb::HvacSectType eStartSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); int nType = 1; if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurves(compCurve, nType); break; case TDb::eCircular: // 园形 return MakeRect2Cir2DCurves(compCurve, nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurves(compCurve, nType); break; case TDb::eCircular: // 园形 return MakeCir2Cir2DCurves(compCurve, nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurvesVer(compCurve, nType); break; case TDb::eCircular: // 园形 return MakeRect2Cir2DCurvesVer(compCurve, nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurvesVer(compCurve, nType); break; case TDb::eCircular: // 园形 return MakeCir2Cir2DCurvesVer(compCurve, nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if (IsInclineAlignment()) { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2Rect2DCurves(compCurve,nType); break; case TDb::eCircular: // 圆形 return MakeRect2Cir2DCurves(compCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2Rect2DCurves(compCurve,nType); break; case TDb::eCircular: // 圆形 return MakeIncCir2Cir2DCurves(compCurve,nType); break; case TDb::eOblate: // 扁圆形 break; } break; } } return FALSE; } BOOL THImpHvacReducer::MakePolyCurveFaces(AcDbVoidPtrArray& arFaces) { if (NULL == m_pXDataMap) return FALSE; // 变径类型 TDb::HvacSectType eStartSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType,(int&) eStartSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); if (IsHorzAlignment()) // 水平 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2RectPolyCurveFaces(arFaces); break; case TDb::eCircular: // 园形 return MakeRect2CirPolyCurveFaces(arFaces); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2RectPolyCurveFaces(arFaces); break; case TDb::eCircular: // 园形 return MakeCir2CirPolyCurveFaces(arFaces); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; } } else if(IsVertAlignment()) // 立管 { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2RectPolyCurveFacesVer(arFaces); break; case TDb::eCircular: // 园形 return MakeRect2CirPolyCurveFacesVer(arFaces); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2RectPolyCurveFacesVer(arFaces); break; case TDb::eCircular: // 园形 return MakeCir2CirPolyCurveFacesVer(arFaces); break; case TDb::eOblate: // 扁圆形 break; } break; case TDb::eOblate: // 扁圆形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 break; case TDb::eCircular: // 园形 break; case TDb::eOblate: // 扁圆形 break; } break; }//倾斜变径二维先按水平画Lixl } else if (IsInclineAlignment()) { switch (eStartSectType) { case TDb::eRectangular: // 矩形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeRect2RectPolyCurveFaces(arFaces); break; case TDb::eCircular: // 园形 return MakeRect2CirPolyCurveFaces(arFaces); break; } break; case TDb::eCircular: // 园形 switch (eEndSectType) { case TDb::eRectangular: // 矩形 return MakeCir2RectPolyCurveFaces(arFaces); break; case TDb::eCircular: // 园形 return MakeIncCir2CirPolyCurveFaces(arFaces); break; } break; } } return FALSE; } Acad::ErrorStatus THImpHvacReducer::transformBy(const AcGeMatrix3d& xform) { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点和法向 AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal, vtSta; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); m_pXDataMap->GetAt(HRED_StartDir, vtSta); // 变换位置 ptStart.transformBy(xform); ptEnd.transformBy(xform); vtNormal.transformBy(xform); vtSta.transformBy(xform); vtNormal.normalize(); vtSta.normalize(); // 更新点和法向 m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); m_pXDataMap->SetAt(KEY_NORMAL, vtNormal); m_pXDataMap->SetAt(HRED_StartDir, vtSta); // 设置尺寸 double dScale = xform.scale(); double dStaWidth(0.0), dEndWidth(0.), dStaThick(0.0), dEndThick(0.0); m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dStaThick); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); dStaWidth *= dScale; dEndWidth *= dScale; dStaThick *= dScale; dEndThick *= dScale; m_pXDataMap->SetAt(HRED_StartWidth, dStaWidth); m_pXDataMap->SetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->SetAt(HRED_StartThick, dStaThick); m_pXDataMap->SetAt(HRED_EndThick, dEndThick); // 传递消息 if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { // 如果实体不是在当前模型空间中,不做写消息,更新接口处理 AcDbDatabase* pDb = m_pOwnerEnt->database(); if (pDb == NULL) pDb = acdbCurDwg(); AcDbObjectId idModel; AcDbBlockTable* pTable = NULL; pDb->getBlockTable(pTable, AcDb::kForRead); if (pTable != NULL) { pTable->getAt(ACDB_MODEL_SPACE, idModel); pTable->close(); } if (idModel == m_pOwnerEnt->blockId()) { // 写入接口更改消息 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; } TDb::Position THImpHvacReducer::ExplainGripIndex(int nIndex) const { TDb::Position ePos = TDb::eStart; switch(nIndex) { case 0: ePos = TDb::eStart; break; case 1: ePos = TDb::eEnd; break; case 2: ePos = TDb::eCommand0; break; case 3: ePos = TDb::eCommand1; break; } return ePos; } Acad::ErrorStatus THImpHvacReducer::getStretchPoints(AcGePoint3dArray& stretchPoints) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); stretchPoints.append(ptStart); stretchPoints.append(ptEnd); return Acad::eOk; } Acad::ErrorStatus THImpHvacReducer::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); //夹点 gripPoints.append(ptStart); //STA gripPoints.append(ptEnd); //END AcGeVector3d vtStart = GetSectNormal(); vtStart.normalize(); //增加2个命令夹点 AcGePoint3d ptGeCmd1,ptGeCmd2; //按 10 个像素点 // double dCmd = PixelToWcs(10); ptGeCmd1 = ptStart + g_dCmdOff * vtStart; ptGeCmd2 = ptEnd - g_dCmdOff * vtStart; gripPoints.append(ptGeCmd1); //cmd1 gripPoints.append(ptGeCmd2); //cmd2 return Acad::eOk; } Acad::ErrorStatus THImpHvacReducer::getOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 根据捕捉模式处理 switch(osnapMode) { case AcDb::kOsModeEnd: snapPoints.append(ptStart); snapPoints.append(ptEnd); break; case AcDb::kOsModeMid: break; case AcDb::kOsModeCen: break; case AcDb::kOsModePerp: break; case AcDb::kOsModeNear: break; } return Acad::eOk; } Acad::ErrorStatus THImpHvacReducer::moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { if (indices.length() < 2) return Acad::eNotImplementedYet; AcGePoint3d ptStart, ptEnd, ptMsg; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); ptStart += offset; ptEnd += offset; m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { //更新接口记录接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(), offset); return Acad::eOk; } return Acad::eNotImplementedYet; } Acad::ErrorStatus THImpHvacReducer::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { ASSERT(NULL != m_pXDataMap); int nSize = indices.length(); if (nSize > 0) { // 取得位置点 AcGePoint3d ptStart, ptEnd, ptMsg; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); int nIndex = indices.first(); // 选择多个夹点,以first为准 TDb::Position ePos = ExplainGripIndex(nIndex); TInterfaceModifyMsg iMsg; TDbInterfaceMsgWrite msgWrite; AcDbSoftPointerId idOwner; m_pXDataMap->GetAt(KEY_THISID, idOwner); switch(ePos) { case TDb::eStart: case TDb::eEnd: MoveGripRandom(ePos, offset); break; /* { ptStart += offset; ptEnd += offset; m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); // 写入接口更改消息 iMsg.SetMsgPoint(ptStart);//new pos iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(idOwner); msgWrite.WriteInterfaceMsg(iMsg); //更新接口记录接口信息 AcGeMatrix3d xform; xform.setToTranslation(offset); UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform); break; } case TDb::eEnd: { ptStart += offset; ptEnd += offset; m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); // 写入接口更改消息 iMsg.SetMsgPoint(ptEnd);//new pos iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(idOwner); msgWrite.WriteInterfaceMsg(iMsg); //更新接口记录接口信息 AcGeMatrix3d xform; xform.setToTranslation(offset); UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform); break; } */ case TDb::eCommand0: { // 写入接口更改消息 iMsg.SetMsgPoint(ptStart); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eNewCommand); iMsg.SetPreviewObjToCreate(TDb::ePipe, 0); iMsg.SetMsgOperateOn(idOwner); msgWrite.WriteInterfaceMsg(iMsg); acedPostCommand(_T("\33")); CString csCmd; GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, csCmd); if (!csCmd.IsEmpty()) { csCmd += _T("\n"); acedPostCommand(csCmd); } break; } case TDb::eCommand1: { // 写入接口更改消息 iMsg.SetMsgPoint(ptEnd); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eNewCommand); iMsg.SetPreviewObjToCreate(TDb::ePipe, 0); iMsg.SetMsgOperateOn(idOwner); msgWrite.WriteInterfaceMsg(iMsg); acedPostCommand(_T("\33")); CString csCmd; GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, csCmd); if (!csCmd.IsEmpty()) { csCmd += _T("\n"); acedPostCommand(csCmd); } break; } default: break; } } return Acad::eOk; } // 拖拽管件,支持转向等操作 Acad::ErrorStatus THImpHvacReducer::MoveGripRandom(TDb::Position ePos, const AcGeVector3d& offset ) { AcGePoint3d ptDrag; if (ePos == eStart) m_pXDataMap->GetAt(HRED_StartPoint, ptDrag); else if (ePos == eEnd) m_pXDataMap->GetAt(HRED_EndPoint, ptDrag); TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptDrag); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(eNewCommand); iMsg.SetPreviewObjToCreate(eReduce, 0); // 写入接口更改消息 AcDbSoftPointerId idOwner; m_pXDataMap->GetAt(KEY_THISID, idOwner); iMsg.SetMsgOperateOn(idOwner); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); // 发送消息 acedPostCommand(_T("\33")); acedPostCommand(_T("znyd\n")); return Acad::eOk; } BOOL THImpHvacReducer::OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs) { if (!TAuxTools::IsAutoWorkOffset()) return FALSE; ASSERT(NULL != m_pXDataMap); BOOL bMsgTranslate = FALSE; AcDbObjectId id = iModiMsg.GetMsgOperateOn(); if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确 return FALSE; AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset(); if (vtOffset.isZeroLength()) return FALSE; AcGePoint3d ptStart, ptCorner, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcGePoint3d ptGeSOld = ptStart; AcGePoint3d ptGeEOld = ptEnd; int nPos = iModiMsg.GetGripPosition(); if (nPos == eStart || nPos == eMid || nPos == eEnd || nPos == eBr1 || nPos == eBr2) { AcGeVector3d vtSta, vtEnd; m_pXDataMap->GetAt(HRED_StartDir, vtSta); vtEnd = -vtSta; ptStart += vtOffset; ptEnd += vtOffset; m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); // 构造接口消息传递 开始端检查 AcDbObjectId idT; if (FindConnect(ptGeSOld, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口 { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeSOld); msg.SetMoveGripOffset(vtOffset); msg.SetMsgOperateOn(idT); msg.SetGripPosition(eStart); iModiMsgs.append(msg); bMsgTranslate = TRUE; } // 构造接口消息传递 末端检查 if (FindConnect(ptGeEOld, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口 { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeEOld); msg.SetMoveGripOffset(vtOffset); msg.SetMsgOperateOn(idT); msg.SetGripPosition(eEnd); iModiMsgs.append(msg); bMsgTranslate = TRUE; } // 更新模型空间的扩展字典的注册的接口数据 AcGeMatrix3d xform; xform.setToTranslation(vtOffset); UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform); } return bMsgTranslate;} BOOL THImpHvacReducer::OnTransformMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs) { if (!TAuxTools::IsAutoWorkOffset()) return FALSE; ASSERT(NULL != m_pXDataMap); BOOL bMsgTranslate = FALSE; AcDbObjectId id = iModiMsg.GetMsgOperateOn(); if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确 return FALSE; AcGeMatrix3d mtTrans = iModiMsg.GetTransform(); AcGeVector3d vtSta, vtEnd; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartDir, vtSta); vtEnd = -vtSta; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcGePoint3d ptGeSOld = ptStart; AcGePoint3d ptGeEOld = ptEnd; ptStart.transformBy(mtTrans); ptEnd.transformBy(mtTrans); m_pXDataMap->SetAt(HRED_StartPoint, ptStart); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); // 构造接口消息传递 开始端检查 AcDbObjectId idT; if (FindConnect(ptGeSOld, vtSta, m_pOwnerEnt->objectId(), idT)) // sta 点的接口 { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeSOld); msg.SetTransform(mtTrans); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } // 构造接口消息传递 末端检查 if (FindConnect(ptGeEOld, vtEnd, m_pOwnerEnt->objectId(), idT)) // end 点的接口 { TInterfaceModifyMsg msg; msg.SetMsgPoint(ptGeEOld); msg.SetTransform(mtTrans); msg.SetMsgOperateOn(idT); iModiMsgs.append(msg); bMsgTranslate = TRUE; } // 更新模型空间的扩展字典的注册的接口数据 UpdateInterfaceRec(m_pOwnerEnt->objectId(), mtTrans); return bMsgTranslate; } BOOL THImpHvacReducer::OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs) { ASSERT(NULL != m_pXDataMap); BOOL bSizeChanged = FALSE; AcDbObjectId id = iModiMsg.GetMsgOperateOn(); if (id != m_pOwnerEnt->objectId()) // 消息发送目标正确 return FALSE; // 获取消息发送方截面类型,暂未实现 HvacSectType eChangedSect = (HvacSectType)-1; // ... AcGeVector3d vtOffset = iModiMsg.GetMoveGripOffset(); AcGePoint3d ptOrigStart, ptOrigEnd, ptMsg; m_pXDataMap->GetAt(HRED_StartPoint, ptOrigStart); m_pXDataMap->GetAt(HRED_EndPoint, ptOrigEnd); ptMsg = iModiMsg.GetMsgPoint(); // 先检查接口是否真实连接了实体 BOOL bStartCon(FALSE), bEndCon(FALSE); AcDbObjectId idStart(AcDbObjectId::kNull), idEnd(AcDbObjectId::kNull); m_pXDataMap->GetAt(KEY_IDCNT1, idStart); m_pXDataMap->GetAt(KEY_IDCNT2, idEnd); OPENOBJ_BEGIN(idStart, AcDb::kForRead, TDbInterfacesObj, pIfObj); if (NULL != pIfObj) { AcGePoint3d ptFind = ptOrigStart; if (ptMsg.distanceTo(ptOrigStart) < 1) ptFind += vtOffset; if (pIfObj->GetInterface(ptFind, TInterface())) bStartCon = TRUE; } OPENOBJ_END(); OPENOBJ_BEGIN(idEnd, AcDb::kForRead, TDbInterfacesObj, pIfObj); if (NULL != pIfObj) { AcGePoint3d ptFind = ptOrigEnd; if (ptMsg.distanceTo(ptOrigEnd) < 1) ptFind += vtOffset; if (pIfObj->GetInterface(ptFind, TInterface())) bEndCon = TRUE; } OPENOBJ_END(); HvacReduComType eComType = TDb::eAuto; HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HRED_ComputeType, (int&)eComType); m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); // 设置各接口新尺寸 double dNewWidth, dNewHeigh(0.0); AcGeVector3d vtNormal = normal(); if (eSect == TDb::eRectangular) { AcGeVector3d vtWidthDir, vtHeighDir; iModiMsg.GetSizeDir(vtWidthDir, vtHeighDir); // 判断是否是空间连接或导致宽高互换 if (vtHeighDir.isParallelTo(vtNormal)) iModiMsg.GetSize(dNewWidth, dNewHeigh); else iModiMsg.GetSize(dNewHeigh, dNewWidth); } else { iModiMsg.GetSize(dNewWidth, dNewHeigh); dNewHeigh = dNewWidth; } // 看哪个接口方向修改了尺寸,修改相应接口尺寸 int nModifyFrom(0); // 修改方向, 0:首,1:尾 if (ptMsg.distanceTo(ptOrigStart) < 1) { if (eChangedSect == -1) m_pXDataMap->GetAt(HRED_StartSectType, (int&)eChangedSect); else m_pXDataMap->SetAt(HRED_StartSectType, eChangedSect); AcGePoint3d ptNewStart = ptOrigStart + vtOffset; m_pXDataMap->SetAt(HRED_StartPoint, ptNewStart); if (eChangedSect == TDb::eRectangular) { m_pXDataMap->SetAt(HRED_StartWidth, dNewWidth); m_pXDataMap->SetAt(HRED_StartThick, dNewHeigh); } else if (eChangedSect == TDb::eCircular) { m_pXDataMap->SetAt(HRED_StartDiameter, dNewWidth); } AcGeVector3d vtFitOff; m_pXDataMap->GetAt(HRED_Offset, vtFitOff); vtFitOff -= vtOffset; m_pXDataMap->SetAt(HRED_Offset, vtFitOff); bSizeChanged = TRUE; nModifyFrom = 0; } else if (ptMsg.distanceTo(ptOrigEnd) < 1) { if (eChangedSect == -1) m_pXDataMap->GetAt(HRED_EndSectType, (int&)eChangedSect); else m_pXDataMap->SetAt(HRED_EndSectType, eChangedSect); AcGePoint3d ptNewEnd = ptOrigEnd + vtOffset; m_pXDataMap->SetAt(HRED_EndPoint, ptNewEnd); if (eChangedSect == TDb::eRectangular) { m_pXDataMap->SetAt(HRED_EndWidth, dNewWidth); m_pXDataMap->SetAt(HRED_EndThick, dNewHeigh); } else if (eChangedSect == TDb::eCircular) { m_pXDataMap->SetAt(HRED_EndDiameter, dNewWidth); } AcGeVector3d vtFitOff; m_pXDataMap->GetAt(HRED_Offset, vtFitOff); vtFitOff += vtOffset; m_pXDataMap->SetAt(HRED_Offset, vtFitOff); bSizeChanged = TRUE; nModifyFrom = 1; } // 由于尺寸变化,调用内部校正函数,接口点必须沿各向量方向校正 IsValid(NULL); AcGePoint3d ptNewStart, ptNewEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptNewStart); m_pXDataMap->GetAt(HRED_EndPoint, ptNewEnd); // 根据最终位移向量,处理接口端连接实体位置 AcGeVector3d vtStartOff = ptNewStart - ptOrigStart; AcGeVector3d vtEndOff = ptNewEnd - ptOrigEnd; if (vtStartOff.length() > 1e-6) UpdateInterfaceRec(id, ptOrigStart, ptNewStart); if (vtEndOff.length() > 1e-6) UpdateInterfaceRec(id, ptOrigEnd, ptNewEnd); // 纠正由于风管边壁偏移导致的向量差 AcGeVector3d vtStart; m_pXDataMap->GetAt(HRED_StartDir, vtStart); AcGePoint3d ptFixedStart(ptOrigStart), ptFixedEnd(ptOrigEnd); if (nModifyFrom == 0) { ptFixedStart += vtOffset; double dAngle = vtStartOff.angleTo(vtStart); double dLen = vtStartOff.length() * cos(dAngle); vtStartOff.setToProduct(vtStart, dLen); } else if (nModifyFrom == 1) { ptFixedEnd += vtOffset; double dAngle = vtEndOff.angleTo(-vtStart); double dLen = vtEndOff.length() * cos(dAngle); vtEndOff.setToProduct(-vtStart, dLen); } if (vtStartOff.length() > 1e-6 && bStartCon) TAuxTools::DealWithConEnt(idStart, vtStartOff, id, ptFixedStart); if (vtEndOff.length() > 1e-6 && bEndCon) TAuxTools::DealWithConEnt(idEnd, vtEndOff, id, ptFixedEnd); return bSizeChanged; } // 绘制三维图形(方对方) void THImpHvacReducer::ExplodeRect2Rect3d(XExplodeDraw& mode) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0, dPlusEdge(GetPlusEdge()); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 计算8顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arPtS, arPtE; arPtS.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); arPtS.append(arPtS.at(0) - dStartWidth * vt); arPtS.append(arPtS.at(1) - dStartThick * vtNormal); arPtS.append(arPtS.at(0) - dStartThick * vtNormal); arPtS.append(arPtS.at(0)); arPtE.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0); arPtE.append(arPtE.at(0) - dEndWidth * vt); arPtE.append(arPtE.at(1) - dEndThick * vtNormal); arPtE.append(arPtE.at(0) - dEndThick * vtNormal); arPtE.append(arPtE.at(0)); // 考虑法兰余量添加5行4列点 AcGePoint3dArray arPoint; for(int i = 0; i < 5; i++) { arPoint.append(arPtS.at(i)); arPoint.append(arPtS.at(i) - dPlusEdge * vtSect); arPoint.append(arPtE.at(i) + dPlusEdge * vtSect); arPoint.append(arPtE.at(i)); } mode.DrawMesh(5, 4, arPoint.asArrayPtr()); } // 构建外轮廓(方对方) AcDbPolyline* THImpHvacReducer::MakeRect2RectPolyCurve() const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); TDb::HvacSectType eSectTypeStart = TDb::eRectangular, eSectTypeEnd = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectTypeStart); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectTypeEnd); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if (!vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) { if (eSectTypeStart == TDb::eRectangular) m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); if (eSectTypeEnd == TDb::eRectangular) m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); vt.normalize(); AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; // mcl changed, 2010.03.17. GetHidePlane()求的可能是个斜面,改为以首点为基准 // AcGePlane plan = GetHidePlane(arPoint[0], arPoint[1], arPoint[2], TAuxTools::GetUcsZvt(), dEle); AcGePlane plan = GetStdPrjPlan(arPoint[0]); double dEle = TAuxTools::GetPlaneEle(plan); AcDbPolyline* pPolyLine = new AcDbPolyline; pPolyLine->addVertexAt(0, arPoint[0].convert2d(plan)); pPolyLine->addVertexAt(1, arPoint[1].convert2d(plan)); pPolyLine->addVertexAt(2, arPointIn[1].convert2d(plan)); pPolyLine->addVertexAt(3, arPointIn[2].convert2d(plan)); pPolyLine->addVertexAt(4, arPoint[2].convert2d(plan)); pPolyLine->addVertexAt(5, arPoint[3].convert2d(plan)); pPolyLine->addVertexAt(6, arPointIn[3].convert2d(plan)); pPolyLine->addVertexAt(7, arPointIn[0].convert2d(plan)); pPolyLine->setNormal(TAuxTools::GetUcsZvt()); pPolyLine->setElevation(dEle); pPolyLine->setClosed(Adesk::kTrue); return pPolyLine; } // 构建二维图形(方对方) BOOL THImpHvacReducer::MakeRect2Rect2DCurves(TComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); TDb::HvacSectType eSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if ((eSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt); if (NULL != pFit) idBaseLayer = pFit->CenterLayer(); BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; AcGeVector3d vtSect = GetSectNormal(); // 2D下绘制,截面方向向XY平面投影,后计算图形在XY平面上的关键点Lixl vtSect = vtSect.orthoProject(TAuxTools::GetUcsZvt()); // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; AcGePoint3d ptS, ptM, ptE; vtDir.normalize(); ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > 120.0) { ptS = ptM + vtDir * 60.0; ptE = ptM - vtDir * 60.0; curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt()); double dS = 20.0, dE = 50.0; if (dStartWidth > dEndWidth) { dS = 50.0; dE = 20.0; } curEle.ptGe[0] = ptS + (dS + 10.0) * vtDir; curEle.ptGe[1] = ptS - (dS + 10.0) * vtDir; curEle.ptGe[2] = ptS - (dS + 10.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + (dE + 10.0) * vtDir; curEle.ptGe[1] = ptE - (dE + 10.0) * vtDir; curEle.ptGe[2] = ptE - (dE + 10.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS + dS * vtDir; curEle.ptGe[1] = ptE + dE * vtDir; curEle.ptGe[2] = ptE + dE * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS - dS * vtDir; curEle.ptGe[1] = ptE - dE * vtDir; curEle.ptGe[2] = ptE - dE * vtDir; cplCurve.append(curEle); return TRUE; } if (0 == nType) { AcGeVector3d vt = vtSect; //vt.rotateBy(PI / 2.0, vtNormal); vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); vt.normalize(); AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPointIn[1]; curEle.ptGe[2] = arPointIn[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPointIn[0]; curEle.ptGe[2] = arPointIn[0]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[1]; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[0]; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[2]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[3]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[1]; curEle.ptGe[2] = arPoint[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[2]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); } else if (1 == nType) { if (bHasBaseLine) { curEle.idSubLay = idBaseLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptStart - dPlusEdge * vtSect; curEle.ptGe[2] = ptStart - dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } } return TRUE; } // 倾斜变径: 圆对圆 BOOL THImpHvacReducer::MakeIncCir2Cir2DCurves(TComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = 0.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; TDb::HvacSectType eStaSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 中心线图层 BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt); if (NULL != pFit) idBaseLayer = pFit->CenterLayer(); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; AcGeVector3d vtSect = GetSectNormal(); int i(0), nRet(0); AcDbPolyline* pLine = new AcDbPolyline; if (NULL == pLine) return FALSE; AcGePoint3dArray arPtsCir; AcGeVector3d vt = vtSect.crossProduct(vtNormal); vt.normalize(); // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; vtDir.orthoProject(TAuxTools::GetUcsZvt()); vtDir.normalize(); AcGePoint3d ptS, ptM, ptE; ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > 120.0) { ptS = ptM + vtDir * 60.0; ptE = ptM - vtDir * 60.0; curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI/2, TAuxTools::GetUcsZvt()); double dS = 20.0, dE = 50.0; if (dStartWidth > dEndWidth) { dS = 50.0; dE = 20.0; } curEle.ptGe[0] = ptS + (dS + 10.0) * vtDir; curEle.ptGe[1] = ptS - (dS + 10.0) * vtDir; curEle.ptGe[2] = ptS - (dS + 10.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + (dE + 10.0) * vtDir; curEle.ptGe[1] = ptE - (dE + 10.0) * vtDir; curEle.ptGe[2] = ptE - (dE + 10.0) * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS + dS * vtDir; curEle.ptGe[1] = ptE + dE * vtDir; curEle.ptGe[2] = ptE + dE * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptS - dS * vtDir; curEle.ptGe[1] = ptE - dE * vtDir; curEle.ptGe[2] = ptE - dE * vtDir; cplCurve.append(curEle); return TRUE; } if (0 == nType) { AcGePoint3d arPoint[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); // 末端半个椭圆 vt = -vtSect;//起点指向终点 if (eEndSectType == TDb::eCircular) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt); if (-1 != nRet) { // for (i = 0; i < arPtsCir.length(); i++) // { // if (i > 1 && i%2 == 0) // { // curEle.ptGe[0] = arPtsCir[i-2]; // curEle.ptGe[1] = arPtsCir[i-1]; // curEle.ptGe[2] = arPtsCir[i]; // cplCurve.append(curEle); // } // } for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } arPoint[2] = arPtsCir.first(); arPoint[3] = arPtsCir.last(); } } else { } arPtsCir.setLogicalLength(0); pLine->reset(Adesk::kFalse, i); if (eStaSectType == TDb::eCircular) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pLine, -vt); if (-1 != nRet) { // for (i = 0; i < arPtsCir.length(); i++) // { // if (i > 1 && i%2 == 0) // { // curEle.ptGe[0] = arPtsCir[i-2]; // curEle.ptGe[1] = arPtsCir[i-1]; // curEle.ptGe[2] = arPtsCir[i]; // cplCurve.append(curEle); // } // } for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } arPoint[0] = arPtsCir.first(); arPoint[1] = arPtsCir.last(); } } else { } vt = -vtSect.crossProduct(vtNormal); AcGePoint3d ptJudge = ptStart + vt * 10000; ptJudge.z = (ptStart.z + ptEnd.z) * 0.5; arPoint[0].z = ptJudge.z; arPoint[1].z = ptJudge.z; arPoint[2].z = ptJudge.z; arPoint[3].z = ptJudge.z; AcGePoint3d ptTmp; // 0,3点在上, 1,2点在下 if (arPoint[0].distanceTo(ptJudge) < arPoint[1].distanceTo(ptJudge)) { ptTmp = arPoint[0]; arPoint[0] = arPoint[1]; arPoint[1] = ptTmp; } if (arPoint[3].distanceTo(ptJudge) < arPoint[2].distanceTo(ptJudge)) { ptTmp = arPoint[3]; arPoint[3] = arPoint[2]; arPoint[2] = ptTmp; } // 变径边线 curEle.idSubLay = AcDbObjectId::kNull; curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); } else if (1 == nType) { if (bHasBaseLine) { curEle.idSubLay = idBaseLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } // 内部端线 curEle.idSubLay = idEndLayer; curEle.dWidth = GetEndLineWidth(); vt = -vtSect; // 起点高,画起点内半个椭圆 if (ptStart.z > ptEnd.z) { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptStart, dStartWidth, vt, TAuxTools::GetUcsZvt(), *pLine, vt); if (-1 != nRet) { // for (i = 0; i < arPtsCir.length(); i++) // { // if (i > 1 && i%2 == 0) // { // curEle.ptGe[0] = arPtsCir[i-2]; // curEle.ptGe[1] = arPtsCir[i-1]; // curEle.ptGe[2] = arPtsCir[i]; // cplCurve.append(curEle); // } // } for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } } } else // 终点高,画终点内部半个椭圆 { nRet = TAuxTools::GetEllipsePtsFromCircle(arPtsCir, ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pLine, -vt); if (-1 != nRet) { // for (i = 0; i < arPtsCir.length(); i++) // { // if (i > 1 && i%2 == 0) // { // curEle.ptGe[0] = arPtsCir[i-2]; // curEle.ptGe[1] = arPtsCir[i-1]; // curEle.ptGe[2] = arPtsCir[i]; // cplCurve.append(curEle); // } // } for (i = 0; i < arPtsCir.length()-1; i++)//Lixl add 2011-11-23 { curEle.ptGe[0] = arPtsCir[i]; curEle.ptGe[1] = arPtsCir[i+1]; curEle.ptGe[2] = arPtsCir[i+1]; cplCurve.append(curEle); } } } } if (NULL != pLine) delete pLine; return TRUE; } // 构建倾斜变径 圆对圆轮廓线 AcDbPolyline* THImpHvacReducer::MakeIncCir2CirPolyCurve() const { ASSERT(NULL != m_pXDataMap); AcDbPolyline* pPolyCurve = new AcDbPolyline; if (NULL == pPolyCurve) return pPolyCurve; double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); AcGeVector3d vtNormal = AcGeVector3d::kZAxis; TDb::HvacSectType eStaSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } AcGeVector3d vtSect = GetSectNormal(); int i(0), nRet(0); AcDbPolyline* pCirLine = new AcDbPolyline; if (NULL == pCirLine) return pPolyCurve; AcGePoint3dArray arPtsCir; AcGeVector3d vt = vtSect.crossProduct(vtNormal); vt.normalize(); AcGePoint3d arPoint[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), TAuxTools::GetUcsZvt()); AcGePoint3d ptOrg = AcGePoint3d::kOrigin.orthoProject(plan); double dEl = ptOrg.asVector().length(); if (!ptOrg.asVector().isCodirectionalTo(plan.normal())) { dEl *= -1.0; } plan.set(ptOrg, TAuxTools::GetUcsZvt()); // 边线 pPolyCurve->addVertexAt(0, arPoint[1].convert2d(plan)); pPolyCurve->addVertexAt(1, arPoint[2].convert2d(plan)); // 终点椭圆端线 vt = ptEnd - ptStart; nRet = TAuxTools::GetEllipseFromCircle(ptEnd, dEndWidth, vt, TAuxTools::GetUcsZvt(), *pCirLine, vt); if (-1 != nRet) { TAuxTools::MergerPline(pPolyCurve, pCirLine); } // 边线 pPolyCurve->addVertexAt(pPolyCurve->numVerts(), arPoint[3].convert2d(plan)); pPolyCurve->addVertexAt(pPolyCurve->numVerts(), arPoint[0].convert2d(plan)); // 起点椭圆边线 pCirLine->reset(Adesk::kFalse, i); if (eStaSectType == TDb::eCircular) { nRet = TAuxTools::GetEllipseFromCircle(ptStart, dStartWidth, -vt, TAuxTools::GetUcsZvt(), *pCirLine, -vt); if (-1 != nRet) TAuxTools::MergerPline(pPolyCurve, pCirLine); } if (NULL != pCirLine) delete pCirLine; pPolyCurve->setElevation(dEl); pPolyCurve->setNormal(plan.normal()); pPolyCurve->setClosed(Adesk::kTrue); return pPolyCurve; } BOOL THImpHvacReducer::MakeIncCir2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; TDb::HvacSectType eStaSectType = TDb::eRectangular; TDb::HvacSectType eEndSectType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStaSectType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSectType); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); if ((eStaSectType == TDb::eRectangular) && !vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 取厚 { m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } AcGeVector3d vtSect = GetSectNormal(); int i(0), nRet(0); AcDbPolyline* pCirLine = new AcDbPolyline; if (NULL == pCirLine) return FALSE; AcGePoint3dArray arPtsCir; AcGeVector3d vt = vtSect.crossProduct(vtNormal); vt.normalize(); AcGePoint3d arPoint[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; AcGePlane plan(TAuxTools::Mid(ptStart, ptEnd), TAuxTools::GetUcsZvt()); AcGePoint3d ptOrg = AcGePoint3d::kOrigin.orthoProject(plan); plan.set(ptOrg, TAuxTools::GetUcsZvt()); // 中心的矩形平面 AcDbFace* pCenFace = new AcDbFace; pCenFace->setVertexAt(0, arPoint[0].orthoProject(plan)); pCenFace->setVertexAt(1, arPoint[1].orthoProject(plan)); pCenFace->setVertexAt(2, arPoint[2].orthoProject(plan)); pCenFace->setVertexAt(3, arPoint[3].orthoProject(plan)); arFaces.append(pCenFace); // 终点端半个椭圆面和起点半个椭圆面 double dMinAngle(TAuxTools::GetMinDiffAngle() * 0.5); int nPartNum = int(PI / dMinAngle) + 1; dMinAngle = PI / nPartNum; AcGePoint3dArray ptArrSta, ptArrEnd; AcGePoint3d ptStaNow = arPoint[0]; AcGePoint3d ptEndNow = arPoint[3]; vt = ptEnd - ptStart; vt.normalize(); for (i = 0; i < nPartNum + 1; i++) { ptArrSta.append(ptStaNow.orthoProject(plan)); ptArrEnd.append(ptEndNow.orthoProject(plan)); if (ptStart.z > ptEnd.z) { ptStaNow.rotateBy(-dMinAngle, -vt, ptStart); ptEndNow.rotateBy(dMinAngle, -vt, ptEnd); } else { ptStaNow.rotateBy(-dMinAngle, vt, ptStart); ptEndNow.rotateBy(dMinAngle, vt, ptEnd); } if (i > 0) { AcDbFace* pStaFace = new AcDbFace; pStaFace->setVertexAt(0, ptStart.orthoProject(plan)); pStaFace->setVertexAt(1, ptArrSta[i]); pStaFace->setVertexAt(2, ptArrSta[i-1]); pStaFace->setVertexAt(3, ptStart.orthoProject(plan)); arFaces.append(pStaFace); AcDbFace* pEndFace = new AcDbFace; pEndFace->setVertexAt(0, ptEnd.orthoProject(plan)); pEndFace->setVertexAt(1, ptArrEnd[i]); pEndFace->setVertexAt(2, ptArrEnd[i-1]); pEndFace->setVertexAt(3, ptEnd.orthoProject(plan)); arFaces.append(pEndFace); } } return arFaces.length() > 0; } // 构建外轮廓所围平面的3DFace组(方对方) BOOL THImpHvacReducer::MakeRect2RectPolyCurveFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // mcl, add.各点都投影到以首点为基准的标准面上 AcGePlane planStd = GetStdPrjPlan(ptStart); ptEnd = ptEnd.orthoProject(planStd); AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); vt.normalize(); AcDbFace* pFace = NULL; if (IsSingleLine()) { double dHideWidth = 0.0; GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHideWidth); AcGePoint3d arPoint[4]; arPoint[0] = ptStart - dHideWidth * vt / 2.0; arPoint[1] = ptStart + dHideWidth * vt / 2.0; arPoint[2] = ptEnd + dHideWidth * vt / 2.0; arPoint[3] = ptEnd - dHideWidth * vt / 2.0; pFace = new AcDbFace; pFace->setVertexAt(0, arPoint[0]); pFace->setVertexAt(1, arPoint[1]); pFace->setVertexAt(2, arPoint[2]); pFace->setVertexAt(3, arPoint[3]); arFaces.append(pFace); } else { double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge(); AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); TDb::HvacSectType eSectTypeStart = TDb::eRectangular, eSectTypeEnd = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSectTypeStart); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSectTypeEnd); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if (!vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) { if (eSectTypeStart == TDb::eRectangular) m_pXDataMap->GetAt(HRED_StartThick, dStartWidth); if (eSectTypeEnd == TDb::eRectangular) m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; if (dPlusEdge > 1.0e-6) { pFace = new AcDbFace; pFace->setVertexAt(0, arPoint[0]); pFace->setVertexAt(1, arPoint[1]); pFace->setVertexAt(2, arPointIn[1]); pFace->setVertexAt(3, arPointIn[0]); arFaces.append(pFace); } pFace = new AcDbFace; pFace->setVertexAt(0, arPointIn[0]); pFace->setVertexAt(1, arPointIn[1]); pFace->setVertexAt(2, arPointIn[2]); pFace->setVertexAt(3, arPointIn[3]); arFaces.append(pFace); if (dPlusEdge > 1.0e-6) { pFace = new AcDbFace; pFace->setVertexAt(0, arPointIn[3]); pFace->setVertexAt(1, arPointIn[2]); pFace->setVertexAt(2, arPoint[2]); pFace->setVertexAt(3, arPoint[3]); arFaces.append(pFace); } } return TRUE; } // 绘制三维图形(方对圆) void THImpHvacReducer::ExplodeRect2Cir3d(XExplodeDraw& mode, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0, dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; AcGeVector3d vtSect = GetSectNormal(); if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dEndThick); m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndThick, dStartThick); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); vtSect = -vtSect; } m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); double dMinDiffAng = PI / 12.0; // 圆弧分割的角度 GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng); int nSect = int(PI / (2.0 * dMinDiffAng)) + 1; // 每PI/2圆弧分成的段数 dMinDiffAng = PI / (2.0 * nSect); // 起始端圆分割点 AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arCirPt; AcGePoint3d ptCir; ptCir = ptStart + vt * dStartWidth / 2.0; arCirPt.append(ptCir); for (int i = 1; i < 4 * nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptStart); arCirPt.append(ptCir); } arCirPt.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差 // 终止端矩形顶点 AcGePoint3dArray arRectPt; arRectPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0); arRectPt.append(arRectPt.at(0) + dEndThick * vtNormal); arRectPt.append(arRectPt.at(1) - dEndWidth * vt); arRectPt.append(arRectPt.at(0) - dEndWidth * vt); arRectPt.append(arRectPt.at(0)); // 4*(nSect+1)+1行4列网格点 AcGePoint3dArray arPoint; for (i = 0; i < 4; i++) { // 圆上点和矩形边 arPoint.append(arCirPt.at(i * nSect)); arPoint.append(arCirPt.at(i * nSect) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(i) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(i)); // 圆上边和矩形顶点 for (int j = 0; j < nSect; j++) { arPoint.append(arCirPt.at(i * nSect + j)); arPoint.append(arCirPt.at(i * nSect + j) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(i + 1) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(i + 1)); } } arPoint.append(arCirPt.at(0)); arPoint.append(arCirPt.at(0) - dPlusEdge * vtSect); arPoint.append(arRectPt.at(0) + dPlusEdge * vtSect); arPoint.append(arRectPt.at(0)); mode.DrawMesh(4 * (nSect + 1) + 1, 4, arPoint.asArrayPtr()); } // 构建外轮廓(方对圆) AcDbPolyline* THImpHvacReducer::MakeRect2CirPolyCurve() const { return MakeRect2RectPolyCurve(); } // 构建二维图形(方对圆) BOOL THImpHvacReducer::MakeRect2Cir2DCurves(TComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtSect = GetSectNormal(); if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 宽厚颠倒 { m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); } // LixlModify支持倾斜管上的变径 else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); } else { m_pXDataMap->GetAt(HRED_EndThick, dEndWidth); } m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { vtSect = -vtSect; if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); } // LixlModify支持倾斜管上的变径 else if (!vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt())) { m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); } else { m_pXDataMap->GetAt(HRED_StartThick, dEndWidth); } m_pXDataMap->GetAt(HRED_EndWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); } AcDbObjectId idEndLayer, idBaseLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); TDbFittingBase* pFit = TDbFittingBase::cast(m_pOwnerEnt); if (NULL != pFit) idBaseLayer = pFit->CenterLayer(); BOOL bHasBaseLine = FALSE; m_pXDataMap->GetAt(HVAC_HasBaseLine, bHasBaseLine); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; // 绘单线 if (IsSingleLine()) { AcGeVector3d vtDir = ptStart - ptEnd; AcGePoint3d ptS, ptM, ptE; vtDir.normalize(); ptM = ptEnd + vtDir * ptStart.distanceTo(ptEnd) / 2.0; if (ptStart.distanceTo(ptEnd) > 120.0) { ptS = ptM + vtDir * 60.0; ptE = ptM - vtDir * 60.0; curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd; curEle.ptGe[1] = ptE; curEle.ptGe[2] = ptE; cplCurve.append(curEle); } else { ptS = ptStart; ptE = ptEnd; } vtDir.rotateBy(PI / 2.0, TAuxTools::GetUcsZvt()); curEle.ptGe[0] = ptS + 10.0 * vtDir; // ptS是圆断面 curEle.ptGe[1] = ptS - 10.0 * vtDir; curEle.ptGe[2] = ptS - 10.0 * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + 60.0 * vtDir; curEle.ptGe[1] = ptE - 60.0 * vtDir; curEle.ptGe[2] = ptE - 60.0 * vtDir; cplCurve.append(curEle); curEle.ptGe[0] = ptE + 50.0 * vtDir; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); curEle.ptGe[0] = ptE - 50.0 * vtDir; curEle.ptGe[1] = ptS; curEle.ptGe[2] = ptS; cplCurve.append(curEle); return TRUE; } AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3d arPoint[4], arPointIn[4]; arPoint[0] = ptStart - dStartWidth * vt / 2.0; arPoint[1] = ptStart + dStartWidth * vt / 2.0; arPoint[2] = ptEnd + dEndWidth * vt / 2.0; arPoint[3] = ptEnd - dEndWidth * vt / 2.0; arPointIn[0] = arPoint[0] - dPlusEdge * vtSect; arPointIn[1] = arPoint[1] - dPlusEdge * vtSect; arPointIn[2] = arPoint[2] + dPlusEdge * vtSect; arPointIn[3] = arPoint[3] + dPlusEdge * vtSect; if (1 == nType) // 内部线 { curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); if (bHasBaseLine) { curEle.idSubLay = idBaseLayer; // 基线图层 curEle.dWidth = GetCentLineWidth(); curEle.ptGe[0] = ptStart; curEle.ptGe[1] = ptStart - dPlusEdge * vtSect; curEle.ptGe[2] = ptStart - dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptStart - dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[2] = ptEnd + dPlusEdge * vtSect; cplCurve.append(curEle); curEle.ptGe[0] = ptEnd + dPlusEdge * vtSect; curEle.ptGe[1] = ptEnd; curEle.ptGe[2] = ptEnd; cplCurve.append(curEle); } } else if (0 == nType) // 外边线 { curEle.dWidth = GetEdgeLineWidth(); curEle.ptGe[0] = arPoint[1]; curEle.ptGe[1] = arPointIn[1]; curEle.ptGe[2] = arPointIn[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPointIn[0]; curEle.ptGe[2] = arPointIn[0]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[1]; curEle.ptGe[1] = arPointIn[2]; curEle.ptGe[2] = arPointIn[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[0]; curEle.ptGe[1] = arPointIn[3]; curEle.ptGe[2] = arPointIn[3]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[2]; curEle.ptGe[1] = arPoint[2]; curEle.ptGe[2] = arPoint[2]; cplCurve.append(curEle); curEle.ptGe[0] = arPointIn[3]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); curEle.ptGe[0] = arPoint[0]; curEle.ptGe[1] = arPoint[1]; curEle.ptGe[2] = arPoint[1]; cplCurve.append(curEle); curEle.ptGe[0] = arPoint[2]; curEle.ptGe[1] = arPoint[3]; curEle.ptGe[2] = arPoint[3]; cplCurve.append(curEle); } return TRUE; } // 构建外轮廓所围平面的3DFace组(方对圆) BOOL THImpHvacReducer::MakeRect2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces) { return MakeRect2RectPolyCurveFaces(arFaces); } // 绘制三维图形(圆对方) void THImpHvacReducer::ExplodeCir2Rect3d(XExplodeDraw& mode) const { ExplodeRect2Cir3d(mode, TRUE); } // 构建外轮廓(圆对方) AcDbPolyline* THImpHvacReducer::MakeCir2RectPolyCurve() const { return MakeRect2RectPolyCurve(); } // 构建二维图形(圆对方) BOOL THImpHvacReducer::MakeCir2Rect2DCurves(TComplexCurve& cplCurve, int &nType) const { return MakeRect2Cir2DCurves(cplCurve, nType, TRUE); } // 构建外轮廓所围平面的3DFace组(圆对方) BOOL THImpHvacReducer::MakeCir2RectPolyCurveFaces(AcDbVoidPtrArray& arFaces) { return MakeRect2RectPolyCurveFaces(arFaces); } // 绘制三维图形(圆对圆) void THImpHvacReducer::ExplodeCir2Cir3d(XExplodeDraw& mode) const { ASSERT(NULL != m_pXDataMap); double dStartWidth = 200.0, dEndWidth = 400.0, dPlusEdge = GetPlusEdge(); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtSect = GetSectNormal(); double dMinDiffAng = PI / 12.0; // 圆弧分割的角度 GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinDiffAng); int nSect = int(2.0 * PI / dMinDiffAng) + 1; dMinDiffAng = 2.0 * PI / nSect; // 起始端圆分割点 AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arCirPtStart; AcGePoint3d ptCir; ptCir = ptStart + vt * dStartWidth / 2.0; arCirPtStart.append(ptCir); for (int i = 1; i < nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptStart); arCirPtStart.append(ptCir); } arCirPtStart.append(ptStart + vt * dStartWidth / 2.0); // 最后一个封闭,可消除计算误差 // 终止端端圆分割点 AcGePoint3dArray arCirPtEnd; ptCir = ptEnd + vt * dEndWidth / 2.0; arCirPtEnd.append(ptCir); for (i = 1; i < nSect; i++) { ptCir.rotateBy(dMinDiffAng, vtSect, ptEnd); arCirPtEnd.append(ptCir); } arCirPtEnd.append(ptEnd + vt * dEndWidth / 2.0); // nSect+1行2列网格点 AcGePoint3dArray arPoint; for (i = 0; i < nSect + 1; i++) { arPoint.append(arCirPtStart.at(i)); arPoint.append(arCirPtStart.at(i) - dPlusEdge * vtSect); arPoint.append(arCirPtEnd.at(i) + dPlusEdge * vtSect); arPoint.append(arCirPtEnd.at(i)); } mode.DrawMesh(nSect + 1, 4, arPoint.asArrayPtr()); } // 构建外轮廓(圆对圆) AcDbPolyline* THImpHvacReducer::MakeCir2CirPolyCurve() const { return MakeRect2RectPolyCurve(); } // 构建二维图形(圆对圆) BOOL THImpHvacReducer::MakeCir2Cir2DCurves(TComplexCurve& cplCurve, int &nType) const { return MakeRect2Rect2DCurves(cplCurve, nType); } // 构建外轮廓所围平面的3DFace组(圆对圆) BOOL THImpHvacReducer::MakeCir2CirPolyCurveFaces(AcDbVoidPtrArray& arFaces) { return MakeRect2RectPolyCurveFaces(arFaces); } // 获得外轮廓点 void THImpHvacReducer::GetOutVertex(AcGePoint3dArray& arPoint, TDb::HvacSectType eStart, TDb::HvacSectType eEnd) const { double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); if (eStart == TDb::eRectangular) m_pXDataMap->GetAt(HRED_StartThick, dStartThick); else dStartThick = dStartWidth; // 圆形取厚度为宽 m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); if (eStart == TDb::eRectangular) m_pXDataMap->GetAt(HRED_EndThick, dEndThick); else dEndThick = dEndWidth; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 计算8顶点(圆形近似为方形计算) AcGeVector3d vtSect = AcGeVector3d::kZAxis; AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); arStartPt.append(arStartPt.at(0) - dStartWidth * vt); arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal); arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal); AcGePoint3dArray arEndPt; arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0); arEndPt.append(arEndPt.at(0) - dEndWidth * vt); arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal); arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal); // 边旋转到与x,y轴平行 double dAngle = vtNormal.angleTo(AcGeVector3d::kXAxis); for (int i = 0; i < 4; i++) { arStartPt.at(i).rotateBy(dAngle, vtSect, ptStart); arEndPt.at(i).rotateBy(dAngle, vtSect, ptStart); } // 寻找外轮廓点 if (arStartPt.at(0).x < arEndPt.at(0).x) { arPoint.append(arEndPt.at(0)); arPoint.append(arEndPt.at(1)); if (arStartPt.at(1).y < arEndPt.at(1).y) { arPoint.append(arEndPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(2)); arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 左,下偏出 { arPoint.append(arStartPt.at(0)); } else // 左偏出 { arPoint.append(arEndPt.at(3)); } } else { arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 下偏出 { arPoint.append(arStartPt.at(3)); arPoint.append(arStartPt.at(0)); } else // 全在里面 { } } } else // 上偏 { arPoint.append(arStartPt.at(1)); arPoint.append(arStartPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,左,下偏出 { arPoint.append(arStartPt.at(0)); } else // 上,左偏出 { arPoint.append(arEndPt.at(3)); } } else { arPoint.append(arEndPt.at(2)); arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 上,下偏出 { arPoint.append(arStartPt.at(3)); arPoint.append(arStartPt.at(0)); } else // 上偏出 { } } } } else // 右偏 { arPoint.append(arStartPt.at(0)); arPoint.append(arStartPt.at(1)); if (arStartPt.at(1).y < arEndPt.at(1).y) { arPoint.append(arEndPt.at(1)); arPoint.append(arEndPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(2)); arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,左,下偏出 { } else // 右,左偏出 { arPoint.append(arEndPt.at(3)); arPoint.append(arEndPt.at(0)); } } else { arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,下偏出 { arPoint.append(arStartPt.at(3)); } else // 右偏出 { arPoint.append(arEndPt.at(0)); } } } else // 上偏 { arPoint.append(arStartPt.at(2)); if (arStartPt.at(2).x < arEndPt.at(2).x)// 左偏 { arPoint.append(arStartPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,左,下偏出 { } else // 右,上,左偏出 { arPoint.append(arEndPt.at(3)); arPoint.append(arEndPt.at(0)); } } else { arPoint.append(arEndPt.at(2)); arPoint.append(arEndPt.at(3)); if (arStartPt.at(3).y < arEndPt.at(3).y) // 右,上,下偏出 { arPoint.append(arStartPt.at(3)); } else // 右,上偏出 { arPoint.append(arEndPt.at(0)); } } } } // 恢复点的原位置 for (i = 0; i < arPoint.length(); i++) { arPoint.at(i).rotateBy(-dAngle, vtSect, ptStart); } } /* 2______________________1 | | | 0 | | | 3______________________4| */ // bGetStartVertex 真:取起点截面周围顶点,假:取终点截面周围顶点 // 矩形截面,执行此函数后6个点,圆形界面26个点,顺序,中心点,逆时针24个点,逆时针起点终点重复一个点 void THImpHvacReducer::GetOutVertex2(AcGePoint3dArray& arPoint, bool bGetStartVertex) const { ASSERT(NULL != m_pXDataMap); // 竖直放置时的外轮廓 if (IsVertAlignment()) { AcGeVector3d vtSect, vtNor; m_pXDataMap->GetAt(HRED_StartDir, vtSect); m_pXDataMap->GetAt(HVAC_Normal, vtNor); AcGePoint3d ptCenter, ptTmp; double dWidth(0.0), dThick(0.0); TDb::HvacSectType eSect(TDb::eRectangular); if (bGetStartVertex) { m_pXDataMap->GetAt(HRED_StartPoint, ptCenter); m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSect); m_pXDataMap->GetAt(HRED_StartWidth, dWidth); m_pXDataMap->GetAt(HRED_StartThick, dThick); } else { m_pXDataMap->GetAt(HRED_EndPoint, ptCenter); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eSect); m_pXDataMap->GetAt(HRED_EndWidth, dWidth); m_pXDataMap->GetAt(HRED_EndThick, dThick); } AcGeVector3d vtDir = vtNor.crossProduct(vtSect); AcGeVector3d vtDirV = vtDir.normalize(); vtDirV.rotateBy(PI*0.5, vtSect); // 0 arPoint.append(ptCenter); if (TDb::eRectangular == eSect) { ptTmp = ptCenter + vtDir * dWidth * 0.5; ptTmp = ptTmp + vtDirV * dThick * 0.5; arPoint.append(ptTmp);//1 ptTmp = arPoint[1] - vtDir * dWidth; arPoint.append(ptTmp);//2 ptTmp = arPoint[2] - vtDirV * dThick; arPoint.append(ptTmp);//3 ptTmp = arPoint[1] - vtDirV * dThick; arPoint.append(ptTmp);//4 // 为闭合,增加1点为重复点 arPoint.append(arPoint[1]); } else if (TDb::eCircular == eSect) { // 把圆按照最小分度角,分成几部分,取圆上点 double dMixAngle = TAuxTools::GetMinDiffAngle(); int nPart = 24; dMixAngle = PI*2.0 / nPart; ptTmp = ptCenter + vtDir * dWidth * 0.5; arPoint.append(ptTmp); for (int i = 0; i < nPart; i++) { ptTmp.rotateBy(dMixAngle, vtSect, ptCenter); arPoint.append(ptTmp); } } } } // 垂直构建外轮廓 AcDbPolyline* THImpHvacReducer::MakePolyCurveVer() const { // TDb::HvacSectType eStartType = TDb::eRectangular; // TDb::HvacSectType eEndType = TDb::eRectangular; // m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType); // m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType); // AcGePoint3dArray arPoint; // GetOutVertex(arPoint, eStartType, eEndType); // // double dStartWidth = 200.0, dStartThick = 200.0; // AcGePoint3d ptStart; // AcGeVector3d vtNormal = AcGeVector3d::kZAxis; // m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); // if (eStartType == TDb::eRectangular) // m_pXDataMap->GetAt(HRED_StartThick, dStartThick); // else // dStartThick = dStartWidth; // 圆形取厚度为宽 // m_pXDataMap->GetAt(HRED_StartPoint, ptStart); // m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // AcGeVector3d vtSect = GetSectNormal(); // AcGeVector3d vt = vtSect; // vt.rotateBy(PI / 2.0, vtNormal); // vt.normalize(); // AcGePoint3dArray arStartPt; // arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); // arStartPt.append(arStartPt.at(0) - dStartWidth * vt); // arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal); // arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal); // // AcGePlane plan = GetStdPrjPlan(arStartPt.at(0)); // double dEle = TAuxTools::GetPlaneEle(plan); // // AcDbPolyline* pPolyLine = new AcDbPolyline; // for (int i = 0; i < arPoint.length(); i++) // { // pPolyLine->addVertexAt(i, arPoint.at(i).convert2d(plan)); // } // pPolyLine->setNormal(TAuxTools::GetUcsZvt()); // pPolyLine->setElevation(dEle); // pPolyLine->setClosed(Adesk::kTrue); // 换个方法Lixl modify 2012-5-21 TDb::HvacSectType eStartSect, eEndSect, eSect; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect); double dStaWidth, dStaThick, dEndWidth, dEndThick; m_pXDataMap->GetAt(HRED_StartWidth, dStaWidth); m_pXDataMap->GetAt(HRED_StartThick, dStaThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); double dStartArea, dEndArea; if (TDb::eRectangular == eStartSect) dStartArea = dStaWidth * dStaThick; else dStartArea = dStaWidth * dStaWidth; if (TDb::eRectangular == eEndSect) dEndArea = dEndWidth * dEndThick; else dEndArea = dEndWidth * dEndWidth; bool bStart(true); eSect = eStartSect; if (UP_ZERO(dEndArea - dStartArea)) { bStart = false; eSect = eEndSect; } AcGePoint3dArray arPoint; GetOutVertex2(arPoint, bStart); if (arPoint.length() < 6) return NULL; AcGePlane plan = GetStdPrjPlan(arPoint[0]); double dEle = TAuxTools::GetPlaneEle(plan); AcDbPolyline* pPolyLine = new AcDbPolyline; if (eSect == TDb::eRectangular) // 方形截面 { pPolyLine->addVertexAt(0, arPoint[1].convert2d(plan)); pPolyLine->addVertexAt(1, arPoint[2].convert2d(plan)); pPolyLine->addVertexAt(2, arPoint[3].convert2d(plan)); pPolyLine->addVertexAt(3, arPoint[4].convert2d(plan)); } else { // 圆截面时,arPoint第一个元素是中心点,最后一个元素与逆时针起点重复,舍去 int nVer(0); for (int i = 1; i < arPoint.length()-1; i++) { pPolyLine->addVertexAt(nVer++, arPoint[i].convert2d(plan)); } } pPolyLine->setNormal(TAuxTools::GetUcsZvt()); pPolyLine->setElevation(dEle); pPolyLine->setClosed(Adesk::kTrue); return pPolyLine; } void THImpHvacReducer::MakePolyCurveFacesVer(AcDbVoidPtrArray& arFaces) { // TDb::HvacSectType eStartType = TDb::eRectangular; // TDb::HvacSectType eEndType = TDb::eRectangular; // m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType); // m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType); // AcGePoint3dArray arPoint; // GetOutVertex(arPoint, eStartType, eEndType); // // AcDbFace* pFace = NULL; // for (int i = 1; i < arPoint.length() - 1; i++) // { // pFace = new AcDbFace; // pFace->setVertexAt(0, arPoint.at(0)); // pFace->setVertexAt(1, arPoint.at(i)); // pFace->setVertexAt(2, arPoint.at(i + 1)); // arFaces.append(pFace); // } // Lixl modify 2012-5-21 TDb::HvacSectType eStartType = TDb::eRectangular; TDb::HvacSectType eEndType = TDb::eRectangular; m_pXDataMap->GetAt(HRED_StartSectType,(int&)eStartType); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndType); AcGePoint3dArray arSra, arEnd; GetOutVertex2(arSra, true); GetOutVertex2(arEnd, false); if (arSra.length() < 0 || arEnd.length() < 0) return ; AcDbFace* pFace = NULL; if (TDb::eRectangular == eStartType) { pFace = new AcDbFace; pFace->setVertexAt(0, arSra.at(1)); pFace->setVertexAt(1, arSra.at(2)); pFace->setVertexAt(2, arSra.at(3)); pFace->setVertexAt(3, arSra.at(4)); arFaces.append(pFace); } else { for (int i = 0; i <= arSra.length()-2; i++) { pFace = new AcDbFace; pFace->setVertexAt(0, arSra[0]); pFace->setVertexAt(1, arSra[i]); pFace->setVertexAt(2, arSra[i + 1]); pFace->setVertexAt(3, arSra[0]); arFaces.append(pFace); } } if (TDb::eRectangular == eEndType) { pFace = new AcDbFace; pFace->setVertexAt(0, arEnd.at(1)); pFace->setVertexAt(1, arEnd.at(2)); pFace->setVertexAt(2, arEnd.at(3)); pFace->setVertexAt(3, arEnd.at(4)); arFaces.append(pFace); } else { for (int i = 0; i <= arEnd.length() - 2; i++) { pFace = new AcDbFace; pFace->setVertexAt(0, arEnd[0]); pFace->setVertexAt(1, arEnd[i]); pFace->setVertexAt(2, arEnd[i + 1]); pFace->setVertexAt(3, arEnd[0]); arFaces.append(pFace); } } } // 垂直构建外轮廓(方对方) AcDbPolyline* THImpHvacReducer::MakeRect2RectPolyCurveVer() const { return MakePolyCurveVer(); } // 垂直构建二维图形(方对方) BOOL THImpHvacReducer::MakeRect2Rect2DCurvesVer(TComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); // double dStartWidth = 200.0, dStartThick = 200.0, dEndWidth = 400.0, dEndThick = 400.0; // AcGePoint3d ptStart, ptEnd; // AcGeVector3d vtNormal = AcGeVector3d::kZAxis; // m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); // m_pXDataMap->GetAt(HRED_StartThick, dStartThick); // m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); // m_pXDataMap->GetAt(HRED_EndThick, dEndThick); // m_pXDataMap->GetAt(HRED_StartPoint, ptStart); // m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // AcDbObjectId idEndLayer; // m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // // // 计算顶点 // AcGeVector3d vt = AcGeVector3d::kZAxis; // vt.rotateBy(PI / 2.0, vtNormal); // vt.normalize(); // AcGePoint3dArray arStartPt; // arStartPt.append(ptStart + dStartWidth * vt / 2.0 + dStartThick * vtNormal / 2.0); // arStartPt.append(arStartPt.at(0) - dStartWidth * vt); // arStartPt.append(arStartPt.at(1) - dStartThick * vtNormal); // arStartPt.append(arStartPt.at(0) - dStartThick * vtNormal); // AcGePoint3dArray arEndPt; // arEndPt.append(ptEnd + dEndWidth * vt / 2.0 + dEndThick * vtNormal / 2.0); // arEndPt.append(arEndPt.at(0) - dEndWidth * vt); // arEndPt.append(arEndPt.at(1) - dEndThick * vtNormal); // arEndPt.append(arEndPt.at(0) - dEndThick * vtNormal); // // TDb::TCurveElement curEle; // curEle.bHided = FALSE; // curEle.dWidth = 0.0; // curEle.gsMark = 0; // if (0 == nType) // { // curEle.dWidth = GetEdgeLineWidth(); // for (int i = 0; i < 4; i++) // { // curEle.ptGe[0] = arStartPt.at(i); // curEle.ptGe[1] = arEndPt.at(i); // curEle.ptGe[2] = arEndPt.at(i); // cplCurve.append(curEle); // } // // curEle.idSubLay = idEndLayer; // 两端图层 // curEle.dWidth = GetEndLineWidth(); // for (i = 0; i < 3; i++) // { // curEle.ptGe[0] = arStartPt.at(i); // curEle.ptGe[1] = arStartPt.at(i + 1); // curEle.ptGe[2] = arStartPt.at(i + 1); // cplCurve.append(curEle); // curEle.ptGe[0] = arEndPt.at(i); // curEle.ptGe[1] = arEndPt.at(i + 1); // curEle.ptGe[2] = arEndPt.at(i + 1); // cplCurve.append(curEle); // } // curEle.ptGe[0] = arStartPt.at(0); // curEle.ptGe[1] = arStartPt.at(3); // curEle.ptGe[2] = arStartPt.at(3); // cplCurve.append(curEle); // curEle.ptGe[0] = arEndPt.at(0); // curEle.ptGe[1] = arEndPt.at(3); // curEle.ptGe[2] = arEndPt.at(3); // cplCurve.append(curEle); // } // Lixl modify 2012-5-21 AcGePoint3dArray arSta, arEnd; GetOutVertex2(arSta, true); GetOutVertex2(arEnd, false); if (arSta.length() != arEnd.length() || arSta.length() != 6) return FALSE; double dEndWidht = GetEndLineWidth(); double dEdgeWidth = GetEdgeLineWidth(); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; { curEle.idSubLay = idEndLayer; curEle.dWidth = dEndWidht; // 起点截面边线 int i = 0; for (i = 1; i < arSta.length()-1; i++) { curEle.ptGe[0] = arSta[i]; curEle.ptGe[1] = arSta[i+1]; curEle.ptGe[2] = arSta[i+1]; cplCurve.append(curEle); } // 终点截面边线 for (i = 1; i < arSta.length()-1; i++) { curEle.ptGe[0] = arEnd[i]; curEle.ptGe[1] = arEnd[i+1]; curEle.ptGe[2] = arEnd[i+1]; cplCurve.append(curEle); } // 绘制两个截面顶点之间的连线 curEle.idSubLay.setNull(); curEle.dWidth = dEdgeWidth; for (i = 1; i <= 4; i++) { curEle.ptGe[0] = arSta[i]; curEle.ptGe[1] = arEnd[i]; curEle.ptGe[2] = arEnd[i]; cplCurve.append(curEle); } } return TRUE; } // 垂直构建外轮廓所围平面的3DFace组(方对方) BOOL THImpHvacReducer::MakeRect2RectPolyCurveFacesVer(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); MakePolyCurveFacesVer(arFaces); return TRUE; } // 垂直构建外轮廓(方对圆) AcDbPolyline* THImpHvacReducer::MakeRect2CirPolyCurveVer() const { return MakePolyCurveVer(); } // 垂直构建二维图形(方对圆) BOOL THImpHvacReducer::MakeRect2Cir2DCurvesVer(TComplexCurve& cplCurve, int &nType, BOOL bStartIsRound) const { ASSERT(NULL != m_pXDataMap); double dStartDia = 200.0, dEndWidth = 400.0, dEndThick = 400.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; if (bStartIsRound) { m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); } else { m_pXDataMap->GetAt(HRED_EndDiameter, dStartDia); m_pXDataMap->GetAt(HRED_StartWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dEndThick); m_pXDataMap->GetAt(HRED_EndPoint, ptStart); m_pXDataMap->GetAt(HRED_StartPoint, ptEnd); } m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 计算顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0; arStartPt.append(ptCir); for (int i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptStart); arStartPt.append(ptCir); } arStartPt.append(ptStart + dStartDia * vt / 2.0); AcGePoint3dArray arEndPt; arEndPt.append(ptEnd + dEndWidth * vt / 2.0 - dEndThick * vtNormal / 2.0); arEndPt.append(arEndPt.at(0) + dEndThick * vtNormal); arEndPt.append(arEndPt.at(1) - dEndWidth * vt); arEndPt.append(arEndPt.at(0) - dEndWidth * vt); arEndPt.append(arEndPt.at(0)); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; // if (0 == nType) { curEle.dWidth = GetEdgeLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(i); curEle.ptGe[2] = arEndPt.at(i); cplCurve.append(curEle); curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(i + 1); curEle.ptGe[2] = arEndPt.at(i + 1); cplCurve.append(curEle); } curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arStartPt.at(2 * i + 1); curEle.ptGe[2] = arStartPt.at(2 * i + 2); cplCurve.append(curEle); curEle.ptGe[0] = arEndPt.at(i); curEle.ptGe[1] = arEndPt.at(i + 1); curEle.ptGe[2] = arEndPt.at(i + 1); cplCurve.append(curEle); } } return TRUE; } // 垂直构建外轮廓所围平面的3DFace组(方对圆) BOOL THImpHvacReducer::MakeRect2CirPolyCurveFacesVer(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); MakePolyCurveFacesVer(arFaces); return TRUE; } // 垂直构建外轮廓(圆对方) AcDbPolyline* THImpHvacReducer::MakeCir2RectPolyCurveVer() const { return MakePolyCurveVer(); } // 垂直构建二维图形(圆对方) BOOL THImpHvacReducer::MakeCir2Rect2DCurvesVer(TComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); MakeRect2Cir2DCurvesVer(cplCurve, nType, TRUE); return TRUE; } // 垂直构建外轮廓所围平面的3DFace组(圆对方) BOOL THImpHvacReducer::MakeCir2RectPolyCurveFacesVer(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); MakePolyCurveFacesVer(arFaces); return TRUE; } // 垂直构建外轮廓(圆对圆) AcDbPolyline* THImpHvacReducer::MakeCir2CirPolyCurveVer() const { return MakePolyCurveVer(); } // 垂直构建二维图形(圆对圆) BOOL THImpHvacReducer::MakeCir2Cir2DCurvesVer(TComplexCurve& cplCurve, int &nType) const { ASSERT(NULL != m_pXDataMap); double dStartDia = 200.0, dEndDia = 400.0; AcGePoint3d ptStart, ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartDiameter, dStartDia); m_pXDataMap->GetAt(HRED_EndDiameter, dEndDia); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcDbObjectId idEndLayer; m_pXDataMap->GetAt(HVAC_EndLayer, idEndLayer); // 计算顶点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vt = vtSect; vt.rotateBy(PI / 2.0, vtNormal); vt.normalize(); AcGePoint3dArray arStartPt; AcGePoint3d ptCir = ptStart + dStartDia * vt / 2.0; arStartPt.append(ptCir); for (int i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptStart); arStartPt.append(ptCir); } arStartPt.append(ptStart + dStartDia * vt / 2.0); AcGePoint3dArray arEndPt; ptCir = ptEnd + dEndDia * vt / 2.0; arEndPt.append(ptCir); for (i = 1; i < 8; i++) { ptCir.rotateBy(PI / 4.0, vtSect, ptEnd); arEndPt.append(ptCir); } arEndPt.append(ptEnd + dEndDia * vt / 2.0); TDb::TCurveElement curEle; curEle.bHided = FALSE; curEle.dWidth = 0.0; curEle.gsMark = 0; if (0 == nType) { curEle.idSubLay = idEndLayer; // 两端图层 curEle.dWidth = GetEndLineWidth(); for (i = 0; i < 4; i++) { curEle.ptGe[0] = arStartPt.at(2 * i); curEle.ptGe[1] = arStartPt.at(2 * i + 1); curEle.ptGe[2] = arStartPt.at(2 * i + 2); cplCurve.append(curEle); curEle.ptGe[0] = arEndPt.at(2 * i); curEle.ptGe[1] = arEndPt.at(2 * i + 1); curEle.ptGe[2] = arEndPt.at(2 * i + 2); cplCurve.append(curEle); } } return TRUE; } // 垂直构建外轮廓所围平面的3DFace组(圆对圆) BOOL THImpHvacReducer::MakeCir2CirPolyCurveFacesVer(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); MakePolyCurveFacesVer(arFaces); return TRUE; } // mcl commented, 2010.03.17. GetHidePlane()求的可能是个斜面,改为以首点为基准 // AcGePlane THImpHvacReducer::GetHidePlane(AcGePoint3d pt1, AcGePoint3d pt2, AcGePoint3d pt3, // const AcGeVector3d vtNormal, double &dEle) const // { // AcGePlane plan(pt1, pt2, pt3); // AcGePoint3d ptOrth = AcGePoint3d::kOrigin.orthoProject(plan); // plan.set(ptOrth, vtNormal); // // dEle = ptOrth.asVector().length(); // if (!ptOrth.asVector().isCodirectionalTo(vtNormal)) // dEle *= -1.0; // // return plan; // } AcGePlane THImpHvacReducer::GetStdPrjPlan( const AcGePoint3d &ptOnPlan ) const { AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGePlane planStd(ptOnPlan, vtZAxis); AcGePoint3d ptPrj = AcGePoint3d::kOrigin.orthoProject(planStd); planStd.set(ptPrj, vtZAxis); return planStd; } // 注意:pXMap == NULL表示不想得到返回值,只是判断数据是否合理 // 先取出m_pXDataMap中数据进行判断是否合理,返回判断结果 // 如果pXMap不为NULL,则将有效参数填入pXMap BOOL THImpHvacReducer::IsValid(TDbXDataMap* pXMap) { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptEnd; HvacReduComType eType = TDb::eAuto; m_pXDataMap->GetAt(HRED_ComputeType, (int&)eType); if (TDb::eAngle == eType) ptEnd = GetEndPtByangle(); else if (TDb::eLength == eType) ptEnd = GetEndPtByLen(); else ptEnd = GetEndPtAuto(); AcGePoint3d ptOrigEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptOrigEnd); m_pXDataMap->SetAt(HRED_EndPoint, ptEnd); if (NULL != m_pOwnerEnt) UpdateInterfaceRec(m_pOwnerEnt->objectId(), ptOrigEnd, ptEnd); if (NULL != pXMap) pXMap->SetAt(HRED_EndPoint, ptEnd); return TRUE; } double THImpHvacReducer::GetEdgeLineWidth() const { BOOL bShow(FALSE); GetGlobalContext( HVAC_SHOWWIDTH, bShow); // add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响 TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow); if (!bShow) return 0.0; ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EdgeWidth, dWidth); return dWidth; } double THImpHvacReducer::GetCentLineWidth() const { BOOL bShow(FALSE); GetGlobalContext( HVAC_SHOWWIDTH, bShow); // add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响 TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow); if (!bShow) return 0.0; ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_CentWidth, dWidth); return dWidth; } double THImpHvacReducer::GetEndLineWidth() const { BOOL bShow(FALSE); GetGlobalContext( HVAC_SHOWWIDTH, bShow); // add by hh 2011-01-05 从图纸中读取加粗标识 避免全局参数对不同的图纸间的影响 TAuxTools::GetTHvacDataFromDwg(HVAC_SHOWWIDTH, bShow); if (!bShow) return 0.0; ASSERT(NULL != m_pXDataMap); double dWidth(0.0); m_pXDataMap->GetAt(HVAC_EndWidth, dWidth); return dWidth; } double THImpHvacReducer::GetPlusEdge() const { return 0.0; } int THImpHvacReducer::GetXBaseShell(TXShell& xShell) { int nRet = 0; if (NULL == m_pXDataMap) { return 0; } HvacSectType eSSectType; m_pXDataMap->GetAt(HRED_StartSectType, (int&)eSSectType); HvacSectType eESectType; m_pXDataMap->GetAt(HRED_EndSectType, (int&)eESectType); if (TDb::eRectangular == eSSectType && TDb::eRectangular == eESectType) { // 获得参数 double dSWidth = 0.0; m_pXDataMap->GetAt(HRED_StartWidth, dSWidth); double dEWidth = 0.0; m_pXDataMap->GetAt(HRED_EndWidth, dEWidth); double dSThick = 0.0; m_pXDataMap->GetAt(HRED_StartThick, dSThick); double dEThick = 0.0; m_pXDataMap->GetAt(HRED_EndThick, dEThick); AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); vtNormal.normalize(); AcGeVector3d vtSide; m_pXDataMap->GetAt(HRED_StartDir, vtSide); vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dSWidth, dSThick, dEWidth, dEThick, xShell, &vtSide, &vtSide); nRet = 1; } else if (TDb::eCircular == eSSectType && TDb::eCircular == eESectType) { // 获得参数 double dSDiameter = 0.0; m_pXDataMap->GetAt(HRED_StartDiameter, dSDiameter); double dEDiameter = 0.0; m_pXDataMap->GetAt(HRED_EndDiameter, dEDiameter); AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); AcGeVector3d vtSide; m_pXDataMap->GetAt(HRED_StartDir, vtSide); vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildCirDuct(ptStart, ptEnd, dSDiameter, dEDiameter, xShell, &vtSide, &vtSide); nRet = 1; } else if ((TDb::eCircular == eSSectType && TDb::eRectangular == eESectType)) { // 获得参数 double dSDiameter = 0.0; m_pXDataMap->GetAt(HRED_StartDiameter, dSDiameter); double dEWidth = 0.0; m_pXDataMap->GetAt(HRED_EndWidth, dEWidth); double dEThick = 0.0; m_pXDataMap->GetAt(HRED_EndThick, dEThick); AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); AcGeVector3d vtStart; m_pXDataMap->GetAt(HRED_StartDir, vtStart); AcGeVector3d vtSide = vtStart; vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildCir2RectDuct(ptStart, ptEnd, vtNormal, dSDiameter, dEWidth, dEThick, xShell, &vtSide, &vtStart); nRet = 1; } else if (TDb::eRectangular == eSSectType && TDb::eCircular == eESectType) { // 获得参数 double dEDiameter = 0.0; m_pXDataMap->GetAt(HRED_EndDiameter, dEDiameter); double dSWidth = 0.0; m_pXDataMap->GetAt(HRED_StartWidth, dSWidth); double dSThick = 0.0; m_pXDataMap->GetAt(HRED_StartThick, dSThick); AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); AcGeVector3d vtStart; m_pXDataMap->GetAt(HRED_StartDir, vtStart); AcGeVector3d vtEnd = -vtStart; AcGeVector3d vtSide = vtEnd; vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildCir2RectDuct(ptEnd, ptStart, vtNormal, dEDiameter, dSWidth, dSThick, xShell, &vtSide, &vtEnd); nRet = 1; } else { // 不做处理 } return nRet; } int THImpHvacReducer::GetBodyBox(AcDbExtents& ext) { if (NULL == m_pXDataMap) { return 0; } // 获得参数 double dSWidth = 0.0; m_pXDataMap->GetAt(HRED_StartWidth, dSWidth); double dHalfSWidth = dSWidth / 2.0; double dSThick = 0.0; m_pXDataMap->GetAt(HRED_StartThick, dSThick); double dHalfSThick = dSThick / 2.0; HvacSectType eSSectType; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSSectType); if (TDb::eCircular == eSSectType) { // 处理圆管数据 dHalfSThick = dHalfSWidth; } double dEWidth = 0.0; m_pXDataMap->GetAt(HRED_EndWidth, dEWidth); double dHalfEWidth = dEWidth / 2.0; double dEThick = 0.0; m_pXDataMap->GetAt(HRED_EndThick, dEThick); double dHalfEThick = dEThick / 2.0; HvacSectType eESectType; m_pXDataMap->GetAt(HVAC_SectType, (int&)eESectType); if (TDb::eCircular == eESectType) { // 处理圆管数据 dHalfEThick = dHalfEWidth; } AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); vtNormal.normalize(); AcGeVector3d vtSide; m_pXDataMap->GetAt(HRED_StartDir, vtSide); vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HRED_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); // 计算端点 AcGePoint3dArray arpt; arpt.append(ptStart + vtSide * dHalfSWidth + vtNormal * dHalfSThick); arpt.append(ptStart + vtSide * dHalfSWidth - vtNormal * dHalfSThick); arpt.append(ptStart - vtSide * dHalfSWidth - vtNormal * dHalfSThick); arpt.append(ptStart - vtSide * dHalfSWidth + vtNormal * dHalfSThick); arpt.append(ptEnd + vtSide * dHalfEWidth + vtNormal * dHalfEThick); arpt.append(ptEnd + vtSide * dHalfEWidth - vtNormal * dHalfEThick); arpt.append(ptEnd - vtSide * dHalfEWidth - vtNormal * dHalfEThick); arpt.append(ptEnd - vtSide * dHalfEWidth + vtNormal * dHalfEThick); // 构造最小包含体 TAuxTools::BuildMinRectangle(arpt, ext); return 1; } AcGePoint3d THImpHvacReducer::GetEndPtAuto() { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; double dPlus(0.0); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); m_pXDataMap->GetAt(HRED_Offset, vtOffset); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus); vtEnd *= -1; double dSizeSub = GetMaxSizeSub(); double dHoriLen = dSizeSub * 1.5 + 100; if (dHoriLen < 200.0) dHoriLen = 200.0; ptEnd = ptStart + (dHoriLen + dPlus * 2) * vtEnd; ptEnd += vtOffset; return ptEnd; } // 不支持既不同心又没有一边对其情况心情况 AcGePoint3d THImpHvacReducer::GetEndPtByangle() { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; double dSizeSub(0.0), dPlus(0.0), dAngle(0.0); m_pXDataMap->GetAt(HRED_Angle, dAngle); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); m_pXDataMap->GetAt(HRED_Offset, vtOffset); m_pXDataMap->GetAt(HVAC_PlusEdge, dPlus); dSizeSub = GetMaxSizeSub(); vtEnd *= -1; double dHoriLen(0.0); if (vtOffset.length() < 1e-3) // 同心 dHoriLen = dSizeSub * 0.5 / tan(dAngle*0.5); else dHoriLen = dSizeSub / tan(dAngle); double dAllDist = dHoriLen + dPlus * 2; if (dAllDist < 200) // 避免天圆地方是看不出来 dAllDist = 200; ptEnd = ptStart + dAllDist * vtEnd; ptEnd += vtOffset; return ptEnd; } AcGePoint3d THImpHvacReducer::GetEndPtByLen() { ASSERT(NULL != m_pXDataMap); double dLen(0.0); AcGePoint3d ptStart, ptEnd; AcGeVector3d vtEnd, vtOffset; m_pXDataMap->GetAt(HRED_Length, dLen); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(HRED_StartDir, vtEnd); vtEnd *= -1; if (dLen < 200) dLen = 200; vtOffset = ptEnd - ptStart; vtOffset = vtOffset.orthoProject(vtEnd); ptEnd = ptStart + dLen * vtEnd; ptEnd += vtOffset; return ptEnd; } double THImpHvacReducer::GetMaxSizeSub() { HvacSectType eStartSect = TDb::eRectangular; HvacSectType eEndSect = TDb::eRectangular; double dStartWidth(0.0), dEndWidth(0.0), dStartThick(0.0), dEndThick(0.0), dMaxSizeSub(0.0); m_pXDataMap->GetAt(HRED_StartSectType, (int&)eStartSect); m_pXDataMap->GetAt(HRED_EndSectType, (int&)eEndSect); m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); if (eStartSect == eEndSect) { double dWidthSub = fabs(dStartWidth - dEndWidth); if (eStartSect == TDb::eRectangular) { double dThickSub = fabs(dStartThick - dEndThick); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } else { dMaxSizeSub = dWidthSub; } } else { if (eStartSect == TDb::eRectangular) { double dWidthSub = fabs(dStartWidth - dEndWidth); double dThickSub = fabs(dStartThick - dEndWidth); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } else { double dWidthSub = fabs(dStartWidth - dEndWidth); double dThickSub = fabs(dStartWidth - dEndThick); dMaxSizeSub = dWidthSub > dThickSub ? dWidthSub:dThickSub; } } return dMaxSizeSub; } // 导出XML // CString THImpHvacReducer::GetXml() const // { // if (NULL == m_pXDataMap || NULL == m_pOwnerEnt) // return _T(""); // // int nValue(0); // double dValue(0.0); // int nSizePreci = 3; // 尺寸精度 // int nPtPreci = 6; // 位置精度 // int nWhPreci = 0; // 宽度、高度精度 // // TXmlTree xmlTree; // CString csText; // CString csX, csY, csZ; // AcGePoint3d pt; // AcGeVector3d vt; // POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL); // { // xmlTree.SetAttribute(posRoot, _T("name"), _T("变径")); // xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称,包含天圆地方")); // } // // POSITION posItemSectStr = xmlTree.Insert(_T("SectionType_start"), posRoot, NULL); // { // xmlTree.SetAttribute(posItemSectStr, _T("name"), _T("起始端截面类型")); // xmlTree.SetAttribute(posItemSectStr, _T("comment"), _T("0:矩形,1:圆形")); // m_pXDataMap->GetAt(HRED_StartSectType, nValue); // csText.Format(_T("%d"), nValue); // xmlTree.SetItemText(posItemSectStr, csText); // } // // POSITION posItemSectEnd = xmlTree.Insert(_T("SectionType_end"), posRoot, posItemSectStr); // { // xmlTree.SetAttribute(posItemSectEnd, _T("name"), _T("终止端截面类型")); // xmlTree.SetAttribute(posItemSectEnd, _T("comment"), _T("0:矩形,1:圆形")); // m_pXDataMap->GetAt(HRED_EndSectType, nValue); // csText.Format(_T("%d"), nValue); // xmlTree.SetItemText(posItemSectEnd, csText); // } // // POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSectEnd); // { // xmlTree.SetAttribute(posItemNorDir, _T("name"), _T("法向量")); // m_pXDataMap->GetAt(HVAC_Normal, vt); // TAuxTools::DoubleToString(vt.x, nPtPreci, csX); // TAuxTools::DoubleToString(vt.y, nPtPreci, csY); // TAuxTools::DoubleToString(vt.z, nPtPreci, csZ); // csText.Format(_T("%s,%s,%s"), csX, csY, csZ); // xmlTree.SetItemText(posItemNorDir, csText); // } // // POSITION posItemStartPt = xmlTree.Insert(_T("Start_point"), posRoot, posItemNorDir); // { // xmlTree.SetAttribute(posItemStartPt, _T("name"), _T("起点位置")); // m_pXDataMap->GetAt(HRED_StartPoint, 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(posItemStartPt, csText); // } // // POSITION posItemStartDir = xmlTree.Insert(_T("Start_direction"), posRoot, posItemStartPt); // { // xmlTree.SetAttribute(posItemStartDir, _T("name"), _T("起点方向")); // m_pXDataMap->GetAt(HRED_StartDir, vt); // TAuxTools::DoubleToString(vt.x, nPtPreci, csX); // TAuxTools::DoubleToString(vt.y, nPtPreci, csY); // TAuxTools::DoubleToString(vt.z, nPtPreci, csZ); // csText.Format(_T("%s,%s,%s"), csX, csY, csZ); // xmlTree.SetItemText(posItemStartDir, csText); // } // // POSITION posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartDir); // { // xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置")); // m_pXDataMap->GetAt(HRED_EndPoint, 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(posItemEndPt, csText); // } // // POSITION posItemWidthStr = xmlTree.Insert(_T("Width_Start"), posRoot, posItemEndPt); // { // xmlTree.SetAttribute(posItemWidthStr, _T("name"), _T("起始端宽度")); // m_pXDataMap->GetAt(HRED_StartWidth, dValue); // TAuxTools::DoubleToString(dValue, nWhPreci, csText); // xmlTree.SetItemText(posItemWidthStr, csText); // } // // POSITION posItemWidthEnd = xmlTree.Insert(_T("Width_End"), posRoot, posItemWidthStr); // { // xmlTree.SetAttribute(posItemWidthEnd, _T("name"), _T("终止端宽度")); // m_pXDataMap->GetAt(HRED_EndWidth, dValue); // TAuxTools::DoubleToString(dValue, nWhPreci, csText); // xmlTree.SetItemText(posItemWidthEnd, csText); // } // // POSITION posItemHghStr = xmlTree.Insert(_T("Height_Start"), posRoot, posItemWidthEnd); // { // xmlTree.SetAttribute(posItemHghStr, _T("name"), _T("起始端高度")); // m_pXDataMap->GetAt(HRED_StartThick, dValue); // TAuxTools::DoubleToString(dValue, nWhPreci, csText); // xmlTree.SetItemText(posItemHghStr, csText); // } // // POSITION posItemHghEnd = xmlTree.Insert(_T("Height_End"), posRoot, posItemHghStr); // { // xmlTree.SetAttribute(posItemHghEnd, _T("name"), _T("终止端高度")); // m_pXDataMap->GetAt(HRED_EndThick, dValue); // TAuxTools::DoubleToString(dValue, nWhPreci, csText); // xmlTree.SetItemText(posItemHghEnd, csText); // } // // POSITION posPlusEdge = xmlTree.Insert(_T("PlusEdge"), posRoot, posItemHghEnd); // { // xmlTree.SetAttribute(posPlusEdge, _T("name"),_T("咬口法兰翻边余量")); // m_pXDataMap->GetAt(HVAC_PlusEdge, dValue); // TAuxTools::DoubleToString(dValue, 1, csText); // xmlTree.SetItemText(posPlusEdge, csText); // } // // POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posPlusEdge); // { // xmlTree.SetAttribute(posObjId, _T("name"),_T("ID")); // xmlTree.SetAttribute(posObjId, _T("comment"),_T("变径ID")); // // csText.Format(_T("%ld"), 0x7FFFFFFF & m_pOwnerEnt->objectId().asOldId()); // xmlTree.SetItemText(posObjId, csText); // } // // CString csXml = xmlTree.GetXml(); // // return csXml; // } CString THImpHvacReducer::GetXml(const AcGeMatrix3d& mat) const { if (NULL == m_pXDataMap || NULL == m_pOwnerEnt) return _T(""); int nValue(0); double dValue(0.0); int nSizePreci = 3; // 尺寸精度 int nPtPreci = 6; // 位置精度 int nWhPreci = 0; // 宽度、高度精度 TXmlTree xmlTree; CString csText; CString csX, csY, csZ; AcGePoint3d pt; AcGeVector3d vt; POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL); { xmlTree.SetAttribute(posRoot, _T("name"), _T("变径")); xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称,包含天圆地方")); } POSITION posItemSectStr = xmlTree.Insert(_T("SectionType_start"), posRoot, NULL); { xmlTree.SetAttribute(posItemSectStr, _T("name"), _T("起始端截面类型")); xmlTree.SetAttribute(posItemSectStr, _T("comment"), _T("0:矩形,1:圆形")); m_pXDataMap->GetAt(HRED_StartSectType, nValue); csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posItemSectStr, csText); } POSITION posItemSectEnd = xmlTree.Insert(_T("SectionType_end"), posRoot, posItemSectStr); { xmlTree.SetAttribute(posItemSectEnd, _T("name"), _T("终止端截面类型")); xmlTree.SetAttribute(posItemSectEnd, _T("comment"), _T("0:矩形,1:圆形")); m_pXDataMap->GetAt(HRED_EndSectType, nValue); csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posItemSectEnd, csText); } POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSectEnd); { xmlTree.SetAttribute(posItemNorDir, _T("name"), _T("法向量")); m_pXDataMap->GetAt(HVAC_Normal, vt); TAuxTools::DoubleToString(vt.x, nPtPreci, csX); TAuxTools::DoubleToString(vt.y, nPtPreci, csY); TAuxTools::DoubleToString(vt.z, nPtPreci, csZ); csText.Format(_T("%s,%s,%s"), csX, csY, csZ); xmlTree.SetItemText(posItemNorDir, csText); } POSITION posItemStartPt = xmlTree.Insert(_T("Start_point"), posRoot, posItemNorDir); { xmlTree.SetAttribute(posItemStartPt, _T("name"), _T("起点位置")); m_pXDataMap->GetAt(HRED_StartPoint, 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(posItemStartPt, csText); } POSITION posItemStartDir = xmlTree.Insert(_T("Start_direction"), posRoot, posItemStartPt); { xmlTree.SetAttribute(posItemStartDir, _T("name"), _T("起点方向")); m_pXDataMap->GetAt(HRED_StartDir, vt); TAuxTools::DoubleToString(vt.x, nPtPreci, csX); TAuxTools::DoubleToString(vt.y, nPtPreci, csY); TAuxTools::DoubleToString(vt.z, nPtPreci, csZ); csText.Format(_T("%s,%s,%s"), csX, csY, csZ); xmlTree.SetItemText(posItemStartDir, csText); } POSITION posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartDir); { xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置")); m_pXDataMap->GetAt(HRED_EndPoint, 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(posItemEndPt, csText); } POSITION posItemWidthStr = xmlTree.Insert(_T("Width_Start"), posRoot, posItemEndPt); { xmlTree.SetAttribute(posItemWidthStr, _T("name"), _T("起始端宽度")); m_pXDataMap->GetAt(HRED_StartWidth, dValue); TAuxTools::DoubleToString(dValue, nWhPreci, csText); xmlTree.SetItemText(posItemWidthStr, csText); } POSITION posItemWidthEnd = xmlTree.Insert(_T("Width_End"), posRoot, posItemWidthStr); { xmlTree.SetAttribute(posItemWidthEnd, _T("name"), _T("终止端宽度")); m_pXDataMap->GetAt(HRED_EndWidth, dValue); TAuxTools::DoubleToString(dValue, nWhPreci, csText); xmlTree.SetItemText(posItemWidthEnd, csText); } POSITION posItemHghStr = xmlTree.Insert(_T("Height_Start"), posRoot, posItemWidthEnd); { xmlTree.SetAttribute(posItemHghStr, _T("name"), _T("起始端高度")); m_pXDataMap->GetAt(HRED_StartThick, dValue); TAuxTools::DoubleToString(dValue, nWhPreci, csText); xmlTree.SetItemText(posItemHghStr, csText); } POSITION posItemHghEnd = xmlTree.Insert(_T("Height_End"), posRoot, posItemHghStr); { xmlTree.SetAttribute(posItemHghEnd, _T("name"), _T("终止端高度")); m_pXDataMap->GetAt(HRED_EndThick, dValue); TAuxTools::DoubleToString(dValue, nWhPreci, csText); xmlTree.SetItemText(posItemHghEnd, csText); } POSITION posPlusEdge = xmlTree.Insert(_T("PlusEdge"), posRoot, posItemHghEnd); { xmlTree.SetAttribute(posPlusEdge, _T("name"),_T("咬口法兰翻边余量")); m_pXDataMap->GetAt(HVAC_PlusEdge, dValue); TAuxTools::DoubleToString(dValue, 1, csText); xmlTree.SetItemText(posPlusEdge, csText); } POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posPlusEdge); { xmlTree.SetAttribute(posObjId, _T("name"),_T("ID")); xmlTree.SetAttribute(posObjId, _T("comment"),_T("变径ID")); csText.Format(_T("%ld"), 0x7FFFFFFF & m_pOwnerEnt->objectId().asOldId()); xmlTree.SetItemText(posObjId, csText); } // begin // add by wc 13-12-13 POSITION posSysName = xmlTree.Insert(_T("System"), posRoot, posObjId); { xmlTree.SetAttribute(posSysName, _T("name"), _T("管线类型")); xmlTree.SetAttribute(posSysName, _T("comment"), _T("回风/送风/通风...")); m_pXDataMap->GetAt(HVAC_System, csText); xmlTree.SetItemText(posSysName, csText); } POSITION posSingleLine = xmlTree.Insert(_T("IsSingleLine"), posRoot, posSysName); { xmlTree.SetAttribute(posSingleLine, _T("name"), _T("单线")); xmlTree.SetAttribute(posSingleLine, _T("comment"), _T("是否是单线: 1/是, 0/不是")); csText.Format(_T("%d"), (int)IsSingleLine()); xmlTree.SetItemText(posSingleLine, csText); } POSITION posHasLiningLine = xmlTree.Insert(_T("HasLiningLine"), posRoot, posSingleLine); { xmlTree.SetAttribute(posHasLiningLine, _T("name"), _T("内衬线")); xmlTree.SetAttribute(posHasLiningLine, _T("comment"), _T("是否有内衬线:0/不是, 1/是")); if (!m_pXDataMap->GetAt(HVAC_HasLining, nValue)) nValue = 0; csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posHasLiningLine, csText); } POSITION posLiningLineType = xmlTree.Insert(_T("LiningLineType"), posRoot, posHasLiningLine); { AcDbObjectId idType; AcDbObject *pObjType = NULL; ACHAR *pChar = NULL; xmlTree.SetAttribute(posLiningLineType, _T("name"), _T("内衬线型")); xmlTree.SetAttribute(posLiningLineType, _T("comment"), _T("内衬线型的名称")); m_pXDataMap->GetAt(HVAC_LiningLine, idType); if (Acad::eOk != acdbOpenObject(pObjType, idType, AcDb::kForRead)) { } if (NULL != pObjType) { AcDbLinetypeTableRecord *pRec = AcDbLinetypeTableRecord::cast(pObjType); pRec->getName(pChar); pRec->close(); pObjType->close(); csText.Format(_T("%s"), pChar); delete pChar; } else csText.Empty(); } POSITION posIsEdgeWidth = xmlTree.Insert(_T("IsEdgeWidth"), posRoot, posLiningLineType); { xmlTree.SetAttribute(posIsEdgeWidth, _T("name"), _T("边线是否加粗")); xmlTree.SetAttribute(posIsEdgeWidth, _T("comment"), _T("0/不加粗, 1/加粗")); if (!m_pXDataMap->GetAt(HVAC_EdgeWeight, nValue)) nValue = 0; csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posIsEdgeWidth, csText); } POSITION posIsCentWidth = xmlTree.Insert(_T("IsCentWidth"), posRoot, posIsEdgeWidth); { xmlTree.SetAttribute(posIsCentWidth, _T("name"), _T("中线是否加粗")); xmlTree.SetAttribute(posIsCentWidth, _T("comment"), _T("0/不加粗, 1/加粗")); if (!m_pXDataMap->GetAt(HVAC_CentWeight, nValue)) nValue = 0; csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posIsCentWidth, csText); } POSITION posIsEndWidth = xmlTree.Insert(_T("IsEndWidth"), posRoot, posIsCentWidth); { xmlTree.SetAttribute(posIsEndWidth, _T("name"), _T("端线是否加粗")); xmlTree.SetAttribute(posIsEndWidth, _T("comment"), _T("0/不加粗, 1/加粗")); if (!m_pXDataMap->GetAt(HVAC_EndWeight, nValue)) nValue = 0; csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posIsEndWidth, csText); } POSITION posEdgeWidth = xmlTree.Insert(_T("EdgeWidth"), posRoot, posIsEndWidth); { xmlTree.SetAttribute(posEdgeWidth, _T("name"), _T("边线加粗量")); xmlTree.SetAttribute(posEdgeWidth, _T("comment"), _T("边线加粗的数值")); m_pXDataMap->GetAt(HVAC_EdgeWidth, dValue); csText.Format(_T("%f"), dValue); xmlTree.SetItemText(posEdgeWidth, csText); } POSITION posCentWidth = xmlTree.Insert(_T("CentWidth"), posRoot, posEdgeWidth); { xmlTree.SetAttribute(posCentWidth, _T("name"), _T("中线加粗量")); xmlTree.SetAttribute(posCentWidth, _T("comment"), _T("中线加粗的数值")); m_pXDataMap->GetAt(HVAC_CentWidth, dValue); csText.Format(_T("%f"), dValue); xmlTree.SetItemText(posCentWidth, csText); } POSITION posEndWidth = xmlTree.Insert(_T("EndWidth"), posRoot, posCentWidth); { xmlTree.SetAttribute(posEndWidth, _T("name"), _T("端线加粗量")); xmlTree.SetAttribute(posEndWidth, _T("comment"), _T("端线加粗的数值")); m_pXDataMap->GetAt(HVAC_EndWidth, dValue); csText.Format(_T("%f"), dValue); xmlTree.SetItemText(posEndWidth, csText); } // end CString csXml = xmlTree.GetXml(); return csXml; } // 点对应图见工程目录下 关键点示意图.dwg bool THImpHvacReducer::GetSection( const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs ) const { if (NULL == m_pXDataMap) return false; AcDbObjectId idObj = m_pOwnerEnt->objectId(); AcDbObjectId idLayer = m_pOwnerEnt->layerId(); TGGeSectionPlane section_pln(face, vtPlaneSecDir); AcGePoint3d ptStart, ptEnd; double dStartWidth(0.0), dStartThick(0.0), dEndWidth(0.0), dEndThick(0.0); AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(HRED_StartWidth, dStartWidth); m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndWidth, dEndWidth); m_pXDataMap->GetAt(HRED_EndThick, dEndThick); m_pXDataMap->GetAt(HRED_StartPoint, ptStart); m_pXDataMap->GetAt(HRED_EndPoint, ptEnd); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 计算开始4点 AcGeVector3d vtSect = GetSectNormal(); AcGeVector3d vtPerl = vtSect; vtPerl.rotateBy(PI / 2.0, vtNormal); vtPerl.normalize(); AcGePoint3dArray arPtS, arPtE; arPtS.append(ptStart + dStartWidth * vtPerl*0.5 + dStartThick * vtNormal*0.5 ); arPtS.append(arPtS.at(0) - dStartWidth * vtPerl); arPtS.append(arPtS.last() - dStartThick * vtNormal); arPtS.append(arPtS.at(0) - dStartThick * vtNormal); arPtE.append(ptEnd + dEndWidth * vtPerl*0.5 + dEndThick * vtNormal*0.5 ); arPtE.append(arPtE.at(0) - dEndWidth * vtPerl); arPtE.append(arPtE.last() - dEndThick * vtNormal); arPtE.append(arPtE.at(0) - dEndThick * vtNormal); TGGePoly2D poly2d, poly2dOut; // 上面 poly2d.AppendNode(arPtS[0]); poly2d.AppendNode(arPtS[1]); poly2d.AppendNode(arPtE[1]); poly2d.AppendNode(arPtE[0]); poly2d.AppendNode(*poly2d.Head()); double dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut); if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断 sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); // 下面 poly2d.Reset(); poly2d.AppendNode(arPtS[3]); poly2d.AppendNode(arPtS[2]); poly2d.AppendNode(arPtE[2]); poly2d.AppendNode(arPtE[3]); poly2d.AppendNode(*poly2d.Head()); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut); if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断 sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); // 前面 poly2d.Reset(); poly2d.AppendNode(arPtS[1]); poly2d.AppendNode(arPtS[2]); poly2d.AppendNode(arPtE[2]); poly2d.AppendNode(arPtE[1]); poly2d.AppendNode(*poly2d.Head()); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut); if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断 sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); // 后面 poly2d.Reset(); poly2d.AppendNode(arPtS[0]); poly2d.AppendNode(arPtS[3]); poly2d.AppendNode(arPtE[3]); poly2d.AppendNode(arPtE[0]); poly2d.AppendNode(*poly2d.Head()); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2d, poly2dOut); if(!!poly2dOut) // add by hh 2011-03-11 增加投影后的Poly2D有效型判断 sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); // 有圆形时,要绘制圆圈.... // ....待细化 return true; } Acad::ErrorStatus THImpHvacReducer::GetExtents( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const { if (NULL == m_pXDataMap) return Acad::eNotImplementedYet; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGeVector3d vtUcsZ = TAuxTools::GetUcsZvt(); AcGeVector3d vtNormal = normal(); if (vtNormal.isParallelTo(vtUcsZ)) // 立管上的变径 { if (ptStart.z < ptEnd.z) { ptLow = ptStart; ptUp = ptEnd; } else { ptLow = ptEnd; ptUp = ptStart; } } else/* if (vtNormal.isPerpendicularTo(vtUcsZ))*/ // 水平管上的,暂不考虑斜管 { double dStartThick(0.0), dEndthick(0.0); HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); if (TDb::eRectangular == eSect) { m_pXDataMap->GetAt(HRED_StartThick, dStartThick); m_pXDataMap->GetAt(HRED_EndThick, dEndthick); } else { m_pXDataMap->GetAt(HRED_StartDiameter, dStartThick); m_pXDataMap->GetAt(HRED_EndDiameter, dEndthick); } dStartThick *= 0.5; dEndthick *= 0.5; AcGePoint3d ptStaUp = ptStart + vtNormal * dStartThick; AcGePoint3d ptStaDw = ptStart - vtNormal * dStartThick; AcGePoint3d ptEndUp = ptEnd + vtNormal * dEndthick; AcGePoint3d ptEndDw = ptEnd - vtNormal * dEndthick; if (ptStaUp.z > ptEndUp.z) ptUp = ptStaUp; else ptUp = ptEndUp; if (ptStaDw.z < ptEndDw.z) ptLow = ptStaDw; else ptLow = ptEndDw; } return Acad::eOk; } // add by hh 2014-08-06 支持管件与水管遮挡 Acad::ErrorStatus THImpHvacReducer::GetClipBoundary(TGGePoly2D& poly)const { AcDbPolyline* pLine = MakePolyCurve(); if(NULL == pLine) return Acad::eNotImplementedYet; double dBrWidth = 0; if(!TAuxTools::GetTHvacDataFromDwg(HVAC_PIPEHIDEWIDTH, dBrWidth)) GetGlobalContext()->GetAt(HVAC_PIPEHIDEWIDTH, dBrWidth); if(EQUAL_ZERO(dBrWidth)) { PolyConvert(*pLine, poly); } else { AcDbVoidPtrArray arPLines; pLine->getOffsetCurves(dBrWidth, arPLines); if(0 == arPLines.length()) { PolyConvert(*pLine, poly); } else { PolyConvert(*((AcDbPolyline*)arPLines[0]), poly); for(int i = 0; i < arPLines.length(); i++) { if(NULL != arPLines[i]) delete (AcDbEntity*)arPLines[i]; } } } delete pLine; return Acad::eOk; } bool THImpHvacReducer::IsMeClip() const { return true; } bool THImpHvacReducer::IsClipMe(const TEntityBase* pEnt)const//ok是否被裁剪 { if(NULL == pEnt) return false; //add by dyw 20150409 当图纸复杂时,遮挡的更改影响水管的绘制速度,暂时屏蔽掉 return false; //add end CString sClassName = pEnt->GetMe()->isA()->name(); if(0 == sClassName.Compare(_T("TDbPipe"))) // 水管 { TInterfaceModifyMsg iMsg; iMsg.SetInterfaceOper(TDb::eUpdateCover); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); // 写入接口更改消息 TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); return true; } return false; }