1658 lines
41 KiB
C++
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());
|
|
}
|
|
}
|