#include "stdafx.h" #include "StdArx.h" #include "THImpHvacFlange.h" #include "TDbInterfaceRecord.h" #include "TDbXDataMap.h" #include "TDbInterfaceMsgWrite.h" #include "math.h" #include "dbxutil.h" #include "dbsymutl.h" using namespace TDb; THImpHvacFlange::THImpHvacFlange() { } THImpHvacFlange::~THImpHvacFlange() { } Acad::ErrorStatus THImpHvacFlange::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 THImpHvacFlange::OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo) { ASSERT(NULL != pszName && NULL != pInfo && NULL != m_pXDataMap); // 暖通基本参数设置 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::eFlange); } // 全局属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { pInfo->pXData->nVt = TXINT; pInfo->pXData->nVal = TDb::eFlange; } // 设置数据 else { pInfo->pXData->nVt = 0; // 设置处理完成标识 } } return TRUE; } if (0 == _tcsicmp(pszName, HVAC_SectType)) { 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, HVAC_HasBaseLine)) { pInfo->bVisible = FALSE; 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); // 法兰参数数据设置 if (0 == _tcsicmp(pszName, HFLN_Type)) { pInfo->bVisible = TRUE; // 单线也允许切换,更新位置及连接实体, mcl 09.11.20 // pInfo->bEditable = (!bSingleLine && TDb::eSingleLine != eType); pInfo->bEditable = TRUE; if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("单线")); pInfo->parlValues->Add(TDb::eSingleLine); pInfo->parsValues->Add(_T("双线开口")); pInfo->parlValues->Add(TDb::eOpenDbLine); pInfo->parsValues->Add(_T("双线封口")); pInfo->parlValues->Add(TDb::eCloseDbLine); pInfo->parsValues->Add(_T("三线封口")); pInfo->parlValues->Add(TDb::eCloseTrLine); } if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt) { // 获取各点位置 AcGePoint3d ptStart, ptEnd, ptMid; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); Midpoint(ptStart, ptEnd, ptMid); // 先记录更新前信息 AcGePoint3dArray ptArrOrig; AcDbObjectIdArray idArr; TAuxTools::GetInterfacePoint(this, ptArrOrig); TAuxTools::GetInterfaceId(this, idArr); // 原来法兰样式和新样式比较,当单线、非单线之间转换时,进行位置及连接件更新 TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); TDb::HvacFlangeType eFlangeNewType = (HvacFlangeType)pInfo->pXData->nVal; m_pXDataMap->SetAt(HFLN_Type, eFlangeNewType); if (eFlangeType == TDb::eSingleLine && eFlangeNewType != TDb::eSingleLine || eFlangeType != TDb::eSingleLine && eFlangeNewType == TDb::eSingleLine) { 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, KEY_StartSectType) || 0 == _tcsicmp(pszName, KEY_EndSectType)) { pInfo->bVisible = FALSE; pInfo->bEditable = FALSE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("矩形")); pInfo->parlValues->Add(TDb::eRectangular); } return TRUE; } // 尺寸计算方式 为了注册列表名,保证其他管件能用到此参数 if (0 == _tcsicmp(pszName, HRED_ComputeType)) { pInfo->bVisible = FALSE; pInfo->bEditable = FALSE; // 提供数据列表和对应关系 if (NULL != pInfo->parsValues && NULL != pInfo->parlValues) { pInfo->parsValues->Add(_T("自动计算")); pInfo->parlValues->Add(TDb::eAuto); } return TRUE; } if (0 == _tcsicmp(pszName, HFLN_SkirtSize)) { pInfo->bEditable = TRUE; pInfo->bVisible = !bSingleLine; TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); return TRUE; } if (0 == _tcsicmp(pszName, HFLN_Width)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = TRUE; TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, pszName, pInfo); return TRUE; } if (0 == _tcsicmp(pszName, HFLN_Thick)) { // 获得截面,当截面不为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular != eSectType); pInfo->bEditable = TRUE; return TRUE; } // HFLN_Diameter和HFLN_Width定义相同,为同一个值 // 为区分显示名称,借用未被使用的KEY_Diameter值来表达 if (0 == _tcsicmp(pszName, KEY_Diameter)) { // 获得截面,当截面为圆型时显示并可改 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); pInfo->bVisible = (TDb::eCircular == eSectType); pInfo->bEditable = (!bSingleLine && TDb::eCircular == eSectType); // 替代属性,需要特殊处理数据获取和设置 if (NULL != pInfo->pXData) { // 获取数据 if (0 == pInfo->pXData->nVt) { m_pXDataMap->GetAt(HFLN_Diameter, *pInfo->pXData); } // 设置数据 else { // m_pXDataMap->SetAt(HFLN_Diameter, *pInfo->pXData); // pInfo->pXData->nVt = 0; // 设置处理完成标识 TAuxTools::SetAndUpdateCover((TDbInterfacesObj*)m_pOwnerEnt, HFLN_Diameter, pInfo); } } return TRUE; } if (0 == _tcsicmp(pszName, HFLN_StartPoint)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 整体移动 if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt) { // 改变顶点变换行为 AcGePoint3d ptStart; m_pXDataMap->GetAt(HFLN_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, HELB_EndPoint)) { pInfo->bVisible = TRUE; pInfo->bEditable = TRUE; // 整体移动 if (NULL != pInfo->pXData && 0 != pInfo->pXData->nVt) { // 改变顶点变换行为 AcGePoint3d ptEnd; m_pXDataMap->GetAt(HELB_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 THImpHvacFlange::GetTips(CMapStringToString& mapLable2Tip) const { } void THImpHvacFlange::list() const { ASSERT(NULL != m_pXDataMap); // 管件类型 acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 暖通:法兰")); // 截面类型 HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); switch (eSectType) { case TDb::eRectangular: acutPrintf(_T("\n\t\t\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\t\t 截面:圆形")); break; case TDb::eOblate: acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t\t\t 截面:扁圆形")); break; } // 外围宽 double dSkirtSize = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t出头量:%.2f"), dSkirtSize); // 圆型截面显示直径 if (TDb::eCircular == eSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HFLN_Diameter, 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(HFLN_Width, dWidth); m_pXDataMap->GetAt(HFLN_Thick, dThick); acutPrintf(_T("\n\t\t\t\t\t\t\t\t\t宽度:%.2f\t 厚度:%.2f"), dWidth, dThick); } // 起点 AcGePoint3d pt; m_pXDataMap->GetAt(HFLN_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(HFLN_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 THImpHvacFlange::IsHorzAlignment() const { // 获得法向量 // AcGePoint3d ptStart, ptEnd; // m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); // m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // AcGeVector3d vtNormal = ptStart - ptEnd; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGeTol tolTmp; tolTmp.setEqualPoint(1); tolTmp.setEqualVector(/*1*/0.001);//Lixlmodify return vtNormal.isParallelTo(vtZAxis, tolTmp); } BOOL THImpHvacFlange::IsVertAlignment() const { // 获得方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGeVector3d vtDir = ptEnd - ptStart; AcGeVector3d vtNormal = AcGeVector3d::kZAxis; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); // 立法兰法向量垂直于Z轴,方向向量平行于Z轴 return vtNormal.isPerpendicularTo(vtZAxis) && vtDir.isParallelTo(vtZAxis); } BOOL THImpHvacFlange::IsSingleLine() const { ASSERT(NULL != m_pXDataMap); BOOL bSingleLine = FALSE; m_pXDataMap->GetAt(HVAC_IsSingleLine, (int&)bSingleLine); return bSingleLine; } void THImpHvacFlange::GetKindName(CString& sName) { sName = _T("TCH_HFLANGE"); } int THImpHvacFlange::GetInterfaceCount() const { // 返回接口个数 return 2; } BOOL THImpHvacFlange::GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const { ASSERT(NULL != m_pXDataMap); // 获取截面类型 TDb::HvacSectType eSectType = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); // 获取接口截面、宽度、厚度数据key值 LPCTSTR pszWidthKey, pszThickKey; switch (nIndex) { case 0: pszWidthKey = ((TDb::eCircular == eSectType) ? HFLN_Diameter : HFLN_Width); pszThickKey = HFLN_Thick; break; case 1: pszWidthKey = ((TDb::eCircular == eSectType) ? HFLN_Diameter : HFLN_Width); pszThickKey = HFLN_Thick; 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 THImpHvacFlange::GetInterface(int nIndex, TInterface& pipeInterface) const { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = ptStart - ptEnd; AcGeVector3d vtEnd = ptEnd - ptStart; // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = vtEnd; // vtDir.normalize(); // ptStart = ptTmp - vtDir * FLANGWIDTH_SINGLE*0.5; // ptEnd = ptTmp + vtDir * FLANGWIDTH_SINGLE*0.5; // } 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 THImpHvacFlange::GetInterface(const AcGePoint3d& ptConnect,TInterface& pipeInterface) const { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = ptStart - ptEnd; // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = -vtStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * FLANGWIDTH_SINGLE*0.5; // ptEnd = ptTmp + vtDir * FLANGWIDTH_SINGLE*0.5; // } // 计算测试点到始末点的距离 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, vtStart, pipeInterface)) { GetInterfaceSizeData(1, pipeInterface); return TRUE; } // 如果末尾接口和第二个管件连接 if (m_pXDataMap->GetAt(KEY_IDCNT2, id) && MakesureInterfaceValidate(id, ptEnd, vtStart, pipeInterface)) { GetInterfaceSizeData(1, pipeInterface); return TRUE; } // 没有管件连接 pipeInterface.SetOutDir(vtStart); pipeInterface.SetOwnerId(m_pOwnerEnt->objectId()); pipeInterface.SetPosition(ptEnd); GetInterfaceSizeData(1, pipeInterface); return TRUE; } return FALSE; } BOOL THImpHvacFlange::HasInterface(const AcGePoint3d& ptConnect,const AcGeVector3d& vtDir) { if (NULL == m_pXDataMap) return FALSE; // 获取变径各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = ptStart - ptEnd; // 计算测试点到始末点的距离 double dDist1 = ptConnect.distanceTo(ptStart); double dDist2 = ptConnect.distanceTo(ptEnd); // 单线法兰取中点,没有在使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = -vtStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * 0.005; // ptEnd = ptTmp + vtDir * 0.005; // } // 位于起始点 if (dDist1 < 1.e-3) return (vtDir.isParallelTo(vtStart)); // 位于末尾点 if (dDist2 < 1.e-3) return (vtDir.isParallelTo(vtStart)); return FALSE; } BOOL THImpHvacFlange::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect) { if (NULL == m_pXDataMap) return FALSE; if ( !idConnect.isValid() ) 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(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = ptStart - ptEnd; // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = -vtStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * FLANGWIDTH_SINGLE*0.5; // ptEnd = ptTmp + vtDir * FLANGWIDTH_SINGLE*0.5; // } // 计算测试点到始末点的距离 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, vtStart)) { m_pXDataMap->SetAt(KEY_IDCNT2, idConnect); pEnt->close(); return TRUE; } pEnt->close(); return FALSE; } BOOL THImpHvacFlange::SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect1,const AcDbObjectId& idConnect2) { if (NULL == m_pXDataMap) return FALSE; // 打开对象1 AcDbEntity* pEnt1; if (Acad::eOk != acdbOpenObject(pEnt1, idConnect1, AcDb::kForRead)) return FALSE; // 检查对象1类型,是否是暖通管件 if (!(pEnt1->isKindOf(TDbHvacDuct::desc()) || pEnt1->isKindOf(TDbHvacFitting::desc()) || pEnt1->isKindOf(TDbHvacEquipment::desc()))) { pEnt1->close(); return FALSE; } // 打开对象2 AcDbEntity* pEnt2; if (Acad::eOk != acdbOpenObject(pEnt2, idConnect2, AcDb::kForRead)) { pEnt1->close(); return FALSE; } // 检查对象2类型,是否是暖通管件 if (!(pEnt2->isKindOf(TDbHvacDuct::desc()) || pEnt2->isKindOf(TDbHvacFitting::desc()) || pEnt2->isKindOf(TDbHvacEquipment::desc()))) { pEnt1->close(); pEnt2->close(); return FALSE; } // 获取法兰各点位置 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 求两端方向 AcGeVector3d vtStart = ptStart - ptEnd; // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = -vtStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * FLANGWIDTH_SINGLE*0.5; // ptEnd = ptTmp + vtDir * FLANGWIDTH_SINGLE*0.5; // } // 计算测试点到始末点的距离 double dDist1 = ptConnect.distanceTo(ptStart); double dDist2 = ptConnect.distanceTo(ptEnd); // 基类指针 TDbInterfacesObj* pInterfaceObj1 = TDbInterfacesObj::cast(pEnt1); TDbInterfacesObj* pInterfaceObj2 = TDbInterfacesObj::cast(pEnt2); ASSERT(NULL != pInterfaceObj1 && NULL != pInterfaceObj2); // 连接两个对象 if (dDist1 < 1.e-3 && pInterfaceObj1->HasInterface(ptStart, vtStart) && dDist2 < 1.e-3 && pInterfaceObj2->HasInterface(ptEnd, vtStart)) { m_pXDataMap->SetAt(KEY_IDCNT1, idConnect1); m_pXDataMap->SetAt(KEY_IDCNT2, idConnect2); pEnt1->close(); pEnt2->close(); return TRUE; } // 连接两个对象 if (dDist2 < 1.e-3 && pInterfaceObj1->HasInterface(ptEnd, vtStart) && dDist1 < 1.e-3 && pInterfaceObj2->HasInterface(ptStart, vtStart)) { m_pXDataMap->SetAt(KEY_IDCNT1, idConnect2); m_pXDataMap->SetAt(KEY_IDCNT2, idConnect1); pEnt1->close(); pEnt2->close(); return TRUE; } pEnt1->close(); pEnt2->close(); return FALSE; } BOOL THImpHvacFlange::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 THImpHvacFlange::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 THImpHvacFlange::ExplodeOrDraw3d(XExplodeDraw &mode) const { if (NULL == m_pXDataMap) return Acad::eNotImplementedYet; /* // 变径类型 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 iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); switch (iSectType) { case TDb::eRectangular: // 矩形口 MakeRectangle3D(mode); break; case TDb::eCircular: // 圆形口 MakeCircle3D(mode); break; case TDb::eOblate: break; default: break; } return Acad::eOk; } Acad::ErrorStatus THImpHvacFlange::ExplodeOrDraw2d(XExplodeDraw &mode) const { if (m_pXDataMap == NULL) { return Acad::eNotImplementedYet; } TComplexCurve cplCurve; MakeCurves(cplCurve); TDbExtentsEdge edage; edage.SetEdage(cplCurve); BOOL bWeight = FALSE; // m_pXDataMap->GetAt(KEY_EDAGEWEIGHT,bWeight); AcDbObjectId idReal = ((TDbInterfacesObj*)m_pOwnerEnt)->layerId(); AcDbObjectId idDash = ((TDbInterfacesObj*)m_pOwnerEnt)->DashLayer(); AcDbObjectId idCent = ((TDbInterfacesObj*)m_pOwnerEnt)->CenterLayer(); edage.ExplodeOrDraw2d(mode,idReal,idDash,idCent,NULL,bWeight,FALSE); return Acad::eOk; } AcDbPolyline* THImpHvacFlange::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); */ TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); if (IsHorzAlignment()) { switch (eFlangeType) { case TDb::eSingleLine: //单线 { return MakeSingleLinePolyCurve(); } case TDb::eOpenDbLine: //双线开口 case TDb::eCloseDbLine: //双线封口 case TDb::eCloseTrLine: //三线 { return MakeMultiLinePolyCurve(); } default: break; } } else if (IsVertAlignment()) { //立面安装不支持单线遮挡 if (IsSingleLine()) { return NULL; } int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); switch (iSectType) { case TDb::eRectangular: //矩形 { return MakeRectanglePolyCurve(); } case TDb::eCircular: //圆形 { return MakeCirclePolyCurve(); } case TDb::eOblate: //扁圆形 { break; } default: break; } } //任意角度 else { AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcDbPolyline * pPline = new AcDbPolyline; if (NULL == pPline) return NULL; AcGePoint3dArray arpts,arpts1; if(!GetAnyAnglePts(arpts, arpts1)) return NULL; double dEl(0.0); AcGePoint3d ptS,ptStart,ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptS = ptStart; // if (ptEnd.z > ptStart.z) // { // ptS = ptEnd; // } AcGePoint3d pt1,pt2,pt3; pt1 = arpts[0]; pt2 = arpts[1]; pt3 = arpts[2]; pt1.z = ptS.z; pt2.z = ptS.z; pt3.z = ptS.z; AcGePlane plan = GetHidePlane(pt1, pt2, pt3, vtZAxis, dEl); int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); if (iSectType == TDb::eRectangular) { if (arpts.length() > 6) { pPline->addVertexAt(0,arpts[0].convert2d(plan)); pPline->addVertexAt(1,arpts[5].convert2d(plan)); pPline->addVertexAt(2,arpts[4].convert2d(plan)); pPline->addVertexAt(3,arpts[3].convert2d(plan)); } else { pPline->addVertexAt(0,arpts[0].convert2d(plan)); pPline->addVertexAt(1,arpts[1].convert2d(plan)); pPline->addVertexAt(2,arpts[2].convert2d(plan)); pPline->addVertexAt(3,arpts[3].convert2d(plan)); } } else { // Begin---Lixl---Modify---2011-11-22-----倾斜法兰PolyCurve修改 // 获取绘图数据 double dDiameter = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); vtDir = ptEnd - ptStart; vtDir.normalize(); // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGePoint3d ptMid; Midpoint(ptStart, ptEnd, ptMid); plan.set(ptMid, vtZAxis); pt1 = AcGePoint3d::kOrigin.orthoProject(plan); plan.set(pt1, vtZAxis); dEl = pt1.asVector().length(); if (!pt1.asVector().isCodirectionalTo(vtZAxis)) { dEl *= -1; } if (TDb::eSingleLine == eFlangeType) { // 单线法兰,只画一条 TAuxTools::GetEllipseFromCircle(ptMid, dDiameter, vtDir, vtZAxis, *pPline); } else { AcDbPolyline PStrLine; AcDbPolyline PEndLine; AcDbPolyline PInSideLine; int iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, -vtDir, vtZAxis, PStrLine, -vtDir); TAuxTools::GetEllipseFromCircle(ptEnd, dDiameter, vtDir, vtZAxis, PEndLine, vtDir); if (ptStart.z > ptEnd.z) { TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, vtDir, vtZAxis, PInSideLine, vtDir); } else { TAuxTools::GetEllipseFromCircle(ptEnd, dDiameter, vtDir, vtZAxis, PInSideLine, -vtDir); } AcGePoint3d ptNow; double dBulge(0.0); for (int i = 0; i < (int)PEndLine.numVerts(); i++) { PEndLine.getBulgeAt(i, dBulge); PEndLine.getPointAt(i, ptNow); pPline->addVertexAt(i, ptNow.convert2d(plan), dBulge); } int nNowMax = i; int nStartNum = PStrLine.numVerts(); for (i = nStartNum - 1; i > -1; i--) { PStrLine.getBulgeAt(nStartNum - 1 - i, dBulge); PStrLine.getPointAt(i, ptNow); pPline->addVertexAt(nStartNum - 1 - i + nNowMax , ptNow.convert2d(plan), -dBulge); } PEndLine.getPointAt(0, ptNow); pPline->addVertexAt(pPline->numVerts(), ptNow.convert2d(plan)); AcDbPolyline pLine; if (ptStart.z > ptEnd.z) { PStrLine.getPointAt(0, ptNow); pPline->addVertexAt(pPline->numVerts(), ptNow.convert2d(plan)); TAuxTools::MergerPline(pPline, &PInSideLine); } else { TAuxTools::MergerPline(pPline, &PInSideLine); } } // End--------------------------------------------------------------------- } pPline->setNormal(vtZAxis); pPline->setElevation(dEl); // pPline->setClosed(Adesk::kTrue); return pPline; } return NULL; } BOOL THImpHvacFlange::MakeCurves(TComplexCurve& cplCurve) const { if (NULL == m_pXDataMap) return FALSE; // 法兰类型 TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type,(int&) eFlangeType); ////////////////////////////////////////////////////////////////////////// //lm 08.11.10 if (IsHorzAlignment()) { switch (eFlangeType) { case TDb::eSingleLine: //单线 { return MakeHSingleLine2D(cplCurve); } case TDb::eOpenDbLine: //双线开口 { return MakeHOpenDbLine2D(cplCurve); } case TDb::eCloseDbLine: //双线封口 { return MakeHCloseDbLine2D(cplCurve); } case TDb::eCloseTrLine: //三线 { return MakeHCloseTrLine2D(cplCurve); } default: break; } } else if (IsVertAlignment()) { int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); switch (iSectType) { case TDb::eRectangular: //矩形 { return MakeRectangle2D(cplCurve); } case TDb::eCircular: //圆形 { return MakeCircle2D(cplCurve); } case TDb::eOblate: //扁圆形 { break; } default: break; } } else { return MakeCirInclineLine2D(cplCurve); // return MakeAnyAngle2D(cplCurve); } return FALSE; } BOOL THImpHvacFlange::GetCurvesInSide(TComplexCurve& compCurve) const { if (NULL == m_pXDataMap) return FALSE; if (IsHorzAlignment()) { // 变径类型 TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type,(int&) eFlangeType); //二维三线 ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); if(eFlangeType == TDb::eCloseTrLine) { dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtDir.rotateBy(PI / 2.0, vtNormal); // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (!IsSingleLine()) { el.ptGe[0] = ptS; el.ptGe[1] = ptE; el.ptGe[2] = ptE; compCurve.append(el); } } if (IsSingleLine()) { // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; compCurve.append(el); } } else if (IsVertAlignment()) { return FALSE; } else { // MakeAnyAngle2D(compCurve, 1); MakeCirInclineLine2D(compCurve, 1); } return compCurve.length() > 0; } // mcl 重新启用 2010.03.30 BOOL THImpHvacFlange::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); */ HvacSectType eSectType = TDb::eOblate; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); AcGePoint3d ptS, ptE; m_pXDataMap->GetAt(HFLN_StartPoint, ptS); m_pXDataMap->GetAt(HFLN_EndPoint, ptE); double dDiameter(300.0); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); if (IsHorzAlignment()) { switch (eFlangeType) { case TDb::eSingleLine: // 单线 return MakeSigleLineFaces(arFaces); case TDb::eOpenDbLine: case TDb::eCloseDbLine: case TDb::eCloseTrLine: // 多线 return MakeMultiLineFaces(arFaces); default: break; } } else if (IsVertAlignment()) { //立面安装不支持单线遮挡 if (IsSingleLine()) { return NULL; } switch (eSectType) { case TDb::eRectangular: // 矩形口 return MakeRectangleFaces(arFaces); case TDb::eCircular: // 圆形口 return MakeCircleFaces(arFaces); case TDb::eOblate: break; default: break; } } //任意角度 else { AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcDbFace * pFace; AcGePoint3dArray arpts,arpts1; if(!GetAnyAnglePts(arpts, arpts1)) // if(!GetInclineAnglePts(arpts, arpts1)) return FALSE; if (eSectType == TDb::eRectangular) { if (arpts.length() > 6) { pFace = new AcDbFace; pFace->setVertexAt(0, arpts[0]); pFace->setVertexAt(1, arpts[5]); pFace->setVertexAt(2, arpts[4]); pFace->setVertexAt(3, arpts[3]); arFaces.append(pFace); } else { pFace = new AcDbFace; pFace->setVertexAt(0, arpts[0]); pFace->setVertexAt(1, arpts[1]); pFace->setVertexAt(2, arpts[2]); pFace->setVertexAt(3, arpts[3]); arFaces.append(pFace); } } else if (eSectType == TDb::eCircular) { // AcGeCircArc3d circle(arpts[0],arpts[1],arpts[2]); // AcGePoint3d pt = arpts[0]; // double dangle = circle.endAng() - circle.startAng(); // if (dangle < 0) // { // dangle = -dangle; // } // double dMinDiffAng = PI/12; // GetGlobalContext()->GetAt(KEY_MINDIFFANG,dMinDiffAng); // int nSeg = dangle / dMinDiffAng; // for (int i = 0; i < -2; i++) // { // pFace = new AcDbFace; // pFace->setVertexAt(0, circle.center()); // pFace->setVertexAt(1, pt); // pt.rotateBy(dMinDiffAng,AcGeVector3d::kZAxis,circle.center()); // pFace->setVertexAt(2, pt); // pFace->setVertexAt(3, circle.center()); // arFaces.append(pFace); // } // Begin---Lixl---Modify---2011-12-15----倾斜法兰,重新计算消隐面 // //粗略计算的Face // int nSize = arpts.length(); // if (nSize < 10) // { // return FALSE; // } // AcGePoint3d ptCen = TAuxTools::Mid(arpts[3], arpts[9]); // for (int i = 0; i < nSize - 1; i++) // { // pFace = new AcDbFace; // pFace->setVertexAt(0, ptCen); // pFace->setVertexAt(1, arpts[i]); // pFace->setVertexAt(2, arpts[i + 1]); // pFace->setVertexAt(3, ptCen); // arFaces.append(pFace); // } // pFace = new AcDbFace; // pFace->setVertexAt(0, ptCen); // pFace->setVertexAt(1, arpts[0]); // pFace->setVertexAt(2, arpts[nSize - 1]); // pFace->setVertexAt(3, ptCen); // arFaces.append(pFace); AcGePoint3d ptMid; Midpoint(ptS, ptE, ptMid); AcGePlane planStd(ptMid, vtZAxis); // ptTemp = AcGePoint3d::kOrigin.orthoProject(planStd); // planStd.set(ptTemp, vtZAxis); // 两端半圆 AcGePoint3d ptSS = ptS.orthoProject(planStd); AcGePoint3d ptEE = ptE.orthoProject(planStd); AcGeVector3d vtStaEvery, vtEndEvery, vtDirect; vtDirect = ptEE - ptSS; vtDirect.normalize(); AcGeVector3d vtSide = AcGeVector3d::kZAxis; vtSide.rotateBy(-PI * 0.5, vtDirect); double dMinAngle(TAuxTools::GetMinDiffAngle()); int nPartNum = int(PI / dMinAngle) + 1; dMinAngle = PI / nPartNum; AcGePoint3dArray ptArrSta, ptArrEnd; vtDirect = ptE - ptS; vtDirect.normalize(); vtStaEvery = vtDirect.crossProduct(vtZAxis); AcGePoint3d ptStaNow, ptEndNow; ptStaNow = ptS + vtStaEvery.normalize() * dDiameter * 0.5; ptEndNow = ptE + vtStaEvery * dDiameter * 0.5; if (TDb::eSingleLine == eFlangeType) { ptStaNow = ptMid + vtStaEvery * dDiameter * 0.5; ptEndNow = ptMid + vtStaEvery * dDiameter * 0.5; ptS = ptMid; ptE = ptMid; } int i(0); for (i = 0; i < nPartNum + 1; i++) { ptArrSta.append(ptStaNow.orthoProject(planStd)); ptArrEnd.append(ptEndNow.orthoProject(planStd)); if (ptS.z > ptE.z) { ptStaNow.rotateBy(-dMinAngle, -vtDirect, ptS); ptEndNow.rotateBy(dMinAngle, -vtDirect, ptE); } else { ptStaNow.rotateBy(-dMinAngle, vtDirect, ptS); ptEndNow.rotateBy(dMinAngle, vtDirect, ptE); } if (i > 0) { AcDbFace* pStaFace = new AcDbFace; pStaFace->setVertexAt(0, ptS.orthoProject(planStd)); pStaFace->setVertexAt(1, ptArrSta[i]); pStaFace->setVertexAt(2, ptArrSta[i-1]); pStaFace->setVertexAt(3, ptS.orthoProject(planStd)); arFaces.append(pStaFace); AcDbFace* pEndFace = new AcDbFace; pEndFace->setVertexAt(0, ptE.orthoProject(planStd)); pEndFace->setVertexAt(1, ptArrEnd[i]); pEndFace->setVertexAt(2, ptArrEnd[i-1]); pEndFace->setVertexAt(3, ptE.orthoProject(planStd)); arFaces.append(pEndFace); } } if (TDb::eSingleLine != eFlangeType) { // 中间矩形区域 ptArrSta.setLogicalLength(0); GetFourKeyPoints(ptArrSta); if (4 == ptArrSta.length()) { AcDbFace* pMidFace = new AcDbFace; pMidFace->setVertexAt(0, ptArrSta.at(0).orthoProject(planStd)); pMidFace->setVertexAt(1, ptArrSta.at(1).orthoProject(planStd)); pMidFace->setVertexAt(2, ptArrSta.at(2).orthoProject(planStd)); pMidFace->setVertexAt(3, ptArrSta.at(3).orthoProject(planStd)); arFaces.append(pMidFace); } } // End--------------------------------------------------------------------- } return TRUE; } return FALSE; } double THImpHvacFlange::GetEdgeLineWidth() const { BOOL bShow(FALSE); // delete by dyc on 2013-12-12 法兰不应该加粗 //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 THImpHvacFlange::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; } Acad::ErrorStatus THImpHvacFlange::transformBy(const AcGeMatrix3d& xform) { if (NULL == m_pXDataMap) return Acad::eNotApplicable; AcGeVector3d vtOff = xform.translation(); BOOL bMoveInDuct = IsMovedWithInDuct(vtOff); // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 变换位置 ptStart.transformBy(xform); ptEnd.transformBy(xform); // 更新点 m_pXDataMap->SetAt(HFLN_StartPoint, ptStart); m_pXDataMap->SetAt(HFLN_EndPoint, ptEnd); // 原竖向法向不支持旋转带非竖向 AcGeVector3d vtNormal = normal(); if (!vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) { vtNormal.transformBy(xform); vtNormal.normalize(); m_pXDataMap->SetAt(KEY_NORMAL, vtNormal); } // 设置尺寸 double dScale = xform.scale(); double dWidth(0.0), dThick(0.0), dSkitSize(0.0); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkitSize); // add by zh 2013-5-20 根据出图比例计算出头长度 // double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); // if (dPScale < 1.e-3) dPScale = 1.0; // dSkitSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Width, dWidth); m_pXDataMap->GetAt(HFLN_Thick, dThick); dWidth *= dScale; dThick *= dScale; dSkitSize *= dScale; m_pXDataMap->SetAt(HFLN_SkirtSize, dSkitSize); m_pXDataMap->SetAt(HFLN_Width, dWidth); m_pXDataMap->SetAt(HFLN_Thick, dThick); // 传递消息 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()) { BOOL bAutoCon(FALSE); GetGlobalContext(HVAC_AUTOCONNECT, bAutoCon); if (bAutoCon) { TInterfaceModifyMsg iMsg; TDbInterfaceMsgWrite msgWrite; // if (bMoveInDuct) // { // 写入接口更改消息 iMsg.SetInterfaceOper(TDb::eTransformBy); iMsg.SetMsgValidate(TRUE); iMsg.SetTransform(xform); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); msgWrite.WriteInterfaceMsg(iMsg); // } if (!bMoveInDuct && TAuxTools::IsAutoWorkConnect()) { // 写入自动融合或断开新管 更改消息 iMsg.SetMsgValidate(TRUE); iMsg.SetTransform(xform.translation()); iMsg.SetTransform(xform); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); iMsg.SetInterfaceOper(TDb::eAutoWorkOn); msgWrite.WriteInterfaceMsg(iMsg); } } //更新接口记录接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(), xform); } } return Acad::eOk; } TDb::Position THImpHvacFlange::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 THImpHvacFlange::getStretchPoints(AcGePoint3dArray& stretchPoints) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 单线法兰取中点 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = ptEnd - ptStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * 0.005; // ptEnd = ptTmp + vtDir * 0.005; // } stretchPoints.append(ptStart); stretchPoints.append(ptEnd); return Acad::eOk; } Acad::ErrorStatus THImpHvacFlange::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { if (NULL == m_pXDataMap) return Acad::eNotApplicable; //取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGeVector3d vtStart = ptStart - ptEnd; vtStart.normalize(); // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = -vtStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * 0.005; // ptEnd = ptTmp + vtDir * 0.005; // } // 增加夹点 gripPoints.append(ptStart); gripPoints.append(ptEnd); // 按 10 个像素点, 增加2个命令夹点 // double dCmd = PixelToWcs(10); AcGePoint3d ptGeCmd1, ptGeCmd2; ptGeCmd1 = ptStart + g_dCmdOff * vtStart; ptGeCmd2 = ptEnd - g_dCmdOff * vtStart; gripPoints.append(ptGeCmd1); gripPoints.append(ptGeCmd2); return Acad::eOk; } Acad::ErrorStatus THImpHvacFlange::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(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 单线法兰取中点,不再使用 // TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; // m_pXDataMap->GetAt(HFLN_Type, (int &)eFlangeType); // if (TDb::eSingleLine == eFlangeType) // { // AcGePoint3d ptTmp; // Midpoint(ptStart, ptEnd, ptTmp); // AcGeVector3d vtDir = ptEnd - ptStart; // vtDir.normalize(); // ptStart = ptTmp - vtDir * 0.005; // ptEnd = ptTmp + vtDir * 0.005; // } // 根据捕捉模式处理 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 THImpHvacFlange::moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { if (indices.length() < 2) return Acad::eNotImplementedYet; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptStart += offset; ptEnd += offset; m_pXDataMap->SetAt(HFLN_StartPoint, ptStart); m_pXDataMap->SetAt(HFLN_EndPoint, ptEnd); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { //更新自身模型空间的扩展字典的接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(), offset); return Acad::eOk; } return Acad::eNotImplementedYet; } Acad::ErrorStatus THImpHvacFlange::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { return OnCHorEqualRMoveGripPointsAt(indices,offset); } Acad::ErrorStatus THImpHvacFlange::OnCHorEqualRMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset) { ASSERT(NULL != m_pXDataMap); // 如果有多个点,则去除命令点后,有多个点时作为移动,单个点时使用该点类型 TDb::Position ePos; if (indices.length() == 1) { // 单个夹点 ePos = ExplainGripIndex(indices[0]); } else { // 多个夹点 int iCount = 0; TDb::Position eTemp; int iPos = indices.length(); while ((--iPos) >= 0 && iCount < 2) { eTemp = ExplainGripIndex(indices[iPos]); switch (eTemp) { case TDb::eStart: case TDb::eEnd: ePos = eTemp; iCount++; break; } } // 多个命令夹点不处理 if (iCount == 0) return Acad::eOk; // 多个非命令夹点,移动整体 if (iCount > 1) { // 法兰夹点只是移动操作,移动最后一个夹点 } } // 取得位置点 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); switch(ePos) { case TDb::eStart: case TDb::eEnd: // MoveGripRandom(ePos, offset); // break; { BOOL bMoveInDuct = IsMovedWithInDuct(offset); AcGePoint3d ptNewStart = ptStart + offset; AcGePoint3d ptNewEnd = ptEnd + offset; m_pXDataMap->SetAt(HFLN_StartPoint, ptNewStart); m_pXDataMap->SetAt(HFLN_EndPoint, ptNewEnd); if (m_pOwnerEnt != NULL && m_pOwnerEnt->objectId().isValid()) { BOOL bAutoCon(FALSE); GetGlobalContext(HVAC_AUTOCONNECT, bAutoCon); if (bAutoCon) { TInterfaceModifyMsg iMsg; if (bMoveInDuct) { // 创建接口更改消息 iMsg.SetMsgPoint(ePos == TDb::eStart ? ptNewStart : ptNewEnd); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eMoveGripPoint); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); } else if (TAuxTools::IsAutoWorkConnect()) { // 写入自动融合或断开新管 更改消息 iMsg.SetMsgValidate(TRUE); AcGeMatrix3d mat; mat.setTranslation(offset); iMsg.SetTransform(offset); iMsg.SetTransform(mat); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); iMsg.SetInterfaceOper(TDb::eAutoWorkOn); } // 写入接口更改消息 TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); } //更新自身模型空间的扩展字典的接口信息 UpdateInterfaceRec(m_pOwnerEnt->objectId(), offset); } } break; case TDb::eCommand0: case TDb::eCommand1: { // 获得夹点命令 CString sCmdStr; GetGlobalContext()->GetAt(KEY_HVACGRIPCMD, sCmdStr); if (sCmdStr.IsEmpty()) return Acad::eNotApplicable; // 创建接口更改消息 TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ePos == TDb::eCommand0 ? ptStart : ptEnd); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(TDb::eNewCommand); iMsg.SetPreviewObjToCreate(TDb::ePipe, 0); // 写入接口更改消息 AcDbSoftPointerId idOwner; m_pXDataMap->GetAt(KEY_THISID, idOwner); iMsg.SetMsgOperateOn(idOwner); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); // 发送消息 acedPostCommand(_T("\33")); acedPostCommand(sCmdStr + _T("\n")); } break; default: break; } return Acad::eOk; } // 拖拽管件,支持转向等操作 Acad::ErrorStatus THImpHvacFlange::MoveGripRandom(TDb::Position ePos, const AcGeVector3d& offset ) { AcGePoint3d ptDrag; if (ePos == eStart) m_pXDataMap->GetAt(HFLN_StartPoint, ptDrag); else m_pXDataMap->GetAt(HFLN_EndPoint, ptDrag); TInterfaceModifyMsg iMsg; iMsg.SetMsgPoint(ptDrag); iMsg.SetGripPosition(ePos); iMsg.SetMoveGripOffset(offset); iMsg.SetMsgValidate(TRUE); iMsg.SetInterfaceOper(eNewCommand); iMsg.SetPreviewObjToCreate(eFlange, 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 THImpHvacFlange::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, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint,ptStart); m_pXDataMap->GetAt(HFLN_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 = ptStart - ptEnd; AcGeVector3d vtEnd = -vtSta; ptStart += vtOffset; ptEnd += vtOffset; m_pXDataMap->SetAt(HELB_StartPoint,ptStart); m_pXDataMap->SetAt(HELB_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 THImpHvacFlange::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(); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint,ptStart); m_pXDataMap->GetAt(HFLN_EndPoint,ptEnd); AcGePoint3d ptGeSOld = ptStart; AcGePoint3d ptGeEOld = ptEnd; AcGeVector3d vtSta = ptStart - ptEnd; AcGeVector3d vtEnd = -vtSta; ptStart.transformBy(mtTrans); ptEnd.transformBy(mtTrans); m_pXDataMap->SetAt(HELB_StartPoint,ptStart); m_pXDataMap->SetAt(HELB_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; return FALSE; } BOOL THImpHvacFlange::OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs) { ASSERT(NULL != m_pXDataMap); AcGePoint3d ptOrigStart, ptOrigEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptOrigStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptOrigEnd); // 设置各接口新尺寸 HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); double dNewWidth, dNewHeigh(0.0); if (eSect == TDb::eRectangular) { AcGeVector3d vtNormal = normal(); AcGeVector3d vtWidthDir, vtHeighDir; iModiMsg.GetSizeDir(vtWidthDir, vtHeighDir); // 判断是否是空间连接或导致宽高互换 if (vtHeighDir.isParallelTo(vtNormal)) iModiMsg.GetSize(dNewWidth, dNewHeigh); else iModiMsg.GetSize(dNewHeigh, dNewWidth); } else if (eSect == TDb::eCircular) { iModiMsg.GetSize(dNewWidth, dNewHeigh); dNewHeigh = dNewWidth; } AcGeVector3d vtOff = iModiMsg.GetMoveGripOffset(); AcGePoint3d ptNewStart = ptOrigStart + vtOff; AcGePoint3d ptNewEnd = ptOrigEnd + vtOff; m_pXDataMap->SetAt(HFLN_Width, dNewWidth); m_pXDataMap->SetAt(HFLN_Thick, dNewHeigh); m_pXDataMap->SetAt(HFLN_StartPoint, ptNewStart); m_pXDataMap->SetAt(HFLN_EndPoint, ptNewEnd); // 消息传递 AcGeVector3d vtLine = ptOrigEnd - ptOrigStart; AcDbObjectId idFind; if (FindConnect(ptOrigStart, -vtLine, m_pOwnerEnt->objectId(), idFind)) // sta 点的接口 { TInterfaceModifyMsg iMsg = iModiMsg; iMsg.SetMsgOperateOn(idFind); iMsg.SetMsgPoint(ptOrigStart); iModiMsgs.append(iMsg); } if (FindConnect(ptOrigEnd, vtLine, m_pOwnerEnt->objectId(), idFind)) // End 点的接口 { TInterfaceModifyMsg iMsg = iModiMsg; iMsg.SetMsgOperateOn(idFind); iMsg.SetMsgPoint(ptOrigEnd); iModiMsgs.append(iMsg); } if (!ptOrigStart.isEqualTo(ptNewStart, g_globalTol)) ((TDbInterfacesObj*)m_pOwnerEnt)->UpdateInterfaceRec(ptOrigStart, ptNewStart); if (!ptOrigEnd.isEqualTo(ptNewEnd, g_globalTol)) ((TDbInterfacesObj*)m_pOwnerEnt)->UpdateInterfaceRec(ptOrigEnd, ptNewEnd); return TRUE; } BOOL THImpHvacFlange::MakeRectangle2D(TComplexCurve& cplCurve) const { ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dThick = 0.0; double dWidth = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtXDir = vtNormal; AcGeVector3d vtYDir = vtXDir; AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); vtYDir.rotateBy(PI / 2.0, vtZAxis); vtXDir = vtXDir.normalize(); vtYDir = vtYDir.normalize(); // 获取矩形端点 ptS = ptBase + vtXDir * (dThick / 2.0 + dSkirtSize); ptE = ptBase - vtXDir * (dThick / 2.0 + dSkirtSize); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtYDir * (dWidth / 2.0 + dSkirtSize); ptS2 = ptS - vtYDir * (dWidth / 2.0 + dSkirtSize); ptE1 = ptE + vtYDir * (dWidth / 2.0 + dSkirtSize); ptE2 = ptE - vtYDir * (dWidth / 2.0 + dSkirtSize); // 添加矩形边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (IsSingleLine()) { el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; cplCurve.append(el); return TRUE; } el.ptGe[0] = ptS1; el.ptGe[1] = ptE1; el.ptGe[2] = ptE1; cplCurve.append(el); el.ptGe[0] = ptE1; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); el.ptGe[0] = ptE2; el.ptGe[1] = ptS2; el.ptGe[2] = ptS2; cplCurve.append(el); el.ptGe[0] = ptS2; el.ptGe[1] = ptS1; el.ptGe[2] = ptS1; cplCurve.append(el); // ptS = ptBase + vtXDir * dThick / 2.0; // ptE = ptBase - vtXDir * dThick / 2.0; // ptS1 = ptS + vtYDir * dWidth / 2.0; // ptS2 = ptS - vtYDir * dWidth / 2.0; // ptE1 = ptE + vtYDir * dWidth / 2.0; // ptE2 = ptE - vtYDir * dWidth / 2.0; // // el.ptGe[0] = ptS1; // el.ptGe[1] = ptE1; // el.ptGe[2] = ptE1; // cplCurve.append(el); // // el.ptGe[0] = ptE1; // el.ptGe[1] = ptE2; // el.ptGe[2] = ptE2; // cplCurve.append(el); // // el.ptGe[0] = ptE2; // el.ptGe[1] = ptS2; // el.ptGe[2] = ptS2; // cplCurve.append(el); // // el.ptGe[0] = ptS2; // el.ptGe[1] = ptS1; // el.ptGe[2] = ptS1; // cplCurve.append(el); return cplCurve.length() > 0; } BOOL THImpHvacFlange::MakeCircle2D(TComplexCurve& cplCurve) const { ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptArcH1, ptArcH2, ptArcV1, ptArcV2; double dSkirtSize = 0.0; double dDiameter = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); // 计算方向向量 AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtXDir = vtNormal; AcGeVector3d vtYDir = vtXDir; AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); vtYDir.rotateBy(PI / 2.0, vtZAxis); vtXDir = vtXDir.normalize(); vtYDir = vtYDir.normalize(); // 计算圆上的点 ptArcH1 = ptBase + vtYDir * (dDiameter / 2.0 + dSkirtSize); ptArcH2 = ptBase - vtYDir * (dDiameter / 2.0 + dSkirtSize); ptArcV1 = ptBase + vtXDir * (dDiameter / 2.0 + dSkirtSize); ptArcV2 = ptBase - vtXDir * (dDiameter / 2.0 + dSkirtSize); // 添加两段圆弧(两个半圆组成一个园) TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; el.ptGe[0] = ptArcH1; el.ptGe[1] = ptArcV1; el.ptGe[2] = ptArcH2; cplCurve.append(el); el.ptGe[0] = ptArcH1; el.ptGe[1] = ptArcV2; el.ptGe[2] = ptArcH2; cplCurve.append(el); // ptArcH1 = ptBase + vtYDir * dDiameter / 2.0; // ptArcH2 = ptBase - vtYDir * dDiameter / 2.0; // ptArcV1 = ptBase + vtXDir * dDiameter / 2.0; // ptArcV2 = ptBase - vtXDir * dDiameter / 2.0; // // el.ptGe[0] = ptArcH1; // el.ptGe[1] = ptArcV1; // el.ptGe[2] = ptArcH2; // cplCurve.append(el); // // el.ptGe[0] = ptArcH1; // el.ptGe[1] = ptArcV2; // el.ptGe[2] = ptArcH2; // cplCurve.append(el); return cplCurve.length() > 0; } // mcl,修正单线长度问题 2010.03.29 BOOL THImpHvacFlange::MakeHSingleLine2D(TComplexCurve& cplCurve) const { //二维单线 ASSERT(NULL != m_pXDataMap); // 获取绘图数据 int iSectType = 2; AcGePoint3d ptStart, ptEnd, ptBase; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); m_pXDataMap->GetAt(HVAC_SectType, iSectType); ptBase = TAuxTools::Mid(ptStart, ptEnd); // 计算方向向量 AcGeVector3d vtNormal = AcGeVector3d::kIdentity; AcGeVector3d vtDir = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); vtDir.rotateBy(PI / 2.0, vtNormal); double dSkirtSize = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (!IsSingleLine()) { if (TDb::eRectangular == iSectType) { double dWidth = 0.0; m_pXDataMap->GetAt(HFLN_Width, dWidth); dWidth *= 0.5; el.ptGe[0] = ptBase - vtDir * (dWidth + dSkirtSize); el.ptGe[1] = ptBase + vtDir * (dWidth + dSkirtSize); el.ptGe[2] = el.ptGe[1]; cplCurve.append(el); } else if (TDb::eCircular == iSectType) { double dDiameter = 0.0; m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); dDiameter *= 0.5; el.ptGe[0] = ptBase - vtDir * (dDiameter + dSkirtSize); el.ptGe[1] = ptBase + vtDir * (dDiameter + dSkirtSize); el.ptGe[2] = el.ptGe[1]; cplCurve.append(el); } } else { el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; cplCurve.append(el); } return cplCurve.length() > 0; } BOOL THImpHvacFlange::MakeHOpenDbLine2D(TComplexCurve& cplCurve) const { // 二维双线开口 ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtDir.rotateBy(PI / 2.0, vtNormal); // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } else { return FALSE; } // 计算图形端点 AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * dBoardThick / 2.0; ptS2 = ptS - vtPDir * dBoardThick / 2.0; ptE1 = ptE + vtPDir * dBoardThick / 2.0; ptE2 = ptE - vtPDir * dBoardThick / 2.0; // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (!IsSingleLine()) { el.ptGe[0] = ptS1; el.ptGe[1] = ptE1; el.ptGe[2] = ptE1; cplCurve.append(el); el.ptGe[0] = ptS2; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); } else { el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; cplCurve.append(el); } return cplCurve.length() > 0; } BOOL THImpHvacFlange::MakeHCloseDbLine2D(TComplexCurve& cplCurve) const { // 二维双线封闭 ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtDir.rotateBy(PI / 2.0, vtNormal); // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } else { return FALSE; } // 计算图形端点 AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * (dBoardThick / 2.0); ptS2 = ptS - vtPDir * (dBoardThick / 2.0); ptE1 = ptE + vtPDir * (dBoardThick / 2.0); ptE2 = ptE - vtPDir * (dBoardThick / 2.0); // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (!IsSingleLine()) { el.ptGe[0] = ptS1; el.ptGe[1] = ptE1; el.ptGe[2] = ptE1; cplCurve.append(el); el.ptGe[0] = ptS2; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); el.ptGe[0] = ptS1; el.ptGe[1] = ptS2; el.ptGe[2] = ptS2; cplCurve.append(el); el.ptGe[0] = ptE1; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); } else { el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; cplCurve.append(el); } return cplCurve.length() > 0; } BOOL THImpHvacFlange::MakeAnyAngle2D(TComplexCurve& cplCurve, int nType) const { // 二维双线封闭 ASSERT(NULL != m_pXDataMap); //arpts是外轮廓线点数组,arpts1是内轮廓线点数组, AcGePoint3dArray arpts, arpts1; if(!GetAnyAnglePts(arpts, arpts1)) return FALSE; // 获取绘图数据 int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { //外轮廓 if (nType == 0) { for (int i = 1; i < arpts.length();i++) { el.ptGe[0] = arpts[i - 1]; el.ptGe[1] = arpts[i]; el.ptGe[2] = arpts[i]; cplCurve.append(el); } } //内部线 else if (nType == 1) { for (int i = 1; i < arpts1.length();i++) { el.ptGe[0] = arpts1[i - 1]; el.ptGe[1] = arpts1[i]; el.ptGe[2] = arpts1[i]; cplCurve.append(el); } } } else if (TDb::eCircular == iSectType) { // 获取绘图数据 AcGePoint3d ptSU, ptSD, ptEU,ptED; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); AcGeVector3d vtCross = vtNormal.crossProduct(vtDir); vtCross.normalize(); dWidth *= 0.5; dThick *=0.5; // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGeVector3d vtX = vtCross; vtX.rotateBy(PI * 0.5, vtZAxis); BOOL bDrawinside = FALSE; //开始点和终止点互换 if (ptEnd.z > ptStart.z) { vtX *= -1; bDrawinside = TRUE; } AcDbPolyline pPolyLine, pPolyLine1, pPolyLine2, pPolyLine3, pPolyLine4; AcGePoint3dArray arPtsEll; int iRes = -1; double dBigCir = dDiameter + dSkirtSize * 2; //内部线 if (nType == 1) { //如果法兰向上将绘制内部线,向下将不绘制内部线 if (bDrawinside) { return 0; } //Star小圆 iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, vtDir, vtZAxis, pPolyLine1,-vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine1, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } // el.ptGe[0] = arPtsEll[0]; // el.ptGe[1] = arPtsEll[1]; // el.ptGe[2] = arPtsEll[2]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[2]; // el.ptGe[1] = arPtsEll[3]; // el.ptGe[2] = arPtsEll[4]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[4]; // el.ptGe[1] = arPtsEll[5]; // el.ptGe[2] = arPtsEll[6]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[0]; // el.ptGe[1] = arPtsEll[3] - vtCross * dDiameter; // el.ptGe[2] = arPtsEll[6]; // cplCurve.append(el); } iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, vtDir, vtZAxis, pPolyLine2,vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine2, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } // el.ptGe[0] = arPtsEll[0]; // el.ptGe[1] = arPtsEll[1]; // el.ptGe[2] = arPtsEll[2]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[2]; // el.ptGe[1] = arPtsEll[3]; // el.ptGe[2] = arPtsEll[4]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[4]; // el.ptGe[1] = arPtsEll[5]; // el.ptGe[2] = arPtsEll[6]; // cplCurve.append(el); } /* //Star大圆如果显示真实宽度 iRes = 2 iRes = TAuxTools::GetEllipseFromCircle(ptStart, dBigCir, vtDir, vtZAxis, pPolyLine3,vtX); if (iRes == 3) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine3, arPtsEll); el.ptGe[0] = arPtsEll[0]; el.ptGe[1] = arPtsEll[1]; el.ptGe[2] = arPtsEll[2]; cplCurve.append(el); el.ptGe[0] = arPtsEll[2]; el.ptGe[1] = arPtsEll[3]; el.ptGe[2] = arPtsEll[4]; cplCurve.append(el); el.ptGe[0] = arPtsEll[4]; el.ptGe[1] = arPtsEll[5]; el.ptGe[2] = arPtsEll[6]; cplCurve.append(el); } */ } //外轮廓 if (nType == 0) { iRes = TAuxTools::GetEllipseFromCircle(ptStart, dBigCir, vtDir, vtZAxis, pPolyLine4,-vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine4, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } // el.ptGe[0] = arPtsEll[0]; // el.ptGe[1] = arPtsEll[1]; // el.ptGe[2] = arPtsEll[2]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[2]; // el.ptGe[1] = arPtsEll[3]; // el.ptGe[2] = arPtsEll[4]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[4]; // el.ptGe[1] = arPtsEll[5]; // el.ptGe[2] = arPtsEll[6]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[6]; // el.ptGe[1] = arPtsEll[3] + vtCross * dBigCir; // el.ptGe[2] = arPtsEll[0]; // cplCurve.append(el); // ptSU = arPtsEll[0]; // ptSD = arPtsEll[6]; } //////////////////////////////////////////////////////////////////// //Star大圆如果显示真实宽度 iRes = 3 iRes = TAuxTools::GetEllipseFromCircle(ptStart, dBigCir, vtDir, vtZAxis, pPolyLine3,vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine3, arPtsEll);//Lixl add 2011-11-23 for(int i = 0; i < arPtsEll.length()-1; i++) { el.ptGe[0] = arPtsEll[i]; el.ptGe[1] = arPtsEll[i+1]; el.ptGe[2] = arPtsEll[i+1]; cplCurve.append(el); } // el.ptGe[0] = arPtsEll[6]; // el.ptGe[1] = arPtsEll[5]; // el.ptGe[2] = arPtsEll[4]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[4]; // el.ptGe[1] = arPtsEll[3]; // el.ptGe[2] = arPtsEll[2]; // cplCurve.append(el); // el.ptGe[0] = arPtsEll[2]; // el.ptGe[1] = arPtsEll[1]; // el.ptGe[2] = arPtsEll[0]; // cplCurve.append(el); } /* //End大圆如果显示真实宽度 iRes = 2 iRes = TAuxTools::GetEllipseFromCircle(ptEnd, dBigCir, vtDir, vtZAxis, pPolyLine,vtX); if (iRes == 3) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine, arPtsEll); el.ptGe[0] = arPtsEll[0]; el.ptGe[1] = arPtsEll[1]; el.ptGe[2] = arPtsEll[2]; cplCurve.append(el); el.ptGe[0] = arPtsEll[2]; el.ptGe[1] = arPtsEll[3]; el.ptGe[2] = arPtsEll[4]; cplCurve.append(el); el.ptGe[0] = arPtsEll[4]; el.ptGe[1] = arPtsEll[5]; el.ptGe[2] = arPtsEll[6]; cplCurve.append(el); ptEU = arPtsEll[6]; ptED = arPtsEll[0]; el.ptGe[0] = ptSU; el.ptGe[1] = ptEU; el.ptGe[2] = ptEU; cplCurve.append(el); el.ptGe[0] = ptSD; el.ptGe[1] = ptED; el.ptGe[2] = ptED; cplCurve.append(el); } */ } } return cplCurve.length() > 0; } void GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr) { if (polyLine.numVerts() != 4) return; double dPara1(0.0), dPara2(0.0); double dPar1, dPar2; AcGePoint3d pt0, pt1, pt2, pt3, ptMid; polyLine.getPointAt(0, pt0); polyLine.getPointAt(1, pt1); polyLine.getPointAt(2, pt2); polyLine.getPointAt(3, pt3); polyLine.getParamAtPoint(pt0, dPar1); polyLine.getParamAtPoint(pt1, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(pt0); ptArcArr.append(ptMid); ptArcArr.append(pt1); polyLine.getParamAtPoint(pt1, dPar1); polyLine.getParamAtPoint(pt2, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(ptMid); ptArcArr.append(pt2); polyLine.getParamAtPoint(pt2, dPar1); polyLine.getParamAtPoint(pt3, dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(ptMid); ptArcArr.append(pt3); if (polyLine.isClosed()) { polyLine.getParamAtPoint(pt3, dPar1); polyLine.getEndParam(dPar2); polyLine.getPointAtParam((dPar1 + dPar2)*0.5, ptMid); ptArcArr.append(ptMid); ptArcArr.append(pt0); } } // LixlAdd绘制倾斜法兰二维图形 BOOL THImpHvacFlange::MakeCirInclineLine2D(TComplexCurve& cplCurve, int nType/* = 0*/) const { ASSERT(NULL != m_pXDataMap); TDb::HvacSectType eSectType = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); HvacFlangeType eFlType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type, (int&)eFlType); double dDiameter(200.0); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); if (TDb::eRectangular == eSectType) { // MakeAnyAngle2D(cplCurve, nType); TDb::HvacFlangeType eFlangeType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type,(int&) eFlangeType); switch (eFlangeType) { case TDb::eSingleLine: //单线 { return MakeHSingleLine2D(cplCurve); } case TDb::eOpenDbLine: //双线开口 { return MakeHOpenDbLine2D(cplCurve); } case TDb::eCloseDbLine: //双线封口 { return MakeHCloseDbLine2D(cplCurve); } case TDb::eCloseTrLine: //三线 { return MakeHCloseTrLine2D(cplCurve); } default: break; } } else if (TDb::eCircular == eSectType && 1 == nType) { //arpts是ptStart法兰面数组,arpts1是ptEnd面数组 AcGePoint3dArray arpts, arpts1; // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; int i = 0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); if (0 == nType) { AcGeVector3d vtDir = ptEnd - ptStart; vtDir.normalize(); AcGeVector3d vtZAxis = TAuxTools::GetUcsZvt(); AcDbPolyline *pPolyLine = new AcDbPolyline; if (NULL == pPolyLine) return FALSE; int iRes(0); if (TDb::eSingleLine == eFlType) { // 单线法兰,只画一条 AcGePoint3d ptMid; Midpoint(ptStart, ptEnd, ptMid); iRes = TAuxTools::GetEllipseFromCircle(ptMid, dDiameter, vtDir, vtZAxis, *pPolyLine); if (iRes == 2) { arpts.setLogicalLength(0); TAuxTools::GetArcPoint(*pPolyLine, arpts); for (i = 0; i < arpts.length()-1; i++) { el.ptGe[0] = arpts[i]; el.ptGe[1] = arpts[i+1]; el.ptGe[2] = arpts[i+1]; cplCurve.append(el); } } } else { // 两条边 GetFourKeyPoints(arpts); if (arpts.length() > 0) { el.ptGe[0] = arpts[0]; el.ptGe[1] = arpts[1]; el.ptGe[2] = arpts[1]; cplCurve.append(el); el.ptGe[0] = arpts[2]; el.ptGe[1] = arpts[3]; el.ptGe[2] = arpts[3]; cplCurve.append(el); } //ptEnd圆末端半个椭圆(向外) iRes = TAuxTools::GetEllipseFromCircle(ptEnd, dDiameter, vtDir, vtZAxis, *pPolyLine, vtDir); if (iRes == 2) { arpts.setLogicalLength(0); TAuxTools::GetArcPoint(*pPolyLine, arpts); // for (i = 0; i < arpts.length(); i++) // { // if (i > 1 && i%2 == 0) // { // el.ptGe[0] = arpts[i-2]; // el.ptGe[1] = arpts[i-1]; // el.ptGe[2] = arpts[i]; // cplCurve.append(el); // } // } for (i = 0; i < arpts.length()-1; i++) { el.ptGe[0] = arpts[i]; el.ptGe[1] = arpts[i+1]; el.ptGe[2] = arpts[i+1]; cplCurve.append(el); } } pPolyLine->reset(Adesk::kFalse, i); //ptStart截面,半个椭圆(向外) iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, -vtDir, vtZAxis, *pPolyLine, -vtDir); if (iRes == 2) { arpts1.setLogicalLength(0); TAuxTools::GetArcPoint(*pPolyLine, arpts1); for (i = 0; i < arpts1.length()-1; i++) { el.ptGe[0] = arpts1[i]; el.ptGe[1] = arpts1[i+1]; el.ptGe[2] = arpts1[i+1]; cplCurve.append(el); } } pPolyLine->reset(Adesk::kFalse, i); // 根据高度,画ptStart或者ptEnd截面中,向内的半个类似椭圆的多段线 arpts1.setLogicalLength(0); if (ptStart.z > ptEnd.z) { iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, vtDir, vtZAxis, *pPolyLine, vtDir); if (iRes == 2) { TAuxTools::GetArcPoint(*pPolyLine, arpts1); for (i = 0; i < arpts1.length()-1; i++) { el.ptGe[0] = arpts1[i]; el.ptGe[1] = arpts1[i+1]; el.ptGe[2] = arpts1[i+1]; cplCurve.append(el); } } } else { iRes = TAuxTools::GetEllipseFromCircle(ptEnd, dDiameter, vtDir, vtZAxis, *pPolyLine, -vtDir); if (iRes == 2) { TAuxTools::GetArcPoint(*pPolyLine, arpts); for (i = 0; i < arpts.length()-1; i++) { el.ptGe[0] = arpts[i]; el.ptGe[1] = arpts[i+1]; el.ptGe[2] = arpts[i+1]; cplCurve.append(el); } } } } if (NULL != pPolyLine) delete pPolyLine; } } return cplCurve.length() > 0; } // 倾斜法兰绘制方法和风管统一,即利用画风管方法画法兰Lixl void THImpHvacFlange::GetFourKeyPoints( AcGePoint3dArray &ptArr ) const { ASSERT(NULL != m_pXDataMap); // 获得法兰数据 AcGePoint3d ptS, ptE; m_pXDataMap->GetAt(HFLN_StartPoint, ptS); m_pXDataMap->GetAt(HFLN_EndPoint, ptE); AcGeVector3d vtNormal, vtZAxis(TAuxTools::GetUcsZvt()); m_pXDataMap->GetAt(HVAC_Normal, vtNormal); if (vtNormal.length() < 1E-9) return; HvacSectType eSectType = eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); double dWidth(0.0), dHeigh(0.0); m_pXDataMap->GetAt(HFLN_Width, dWidth); m_pXDataMap->GetAt(HFLN_Thick, dHeigh); // 不同截面,不同处理,暂时只处理倾斜圆管,后续需要,自定添加 if (TDb::eRectangular == eSectType) { } else if (TDb::eCircular == eSectType) { double dHalfWidth = dWidth * 0.5; AcGePoint3d ptMid; Midpoint(ptS, ptE, ptMid); AcGePlane plan(ptMid, vtZAxis); if (!IsHorzAlignment()) { AcGePoint3d ptSOnPlan = ptS.orthoProject(plan); AcGePoint3d ptEOnPlan = ptE.orthoProject(plan); AcGeVector3d vtDirOnPlan = ptEOnPlan - ptSOnPlan; vtDirOnPlan.normalize(); // vtSide是垂直于法向和法兰方向的向量,用于求沿法兰方向的中心截面的四个点 AcGeVector3d vtSide = vtZAxis; vtSide.rotateBy(-PI * 0.5, vtDirOnPlan); ptArr.append(ptS - dHalfWidth * vtSide); ptArr.append(ptE - dHalfWidth * vtSide); ptArr.append(ptE + dHalfWidth * vtSide); ptArr.append(ptS + dHalfWidth * vtSide); } } } BOOL THImpHvacFlange::GetInclineAnglePts(AcGePoint3dArray &arpts, AcGePoint3dArray &arpts1) const { ASSERT(NULL != m_pXDataMap); arpts1.setLogicalLength(0); arpts.setLogicalLength(0); // 获取绘图数据 AcGePoint3d pt, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; TDb::HvacFlangeType eFlType = TDb::eSingleLine; m_pXDataMap->GetAt(HFLN_Type, (int&)eFlType); m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); AcGeVector3d vtCross = vtNormal.crossProduct(vtDir); vtCross.normalize(); dWidth *= 0.5; dThick *=0.5; // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptStart; pt = ptS + vtCross * (dWidth + dSkirtSize); arpts.append(pt + vtNormal * (dThick + dSkirtSize)); arpts.append(pt - vtNormal * (dThick + dSkirtSize)); pt = ptS - vtCross * (dWidth + dSkirtSize); arpts.append(pt - vtNormal * (dThick + dSkirtSize)); arpts.append(pt + vtNormal * (dThick + dSkirtSize)); arpts.append(arpts[0]); //算内部线的点 arpts1.setLogicalLength(0); pt = ptS + vtCross * dWidth; arpts1.append(pt + vtNormal * dThick); arpts1.append(pt - vtNormal * dThick); pt = ptS - vtCross * dWidth; arpts1.append(pt - vtNormal * dThick); arpts1.append(pt + vtNormal * dThick); arpts1.append(arpts1[0]); } else if (TDb::eCircular == iSectType) { AcGeVector3d vtZAxis = TAuxTools::GetUcsZvt(); AcDbPolyline *pPolyLine = new AcDbPolyline; int iRes(0); AcGePoint3d ptBase; Midpoint(ptStart, ptEnd, ptBase); if (ptStart.z > ptEnd.z) // 起点高,取起点外面半个椭圆曲线,构造pline线 { //ptStart圆 iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, -vtDir, vtZAxis, *pPolyLine, -vtDir); if (iRes == 2) { TAuxTools::GetArcPoint(*pPolyLine, arpts); } } else { iRes = TAuxTools::GetEllipseFromCircle(ptStart, dDiameter, vtDir, vtZAxis, *pPolyLine, -vtDir); if (iRes == 2) { TAuxTools::GetArcPoint(*pPolyLine, arpts); } } if (NULL != pPolyLine) delete pPolyLine; } return arpts.length() > 0; } BOOL THImpHvacFlange::GetAnyAnglePts(AcGePoint3dArray &arpts, AcGePoint3dArray &arpts1) const { // 二维双线封闭 ASSERT(NULL != m_pXDataMap); arpts1.setLogicalLength(0); arpts.setLogicalLength(0); // 获取绘图数据 AcGePoint3d pt, ptS, ptE, ptMid; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); AcGeVector3d vtCross = vtNormal.crossProduct(vtDir); vtCross.normalize(); dWidth *= 0.5; dThick *=0.5; // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptStart; // if (ptEnd.z > ptStart.z) // { // ptS = ptEnd; // } pt = ptS + vtCross * (dWidth + dSkirtSize); arpts.append(pt + vtNormal * (dThick + dSkirtSize)); arpts.append(pt - vtNormal * (dThick + dSkirtSize)); pt = ptS - vtCross * (dWidth + dSkirtSize); arpts.append(pt - vtNormal * (dThick + dSkirtSize)); arpts.append(pt + vtNormal * (dThick + dSkirtSize)); arpts.append(arpts[0]); //是否真实显示宽度 // AcGeMatrix3d mat; // vtDir *= dBoardThick; // if (ptEnd.z > ptStart.z) // { // vtDir *= -1; // } // mat.setToTranslation(vtDir); // for (int i = 0; i < arpts.length();i++) // { // pt = arpts[i]; // pt.transformBy(mat); // arpts1.append(pt); // } // arpts.append(arpts1[2]); // arpts.append(arpts1[1]); // arpts.append(arpts[0]); // arpts.append(arpts[3]); //算内部线的点 arpts1.setLogicalLength(0); // if (ptEnd.z > ptStart.z) // { // ptS = ptEnd; // } pt = ptS + vtCross * dWidth; arpts1.append(pt + vtNormal * dThick); arpts1.append(pt - vtNormal * dThick); pt = ptS - vtCross * dWidth; arpts1.append(pt - vtNormal * dThick); arpts1.append(pt + vtNormal * dThick); arpts1.append(arpts1[0]); } else if (TDb::eCircular == iSectType) { // 获得UCS坐标Z向量 AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); AcGeVector3d vtX = vtCross; vtX.rotateBy(PI * 0.5, vtZAxis); //开始点和终止点互换 if (ptEnd.z > ptStart.z) { // AcGePoint3d ptTemp = ptStart; // ptStart = ptEnd; // ptEnd = ptTemp; vtX *= -1; } AcDbPolyline pPolyLine, pPolyLine1; AcGePoint3dArray arPtsEll; //Star大圆 double dBigCir = dDiameter/* + dSkirtSize * 2*/; int iRes = TAuxTools::GetEllipseFromCircle(ptStart, dBigCir, vtDir, vtZAxis, pPolyLine,-vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine, arPtsEll); arpts.append(arPtsEll); } // //大圆 iRes = TAuxTools::GetEllipseFromCircle(ptStart, dBigCir, vtDir, vtZAxis, pPolyLine1,vtX); if (iRes == 2) { arPtsEll.setLogicalLength(0); TAuxTools::GetArcPoint(pPolyLine1, arPtsEll); for (int i = 1; i < arPtsEll.length() - 1; i++) { arpts.append(arPtsEll[i]); } } } ptS = ptStart; // if (ptEnd.z > ptStart.z) // { // ptS = ptEnd; // } Midpoint(ptStart, ptEnd, ptMid); for (int i = 0; i < arpts.length(); i++) { arpts[i].z = ptMid.z; } return arpts.length() > 0; } BOOL THImpHvacFlange::MakeHCloseTrLine2D(TComplexCurve& cplCurve) const { //二维三线 ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; int iSectType = 2; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_Width, dWidth); // 计算方向向量 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtDir.rotateBy(PI / 2.0, vtNormal); // 根据矩形口与圆口的不同情况计算 if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } else { return FALSE; } // 计算图形端点 AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * dBoardThick / 2.0; ptS2 = ptS - vtPDir * dBoardThick / 2.0; ptE1 = ptE + vtPDir * dBoardThick / 2.0; ptE2 = ptE - vtPDir * dBoardThick / 2.0; // 添加边 TDb::TCurveElement el; memset(&el, 0, sizeof(TDb::TCurveElement)); double dEdgeWidth = GetEdgeLineWidth(); el.dWidth = dEdgeWidth; if (!IsSingleLine()) { el.ptGe[0] = ptS1; el.ptGe[1] = ptE1; el.ptGe[2] = ptE1; cplCurve.append(el); el.ptGe[0] = ptS2; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); el.ptGe[0] = ptS1; el.ptGe[1] = ptS2; el.ptGe[2] = ptS2; cplCurve.append(el); el.ptGe[0] = ptE1; el.ptGe[1] = ptE2; el.ptGe[2] = ptE2; cplCurve.append(el); // el.ptGe[0] = ptS; // el.ptGe[1] = ptE; // el.ptGe[2] = ptE; // cplCurve.append(el); } else { el.ptGe[0] = ptStart; el.ptGe[1] = ptEnd; el.ptGe[2] = ptEnd; cplCurve.append(el); } return cplCurve.length() > 0; } // 矩形口三维绘制 /* ↑默认法向 起始端 6━━━━━4 侧壁面 1━━3━━━5━━7━━9 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ 起始端 ┃ ┃ ┃ ┃ ┃ ┃ 8 ┃ ┃ ┃ ┃ ┃ 0━━━━━2 0━━2━━━4━━6━━8 */ void THImpHvacFlange::MakeRectangle3D(XExplodeDraw &mode) const { ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase; AcGeVector3d vtMain,vtMainv; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dWidth = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Width, dWidth); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); // 计算方向向量 AcGeVector3d vtNormal; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtMain = ptEnd - ptStart; vtMainv = vtMain; vtMainv.rotateBy(PI / 2.0, vtNormal); vtMain.normalize(); vtMainv.normalize(); vtNormal.normalize(); AcGePoint3dArray arPts, arptSides; //左方块 ptBase = ptStart + vtNormal * dThick * 0.5; ptBase = ptBase - vtMainv * (dWidth * 0.5 + dSkirtSize); //0 arPts.append(ptBase); //1 arPts.append(arPts[0] + vtMain * dBoardThick); //2 arPts.append(arPts[1] + vtMainv * (dWidth + dSkirtSize * 2)); //3 arPts.append(arPts[0] + vtMainv * (dWidth + dSkirtSize * 2)); arptSides.append(arPts[0] + vtNormal * dSkirtSize ); arptSides.append(arPts[3] + vtNormal * dSkirtSize ); arptSides.append(arPts[3]); arptSides.append(arPts[0]); arptSides.append(arPts[0] + vtNormal * dSkirtSize ); arptSides.append(arPts[1] + vtNormal * dSkirtSize ); arptSides.append(arPts[2] + vtNormal * dSkirtSize ); arptSides.append(arPts[2]); arptSides.append(arPts[1]); arptSides.append(arPts[1] + vtNormal * dSkirtSize ); mode.DrawMesh(2, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[0] + vtNormal * dSkirtSize); arptSides.append(arPts[0] ); arptSides.append(arPts[3] + vtNormal * dSkirtSize); arptSides.append(arPts[3]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[1] + vtNormal * dSkirtSize); arptSides.append(arPts[1]); arptSides.append(arPts[2] + vtNormal * dSkirtSize); arptSides.append(arPts[2]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); //右方块 ptBase = ptStart - vtNormal * dThick * 0.5; ptBase = ptBase - vtMainv * (dWidth * 0.5 + dSkirtSize); arPts.setLogicalLength(0); //0 arPts.append(ptBase); //1 arPts.append(arPts[0] + vtMain * dBoardThick); //2 arPts.append(arPts[1] + vtMainv * (dWidth + dSkirtSize * 2)); //3 arPts.append(arPts[0] + vtMainv * (dWidth + dSkirtSize * 2)); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dSkirtSize ); arptSides.append(arPts[3] - vtNormal * dSkirtSize ); arptSides.append(arPts[3]); arptSides.append(arPts[0]); arptSides.append(arPts[0] - vtNormal * dSkirtSize ); arptSides.append(arPts[1] - vtNormal * dSkirtSize ); arptSides.append(arPts[2] - vtNormal * dSkirtSize ); arptSides.append(arPts[2]); arptSides.append(arPts[1]); arptSides.append(arPts[1] - vtNormal * dSkirtSize ); mode.DrawMesh(2, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dSkirtSize); arptSides.append(arPts[0] ); arptSides.append(arPts[3] - vtNormal * dSkirtSize); arptSides.append(arPts[3]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[1] - vtNormal * dSkirtSize); arptSides.append(arPts[1]); arptSides.append(arPts[2] - vtNormal * dSkirtSize); arptSides.append(arPts[2]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); //下方块 ptBase = ptStart + vtNormal * dThick * 0.5; ptBase = ptBase - vtMainv * (dWidth * 0.5 + dSkirtSize); arPts.setLogicalLength(0); //0 arPts.append(ptBase); //1 arPts.append(arPts[0] + vtMain * dBoardThick); //2 arPts.append(arPts[1] + vtMainv * (dSkirtSize)); //3 arPts.append(arPts[0] + vtMainv * (dSkirtSize)); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dThick ); arptSides.append(arPts[3] - vtNormal * dThick ); arptSides.append(arPts[3]); arptSides.append(arPts[0]); arptSides.append(arPts[0] - vtNormal * dThick ); arptSides.append(arPts[1] - vtNormal * dThick ); arptSides.append(arPts[2] - vtNormal * dThick ); arptSides.append(arPts[2]); arptSides.append(arPts[1]); arptSides.append(arPts[1] - vtNormal * dThick ); mode.DrawMesh(2, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dThick); arptSides.append(arPts[0] ); arptSides.append(arPts[3] - vtNormal * dThick); arptSides.append(arPts[3]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[1] - vtNormal * dThick); arptSides.append(arPts[1]); arptSides.append(arPts[2] - vtNormal * dThick); arptSides.append(arPts[2]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); //上方块 ptBase = ptStart + vtNormal * dThick * 0.5; ptBase = ptBase + vtMainv * (dWidth * 0.5); arPts.setLogicalLength(0); //0 arPts.append(ptBase); //1 arPts.append(arPts[0] + vtMain * dBoardThick); //2 arPts.append(arPts[1] + vtMainv * (dSkirtSize)); //3 arPts.append(arPts[0] + vtMainv * (dSkirtSize)); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dThick ); arptSides.append(arPts[3] - vtNormal * dThick ); arptSides.append(arPts[3]); arptSides.append(arPts[0]); arptSides.append(arPts[0] - vtNormal * dThick ); arptSides.append(arPts[1] - vtNormal * dThick ); arptSides.append(arPts[2] - vtNormal * dThick ); arptSides.append(arPts[2]); arptSides.append(arPts[1]); arptSides.append(arPts[1] - vtNormal * dThick ); mode.DrawMesh(2, 5, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[0] - vtNormal * dThick); arptSides.append(arPts[0] ); arptSides.append(arPts[3] - vtNormal * dThick); arptSides.append(arPts[3]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); arptSides.setLogicalLength(0); arptSides.append(arPts[1] - vtNormal * dThick); arptSides.append(arPts[1]); arptSides.append(arPts[2] - vtNormal * dThick); arptSides.append(arPts[2]); mode.DrawMesh(2, 2, arptSides.asArrayPtr()); /* vtFlangeDir = ptEnd - ptStart; vtFlangeDir = vtFlangeDir.normalize(); ptBase = ptStart + vtFlangeDir * dBoardThick / 2.0; AcGeVector3d vtNormal; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtFlangeDir.rotateBy(PI / 2.0, vtNormal); AcGeVector3d vtYDir = vtFlangeDir; AcGeVector3d vtXDir = vtFlangeDir; vtXDir.rotateBy(PI / 2.0, vtNormal); vtYDir = vtYDir.normalize(); vtXDir = vtXDir.normalize(); vtNormal = vtNormal.normalize(); // 5 X 2 顶点 AcGePoint3d ptArrSide[5*2]; ptArrSide[0] = ptBase - vtNormal * (dThick / 2.0 + dSkirtSize) + vtYDir * (dWidth / 2.0 + dSkirtSize) - vtXDir * dBoardThick / 2.0; ptArrSide[2] = ptArrSide[0] - vtYDir * (dWidth + dSkirtSize * 2.0); ptArrSide[4] = ptArrSide[2] + vtNormal * (dThick + dSkirtSize * 2.0); ptArrSide[6] = ptArrSide[0] + vtNormal * (dThick + dSkirtSize * 2.0); ptArrSide[8] = ptArrSide[0]; ptArrSide[1] = ptArrSide[0] + vtXDir * dBoardThick; ptArrSide[3] = ptArrSide[2] + vtXDir * dBoardThick; ptArrSide[5] = ptArrSide[4] + vtXDir * dBoardThick; ptArrSide[7] = ptArrSide[6] + vtXDir * dBoardThick; ptArrSide[9] = ptArrSide[1]; mode.DrawMesh(5, 2, ptArrSide); AcGePoint3dArray arPtSides; arPtSides.append(ptArrSide[0]); arPtSides.append(ptArrSide[2]); arPtSides.append(ptArrSide[6]); arPtSides.append(ptArrSide[4]); // ptArrSide[0] = ptBase - vtNormal * dThick / 2.0 + vtYDir * dWidth / 2.0 - vtXDir * dBoardThick / 2.0; // ptArrSide[2] = ptArrSide[0] - vtYDir * dWidth; // ptArrSide[4] = ptArrSide[2] + vtNormal * dThick; // ptArrSide[6] = ptArrSide[0] + vtNormal * dThick; // ptArrSide[8] = ptArrSide[0]; // // ptArrSide[1] = ptArrSide[0] + vtXDir * dBoardThick; // ptArrSide[3] = ptArrSide[2] + vtXDir * dBoardThick; // ptArrSide[5] = ptArrSide[4] + vtXDir * dBoardThick; // ptArrSide[7] = ptArrSide[6] + vtXDir * dBoardThick; // ptArrSide[9] = ptArrSide[1]; mode.DrawMesh(2, 2, arPtSides.asArrayPtr()); arPtSides.setLogicalLength(0); arPtSides.append(ptArrSide[1]); arPtSides.append(ptArrSide[3]); arPtSides.append(ptArrSide[7]); arPtSides.append(ptArrSide[5]); mode.DrawMesh(2, 2, arPtSides.asArrayPtr()); */ } // 圆形口三维绘制 /* ↑默认法向 ┏━8━┓ 起始端 10 6 侧壁面 1━━3━━━5━━7━━9... ┃ ┃ ┃ ┃ ┃ ┃ 12 起始端 4 ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ 14 2 0━━2━━━4━━6━━8... ┗━0━┛ */ void THImpHvacFlange::MakeCircle3D(XExplodeDraw &mode) const { ASSERT(NULL != m_pXDataMap); // 获取绘图数据 AcGePoint3d ptBase; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dDiameter = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); AcGeVector3d vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; // 计算方向向量 AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtFlangeDir = AcGeVector3d::kIdentity; vtFlangeDir = vtDir.rotateBy(PI / 2.0, vtNormal); vtFlangeDir = vtFlangeDir.normalize(); AcGeVector3d vtXDir = vtFlangeDir; vtXDir.rotateBy(PI / 2.0, vtNormal); vtNormal = vtNormal.normalize(); vtXDir = vtXDir.normalize(); // 计算圆的分割精度 double dMinAngle(PI / 12); GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinAngle); int nPartNum = int(PI * 2 / dMinAngle) + 1; dMinAngle = PI * 2 / nPartNum; // 计算三维端点 AcGePoint3dArray ptArr; AcGeVector3d vtNow = vtNormal * -1; // 每组顶点法向 int i(0); for (i = 0; i < nPartNum * 2; i += 2) { ptArr.append(ptBase + (dDiameter / 2.0 + dSkirtSize) * vtNow - vtXDir * dBoardThick / 2.0); ptArr.append(ptBase + (dDiameter / 2.0 + dSkirtSize) * vtNow + vtXDir * dBoardThick / 2.0); vtNow.rotateBy(dMinAngle, vtXDir); } ptArr.append(ptArr.at(0)); ptArr.append(ptArr.at(1)); mode.DrawMesh(nPartNum + 1, 2, ptArr.asArrayPtr()); vtNow = vtNormal * -1; AcGePoint3dArray ptArr1; //ptArr.setLogicalLength(0); for (i = 0; i < nPartNum * 2; i += 2) { ptArr1.append(ptBase + (dDiameter / 2.0) * vtNow - vtXDir * dBoardThick / 2.0); ptArr1.append(ptBase + (dDiameter / 2.0) * vtNow + vtXDir * dBoardThick / 2.0); vtNow.rotateBy(dMinAngle, vtXDir); } ptArr1.append(ptArr1.at(0)); ptArr1.append(ptArr1.at(1)); mode.DrawMesh(nPartNum + 1, 2, ptArr1.asArrayPtr()); for (i = 0; i < ptArr.length() - 3; i += 2) { AcGePoint3dArray arPtSide; arPtSide.append(ptArr[i]); arPtSide.append(ptArr[i + 2]); arPtSide.append(ptArr1[i]); arPtSide.append(ptArr1[i + 2]); mode.DrawMesh(2, 2, arPtSide.asArrayPtr()); arPtSide.setLogicalLength(0); arPtSide.append(ptArr[i + 1]); arPtSide.append(ptArr[i + 3]); arPtSide.append(ptArr1[i + 1]); arPtSide.append(ptArr1[i + 3]); mode.DrawMesh(2, 2, arPtSide.asArrayPtr()); } } BOOL THImpHvacFlange::MakeRectangleFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dThick = 0.0; double dWidth = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Width, dWidth); AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtXDir = vtNormal; AcGeVector3d vtYDir = vtXDir; AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); vtYDir.rotateBy(PI / 2.0, vtZAxis); vtXDir = vtXDir.normalize(); vtYDir = vtYDir.normalize(); // 计算面端点 ptS = ptBase + vtXDir * (dThick / 2.0 + dSkirtSize); ptE = ptBase - vtXDir * (dThick / 2.0 + dSkirtSize); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtYDir * (dWidth / 2.0 + dSkirtSize); ptS2 = ptS - vtYDir * (dWidth / 2.0 + dSkirtSize); ptE1 = ptE + vtYDir * (dWidth / 2.0 + dSkirtSize); ptE2 = ptE - vtYDir * (dWidth / 2.0 + dSkirtSize); // 生成面 AcDbFace *pFace = new AcDbFace; pFace->setVertexAt(0, ptS1); pFace->setVertexAt(1, ptE1); pFace->setVertexAt(2, ptE2); pFace->setVertexAt(3, ptS2); arFaces.append(pFace); return arFaces.length() > 0; } BOOL THImpHvacFlange::MakeCircleFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptBase; double dSkirtSize = 0.0; double dDiameter = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal = vtNormal.normalize(); AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); // 计算圆的分割精度 double dMinAngle(PI / 12); GetGlobalContext()->GetAt(KEY_MINDIFFANG, dMinAngle); int nPartNum = int(PI * 2 / dMinAngle) + 1; dMinAngle = PI * 2 / nPartNum; // 计算面端点并生成面 AcGePoint3d ptF = AcGePoint3d::kOrigin; AcGePoint3d ptL = AcGePoint3d::kOrigin; AcGeVector3d vtNow = vtNormal * -1; // 每组顶点法向 int i(0); for (i = 0; i < nPartNum; i ++) { ptF = ptBase + (dDiameter / 2.0 + dSkirtSize) * vtNow; vtNow.rotateBy(dMinAngle, vtZAxis); ptL = ptBase + (dDiameter / 2.0 + dSkirtSize) * vtNow; AcDbFace* pFace = new AcDbFace; pFace->setVertexAt(0, ptBase); pFace->setVertexAt(1, ptF); pFace->setVertexAt(2, ptL); pFace->setVertexAt(3, ptBase); arFaces.append(pFace); } return arFaces.length() > 0; } BOOL THImpHvacFlange::MakeSigleLineFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGePoint3d ptBase = TAuxTools::Mid(ptStart, ptEnd); AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); vtDir.rotateBy(PI / 2.0, vtNormal); vtDir.normalize(); double dHideWidth(0); AcGePoint3d ptS1, ptS2, ptE1, ptE2; // 单线遮挡处理 if (IsSingleLine()) { GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHideWidth); dHideWidth *= 0.5; vtDir *= dHideWidth; ptS1 = ptStart + vtDir; ptS2 = ptStart - vtDir; ptE1 = ptEnd + vtDir; ptE2 = ptEnd - vtDir; } else { double dSkirtSize = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // double dWidth = 0.0; TDb::HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); if (eSect == TDb::eRectangular) { m_pXDataMap->GetAt(HFLN_Width, dWidth); } else if (eSect == TDb::eCircular) { m_pXDataMap->GetAt(HFLN_Diameter, dWidth); } dHideWidth = dWidth*0.5 + dSkirtSize; vtDir *= dHideWidth; ptS1 = ptBase + vtDir; ptS2 = ptS1; ptE1 = ptBase - vtDir; ptE2 = ptE1; } // 生成Face面 AcDbFace *pFace = new AcDbFace; pFace->setVertexAt(0, ptS1); pFace->setVertexAt(1, ptE1); pFace->setVertexAt(2, ptE2); pFace->setVertexAt(3, ptS2); arFaces.append(pFace); return arFaces.length() > 0; } BOOL THImpHvacFlange::MakeMultiLineFaces(AcDbVoidPtrArray& arFaces) { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGePoint3d ptBase = AcGePoint3d::kOrigin; double dThick = 0.0; double dDiameter = 0.0; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dWidth = 0.0; int iSectType = 2; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); m_pXDataMap->GetAt(HFLN_Width, dWidth); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; vtDir.rotateBy(PI / 2.0, vtNormal); // 根据矩形与圆形的不同情况计算面端点 AcGePoint3d ptS, ptE; // 单线遮挡处理 if (IsSingleLine()) { double dHalfStartWidth(0); GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHalfStartWidth); ptS = ptBase + vtDir * dHalfStartWidth * 0.5; ptE = ptBase - vtDir * dHalfStartWidth * 0.5; AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * dBoardThick / 2.0; ptS2 = ptS - vtPDir * dBoardThick / 2.0; ptE1 = ptE + vtPDir * dBoardThick / 2.0; ptE2 = ptE - vtPDir * dBoardThick / 2.0; /* ptS1.z += 1; ptS2.z += 1; ptE1.z += 1; ptE2.z += 1; */ AcDbFace *pFace = new AcDbFace; pFace->setVertexAt(0, ptS1); pFace->setVertexAt(1, ptE1); pFace->setVertexAt(2, ptE2); pFace->setVertexAt(3, ptS2); arFaces.append(pFace); return arFaces.length() > 0; } if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } else { return FALSE; } // 生成矩形 AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS - vtPDir * dBoardThick / 2.0; ptS2 = ptS + vtPDir * dBoardThick / 2.0; ptE1 = ptE - vtPDir * dBoardThick / 2.0; ptE2 = ptE + vtPDir * dBoardThick / 2.0; /* ptS1.z += 1; ptS2.z += 1; ptE1.z += 1; ptE2.z += 1; */ AcDbFace *pFace = new AcDbFace; pFace->setVertexAt(0, ptS1); pFace->setVertexAt(1, ptE1); pFace->setVertexAt(2, ptE2); pFace->setVertexAt(3, ptS2); arFaces.append(pFace); return arFaces.length() > 0; } AcDbPolyline* THImpHvacFlange::MakeRectanglePolyCurve() const { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dThick = 0.0; double dWidth = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Width, dWidth); AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtXDir = vtNormal; AcGeVector3d vtYDir = vtXDir; AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); vtYDir.rotateBy(PI / 2.0, vtZAxis); vtXDir = vtXDir.normalize(); vtYDir = vtYDir.normalize(); // 计算顶点 ptS = ptBase + vtXDir * (dThick / 2.0 + dSkirtSize); ptE = ptBase - vtXDir * (dThick / 2.0 + dSkirtSize); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtYDir * (dWidth / 2.0 + dSkirtSize); ptS2 = ptS - vtYDir * (dWidth / 2.0 + dSkirtSize); ptE1 = ptE + vtYDir * (dWidth / 2.0 + dSkirtSize); ptE2 = ptE - vtYDir * (dWidth / 2.0 + dSkirtSize); // 生成pline线 double dEl(0.0); AcGePlane plan = GetHidePlane(ptS1, ptE1, ptE2, vtZAxis, dEl); AcDbPolyline *pPolyline = new AcDbPolyline; pPolyline->addVertexAt(0, ptS1.convert2d(plan)); pPolyline->addVertexAt(1, ptE1.convert2d(plan)); pPolyline->addVertexAt(2, ptE2.convert2d(plan)); pPolyline->addVertexAt(3, ptS2.convert2d(plan)); pPolyline->setNormal(vtZAxis); pPolyline->setElevation(dEl); pPolyline->setClosed(Adesk::kTrue); return pPolyline; } AcDbPolyline* THImpHvacFlange::MakeCirclePolyCurve() const { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptBase, ptArcH1, ptArcH2, ptArcV1; double dSkirtSize = 0.0; double dDiameter = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); ptBase = ptEnd.z > ptStart.z ? ptEnd:ptStart; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); AcGeVector3d vtXDir = vtNormal; AcGeVector3d vtYDir = vtXDir; AcDbDatabase* pDb = acdbCurDwg(); AcGeVector3d vtZAxis(pDb->ucsxdir().crossProduct(pDb->ucsydir())); vtYDir.rotateBy(PI / 2.0, vtZAxis); vtXDir = vtXDir.normalize(); vtYDir = vtYDir.normalize(); // 计算顶点 ptArcH1 = ptBase + vtYDir * (dDiameter / 2.0 + dSkirtSize); ptArcH2 = ptBase - vtYDir * (dDiameter / 2.0 + dSkirtSize); ptArcV1 = ptBase + vtXDir * (dDiameter / 2.0 + dSkirtSize); // 生成pline线 double dEl(0.0); AcGePlane plan = GetHidePlane(ptArcH1, ptBase, ptArcV1, vtZAxis, dEl); AcDbPolyline* pPolyline = new AcDbPolyline; pPolyline->addVertexAt(0, ptArcH1.convert2d(plan), 1); pPolyline->addVertexAt(1, ptArcH2.convert2d(plan), 1); pPolyline->setNormal(vtZAxis); pPolyline->setElevation(dEl); pPolyline->setClosed(Adesk::kTrue); return pPolyline; } AcGePlane THImpHvacFlange::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; } // mcl 重新启用 2010.03.30 AcDbPolyline* THImpHvacFlange::MakeSingleLinePolyCurve() const { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGePoint3d ptBase = TAuxTools::Mid(ptStart, ptEnd); AcGeVector3d vtDir = AcGeVector3d::kIdentity; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); vtDir.rotateBy(PI / 2.0, vtNormal); vtDir.normalize(); double dHideWidth(0); AcGePoint3d ptS1, ptS2, ptE1, ptE2; // 单线遮挡处理 if (IsSingleLine()) { GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHideWidth); dHideWidth *= 0.5; vtDir *= dHideWidth; ptS1 = ptStart + vtDir; ptS2 = ptStart - vtDir; ptE1 = ptEnd + vtDir; ptE2 = ptEnd - vtDir; } else { double dSkirtSize = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // double dWidth = 0.0; TDb::HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); if (eSect == TDb::eRectangular) { m_pXDataMap->GetAt(HFLN_Width, dWidth); } else if (eSect == TDb::eCircular) { m_pXDataMap->GetAt(HFLN_Diameter, dWidth); } dHideWidth = dWidth*0.5 + dSkirtSize; vtDir *= dHideWidth; ptS1 = ptBase + vtDir; ptS2 = ptS1; ptE1 = ptBase - vtDir; ptE2 = ptE1; } // 生成pline线 AcGePlane plan = GetStdPrjPlan(ptS1); double dEl = TAuxTools::GetPlaneEle(plan); AcDbPolyline *pPolyline = new AcDbPolyline; pPolyline->addVertexAt(0, ptS1.convert2d(plan)); pPolyline->addVertexAt(1, ptE1.convert2d(plan)); pPolyline->addVertexAt(2, ptE2.convert2d(plan)); pPolyline->addVertexAt(3, ptS2.convert2d(plan)); pPolyline->setNormal(vtNormal); pPolyline->setElevation(dEl); pPolyline->setClosed(Adesk::kTrue); return pPolyline; } AcDbPolyline* THImpHvacFlange::MakeMultiLinePolyCurve() const { ASSERT(NULL != m_pXDataMap); // 获取数据 AcGePoint3d ptBase, ptS, ptE; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dDiameter = 0.0; double dWidth = 0.0; AcGeVector3d vtDir = AcGeVector3d::kIdentity; int iSectType = 2; AcGeVector3d vtNormal = AcGeVector3d::kIdentity; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); m_pXDataMap->GetAt(HFLN_Width, dWidth); dBoardThick = ptStart.distanceTo(ptEnd); vtDir = ptEnd - ptStart; vtDir = vtDir.normalize(); ptBase = ptStart + vtDir * dBoardThick / 2.0; m_pXDataMap->GetAt(HVAC_SectType, iSectType); m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtNormal.normalize(); vtDir.rotateBy(PI / 2.0, vtNormal); vtDir.normalize(); // 单线遮挡处理 if (IsSingleLine()) { double dHalfStartWidth(0); GetGlobalContext()->GetAt(KEY_HIDEWIDTH, dHalfStartWidth); ptS = ptBase + vtDir * dHalfStartWidth * 0.5; ptE = ptBase - vtDir * dHalfStartWidth * 0.5; AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * dBoardThick / 2.0; ptS2 = ptS - vtPDir * dBoardThick / 2.0; ptE1 = ptE + vtPDir * dBoardThick / 2.0; ptE2 = ptE - vtPDir * dBoardThick / 2.0; // 生成pline线 double dEl(0.0); AcGePlane plan = GetHidePlane(ptS1, ptE1, ptE2, vtNormal, dEl); AcDbPolyline *pPolyline = new AcDbPolyline; pPolyline->addVertexAt(0, ptS1.convert2d(plan)); pPolyline->addVertexAt(1, ptE1.convert2d(plan)); pPolyline->addVertexAt(2, ptE2.convert2d(plan)); pPolyline->addVertexAt(3, ptS2.convert2d(plan)); pPolyline->setNormal(vtNormal); //pPolyline->setElevation(dEl + 1.0); pPolyline->setElevation(dEl); pPolyline->setClosed(Adesk::kTrue); return pPolyline; } // 计算顶点 if (TDb::eRectangular == iSectType) { ptS = ptBase + vtDir * (dWidth / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dWidth / 2.0 + dSkirtSize); } else if (TDb::eCircular == iSectType) { ptS = ptBase + vtDir * (dDiameter / 2.0 + dSkirtSize); ptE = ptBase - vtDir * (dDiameter / 2.0 + dSkirtSize); } else { return FALSE; } AcGeVector3d vtPDir = vtDir; vtPDir.rotateBy(PI / 2.0, vtNormal); vtPDir = vtPDir.normalize(); AcGePoint3d ptS1, ptS2, ptE1, ptE2; ptS1 = ptS + vtPDir * dBoardThick / 2.0; ptS2 = ptS - vtPDir * dBoardThick / 2.0; ptE1 = ptE + vtPDir * dBoardThick / 2.0; ptE2 = ptE - vtPDir * dBoardThick / 2.0; // 生成pline线 double dEl(0.0); AcGePlane plan = GetHidePlane(ptS1, ptE1, ptE2, vtNormal, dEl); AcDbPolyline *pPolyline = new AcDbPolyline; pPolyline->addVertexAt(0, ptS1.convert2d(plan)); pPolyline->addVertexAt(1, ptE1.convert2d(plan)); pPolyline->addVertexAt(2, ptE2.convert2d(plan)); pPolyline->addVertexAt(3, ptS2.convert2d(plan)); pPolyline->setNormal(vtNormal); //pPolyline->setElevation(dEl + 1.0); pPolyline->setElevation(dEl); pPolyline->setClosed(Adesk::kTrue); return pPolyline; } // 注意:pXMap == NULL表示不想得到返回值,只是判断数据是否合理 // 先取出m_pXDataMap中数据进行判断是否合理,返回判断结果 // 如果pXMap不为NULL,则将有效参数填入pXMap BOOL THImpHvacFlange::IsValid(TDbXDataMap* pXMap) { if (NULL == m_pXDataMap) return FALSE; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGeVector3d vtOff = (ptEnd - ptStart).normalize(); HvacFlangeType eType = TDb::eCloseDbLine; m_pXDataMap->GetAt(HFLN_Type, (int&)eType); // 如果发现空连接或连接风管或,则首先考虑移动该连接点 BOOL bMoveStartPt(FALSE); AcGeVector3d vtStart = ptStart - ptEnd; AcDbObjectId idStart(AcDbObjectId::kNull); m_pXDataMap->GetAt(KEY_IDCNT1, idStart); // 验证位置关系 OPENOBJ_BEGIN(idStart, AcDb::kForRead, TDbInterfacesObj, pObj); if (NULL != pObj) { if (!pObj->GetInterface(ptStart, TInterface())) idStart.setNull(); } OPENOBJ_END(); if (!idStart.isValid()) { bMoveStartPt = TRUE; } else { AcDbObjectId idEnd(AcDbObjectId::kNull); m_pXDataMap->GetAt(KEY_IDCNT2, idEnd); // 验证位置关系 OPENOBJ_BEGIN(idEnd, AcDb::kForRead, TDbInterfacesObj, pObj); if (NULL != pObj) { if (!pObj->GetInterface(ptEnd, TInterface())) idEnd.setNull(); } OPENOBJ_END(); if (!idEnd.isValid()) { bMoveStartPt = FALSE; } else { OPENOBJ_BEGIN(idStart, AcDb::kForRead, TDbHvacDuct, pDuct); if (NULL != pDuct) bMoveStartPt = TRUE; else bMoveStartPt = FALSE; OPENOBJ_END(); } } if (bMoveStartPt) { AcGePoint3d ptNewStart; if (eType == eSingleLine) ptNewStart = ptEnd - vtOff * FLANGWIDTH_SINGLE; else ptNewStart = ptEnd - vtOff * FLANGWIDTH_NORMAL; m_pXDataMap->SetAt(HFLN_StartPoint, ptNewStart); if (NULL != pXMap) pXMap->SetAt(HFLN_StartPoint, ptNewStart); if (NULL != m_pOwnerEnt) UpdateInterfaceRec(m_pOwnerEnt->objectId(), ptStart, ptNewStart); } else { AcGePoint3d ptNewEnd; if (eType == eSingleLine) ptNewEnd = ptStart + vtOff * FLANGWIDTH_SINGLE; else ptNewEnd = ptStart + vtOff * FLANGWIDTH_NORMAL; m_pXDataMap->SetAt(HFLN_EndPoint, ptNewEnd); if (NULL != pXMap) pXMap->SetAt(HFLN_EndPoint, ptNewEnd); if (NULL != m_pOwnerEnt) UpdateInterfaceRec(m_pOwnerEnt->objectId(), ptEnd, ptNewEnd); } return TRUE; } void THImpHvacFlange::OnSubErase( Adesk::Boolean erasing ) { if (erasing == Adesk::kTrue && 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 (TAuxTools::IsAutoWorkConnect() && idModel == m_pOwnerEnt->blockId()) { // 写入接口更改消息 TInterfaceModifyMsg iMsg; iMsg.SetMsgValidate(TRUE); iMsg.SetMsgOperateOn(m_pOwnerEnt->objectId()); iMsg.SetInterfaceOper(TDb::eAutoWorkOn); TDbInterfaceMsgWrite msgWrite; msgWrite.WriteInterfaceMsg(iMsg); } } } BOOL THImpHvacFlange::IsMovedWithInDuct( const AcGeVector3d &vtOffset ) { ASSERT(NULL != m_pXDataMap); TInterface tIfSta, tIfEnd; GetInterface(0, tIfSta); GetInterface(1, tIfEnd); AcDbObjectId idStaCon = tIfSta.GetConnectObject(); AcDbObjectId idEndCon = tIfEnd.GetConnectObject(); // 先找出最远的两个点 BOOL bStaDuct(FALSE); AcGePoint3d ptMin(AcGePoint3d::kOrigin), ptMax(AcGePoint3d::kOrigin); OPENOBJ_BEGIN(idStaCon, AcDb::kForRead, TDbInterfacesObj, pObj); if (NULL != pObj) { if (pObj->GetInterface(tIfSta.GetPosition(), TInterface())) { ObjectKind eKind(eCabletry); TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly(); if (NULL != pObjMap) pObjMap->GetAt(KEY_RUNTIME, (int&)eKind); if (eKind == ePipe) { TDbHvacDuct* pDuct = TDbHvacDuct::cast(pObj); if (NULL != pDuct) { ptMin = pDuct->StartPoint(); ptMax = pDuct->EndPoint(); bStaDuct = TRUE; } } } } OPENOBJ_END(); OPENOBJ_BEGIN(idEndCon, AcDb::kForRead, TDbInterfacesObj, pObj); if (NULL != pObj) { if (pObj->GetInterface(tIfEnd.GetPosition(), TInterface())) { ObjectKind eKind(eCabletry); TDbXDataMap* pObjMap = pObj->GetSpecialtyDataReadOnly(); if (NULL != pObjMap) pObjMap->GetAt(KEY_RUNTIME, (int&)eKind); if (eKind == ePipe) { TDbHvacDuct* pDuct = TDbHvacDuct::cast(pObj); if (NULL != pDuct) { if (bStaDuct) { AcGePoint3d ptStart = pDuct->StartPoint(); AcGePoint3d ptEnd = pDuct->EndPoint(); double dDistSta = ptStart.distanceTo(ptMax); double dDistEnd = ptEnd.distanceTo(ptMax); AcGePoint3d ptNewMax = dDistEnd > dDistSta ? ptEnd:ptStart; dDistSta = ptMin.distanceTo(ptStart); dDistEnd = ptMax.distanceTo(ptStart); AcGePoint3d ptNewMin = dDistEnd > dDistSta ? ptMax:ptMin; ptMin = ptNewMin; ptMax = ptNewMax; } else { ptMin = pDuct->StartPoint(); ptMax = pDuct->EndPoint(); } } } } } OPENOBJ_END(); if (ptMin.isEqualTo(ptMax, g_globalTol)) // 异常 return FALSE; AcGePoint3d ptCenter, ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_StartPoint, ptEnd); ptCenter = TAuxTools::Mid(ptStart, ptEnd); AcGePoint3d ptNewCenter = ptCenter + vtOffset; AcDbLine lineHelp(ptMin, ptMax); double dTemp(0.0); if (lineHelp.getParamAtPoint(ptNewCenter, dTemp) == Acad::eOk) { // 距离管两端,不能小于半个法兰的宽度,否则算移出 double dDistMin = ptNewCenter.distanceTo(ptMin); double dDistMax = ptNewCenter.distanceTo(ptMax); double dHalfFlang = ptStart.distanceTo(ptEnd) * 0.5; if (dDistMin > dHalfFlang && dDistMax > dHalfFlang) return TRUE; } return FALSE; } LRESULT THImpHvacFlange::UserCall( long i, LPVOID pData ) { ASSERT(NULL != m_pXDataMap); m_pXDataMap->SetAt(KEY_IDCNT1, NULL); m_pXDataMap->SetAt(KEY_IDCNT2, NULL); return 1l; } int THImpHvacFlange::GetXBaseShell(TXShell& xShell) { if (NULL == m_pXDataMap) { return 0; } HvacSectType eSectType; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); if (TDb::eRectangular == eSectType) { // 获得参数 double dSkirt = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirt); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirt *= dPScale/100; // double dWidth = 0.0; m_pXDataMap->GetAt(HFLN_Width, dWidth); dWidth += dSkirt * 2.0; double dThick = 0.0; m_pXDataMap->GetAt(HFLN_Thick, dThick); dThick += dSkirt * 2.0; AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); vtNormal.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildRectDuct(ptStart, ptEnd, vtNormal, dWidth, dThick, dWidth, dThick, xShell); } else if (TDb::eCircular == eSectType) { // 获得参数 double dSkirt = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirt); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirt *= dPScale/100; // double dDiameter = 0.0; m_pXDataMap->GetAt(HFLN_Diameter, dDiameter); dDiameter += dSkirt * 2.0; AcGePoint3d ptStart; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); // 构造碰撞实体 TAuxTools::BuildCirDuct(ptStart, ptEnd, dDiameter, dDiameter, xShell); } else { // 不做处理 ; } return 1; } int THImpHvacFlange::GetBodyBox(AcDbExtents& ext) { if (NULL == m_pXDataMap) { return 0; } // 获得参数 double dSkirt = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirt); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirt *= dPScale/100; // double dWidth = 0.0; m_pXDataMap->GetAt(HFLN_Width, dWidth); dWidth += dSkirt * 2.0; double dHalfWidth = dWidth / 2.0; double dThick = 0.0; m_pXDataMap->GetAt(HFLN_Thick, dThick); dThick += dSkirt * 2.0; double dHalfThick = dThick / 2.0; HvacSectType eSectType; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSectType); if (TDb::eCircular == eSectType) { // 处理圆管数据 dHalfThick = dHalfWidth; } AcGeVector3d vtNormal; m_pXDataMap->GetAt(HVAC_Normal, vtNormal); vtNormal.normalize(); AcGePoint3d ptStart; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); AcGePoint3d ptEnd; m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); AcGeVector3d vtSide = ptEnd - ptStart; vtSide.rotateBy(PI / 2.0, vtNormal); vtSide.normalize(); // 计算端点 AcGePoint3dArray arpt; arpt.append(ptStart + vtSide * dHalfWidth + vtNormal * dHalfThick); arpt.append(ptStart + vtSide * dHalfWidth - vtNormal * dHalfThick); arpt.append(ptStart - vtSide * dHalfWidth - vtNormal * dHalfThick); arpt.append(ptStart - vtSide * dHalfWidth + vtNormal * dHalfThick); arpt.append(ptEnd + vtSide * dHalfWidth + vtNormal * dHalfThick); arpt.append(ptEnd + vtSide * dHalfWidth - vtNormal * dHalfThick); arpt.append(ptEnd - vtSide * dHalfWidth - vtNormal * dHalfThick); arpt.append(ptEnd - vtSide * dHalfWidth + vtNormal * dHalfThick); // 构造最小包含体 TAuxTools::BuildMinRectangle(arpt, ext); return 1; } AcGePlane THImpHvacFlange::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; } // 导出XML // CString THImpHvacFlange::GetXml() const // { // if (NULL == m_pXDataMap || NULL == m_pOwnerEnt) // return _T(""); // // int nValue(0); // double dValue(0.0); // int nPtPreci = 6; // 位置精度 // // TXmlTree xmlTree; // CString csText; // CString csX, csY, csZ; // AcGePoint3d pt; // POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL); // { // xmlTree.SetAttribute(posRoot, _T("name"), _T("法兰")); // xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称")); // } // // POSITION posItemDrawStyle = xmlTree.Insert(_T("DrawStyle"), posRoot, NULL); // { // xmlTree.SetAttribute(posItemDrawStyle, _T("name"), _T("绘制样式")); // xmlTree.SetAttribute(posItemDrawStyle, _T("comment"), _T("绘制表现形式1:单线,2:双线开口,3…")); // m_pXDataMap->GetAt(HFLN_Type, nValue); // csText.Format(_T("%d"), nValue); // xmlTree.SetItemText(posItemDrawStyle, csText); // } // // POSITION posItemSect = xmlTree.Insert(_T("SectionType"), posRoot, posItemDrawStyle); // { // xmlTree.SetAttribute(posItemSect, _T("name"), _T("截面类型")); // xmlTree.SetAttribute(posItemSect, _T("comment"), _T("截面的形状0:矩形,1:圆形")); // m_pXDataMap->GetAt(HVAC_SectType, nValue); // csText.Format(_T("%d"), nValue); // xmlTree.SetItemText(posItemSect, csText); // } // // AcGeVector3d vt; // POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSect); // { // 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(HFLN_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 posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartPt); // { // xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置")); // m_pXDataMap->GetAt(HFLN_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 posItemSkirt = xmlTree.Insert(_T("SkirtSize"), posRoot, posItemEndPt); // { // xmlTree.SetAttribute(posItemSkirt, _T("name"), _T("出头量")); // xmlTree.SetAttribute(posItemSkirt, _T("comment"), _T("超出风管尺寸部分")); // m_pXDataMap->GetAt(HFLN_SkirtSize, dValue); // TAuxTools::DoubleToString(dValue, 0, csText); // xmlTree.SetItemText(posItemSkirt, csText); // } // // POSITION posItemWidth = xmlTree.Insert(_T("Width"), posRoot, posItemSkirt); // { // xmlTree.SetAttribute(posItemWidth, _T("name"), _T("宽度")); // m_pXDataMap->GetAt(HFLN_Width, dValue); // TAuxTools::DoubleToString(dValue, 0, csText); // xmlTree.SetItemText(posItemWidth, csText); // } // // POSITION posItemHeight = xmlTree.Insert(_T("Height"), posRoot, posItemWidth); // { // xmlTree.SetAttribute(posItemHeight, _T("name"), _T("高度")); // m_pXDataMap->GetAt(HFLN_Thick, dValue); // TAuxTools::DoubleToString(dValue, 0, csText); // xmlTree.SetItemText(posItemHeight, csText); // } // // POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posItemHeight); // { // 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 THImpHvacFlange::GetXml(const AcGeMatrix3d& mat) const { if (NULL == m_pXDataMap || NULL == m_pOwnerEnt) return _T(""); int nValue(0); double dValue(0.0); int nPtPreci = 6; // 位置精度 TXmlTree xmlTree; CString csText; CString csX, csY, csZ; AcGePoint3d pt; POSITION posRoot = xmlTree.Insert(_T("ATS_DBHFITTING"), NULL, NULL); { xmlTree.SetAttribute(posRoot, _T("name"), _T("法兰")); xmlTree.SetAttribute(posRoot, _T("comment"), _T("上华对象名称")); } POSITION posItemDrawStyle = xmlTree.Insert(_T("DrawStyle"), posRoot, NULL); { xmlTree.SetAttribute(posItemDrawStyle, _T("name"), _T("绘制样式")); xmlTree.SetAttribute(posItemDrawStyle, _T("comment"), _T("绘制表现形式1:单线,2:双线开口,3…")); m_pXDataMap->GetAt(HFLN_Type, nValue); csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posItemDrawStyle, csText); } POSITION posItemSect = xmlTree.Insert(_T("SectionType"), posRoot, posItemDrawStyle); { xmlTree.SetAttribute(posItemSect, _T("name"), _T("截面类型")); xmlTree.SetAttribute(posItemSect, _T("comment"), _T("截面的形状0:矩形,1:圆形")); m_pXDataMap->GetAt(HVAC_SectType, nValue); csText.Format(_T("%d"), nValue); xmlTree.SetItemText(posItemSect, csText); } AcGeVector3d vt; POSITION posItemNorDir = xmlTree.Insert(_T("NormalDir"),posRoot, posItemSect); { 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(HFLN_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 posItemEndPt = xmlTree.Insert(_T("End_point"), posRoot, posItemStartPt); { xmlTree.SetAttribute(posItemEndPt, _T("name"), _T("终点位置")); m_pXDataMap->GetAt(HFLN_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 posItemSkirt = xmlTree.Insert(_T("SkirtSize"), posRoot, posItemEndPt); { xmlTree.SetAttribute(posItemSkirt, _T("name"), _T("出头量")); xmlTree.SetAttribute(posItemSkirt, _T("comment"), _T("超出风管尺寸部分")); m_pXDataMap->GetAt(HFLN_SkirtSize, dValue); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dValue *= dPScale/100; // TAuxTools::DoubleToString(dValue, 0, csText); xmlTree.SetItemText(posItemSkirt, csText); } POSITION posItemWidth = xmlTree.Insert(_T("Width"), posRoot, posItemSkirt); { xmlTree.SetAttribute(posItemWidth, _T("name"), _T("宽度")); m_pXDataMap->GetAt(HFLN_Width, dValue); TAuxTools::DoubleToString(dValue, 0, csText); xmlTree.SetItemText(posItemWidth, csText); } POSITION posItemHeight = xmlTree.Insert(_T("Height"), posRoot, posItemWidth); { xmlTree.SetAttribute(posItemHeight, _T("name"), _T("高度")); m_pXDataMap->GetAt(HFLN_Thick, dValue); TAuxTools::DoubleToString(dValue, 0, csText); xmlTree.SetItemText(posItemHeight, csText); } POSITION posObjId = xmlTree.Insert(_T("Object_ID"), posRoot, posItemHeight); { 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); } CString csXml = xmlTree.GetXml(); // end return csXml; } // 暂简化求出绕风管四壁的四个面,点对应图见工程目录下 关键点示意图.dwg bool THImpHvacFlange::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); // 获取绘图数据 HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); AcGeVector3d vtMain,vtMainv; double dSkirtSize = 0.0; double dBoardThick = 0.0; double dThick = 0.0; double dWidth = 0.0; m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // m_pXDataMap->GetAt(HFLN_Thick, dThick); m_pXDataMap->GetAt(HFLN_Width, dWidth); AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); dBoardThick = ptStart.distanceTo(ptEnd); // 计算方向向量 AcGeVector3d vtNormal; m_pXDataMap->GetAt(KEY_NORMAL, vtNormal); vtMain = ptEnd - ptStart; vtMainv = vtMain; vtMainv.rotateBy(PI / 2.0, vtNormal); vtMain.normalize(); vtMainv.normalize(); vtNormal.normalize(); if (TDb::eRectangular == eSect) { AcGePoint3dArray ptUp4Arr, ptDown4Arr; AcGePoint3d ptTemp = ptStart; ptTemp += vtNormal * (dThick*0.5 + dSkirtSize) + vtMainv * (dWidth*0.5 + dSkirtSize); ptUp4Arr.append(ptTemp); ptTemp -= vtMainv * (dWidth + dSkirtSize*2); ptUp4Arr.append(ptTemp); ptTemp += vtMain * dBoardThick; ptUp4Arr.append(ptTemp); ptTemp += vtMainv * (dWidth + dSkirtSize*2); ptUp4Arr.append(ptTemp); ptDown4Arr = ptUp4Arr; double dOffset = dThick + dSkirtSize * 2; ptDown4Arr[0] -= vtNormal * dOffset; ptDown4Arr[1] -= vtNormal * dOffset; ptDown4Arr[2] -= vtNormal * dOffset; ptDown4Arr[3] -= vtNormal * dOffset; TGGePoly2D poly2d, poly2dOut; // 上面 poly2d.AppendNode(ptUp4Arr[0]); poly2d.AppendNode(ptUp4Arr[1]); poly2d.AppendNode(ptUp4Arr[2]); poly2d.AppendNode(ptUp4Arr[3]); poly2d.SetClosed(); 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(ptDown4Arr[0]); poly2d.AppendNode(ptDown4Arr[1]); poly2d.AppendNode(ptDown4Arr[2]); poly2d.AppendNode(ptDown4Arr[3]); poly2d.SetClosed(); 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(ptUp4Arr[1]); poly2d.AppendNode(ptDown4Arr[1]); poly2d.AppendNode(ptDown4Arr[2]); poly2d.AppendNode(ptUp4Arr[2]); poly2d.SetClosed(); 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(ptUp4Arr[0]); poly2d.AppendNode(ptDown4Arr[0]); poly2d.AppendNode(ptDown4Arr[3]); poly2d.AppendNode(ptUp4Arr[3]); poly2d.SetClosed(); 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)); } else if (TDb::eCircular == eSect) { int nPartNum = int(PI * 2 / TAuxTools::GetMinDiffAngle()); if(0 != nPartNum % 2) // 边数要为偶数,才能和填充线准确接合 nPartNum += 1; double dRotAngle = PI * 2 / nPartNum; AcGeVector3d vtNow = normal(); if(!vtMain.isParallelTo(vtPlaneSecDir) && !vtNow.isParallelTo(vtPlaneSecDir)) vtNow.rotateBy(PI / 2, vtMain); vtNow.normalize(); vtNow *= (dWidth * 0.5 + dSkirtSize); int i = 0; AcGePoint3dArray arStrPts, arEndPts; for(i = 0; i < nPartNum; i++) { arStrPts.append(ptStart + vtNow); arEndPts.append(ptEnd + vtNow); vtNow.rotateBy(dRotAngle, vtMain); } TGGePoly2D poly2dF, poly2dS, poly2dOut; // 上面&下面 for(i = 0; i <= nPartNum / 2; i++) { if(i < nPartNum / 4) poly2dF.AppendNode(arStrPts[(nPartNum / 4) * 3 + i]); else poly2dF.AppendNode(arStrPts[i - (nPartNum / 4)]); poly2dS.AppendNode(arStrPts[(nPartNum / 4) * 3 - i]); } for(i = 0; i <= nPartNum / 2; i++) { if(i <= nPartNum / 4) poly2dF.AppendNode(arEndPts[(nPartNum / 4) - i]); else poly2dF.AppendNode(arEndPts[nPartNum + (nPartNum / 4) - i]); poly2dS.AppendNode(arEndPts[(nPartNum / 4) + i]); } // 上 poly2dF.SetClosed(); poly2dOut.Reset(); double dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2dF, poly2dOut); if(!!poly2dOut) { sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); } // 下 poly2dS.SetClosed(); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2dS, poly2dOut); if(!!poly2dOut) { sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); } // 前面&后面 poly2dF.Reset(); poly2dS.Reset(); for(i = 0; i < nPartNum; i++) { poly2dF.AppendNode(arStrPts[i]); poly2dS.AppendNode(arEndPts[i]); } // 前 poly2dF.SetClosed(); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2dF, poly2dOut); if(!!poly2dOut) { sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); } // 后 poly2dS.SetClosed(); poly2dOut.Reset(); dMinDist = SectionUtility::Projection_poly2plane(section_pln, poly2dS, poly2dOut); if(!!poly2dOut) { sectionRecord.push_back(TObjSectionRecord(idObj, idLayer, TObjSectionRecord::eTCH_DBHFITTING, dMinDist, poly2dOut)); } } return true; } Acad::ErrorStatus THImpHvacFlange::GetExtents( TADSGePoint3d &ptLow, TADSGePoint3d &ptUp ) const { if (NULL == m_pXDataMap) return Acad::eNotImplementedYet; double dHalfheigh(0.0); HvacSectType eSect = TDb::eRectangular; m_pXDataMap->GetAt(HVAC_SectType, (int&)eSect); if (eSect == eRectangular) m_pXDataMap->GetAt(HFLN_Thick, dHalfheigh); else m_pXDataMap->GetAt(HFLN_Diameter, dHalfheigh); dHalfheigh *= 0.5; double dSkirtSize = 0.0; AcGePoint3d ptStart, ptEnd; m_pXDataMap->GetAt(HFLN_StartPoint, ptStart); m_pXDataMap->GetAt(HFLN_EndPoint, ptEnd); m_pXDataMap->GetAt(HFLN_SkirtSize, dSkirtSize); // add by zh 2013-5-20 根据出图比例计算出头长度 double dPScale = ((TDbInterfacesObj*)m_pOwnerEnt)->GetPrintScale(); if (dPScale < 1.e-3) dPScale = 1.0; dSkirtSize *= dPScale/100; // AcGeVector3d vtNormal = normal(); dHalfheigh += dSkirtSize; if (vtNormal.isParallelTo(TAuxTools::GetUcsZvt())) // 常规法兰 { ptLow = ptStart - vtNormal * dHalfheigh; ptUp = ptStart + vtNormal * dHalfheigh; } else /*if (vtNormal.isPerpendicularTo(TAuxTools::GetUcsZvt()))*/ // 立管上的法兰,暂不考虑斜管 { if (ptStart.z < ptEnd.z) { ptLow = ptStart; ptUp = ptEnd; } else { ptLow = ptEnd; ptUp = ptStart; } } return Acad::eOk; } // add by hh 2014-08-06 支持管件与水管遮挡 Acad::ErrorStatus THImpHvacFlange::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 THImpHvacFlange::IsMeClip() const { return true; } bool THImpHvacFlange::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; }