Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1658 lines
41 KiB
C++

#include "stdafx.h"
#include "DbPipeLabel.h"
#include "DbPipe.h"
#include "PipeTools.h"
#include "acgiutil.h "
#include "DbDoubleLinePipe.h"
// 处理双击修改标注的辅助函数 cet 2014.6.3 add
extern CString ReadXdata(const AcDbEntity*pEnt, const TCHAR*szName);
namespace
{
// 从左侧开始寻找第一个数字
int FindFirstDigit(const CString &sText)
{
int nDigitIndex = -1;
int nCount = sText.GetLength();
for (int i = 0; i < nCount; ++i)
{
TCHAR ch = sText.GetAt(i);
if (ch >= _T('0') && ch <= _T('9'))
{
nDigitIndex = i;
break;
}
}
return nDigitIndex;
}
// 判断是否值修改改了管径值,如果是则dDn返回管径值
bool IsOnlyModifiedPipeDn(CString sNewText, CString sOldText, double &dDn)
{
int nIndex1 = sNewText.Find(_T("x"));
int nIndex2 = sOldText.Find(_T("x"));
if(nIndex1 == -1 && nIndex2 != -1 || nIndex1 != -1 && nIndex2 == -1)
{
return false;
}
if (nIndex1 != -1) // 外径标注如“φ50x2.8”
{
CString sRight1 = sNewText.Right(sNewText.GetLength() - nIndex1);
CString sRight2 = sOldText.Right(sOldText.GetLength() - nIndex2);
if (sRight1 != sRight2)
{
return false;
}
CString sLeft1 = sNewText.Left(nIndex1);
CString sLeft2 = sOldText.Left(nIndex2);
sNewText = sLeft1;
sOldText = sLeft2;
}
// 从左侧寻找第一个数字
int nDigitIndex1 = FindFirstDigit(sNewText);
int nDigitIndex2 = FindFirstDigit(sOldText);
if (nDigitIndex1 == -1 || nDigitIndex2 == -1 || nDigitIndex1 != nDigitIndex2)
{
return false;
}
CString sLeft1 = sNewText.Left(nDigitIndex1); // 前缀
CString sLeft2 = sOldText.Left(nDigitIndex1); // 前缀
if (sLeft1 != sLeft2) // 修改了前缀值
{
return false;
}
int nCount = sNewText.GetLength();
CString sDn = sNewText.Right(nCount - nDigitIndex1); // 管径
dDn = _tstof(sDn);
return true;
}
// 标注文字类型 -1 未知 0 管径标注文字 1 管线文字
int DimTextType(TDbPipeText *pText)
{
int nType = pText->DimTextType();
if (nType != -1)
{
return nType;
}
// 未知情况继续分析
nType = 1; // 默认管线文字
CString sPipeText = pText->GetText();
OPENOBJ_BEGIN(pText->GetPipeId(), AcDb::kForRead, TDbPipe, pPipe)
if (pPipe != NULL)
{
CString sPipeR;
sPipeR.Format(_T("%.0f"),pPipe->GetDnDiameter());
if (sPipeText.Find(sPipeR) != -1) // 当做管径标注文字
{
nType = 0;
}
}
OPENOBJ_END()
return nType;
}
//以下数据采用《钢制管件》02S403 P75
void GetFlangeDataByDn(int m_iPn, double m_dRetDn, double &m_nFlangeDn, double &m_nFlangeThick)
{
if(m_iPn == 0){ //0.25MPa
if(fabs(m_dRetDn - 50) < 0.01){
m_nFlangeDn = 140;
m_nFlangeThick = 12;
}
else if(fabs(m_dRetDn - 65) < 0.01){
m_nFlangeDn = 160;
m_nFlangeThick = 14;
}
else if(fabs(m_dRetDn - 80) < 0.01){
m_nFlangeDn = 190;
m_nFlangeThick = 14;
}
else if(fabs(m_dRetDn - 100) < 0.01){
m_nFlangeDn = 210;
m_nFlangeThick = 14;
}
else if(fabs(m_dRetDn - 125) < 0.01){
m_nFlangeDn = 240;
m_nFlangeThick = 14;
}
else if(fabs(m_dRetDn - 150) < 0.01){
m_nFlangeDn = 265;
m_nFlangeThick = 16;
}
else if(fabs(m_dRetDn - 200) < 0.01){
m_nFlangeDn = 320;
m_nFlangeThick = 18;
}
else if(fabs(m_dRetDn - 250) < 0.01){
m_nFlangeDn = 375;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 300) < 0.01){
m_nFlangeDn = 440;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 350) < 0.01){
m_nFlangeDn = 490;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 400) < 0.01){
m_nFlangeDn = 540;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 450) < 0.01){
m_nFlangeDn = 595;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 500) < 0.01){
m_nFlangeDn = 645;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 600) < 0.01){
m_nFlangeDn = 755;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 700) < 0.01){
m_nFlangeDn = 860;
m_nFlangeThick = 26;
}
else if(fabs(m_dRetDn - 800) < 0.01){
m_nFlangeDn = 975;
m_nFlangeThick = 26;
}
else if(fabs(m_dRetDn - 900) < 0.01){
m_nFlangeDn = 1075;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 1000) < 0.01){
m_nFlangeDn = 1175;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 1200) < 0.01){
m_nFlangeDn = 1375;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 1400) < 0.01){
m_nFlangeDn = 1575;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 1600) < 0.01){
m_nFlangeDn = 1790;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 1800) < 0.01){
m_nFlangeDn = 1990;
m_nFlangeThick = 34;
}
else if(fabs(m_dRetDn - 2000) < 0.01){
m_nFlangeDn = 2190;
m_nFlangeThick = 34;
}
}
else if(m_iPn == 1){//0.6MPa
if(fabs(m_dRetDn - 50) < 0.01){
m_nFlangeDn = 140;
m_nFlangeThick = 16;
}
else if(fabs(m_dRetDn - 65) < 0.01){
m_nFlangeDn = 160;
m_nFlangeThick = 16;
}
else if(fabs(m_dRetDn - 80) < 0.01){
m_nFlangeDn = 190;
m_nFlangeThick = 18;
}
else if(fabs(m_dRetDn - 100) < 0.01){
m_nFlangeDn = 210;
m_nFlangeThick = 18;
}
else if(fabs(m_dRetDn - 125) < 0.01){
m_nFlangeDn = 240;
m_nFlangeThick = 20;
}
else if(fabs(m_dRetDn - 150) < 0.01){
m_nFlangeDn = 265;
m_nFlangeThick = 20;
}
else if(fabs(m_dRetDn - 200) < 0.01){
m_nFlangeDn = 320;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 250) < 0.01){
m_nFlangeDn = 375;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 300) < 0.01){
m_nFlangeDn = 440;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 350) < 0.01){
m_nFlangeDn = 490;
m_nFlangeThick = 26;
}
else if(fabs(m_dRetDn - 400) < 0.01){
m_nFlangeDn = 540;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 450) < 0.01){
m_nFlangeDn = 595;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 500) < 0.01){
m_nFlangeDn = 645;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 600) < 0.01){
m_nFlangeDn = 755;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 700) < 0.01){
m_nFlangeDn = 860;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 800) < 0.01){
m_nFlangeDn = 975;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 900) < 0.01){
m_nFlangeDn = 1075;
m_nFlangeThick = 34;
}
else if(fabs(m_dRetDn - 1000) < 0.01){
m_nFlangeDn = 1175;
m_nFlangeThick = 36;
}
else if(fabs(m_dRetDn - 1200) < 0.01){
m_nFlangeDn = 1405;
m_nFlangeThick = 38;
}
else if(fabs(m_dRetDn - 1400) < 0.01){
m_nFlangeDn = 1630;
m_nFlangeThick = 44;
}
else if(fabs(m_dRetDn - 1600) < 0.01){
m_nFlangeDn = 1830;
m_nFlangeThick = 46;
}
else if(fabs(m_dRetDn - 1800) < 0.01){
m_nFlangeDn = 2045;
m_nFlangeThick = 52;
}
else if(fabs(m_dRetDn - 2000) < 0.01){
m_nFlangeDn = 2265;
m_nFlangeThick = 54;
}
}
else if(m_iPn == 2){//1.0MPa
if(fabs(m_dRetDn - 50) < 0.01){
m_nFlangeDn = 165;
m_nFlangeThick = 18;
}
else if(fabs(m_dRetDn - 65) < 0.01){
m_nFlangeDn = 185;
m_nFlangeThick = 20;
}
else if(fabs(m_dRetDn - 80) < 0.01){
m_nFlangeDn = 200;
m_nFlangeThick = 20;
}
else if(fabs(m_dRetDn - 100) < 0.01){
m_nFlangeDn = 220;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 125) < 0.01){
m_nFlangeDn = 250;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 150) < 0.01){
m_nFlangeDn = 285;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 200) < 0.01){
m_nFlangeDn = 340;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 250) < 0.01){
m_nFlangeDn = 395;
m_nFlangeThick = 26;
}
else if(fabs(m_dRetDn - 300) < 0.01){
m_nFlangeDn = 445;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 350) < 0.01){
m_nFlangeDn = 505;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 400) < 0.01){
m_nFlangeDn = 565;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 450) < 0.01){
m_nFlangeDn = 615;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 500) < 0.01){
m_nFlangeDn = 670;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 600) < 0.01){
m_nFlangeDn = 780;
m_nFlangeThick = 36;
}
else if(fabs(m_dRetDn - 700) < 0.01){
m_nFlangeDn = 895;
m_nFlangeThick = 36;
}
else if(fabs(m_dRetDn - 800) < 0.01){
m_nFlangeDn = 1015;
m_nFlangeThick = 38;
}
else if(fabs(m_dRetDn - 900) < 0.01){
m_nFlangeDn = 1115;
m_nFlangeThick = 42;
}
else if(fabs(m_dRetDn - 1000) < 0.01){
m_nFlangeDn = 1230;
m_nFlangeThick = 44;
}
else if(fabs(m_dRetDn - 1200) < 0.01){
m_nFlangeDn = 1455;
m_nFlangeThick = 48;
}
else if(fabs(m_dRetDn - 1400) < 0.01){
m_nFlangeDn = 1675;
m_nFlangeThick = 54;
}
else if(fabs(m_dRetDn - 1600) < 0.01){
m_nFlangeDn = 1915;
m_nFlangeThick = 62;
}
else if(fabs(m_dRetDn - 1800) < 0.01){
m_nFlangeDn = 2115;
m_nFlangeThick = 66;
}
else if(fabs(m_dRetDn - 2000) < 0.01){
m_nFlangeDn = 2325;
m_nFlangeThick = 72;
}
}
else if(m_iPn == 3){//1.6MPa
if(fabs(m_dRetDn - 50) < 0.01){
m_nFlangeDn = 165;
m_nFlangeThick = 22;
}
else if(fabs(m_dRetDn - 65) < 0.01){
m_nFlangeDn = 185;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 80) < 0.01){
m_nFlangeDn = 200;
m_nFlangeThick = 24;
}
else if(fabs(m_dRetDn - 100) < 0.01){
m_nFlangeDn = 220;
m_nFlangeThick = 26;
}
else if(fabs(m_dRetDn - 125) < 0.01){
m_nFlangeDn = 250;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 150) < 0.01){
m_nFlangeDn = 285;
m_nFlangeThick = 28;
}
else if(fabs(m_dRetDn - 200) < 0.01){
m_nFlangeDn = 340;
m_nFlangeThick = 30;
}
else if(fabs(m_dRetDn - 250) < 0.01){
m_nFlangeDn = 405;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 300) < 0.01){
m_nFlangeDn = 460;
m_nFlangeThick = 32;
}
else if(fabs(m_dRetDn - 350) < 0.01){
m_nFlangeDn = 520;
m_nFlangeThick = 34;
}
else if(fabs(m_dRetDn - 400) < 0.01){
m_nFlangeDn = 580;
m_nFlangeThick = 38;
}
else if(fabs(m_dRetDn - 450) < 0.01){
m_nFlangeDn = 640;
m_nFlangeThick = 42;
}
else if(fabs(m_dRetDn - 500) < 0.01){
m_nFlangeDn = 715;
m_nFlangeThick = 48;
}
else if(fabs(m_dRetDn - 600) < 0.01){
m_nFlangeDn = 840;
m_nFlangeThick = 50;
}
////////////////// pn 1。6MPA 没有以下管径,数据按1.0
else if(fabs(m_dRetDn - 700) < 0.01){
m_nFlangeDn = 895;
m_nFlangeThick = 36;
}
else if(fabs(m_dRetDn - 800) < 0.01){
m_nFlangeDn = 1015;
m_nFlangeThick = 38;
}
else if(fabs(m_dRetDn - 900) < 0.01){
m_nFlangeDn = 1115;
m_nFlangeThick = 42;
}
else if(fabs(m_dRetDn - 1000) < 0.01){
m_nFlangeDn = 1230;
m_nFlangeThick = 44;
}
else if(fabs(m_dRetDn - 1200) < 0.01){
m_nFlangeDn = 1450;
m_nFlangeThick = 48;
}
else if(fabs(m_dRetDn - 1400) < 0.01){
m_nFlangeDn = 1675;
m_nFlangeThick = 54;
}
else if(fabs(m_dRetDn - 1600) < 0.01){
m_nFlangeDn = 1915;
m_nFlangeThick = 62;
}
else if(fabs(m_dRetDn - 1800) < 0.01){
m_nFlangeDn = 2115;
m_nFlangeThick = 66;
}
else if(fabs(m_dRetDn - 2000) < 0.01){
m_nFlangeDn = 2325;
m_nFlangeThick = 72;
}
}
}
}
const Adesk::UInt8 TLabelStyle::g_nVersion = 1;
TLabelStyle::TLabelStyle():
m_dTextHeight(3.5),m_dTextRotation(0)
{
}
void TLabelStyle::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag)
{
TLabelStyle *pLabel = (TLabelStyle *)pSrc;
if(pLabel) {
m_idTextStyle = pLabel->m_idTextStyle;
m_dTextHeight = pLabel->m_dTextHeight;
m_dTextRotation = pLabel->m_dTextRotation;
}
}
BOOL TLabelStyle::IsValid() const
{
return m_idTextStyle.isValid() && m_dTextHeight>1.0E-3;
}
Acad::ErrorStatus TLabelStyle::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es=Acad::eOk;
Adesk::UInt8 nVer;
pFiler->readItem(&nVer);
if(nVer>g_nVersion) {// Version is too new
return Acad::eMakeMeProxy;
}
pFiler->readItem(&m_idTextStyle);
pFiler->readItem(&m_dTextHeight);
pFiler->readItem(&m_dTextRotation);
return pFiler->filerStatus();
}
Acad::ErrorStatus TLabelStyle::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es=Acad::eOk;
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_idTextStyle);
pFiler->writeItem(m_dTextHeight);
pFiler->writeItem(m_dTextRotation);
return pFiler->filerStatus();
}
Acad::ErrorStatus TLabelStyle::dxfInFields(AcDbDxfFiler* pFiler)
{
Acad::ErrorStatus es=Acad::eOk;
resbuf rb;
while((es==Acad::eOk) && ((es=pFiler->readResBuf(&rb))==Acad::eOk)) {
switch (rb.restype) {
case AcDb::kDxfXReal:
m_dTextHeight=rb.resval.rreal;
break;
default:
pFiler->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if(es!=Acad::eEndOfFile)
return Acad::eInvalidResBuf;
return pFiler->filerStatus();
}
Acad::ErrorStatus TLabelStyle::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es=Acad::eOk;
pFiler->writeDouble(AcDb::kDxfXReal,m_dTextHeight);
return es;
}
Acad::ErrorStatus TLabelStyle::subTransformBy(const AcGeMatrix3d& xform)
{
AngleTransform(xform,m_dTextRotation);// 旋转角度
ScaleTransform(xform,m_dTextHeight);// 字高
return Acad::eOk;
}
//////////////////////////////////////////////////////////////////////////
ACRX_DXF_DEFINE_MEMBERS(ATSPipeLabel, ATSPipeAttachment, AcDb::kDHL_CURRENT,
AcDb::kMReleaseCurrent,1,ATS_PIPELABEL,
"ATS_PIPELABEL图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
IMPLEMENT_TENTBASE(TDbPipeLabel);
const Adesk::UInt8 TDbPipeLabel::g_nVersion = 1;
TDbPipeLabel::TDbPipeLabel():
m_dDistToPipe(-300),m_typePipe(kCommon),
m_dPipeWidth(-1),m_dPipeHeight(-1)
{
}
void TDbPipeLabel::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag)
{
assertWriteEnabled();
TDbPipeAttachment::CopyPropertiesFrom(pSrc, gMatchFlag);
TLabelStyle::CopyPropertiesFrom(pSrc, gMatchFlag);
TDbPipeLabel *pLabel = TDbPipeLabel::cast(pSrc);
if(pLabel) {
m_dDistToPipe = pLabel->m_dDistToPipe;
}
}
Acad::ErrorStatus TDbPipeLabel::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
}
BOOL TDbPipeLabel::IsValid() const
{
return TDbPipeAttachment::IsValid() && TLabelStyle::IsValid();
}
Acad::ErrorStatus
TDbPipeLabel::subGetOsnapPoints(AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
Acad::ErrorStatus es=Acad::eOk;
if(osnapMode==AcDb::kOsModeIns || osnapMode==AcDb::kOsModeNode) {
XPoint ptLabel=GetLabelLocation();
snapPoints.append(ptLabel);
}
es=TDbPipeAttachment::subGetOsnapPoints(osnapMode,gsSelectionMark,
ptPick,lastPoint,viewXform,snapPoints,geomIds);
return es;
}
// 从DWG读入数据:
Acad::ErrorStatus TDbPipeLabel::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dwgInFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dwgInFields(pFiler);
if(es!=Acad::eOk) return es;
Adesk::UInt8 nVer;
pFiler->readItem(&nVer);
if(nVer>g_nVersion) {// Version is too new
return Acad::eMakeMeProxy;
}
pFiler->readItem(&m_dDistToPipe);
pFiler->readItem(&m_dPipeWidth);
pFiler->readItem(&m_dPipeHeight);
Adesk::UInt8 nVar=0;
pFiler->readItem(&nVar);
m_typePipe = (PipeType)((int)nVar);
ReadString(pFiler, m_sLeftText);
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeLabel::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dwgOutFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dwgOutFields(pFiler);
if(es!=Acad::eOk) return es;
pFiler->writeItem(g_nVersion);
pFiler->writeItem(m_dDistToPipe);
pFiler->writeItem(m_dPipeWidth);
pFiler->writeItem(m_dPipeHeight);
pFiler->writeItem((Adesk::UInt8)((int)m_typePipe));
pFiler->writeItem((const TCHAR *)m_sLeftText);
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeLabel::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dxfInFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dxfInFields(pFiler);
if(es!=Acad::eOk) return es;
if (!pFiler->atSubclassData(_T("TDbPipeLabel"))) {
return Acad::eBadDxfSequence;
}
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeLabel::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = TLabelStyle::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPipeLabel"));
assert(es == Acad::eOk);
return es;
}
double TDbPipeLabel::GetMinLabelTextLen() const
{
double nVal=0.0;
TDbText text;
text.setPropertiesFrom(this);
XPoint ptLabel=GetLabelLocation();
text.SetStyleId(m_idTextStyle);
text.SetText(GetLabelText());
text.SetRotation(0);
text.SetLocation(ptLabel);
text.SetHeight(m_dTextHeight);
text.SetAlignment(XExplodeDraw::kMiddleCenter);
XPoint ptExt=text.GetExtents();
nVal=max(nVal, ptExt.x);
return nVal;
}
Acad::ErrorStatus TDbPipeLabel::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
// cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制)
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
if (player.openStatus() == Acad::eOk && player->isOff())
{
return Acad::eOk;
}
if(!IsValid())
return Acad::eInvalidInput;
TDbText text;
text.setPropertiesFrom(this);
text.SetStyleId(m_idTextStyle);
text.SetText(GetLabelText());
text.SetRotation(GetTextRotation());
XPoint ptLabel=GetLabelLocation();
text.SetLocation(ptLabel);
text.SetHeight(m_dTextHeight);
text.SetAlignment(XExplodeDraw::kMiddleCenter);
text.ExplodeOrDraw2d(dc);
return Acad::eOk;
}
XString TDbPipeLabel::GetLabelText() const
{
OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe);
if (pPipe)
{
if(pPipe->GetSysType() == TPipeSys::kVRVMedia)
{
CString sTmp = _T("%%C");
CString sLabel = _T(""), sGasDn = _T(""),sLiqDn = _T(""),sDGasDn = _T("");
sLabel = pPipe->GetLabel();
// change by hh 2014.6.24 冷媒管增加两种分隔符
CString sSplit = _T(",");
// int nStr = sLabel.Find(_T(","));
int nStr = sLabel.Find(sSplit);
if(0 > nStr)
{
sSplit = _T("/");
nStr = sLabel.Find(sSplit);
if(0 > nStr)
{
sSplit = _T(" ");
nStr = sLabel.Find(sSplit);
}
}
int nLength = sLabel.GetLength();
if (nStr < 0)
return sLabel;
//液管
sLiqDn = sLabel.Left(nStr);
sGasDn = sLabel.Right(nLength - nStr - 1);
// nStr = sGasDn.Find(_T(","));
nStr = sGasDn.Find(sSplit);
nLength = sGasDn.GetLength();
//气管
if (nStr < 0)
{
// sLabel.Format(_T("%s%s,%s%s"),sTmp,sLiqDn,sTmp,sGasDn);
sLabel.Format(_T("%s%s%s%s%s"),sTmp,sLiqDn,sSplit,sTmp,sGasDn);
}
//低压气管
else
{
CString sGasTmp = sGasDn;
sGasDn = sGasTmp.Left(nStr);
sDGasDn = sGasTmp.Right(nLength - nStr - 1);
// sLabel.Format(_T("%s%s,%s%s,%s%s"),sTmp,sLiqDn,sTmp,sGasDn,sTmp,sDGasDn);
sLabel.Format(_T("%s%s%s%s%s%s%s%s"),sTmp,sLiqDn,sSplit,sTmp,sGasDn,sSplit,sTmp,sDGasDn);
}
return sLabel;
}
}
OPENOBJ_END();
CString csLabel = _T(""),csLabelTemp = _T("");
csLabelTemp = m_sLeftText;
XString sLabel;
CString csTmp;
csTmp.Format(_T("%.0f"), m_dPipeWidth);
if(m_typePipe == kCommon)
{
csLabel.Format(_T("%s%s"), csLabelTemp, csTmp);
}
else
{
csLabel = csLabelTemp;
}
sLabel = (const TCHAR*)csLabel;
return sLabel;
}
void TDbPipeLabel::GetTips(DList<TObjInfoUnit> &info) const
{
info.Append(new TObjInfoUnit(_T("对象类型"), _T("管线标注")));
if(!m_idPipe.isValid())
info.Append(new TObjInfoUnit(_T("所属管线"), _T("无")));
// ...
}
Acad::ErrorStatus TDbPipeLabel::GetGripText(int idx, CString &cs) const
{
Acad::ErrorStatus es=Acad::eOk;
switch(idx) {
case 0: cs=_T("移动基点"); break;
case 1: cs=_T("移动文字"); break;
default: ASSERT(0);
}
return es;
}
Acad::ErrorStatus
TDbPipeLabel::subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const
{
assertReadEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::subGetGripPoints(gripPoints,osnapModes,geomIds);
if(es!=Acad::eOk) return es;
XPoint ptLabel=GetLabelLocation();
gripPoints.append((AcGePoint3d)ptLabel);
return es;
}
Acad::ErrorStatus
TDbPipeLabel::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const
{
assertReadEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::subGetStretchPoints(stretchPoints);
//if(es!=Acad::eOk) return es;
return es;
}
Acad::ErrorStatus TDbPipeLabel::GetExtents(XPoint &ptLow,XPoint &ptUp) const
{
Acad::ErrorStatus es=Acad::eOk;
es=TDbPipeAttachment::GetExtents(ptLow,ptUp);
if(es==Acad::eOk) {
if(ptLow==XPoint()&&ptUp==XPoint()) {
ptLow = m_ptLocation;
ptUp = m_ptLocation;
} else {
ptLow = Min(ptLow,m_ptLocation);
ptUp = Max(ptUp,m_ptLocation);
}
}
return es;
}
Acad::ErrorStatus
TDbPipeLabel::MoveGSPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
AcGeMatrix3d mat;
mat.setToTranslation(offset);
TADSGePoint3d ptStart, ptEnd;
for(int i=0; i<indices.length();i++) {
switch(indices[i]) {
case 1:
OPENOBJ_BEGIN(m_idPipe,AcDb::kForRead,TDbPipePrototype,pPipe);
if(pPipe!=NULL) {
XPoint ptOffset=GetLabelLocation()+offset;
XCurveSegment seg;
seg = *pPipe;
ptStart = seg.GetStartPoint();
ptEnd = seg.GetEndPoint();
ptStart.z = ptEnd.z = 0;
seg.SetStartPoint(ptStart);
seg.SetEndPoint(ptEnd);
// seg.startPoint.z =0;
// seg.endPoint.z =0;
m_dDistToPipe=seg.GetDist2Me(ptOffset);
pPipe->getClosestPointTo(ptOffset,m_ptLocation);
}
OPENOBJ_END();
break;
default: ;
}
}
return Acad::eOk;
}
Acad::ErrorStatus
TDbPipeLabel::subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::subMoveGripPointsAt(indices,offset);
if(es!=Acad::eOk) return es;
es = MoveGSPointsAt(indices,offset);
return es;
}
Acad::ErrorStatus
TDbPipeLabel::subMoveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::subMoveStretchPointsAt(indices,offset);
//if(es!=Acad::eOk) return es;
//es = MoveGSPointsAt(indices,offset);
return es;
}
Acad::ErrorStatus TDbPipeLabel::subClose()
{
Acad::ErrorStatus es=TDbPipeAttachment::subClose();
return es;
}
Acad::ErrorStatus
TDbPipeLabel::subTransformBy(const AcGeMatrix3d& xform)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::subTransformBy(xform);
if(es!=Acad::eOk) return es;
es = TLabelStyle::subTransformBy(xform);
if(es!=Acad::eOk) return es;
// 离管线的距离
ScaleTransform(xform,m_dDistToPipe);
return es;
}
XPoint TDbPipeLabel::GetLabelLocation() const
{
assertReadEnabled();
XPoint ptLabel;
//double dDir=ads_angle(Wcs2Ucs(m_vtLocation),XPoint()); cet 2012.2.6 modify
double dDir=ads_angle(Wcs2Ucs(XPoint()), Wcs2Ucs(m_vtLocation));
//dDir += PI/2; cet 2012.7. 13 modify
dDir -= PI/2;
dDir = CT_std_angle(dDir);
// acutPolar(m_ptLocation,dDir,m_dDistToPipe,ptLabel); cet 2012.2.6 modify
acutPolar(Wcs2Ucs(m_ptLocation),dDir,m_dDistToPipe,ptLabel);
ptLabel = Ucs2Wcs(ptLabel);
return ptLabel;
}
double TDbPipeLabel::GetTextRotation() const
{
assertReadEnabled();
AcGeVector3d vtDir = m_vtLocation;
vtDir.z = 0.0;
vtDir = Wcs2Ucs(vtDir, TRUE); // 支持ucs下原点改变的情况
double dRotation= AcGeVector3d::kXAxis.angleTo(vtDir, AcGeVector3d::kZAxis);
dRotation = CT_std_angle(dRotation);
if(dRotation - 0.001 > PI/2 && dRotation< 3*PI/2 + 0.001) // (PI * 0.5, PI * .15]
{
dRotation += PI;
dRotation = CT_std_angle(dRotation);
}
dRotation = Ucs2Wcs(dRotation);
return dRotation;
}
BOOL TDbPipeLabel::IsSingle(const TDbPipePrototype *pipe) const
{
BOOL bRet=TRUE;
const DList<AcDbSoftPointerId>& lstAttach=pipe->GetAttachments();
int nCount = lstAttach.Length();
for(int i=0; i<nCount; i++) {
OPENOBJ_BEGIN(lstAttach[i],AcDb::kForRead,TDbPipeLabel,pLabel);
if(pLabel!=NULL) {
if(pLabel->objectId() != objectId()) {
bRet = FALSE;
}
}
OPENOBJ_END();
}
return bRet;
}
void TDbPipeLabel::SetSubText( long i,CString sText )
{
assertWriteEnabled();
// 未曾修改
CString sOldText = GetLabelText().cs();
sText.TrimLeft();
sText.TrimRight();
if (sOldText == sText)
{
return;
}
// 未关联管线的标注可以随意更改文字
AcDbObjectId idPipe = GetPipeId();
if (!idPipe.isValid())
{
SetPipeType(TDbPipeLabel::kDuct);
SetLeftText(sText);
return;
}
// 是否只修改了管径
double dDn = 0.0;
if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn))
{
return;
}
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetDnDiameter(dDn);
// 双线水管,需更新法兰信息
if (pPipe->isKindOf(TDbDoubleLinePipe::desc()))
{
TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe;
double dPipeDn = pDoublePipe->GetDnDiameter();
CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN"));
int nPn = 0;
if(sPn == _T("0.25MPa"))
{
nPn = 0;
}
else if(sPn == _T("0.6MPa"))
{
nPn = 1;
}
else if(sPn == _T("1.0MPa"))
{
nPn = 2;
}
else if(sPn == _T("1.6MPa"))
{
nPn = 3;
}
double dFlangeDn = 0.0, dFlangeThick = 0.0;
GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick);
pDoublePipe->SetWidth(dPipeDn);
pDoublePipe->SetFlangeDn(dFlangeDn);
pDoublePipe->SetFlangeThick(dFlangeThick);
}
pPipe->close();
}
SetPipeType(TDbPipeLabel::kDuct);
SetLeftText(sText);
}
//////////////////////////////////////////////////////////////////////////
ACRX_DXF_DEFINE_MEMBERS(ATSPipeText, ATSPipeAttachment, AcDb::kDHL_CURRENT,
AcDb::kMReleaseCurrent,1,ATS_PIPETEXT,
"ATS_PIPETEXT图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
IMPLEMENT_TENTBASE(TDbPipeText);
const Adesk::UInt8 TDbPipeText::g_nVersion = 1;
TDbPipeText::TDbPipeText()
{
}
void TDbPipeText::CopyPropertiesFrom(AcDbEntity *pSrc,unsigned gMatchFlag)
{
assertWriteEnabled();
TDbPipeAttachment::CopyPropertiesFrom(pSrc, gMatchFlag);
TLabelStyle::CopyPropertiesFrom(pSrc, gMatchFlag);
TDbPipeText *pText = TDbPipeText::cast(pSrc);
if(pText) {
m_sText = pText->m_sText;
}
}
Acad::ErrorStatus TDbPipeText::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
}
BOOL TDbPipeText::IsValid() const
{
return TDbPipeAttachment::IsValid() && TLabelStyle::IsValid();
}
// 从DWG读入数据:
Acad::ErrorStatus TDbPipeText::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dwgInFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dwgInFields(pFiler);
if(es!=Acad::eOk) return es;
Adesk::UInt8 nVer;
pFiler->readItem(&nVer);
if(nVer>g_nVersion) {// Version is too new
return Acad::eMakeMeProxy;
}
ReadString(pFiler, m_sText);
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeText::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dwgOutFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dwgOutFields(pFiler);
if(es!=Acad::eOk) return es;
pFiler->writeItem(g_nVersion);
pFiler->writeItem((const TCHAR *)m_sText);
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeText::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dxfInFields(pFiler);
if(es!=Acad::eOk) return es;
es = TLabelStyle::dxfInFields(pFiler);
if(es!=Acad::eOk) return es;
if (!pFiler->atSubclassData(_T("TDbPipeText"))) {
return Acad::eBadDxfSequence;
}
resbuf rb;
while((es==Acad::eOk) && ((es=pFiler->readResBuf(&rb))==Acad::eOk)) {
switch (rb.restype) {
case AcDb::kDxfXTextString:
m_sText=rb.resval.rstring;
break;
default:
pFiler->pushBackItem();
es = Acad::eEndOfFile;
break;
}
}
if(es!=Acad::eEndOfFile)
return Acad::eInvalidResBuf;
return pFiler->filerStatus();
}
Acad::ErrorStatus TDbPipeText::dxfOutFields(AcDbDxfFiler* pFiler) const
{
Acad::ErrorStatus es=Acad::eOk;
es = TDbPipeAttachment::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = TLabelStyle::dxfOutFields(pFiler);
assert(es == Acad::eOk);
es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPipeText"));
assert(es == Acad::eOk);
pFiler->writeString(AcDb::kDxfXTextString,(const TCHAR*)m_sText);
return es;
}
Acad::ErrorStatus TDbPipeText::ExplodeOrDraw2d(XExplodeDraw &dc) const
{
// cet 2016.10.17 add 图层关闭时,实体不显示,不进行绘制(打印时,也不会绘制)
AcDbLayerTableRecordPointer player(this->layerId(), AcDb::kForRead);
if (player.openStatus() == Acad::eOk && player->isOff())
{
return Acad::eOk;
}
if(!IsValid())
return Acad::eInvalidInput;
XPoint ptLocation=m_ptLocation;
ptLocation.z=0;
TDbText text;
text.setPropertiesFrom(this);
text.SetStyleId(m_idTextStyle);
text.SetText(m_sText);
text.SetRotation(GetTextRotation());
text.SetLocation(ptLocation);
text.SetHeight(m_dTextHeight);
text.SetAlignment(XExplodeDraw::kMiddleCenter);
TPushProperty vProp(&text, dc);
if(dc.IsFullExplode())
text.ExplodeOrDraw2d(dc);
else
dc.DrawEntity(text);
// dc.SetStyle(m_idTextStyle);
// dc.SetRotation(GetTextRotation());
// dc.SetLocation(ptLocation);
// dc.SetHeight(m_dTextHeight*GetPScale());
// dc.SetAlignment(XExplodeDraw::kMiddleCenter);
// dc.DrawText(m_sText);
return Acad::eOk;
}
Acad::ErrorStatus TDbPipeText::GetGripText(int idx, CString &cs) const
{
Acad::ErrorStatus es=Acad::eOk;
switch(idx) {
case 0: cs=_T("平移"); break;
default: ASSERT(0);
}
return es;
}
double TDbPipeText::GetWidth() const
{
AcGiTextStyle txtStyle;
if(!m_idTextStyle.isValid())
return GetPScale();
Acad::ErrorStatus es=fromAcDbTextStyle(txtStyle, m_idTextStyle);
txtStyle.setTextSize(m_dTextHeight*GetPScale());
Adesk::Boolean bIncludeSpace=Adesk::kTrue;
// Windows字体,都需要包括前后空隙
TCHAR *pTypeface=NULL;
Adesk::Boolean bBold, bItalic;
#if ADS <= 20
int tmp0, tmp1;
BOOL bWinFont=(txtStyle.font(pTypeface, bBold ,bItalic, tmp0, tmp1)==Acad::eOk);
#else
Charset charset;
Autodesk::AutoCAD::PAL::FontUtils::FontPitch pitch;
Autodesk::AutoCAD::PAL::FontUtils::FontFamily family;
BOOL bWinFont = (txtStyle.font(pTypeface, bBold, bItalic, charset, pitch, family) == Acad::eOk);
#endif
if(bWinFont) {
if(!pTypeface || !pTypeface[0])
bWinFont=FALSE;
}
if(pTypeface)
delete[] pTypeface;
if(bWinFont)
bIncludeSpace=Adesk::kTrue;
else {
bIncludeSpace=Adesk::kFalse;
const TCHAR *pShxFile=txtStyle.fileName();
if(pShxFile) {
XPathParser paser(pShxFile);
_tcsupr(paser.m_sFileName);
TCHAR sFilter[]=_T("GBE*,GOTH*,ISO*,SCRIPT*,ROMAN*");
if(ads_wcmatch(paser.m_sFileName, sFilter)==RTNORM)
bIncludeSpace=Adesk::kTrue;
}
}
double nWidthScale(0.8),nHeightFactor(0);
OPENOBJ_BEGIN(m_idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pRec);
if(pRec){
resbuf *pxData = pRec->xData(TCHXD); // 读扩展数据
if(pxData) {
resbuf *pNext = pxData->rbnext;
if(pNext && pNext->restype == 1040) {
nHeightFactor = pNext->resval.rreal;
pNext = pNext->rbnext;
if(pNext && pNext->restype == 1040)
nWidthScale = pNext->resval.rreal;
}
ads_relrb(pxData);
}
}
OPENOBJ_END();
AcGePoint2d ptExt=txtStyle.extents(m_sText, bIncludeSpace, -1, Adesk::kFalse);
double dScale=GetPScale();
double dWidth=0;
//txtStyle.extents计算出来的外框,是英文宽度比例为1时候的,注意nWidthScale是上华的扩展数据
dWidth = fabs(ptExt.x)*nWidthScale;
// cet 2012.2.7 modify 由于某些未知原因,得到的宽度值有时不对
// 为保险起见,再求一次其外包框 用最大值
// return dWidth+2*dScale*g_dPipeTextDis;
double dPipeTextDist = GetPsPipeTextDis(this->database());
dWidth = dWidth+2*dScale*dPipeTextDist;
TDbText text;
text.setPropertiesFrom(this);
text.SetStyleId(m_idTextStyle);
text.SetText(m_sText);
text.SetRotation(0.0);
text.SetLocation(m_ptLocation);
text.SetHeight(m_dTextHeight);
text.SetAlignment(XExplodeDraw::kMiddleCenter);
double dWidth2 = fabs(text.GetExtents().x);
dWidth2 += 2 * dScale * dPipeTextDist;
return (dWidth > dWidth2 ? dWidth : dWidth2);
}
extern BOOL StringAnalysis(const TCHAR *src, XString &sPrefix, int *num, int *numWidth);
//注意2种标注
// --- H ------ 管线类型标注, 如果修改了, 则同时修改同管线其它标注
// --- DN50 --- 单管管径标注, 如果修改了, 则同时更新管线标注
void TDbPipeText::SetSubText(long i,CString sText)
{
// cet 2014.6.3 modify 细化标注
// assertWriteEnabled();
// SetText(sText);
//
// XString xsText;
// int num, numWith;
// StringAnalysis((const TCHAR*)sText, xsText, &num, &numWith);
// BOOL bIsDn = FALSE;
// if((sText.Find(_T("D")) > -1 || sText.Find(_T("d")) > -1 || sText.Find(_T("φ")) > -1 || sText.Find(_T("Φ")) > -1) && num > 0.1)
// bIsDn = TRUE;
// OPENOBJ_BEGIN(m_idPipe, AcDb::kForRead, TDbPipe, pPipe);
// if(pPipe){
// double dDn = pPipe->GetDnDiameter();
// CString csDn, csLabel, csOld;
// csLabel = pPipe->GetLabel();
// csDn.Format(_T("%.0f"), dDn);
// csOld.Format(_T("%s%s"), csLabel, csDn);
// DList<AcDbObjectId> lstAttachment;
// pPipe->GetAttachments(lstAttachment);
// int leng = lstAttachment.Length();
// for(int m=0;m<leng;m++){
// AcDbObjectId idTmp = *lstAttachment[m];
// OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeText, pText);
// if(pText){
// CString csText2 = pText->GetText();
// if(csText2.Find(csDn) < 0 && !bIsDn)
// pText->SetText(sText); //更新其它类型标注
// else if(csText2 == csOld && bIsDn)
// pText->SetText(sText); //更新其它管径标注
// }
// OPENOBJ_END();
// }
// if(bIsDn && pPipe->upgradeOpen()==Acad::eOk){
// pPipe->SetSysLabel(xsText);
// pPipe->SetDnDiameter(num);
// pPipe->downgradeOpen();
// }
// }
// OPENOBJ_END();
assertWriteEnabled();
// 未曾修改
CString sOldText = GetText();
sText.TrimLeft();
sText.TrimRight();
if (sOldText == sText)
{
return;
}
// 未关联管线的标注可以随意更改文字
AcDbObjectId idPipe = GetPipeId();
if (!idPipe.isValid())
{
SetText(sText);
return;
}
int nDimTextType = ::DimTextType(this);
if (nDimTextType == 0) // 处理管径标注文字
{
if (DimTextType() == -1)
{
DimTextType(0);
}
// 是否只修改了管径
double dDn = 0.0;
if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn))
{
return;
}
bool bUpdateOtherDim = false;
DList<AcDbObjectId> lstAttachment;
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
bUpdateOtherDim = pPipe->IsLinkedPipeDnDimText();
pPipe->GetAttachments(lstAttachment);
pPipe->close();
}
SetText(sText);
// 更新其他管线关联标注
if (!bUpdateOtherDim)
{
int nLen = lstAttachment.Length();
for(int m = 0; m < nLen; m++)
{
AcDbObjectId idTmp = *lstAttachment[m];
OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeText, pText);
if(pText != NULL)
{
if (::DimTextType(pText) == 0)
{
pText->SetText(sText);
}
}
OPENOBJ_END();
}
}
// 更新管径
acdbOpenObject(pPipe, idPipe, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetDnDiameter(dDn);
// 双线水管,需更新法兰信息
if (pPipe->isKindOf(TDbDoubleLinePipe::desc()))
{
TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe;
double dPipeDn = pDoublePipe->GetDnDiameter();
CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN"));
int nPn = 0;
if(sPn == _T("0.25MPa"))
{
nPn = 0;
}
else if(sPn == _T("0.6MPa"))
{
nPn = 1;
}
else if(sPn == _T("1.0MPa"))
{
nPn = 2;
}
else if(sPn == _T("1.6MPa"))
{
nPn = 3;
}
double dFlangeDn = 0.0, dFlangeThick = 0.0;
GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick);
pDoublePipe->SetWidth(dPipeDn);
pDoublePipe->SetFlangeDn(dFlangeDn);
pDoublePipe->SetFlangeThick(dFlangeThick);
}
pPipe->close();
}
}
else if (nDimTextType == 1) // 管线文字
{
SetText(sText);
if (DimTextType() == -1)
{
DimTextType(1);
}
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetLinkedPipeText(sText);
pPipe->close();
}
}
}
void TDbPipeText::GetTips(DList<TObjInfoUnit> &info) const
{
info.Append(new TObjInfoUnit(_T("对象类型"), _T("管线文字")));
if(!m_idPipe.isValid())
info.Append(new TObjInfoUnit(_T("所属管线"), _T("无")));
info.Append(new TObjInfoUnit(_T("文字内容"), (const TCHAR*)m_sText));
}
double TDbPipeText::GetTextRotation() const
{
assertReadEnabled();
AcGeVector3d vt = m_vtLocation;
vt.z = 0.0;
vt = Wcs2Ucs(vt, TRUE); // 支持ucs下原点改变的情况
double dRotation =( AcGeVector3d::kXAxis).angleTo(vt, AcGeVector3d::kZAxis);
if((dRotation-0.001)>PI/2 && dRotation< 3*PI/2 + 0.001) // (PI * 0.5, PI *1.5]
{
dRotation += PI;
dRotation = CT_std_angle(dRotation);
}
dRotation = Ucs2Wcs(dRotation);
return dRotation;
}
int TDbPipeText::DimTextType()
{
TEntityFields &fd = Fields();
Adesk::Int8 nVal = -1;
fd.GFD(_T("DIM_TEXT_TYPE"), nVal);
return nVal;
}
void TDbPipeText::DimTextType( Adesk::Int8 nDimTextType )
{
assertWriteEnabled();
TEntityFields &fd = Fields();
fd.SFD(_T("DIM_TEXT_TYPE"), nDimTextType);
}
bool TDbPipeText::UpdateLinkedPipe( const CString &sDimText )
{
// 未关联管线的标注可以随意更改文字
AcDbObjectId idPipe = GetPipeId();
if (!idPipe.isValid())
{
return true;
}
// 未曾修改
CString sOldText = GetText();
CString sText = sDimText;
sText.TrimLeft();
sText.TrimRight();
int nDimTextType = ::DimTextType(this);
if (nDimTextType == 0) // 处理管径标注文字
{
if (DimTextType() == -1)
{
DimTextType(0);
}
// 是否只修改了管径
double dDn = 0.0;
if (!IsOnlyModifiedPipeDn(sText, sOldText, dDn))
{
return false;
}
bool bUpdateOtherDim = false;
DList<AcDbObjectId> lstAttachment;
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
bUpdateOtherDim = pPipe->IsLinkedPipeDnDimText();
pPipe->GetAttachments(lstAttachment);
pPipe->close();
}
// 更新其他管线关联标注
if (!bUpdateOtherDim)
{
int nLen = lstAttachment.Length();
for(int m = 0; m < nLen; m++)
{
AcDbObjectId idTmp = *lstAttachment[m];
OPENOBJ_BEGIN(idTmp, AcDb::kForWrite, TDbPipeText, pText);
if(pText != NULL)
{
if (::DimTextType(pText) == 0)
{
pText->SetText(sText);
}
}
OPENOBJ_END();
}
}
// 更新管径
acdbOpenObject(pPipe, idPipe, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetDnDiameter(dDn);
// 双线水管,需更新法兰信息
if (pPipe->isKindOf(TDbDoubleLinePipe::desc()))
{
TDbDoubleLinePipe *pDoublePipe = (TDbDoubleLinePipe*)pPipe;
double dPipeDn = pDoublePipe->GetDnDiameter();
CString sPn = ReadXdata(pDoublePipe, _T("TG-PIPE-FLANGE-PN"));
int nPn = 0;
if(sPn == _T("0.25MPa"))
{
nPn = 0;
}
else if(sPn == _T("0.6MPa"))
{
nPn = 1;
}
else if(sPn == _T("1.0MPa"))
{
nPn = 2;
}
else if(sPn == _T("1.6MPa"))
{
nPn = 3;
}
double dFlangeDn = 0.0, dFlangeThick = 0.0;
GetFlangeDataByDn(nPn, dPipeDn, dFlangeDn, dFlangeThick);
pDoublePipe->SetWidth(dPipeDn);
pDoublePipe->SetFlangeDn(dFlangeDn);
pDoublePipe->SetFlangeThick(dFlangeThick);
}
pPipe->close();
}
return true;
}
else if (nDimTextType == 1) // 管线文字
{
if (DimTextType() == -1)
{
DimTextType(1);
}
TDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForWrite);
if (pPipe != NULL)
{
pPipe->SetLinkedPipeText(sText);
pPipe->close();
}
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////
void InitDbLabel(BOOL bTrue)
{
if(bTrue) {
TDbPipeLabel::rxInit();
TDbPipeText::rxInit();
TDbPipeLabel::InitMatchProtocol(TRUE);
TDbPipeText::InitMatchProtocol(TRUE);
} else {
TDbPipeLabel::InitMatchProtocol(FALSE);
TDbPipeText::InitMatchProtocol(FALSE);
deleteAcRxClass(TDbPipeLabel::desc());
deleteAcRxClass(TDbPipeText::desc());
}
}