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

635 lines
18 KiB
C++

// DimPipeElevationDlg.cpp : implementation file
//
#include "stdafx.h"
#include <dbSymbolAnnotate.h>
#include <EdJigEx.h>
#include "DimPipeElevationDlg.h"
#include "TwtDef.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//***************************************************************************************************
// 单注标高
//***************************************************************************************************
class TElevEdJig : public TSymbEdJig {
public:
enum TElevOper { kNone=0, kDirection=1, kBaseLine=2, kLeader=3};
protected:
//输入
TElevEdJig::TElevOper m_nOperCode;
CDimPipeElevationDlg *m_pDlg;
// I/O
TDbSymbElevation *m_pDrawEnt;
public:
TElevEdJig(TDbSymbElevation *pElev, CDimPipeElevationDlg *pDlg);
TElevEdJig(TDbSymbElevation *pElev);
virtual int DoIt(int *pKeyIndex=NULL);
virtual DragStatus GetPoint(XPoint &pt);
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
XPoint GetDragPoint() const;
XPoint GetBasePoint() const;
public:
void SetOperCode(TElevEdJig::TElevOper nCode) {
m_nOperCode=nCode;
}
};
TElevEdJig::TElevEdJig(TDbSymbElevation *pElev, CDimPipeElevationDlg *pDlg)
{
m_nOperCode=TElevEdJig::kNone;
m_pDrawEnt=pElev;
m_pDlg = pDlg;
}
TElevEdJig::TElevEdJig(TDbSymbElevation *pElev)
{
m_nOperCode=TElevEdJig::kNone;
m_pDrawEnt=pElev;
m_pDlg = NULL;
}
XPoint TElevEdJig::GetDragPoint() const
{
XPoint ptDrag=m_ptResult;
XPoint ptArray[7];
m_pDrawEnt->GetVertexes(ptArray);
if(m_nOperCode==TElevEdJig::kDirection)
ptDrag=ptArray[2];
else if(m_nOperCode==TElevEdJig::kBaseLine)
ptDrag=ptArray[4];
else if(m_nOperCode==TElevEdJig::kLeader)
ptDrag=ptArray[6];
return ptDrag;
}
XPoint TElevEdJig::GetBasePoint() const
{
XPoint ptDrag=m_ptResult;
XPoint ptArray[7];
m_pDrawEnt->GetVertexes(ptArray);
if(m_nOperCode==TElevEdJig::kDirection)
ptDrag=ptArray[2];
else if(m_nOperCode==TElevEdJig::kBaseLine)
ptDrag=ptArray[0];
return ptDrag;
}
// 开始执行拖动
int TElevEdJig::DoIt(int *keyIndex)
{
m_ptResult=GetDragPoint();
return TSymbEdJig::DoIt(keyIndex);
}
// 反馈
AcEdJig::DragStatus TElevEdJig::GetPoint(XPoint &pt)
{
return acquirePoint(pt, GetBasePoint().AsAcGePoint3d());
}
// 更新实体数据
Adesk::Boolean TElevEdJig::update()
{
if(m_pDlg != NULL){
m_pDlg->UpdateData(TRUE);
// m_pDrawEnt->SetPScale((double)m_pDlg->m_iScale);
CString sText = m_pDlg->m_csText;
if(m_pDlg->m_csElePrefix != _T("无") && sText.Find(_T(".")) < 0){
if(m_pDlg->m_iPrecision == 1)
sText = sText + _T(".00");
else
sText = sText + _T(".000");
}
if(m_pDlg->m_csElePrefix != _T("无") && fabs(_tstof(sText)) < 0.001)
sText = m_pDlg->m_csElePrefix + _T("%%P") + sText;
else if(m_pDlg->m_csElePrefix != _T("无") && _tstof(sText) > 0.001)
sText = m_pDlg->m_csElePrefix + _T("+") + sText;
else if(m_pDlg->m_csElePrefix != _T("无") && _tstof(sText) < -0.001)
sText = m_pDlg->m_csElePrefix + sText;
m_pDrawEnt->SetText(sText);
if(m_pDlg->m_iPrecision == 1)
m_pDrawEnt->SetPrec2(TRUE);
else
m_pDrawEnt->SetPrec2(FALSE);
}
Adesk::Boolean bRet=Adesk::kTrue;
AcGePoint3dArray gripPoints;
TDbSymbElevation *pElev=m_pDrawEnt;
VERIFY(pElev->getStretchPoints(gripPoints)==Acad::eOk);
if(m_nOperCode==TElevEdJig::kDirection) {
AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[1];
AcDbIntArray indices;
indices.append(1);
if(vtOffset.length()>_distSnap*10)
pElev->moveGripPointsAt(indices, vtOffset);
} else if(m_nOperCode==TElevEdJig::kBaseLine) {
AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[3];
AcDbIntArray indices;
indices.append(3);
if(vtOffset.length()>_distSnap)
pElev->moveGripPointsAt(indices, vtOffset);
} else if(m_nOperCode==TElevEdJig::kLeader) {
int idx=pElev->HasBaseLine()? 4 : 3;
AcGeVector3d vtOffset=m_ptResult.AsAcGePoint3d()-gripPoints[idx];
AcDbIntArray indices;
indices.append(idx);
if(vtOffset.length()>_distSnap*10)
pElev->moveGripPointsAt(indices, vtOffset);
} else {
bRet=Adesk::kFalse;
}
return bRet;
}
AcDbEntity* TElevEdJig::entity() const
{
return (AcDbEntity *)m_pDrawEnt;
}
//extern CString GetDimLayerNameByPipeLayer(const CString &strLayer); // cet 2010.11.23 add
XPoint GetAngPoint(XPoint ptstart, double nAngle)
{
double nEle = ptstart.z;
ptstart.z =0;
XPoint ptRet, ptend;
int itype = -1;
double dAng(0);
nAngle = Wcs2Ucs(nAngle);
double ntmp2 = Radian2Angle(nAngle);
while(1){
struct resbuf pointbuf;
int iRet = ads_grread(5, &itype, &pointbuf);//得到动态点pointbuf
ads_point_set(pointbuf.resval.rpoint, ptend);//ptend动态点,也就是引出支线的结束点
ptend.z = 0;
double dOAng = ads_angle(ptstart, ptend) - nAngle;
double dDis = ads_distance(ptstart, ptend);
dDis = fabs(dDis * cos(dOAng));
//指出标注的引出方向
if(dOAng < -0.001)
dOAng += 2*PI;
else if(dOAng > (PI*2 + 0.001))
dOAng -= PI*2;
double ntmp = Radian2Angle(dOAng);
if(dOAng<=PI && dOAng>PI/2){
dAng = nAngle + PI;
}
else if(dOAng>=0 && dOAng<PI/2){
dAng = nAngle;
}
else if(dOAng<=PI*2 && dOAng>PI/2*3){
dAng = nAngle;
}
else if(dOAng>=PI && dOAng<PI/2*3){
dAng = nAngle + PI;
}
ads_redraw(NULL, 1);
if(itype == 5){
ads_polar(ptstart, dAng, dDis, ptend);
ads_grdraw(ptstart, ptend, -1, 0);
ptRet = ptend;
ptRet.z = nEle;
}
else
break;
}
if(itype != 3)
return XPoint();
return ptRet;
}
// Command: 标高
void DimSymbElevation()
{
AcDbObjectId idRet;
DList<AcDbObjectId> lstElevId;
GetEntFromBlockByDxf(lstElevId, _T("ATS_ELEVATION"));
AcDbObjectId *pLast=lstElevId.Tail();
XPoint ptLast;
double *pLastLoc=NULL;
double nLastElev=0.0;
if(pLast) {
OPENOBJ_BEGIN(*pLast, AcDb::kForRead, TDbSymbElevation, pLastElev);
if(pLastElev) {
ptLast=pLastElev->GetLocation();
nLastElev=_tstof(pLastElev->GetText());
pLastLoc=&ptLast.x;
}
OPENOBJ_END();
}
CDimPipeElevationDlg dlg(acedGetAcadFrame());
{
CTemporaryResourceOverride vTemp;
dlg.Create(IDD_DIM_PIPE_ELEVATION, acedGetAcadFrame());
}
dlg.ShowWindow(SW_SHOW);
acedGetAcadDwgView()->SetFocus();
// cet 2011.11.22 add
double dMeter = 1000;
if (DocGetMeterUnitDraw())
{
dMeter = 1;
}
// if(DocGetMeterUnitDraw() && dlg.m_iScale > 20)
// {
// dlg.m_iScale = 1;
// dlg.UpdateData(FALSE);
// }
double g_nLeaderLen=7.0;
double g_nBaseLen=7.0;
XPoint ptLoc, ptPick;
while(1) {
int nOsMode=0;
xg_getvar(_T("OSMODE"), &nOsMode);
nOsMode &= ~0x4000;
nOsMode |= OS_INT|OS_NEA;
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
int nRetCode;
INITGET_BEG(0, _T("R"));
nRetCode=ads_getpoint(pLastLoc? (double *)Wcs2Ucs(pLastLoc) : NULL,
_T("\n请点取标高点或 [参考标高(R)]<退出>:"), ptLoc);
INITGET_END();
if(nRetCode==RTNORM)
break;
else if(nRetCode==RTKWORD) {
Entity entRef;
if(entRef.FilterSelect(_T("\n点取参考标高<退出>: "), RBList(RTDXF0, _T("ATS_ELEVATION"), NULL))==RTNORM) {
OPENOBJ_BEGIN(entRef, AcDb::kForRead, TDbSymbElevation, pLastElev);
if(pLastElev) {
ptLast=pLastElev->GetLocation();
nLastElev=_tstof(pLastElev->GetText());
pLastLoc=&ptLast.x;
}
OPENOBJ_END();
}
} else{
dlg.DestroyWindow();
return;
}
}
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("ATS_PIPE"), 8, _T("*"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("LINE"), 8, _T("*"), -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ss(SS_FREE);
GetPointPickSet(ptLoc, ss, rbMask, int(0.5*DocGetPScale()));
XPoint ptUcs = ptLoc;
ptLoc=Ucs2Wcs(ptLoc);
double nRotate(0), nEle(-250);
TCHAR szLayer[256];
dlg.UpdateData(TRUE);
CString strPipeLayer; // cet 2010.11.23 add 管道图层
if(ss.Length() == 1){
Entity ent = ss[0L];
if(ent.Is(_T("LINE"))){
XLine line(ent);
nRotate = line.Direction();
if(nRotate >= PI && nRotate <= PI*3/2)
nRotate -= PI;
else if(nRotate > PI/2 && nRotate < PI)
nRotate += PI;
}
else if(ent.Is(_T("ATS_PIPE"))){
ent.GetData(8, szLayer);
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
nRotate = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint());
if(pPipe->GetModelType() == TPipeSys::kModel)
{
//nEle = pPipe->StartPoint().z/1000; cet 2011.11.22 modify
nEle = pPipe->StartPoint().z / dMeter;
}
else
nEle = _tstof(ReadXdata(ent, _T("TG-ELEVATION")));
if(nRotate >= PI && nRotate <= PI*3/2)
nRotate -= PI;
else if(nRotate > PI/2 && nRotate < PI)
nRotate += PI;
strPipeLayer = pPipe->layer(); // cet 2010.11.23 add 管道图层
}
OPENOBJ_END();
}
// nRotate = Ucs2Wcs(nRotate);
}
if(dlg.m_bOut){
if(ss.Length() == 1){
ads_prompt(_T("\n请点取引出点:<不引出>"));
ptPick = GetAngPoint(ptUcs, nRotate);
ptPick = Ucs2Wcs(ptPick);
}
else{
if(ads_getpoint(ptUcs, _T("\n请点取引出点:<不引出>"), ptPick) == RTNORM){
ptPick = Ucs2Wcs(ptPick);
ptPick.z = ptLoc.z;
nRotate = ads_angle(ptLoc, ptPick);
if(nRotate >= PI && nRotate < PI*3/2)
nRotate -= PI;
else if(nRotate > PI/2 && nRotate < PI)
nRotate += PI;
}
}
}
XString sText, sText1;
dlg.UpdateData(TRUE);
if(nEle > -200)
{
if(dlg.m_iPrecision == 1)
sText = XString(_T("%.2f"), nEle);
else
sText = XString(_T("%.3f"), nEle);
}
else{
if(dlg.m_csText == _T(""))
{
// cet 2011.11.22 modify
// if(dlg.m_iPrecision == 1)
// sText = XString(_T("%.2f"), nLastElev+_AS_METER(ptLoc.y-ptLast.y));
// else
// sText = XString(_T("%.3f"), nLastElev+_AS_METER(ptLoc.y-ptLast.y));
double dVal = ptLoc.y-ptLast.y;
dVal /= dMeter;
if (dlg.m_iPrecision == 1)
{
sText = XString(_T("%.2f"), nLastElev + dVal);
}
else
{
sText = XString(_T("%.3f"), nLastElev + dVal);
}
}
else
sText = dlg.m_csText;
}
dlg.m_csText = sText;
dlg.UpdateData(FALSE);
// if(dlg.m_csElePrefix != _T("无") && _tstof(sText) < 0.001)
// sText = dlg.m_csElePrefix + _T("±") + sText;
// else if(dlg.m_csElePrefix != _T("无") && _tstof(sText) > 0.001)
// sText = dlg.m_csElePrefix + _T("+") + sText;
if(!sText1)
sText1=sText;
TDbSymbElevation *pElev = new TDbSymbElevation;
pElev->SetLocation(ptLoc);
if(fabs(nRotate) < 0.001)
pElev->SetLayoutRotation(Ucs2Wcs(nRotate));
else
pElev->SetLayoutRotation(nRotate);
pElev->SetText(sText1);
if(!!ptPick){
pElev->SetLocation(ptPick);
pElev->SetBaseLine(TRUE);
pElev->SetBaseLen(ads_distance(ptPick, ptLoc)/100);
}
else{
pElev->SetLocation(ptLoc);
pElev->SetBaseLine(FALSE);
pElev->SetBaseLen(7);
}
pElev->SetLeader(FALSE);
pElev->SetLeaderLen(7);
pElev->SetTextHeight(dlg.m_nHeight);
// zxl 2012.07.03 modify
//pElev->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle));
pElev->SetTextStyleId(InitTwtTextStyle(g_csEleDimStyle));
pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen());
pElev->SetTextLayerId(InitLayer(LAY_TEXT));
pElev->setLayer(pElev->GetDefaultLayer());
// pElev->SetPScale((double)dlg.m_iScale);
pElev->SetTextPoint(pElev->GetDefaultTextLocation());
TElevEdJig jig(pElev, &dlg);
const TCHAR *pszPrompt=_T("\n请点取标高方向<当前>:");
jig.SetOperCode(TElevEdJig::kDirection);
jig.SetPrompt(pszPrompt);
int nRet=jig.DoIt();
if(nRet!=RTNORM) {
dlg.DestroyWindow();
delete pElev;
return;
}
AcDbObjectId id = pElev->AddToCSpace(Adesk::kTrue);
//cet 2010.11.23 add 标注随管道的标注图层
if (!strPipeLayer.IsEmpty())
{
OPENOBJ_BEGIN(id, AcDb::kForWrite, TDbSymbElevation, pEnt)
if(pEnt != NULL)
{
CString strDimLayer = GetDimLayerNameByPipeLayer(strPipeLayer);
pEnt->setLayer(InitLayer(strDimLayer));
}
OPENOBJ_END()
}
if(_tcscmp(szLayer, _T("")) != 0){
Entity entLast;
entLast.GetLast();
WriteXdata(entLast, _T("TG-LAYER"), szLayer);
}
dlg.DestroyWindow();
return;
}
void DimPipeElevation(Entity ent, XPoint ptLoc)
{
double dMeter(1);
if(!DocGetMeterUnitDraw())
dMeter = 1000;
TCHAR szLayer[256];
ent.GetData(8, szLayer);
double nRotate(0), nEle(0);
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbPipe, pPipe);
if(pPipe){
pPipe->getClosestPointTo(ptLoc, AcGeVector3d::kZAxis, ptLoc);
//nRotate = ads_angle(pPipe->GetStartPoint(), pPipe->GetEndPoint());// zxl 2013.12.03 modify
nRotate = ads_angle(Wcs2Ucs(pPipe->GetStartPoint()), Wcs2Ucs(pPipe->GetEndPoint()));
if(pPipe->GetModelType() == TPipeSys::kModel)
nEle = ptLoc.z/dMeter;
else
nEle = _tstof(ReadXdata(ent, _T("TG-ELEVATION")));
if(nRotate >= PI && nRotate <= PI*3/2)
nRotate -= PI;
else if(nRotate > PI/2 && nRotate < PI)
nRotate += PI;
}
else
return;
OPENOBJ_END();
CString sText;
sText.Format(_T("%.3f"), nEle);
TDbSymbElevation *pElev = new TDbSymbElevation;
pElev->SetLocation(ptLoc);
// zxl 2013.12.03 modify nRotate统一为ucs角度
// if(fabs(nRotate) < 0.001)
// pElev->SetLayoutRotation(Ucs2Wcs(nRotate));
// else
// pElev->SetLayoutRotation(nRotate);
pElev->SetLayoutRotation(Ucs2Wcs(nRotate));
pElev->SetText(sText);
pElev->SetLocation(ptLoc);
pElev->SetBaseLine(FALSE);
pElev->SetBaseLen(7);
pElev->SetLeader(FALSE);
pElev->SetLeaderLen(7);
// zxl 2012.07.03 modify
// pElev->SetTextHeight(g_nTwtDimHeight);
// pElev->SetTextStyleId(InitTwtTextStyle(g_csTwtDimStyle));
pElev->SetTextHeight(g_nEleDimHeight);
pElev->SetTextStyleId(InitTwtTextStyle(g_csEleDimStyle));
pElev->SetTextBaseLen(pElev->GetDefaultTextBaseLen());
pElev->SetTextLayerId(InitLayer(LAY_TEXT));
pElev->setLayer(pElev->GetDefaultLayer());
pElev->SetTextPoint(pElev->GetDefaultTextLocation());
//pElev->SetPScale((double)dlg.m_iScale);
TElevEdJig jig(pElev);
const TCHAR *pszPrompt=_T("\n请点取标高方向<当前>:");
jig.SetOperCode(TElevEdJig::kDirection);
jig.SetPrompt(pszPrompt);
int nRet=jig.DoIt();
if(nRet!=RTNORM) {
delete pElev;
return;
}
pElev->AddToCSpace(Adesk::kTrue);
if(_tcscmp(szLayer, _T("")) != 0){
Entity entLast;
entLast.GetLast();
WriteXdata(entLast, _T("TG-LAYER"), szLayer);
}
return;
}
/////////////////////////////////////////////////////////////////////////////
// CDimPipeElevationDlg dialog
IMPLEMENT_DYNAMIC(CDimPipeElevationDlg, CModelessDialog)
BOOL CDimPipeElevationDlg::m_bOut = TRUE;
CString CDimPipeElevationDlg::m_csElePrefix = _T("无");
//int CDimPipeElevationDlg::m_iScale = 100;
double CDimPipeElevationDlg::m_nHeight = 3.5;
int CDimPipeElevationDlg::m_iPrecision = 0;
CDimPipeElevationDlg::CDimPipeElevationDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CDimPipeElevationDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDimPipeElevationDlg)
m_csText = _T("");
//}}AFX_DATA_INIT
}
void CDimPipeElevationDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDimPipeElevationDlg)
DDX_Text(pDX, IDC_EDIT_CONTENT, m_csText);
DDX_CBIndex(pDX, IDC_COMBO_PRECISION, m_iPrecision);
DDX_Control(pDX, IDC_COMBO_PREFIX, m_colPerFix);
DDX_CBString(pDX, IDC_COMBO_PREFIX, m_csElePrefix);
DDX_Check(pDX, IDC_CHECK_OUT, m_bOut);
DDX_Text(pDX, IDC_EDIT_HEIGHT, m_nHeight);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDimPipeElevationDlg, CModelessDialog)
//{{AFX_MSG_MAP(CDimPipeElevationDlg)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDimPipeElevationDlg message handlers
// 重载update函数,支持combobox的数据刷新 zxl 2012.06.16 add
BOOL CDimPipeElevationDlg::UpdateData(BOOL bSaveAndValidate)
{
CWnd::UpdateData(bSaveAndValidate);
int len = m_colPerFix.GetCount();
BOOL bFlag = FALSE;
for(int i=0;i<len;i++)
{
CString csTmp;
m_colPerFix.GetLBText(i, csTmp);
if(csTmp.Compare(m_csElePrefix) == 0)
{
m_colPerFix.SetCurSel(i);
bFlag = TRUE;
break;
}
}
if(!bFlag)
m_colPerFix.SetWindowText(m_csElePrefix);
return TRUE;
}
BOOL CDimPipeElevationDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
m_nHeight = g_nEleDimHeight;
UpdateData(FALSE);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDimPipeElevationDlg::OnClose()
{
CModelessDialog::OnClose();
acedPostCommand(_T("\33\33"));
}