Files
envi-code/SourceCode/Code2026/tg_shs/shs_public/FloorCopyDlg.cpp
T
2026-09-28 15:28:50 +08:00

391 lines
8.8 KiB
C++

// FloorCopyDlg.cpp : implementation file
//
#include "stdafx.h"
#include "FloorCopyDlg.h"
#include "DbFloorRect.h"
//#include <arxtools.h>
#include "tapi.h"
#include "DbVPipeDim.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//***************************************************************************************************
// 楼层基点
//***************************************************************************************************
BOOL PickFloorInfo(XPoint &ptBase, CString &csName, double &dHeight, XPoint &ptLeft, XPoint &ptRight, XStringList &lstFloor)
{
BOOL bRet = FALSE;
if(ads_getpoint(NULL, _T("\n请点选楼层基点<退出>:"), ptBase) != RTNORM)
return bRet;
ptBase.z = 0;
TCHAR szName[256];
ads_getstring(0, _T("\n请输入楼层名称<退出>:"), szName);
csName = szName;
if(csName == _T(""))
return bRet;
if(lstFloor.Index(csName) > -1)
{
adsout << _T("\n注意:楼层基点名称重复!");
return bRet;
}
double dFloorHeight(3.0);
ads_getreal(_T("\n楼层高:<3.0m>"), &dFloorHeight);
dHeight = dFloorHeight;
if(dHeight > 900)
dHeight = dHeight / 1000; //必须米单位
if(ads_getpoint(NULL, _T("\n请点该楼层一角<退出>:"), ptLeft) != RTNORM)
return bRet;
if(ads_getcorner(ptLeft, _T("\n请点该楼层对角<退出>:"), ptRight) != RTNORM)
return bRet;
ptLeft.z = 0;
ptRight.z = 0;
return TRUE;
}
void SetFloorBasePt()
{
XPoint ptBase, ptCen;
RBList mask(RTDXF0, _T("ATS_FLOORRECT"),NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, mask);
long len = ss.Length();
XStringList lstFloor;
for(long i=0;i<len;i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbFloorRect, pEnt);
if(pEnt){
pEnt->SetShow(TRUE);
CString csText = pEnt->GetFloorName();
lstFloor.Append(tstrnew(csText));
}
OPENOBJ_END();
}
CString csName;
XPoint ptLeft, ptRight;
double dHeight(3);
BOOL ret = PickFloorInfo(ptBase, csName, dHeight, ptLeft, ptRight, lstFloor);
for(i=0;i<len;i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbFloorRect, pEnt);
if(pEnt){
pEnt->SetShow(FALSE);
CString csText = pEnt->GetFloorName();
}
OPENOBJ_END();
}
if(!ret)
return;
AcDbObjectId idTextStyle = InitTextStyle(TS_STANDARD);
XRectAngle rect(ptLeft, ptRight);
TDbFloorRect *pNew = new TDbFloorRect;
pNew->SetBase(ptBase);
rect.Center(ptCen);
pNew->SetCenter(ptCen);
pNew->SetLength(rect.Width());
pNew->SetWidth(rect.Height());
pNew->SetFloorName(csName);
pNew->SetFloorHeight(dHeight);
pNew->SetTextStyleId(idTextStyle);
pNew->SetTextHeight(5.0);
pNew->SetLayoutRotation(Ucs2Wcs(0.0)); // 设置布局转角,支持UCS
AcDbObjectId idNew = AddToCurrentSpace(pNew, Adesk::kTrue);
}
//***************************************************************************************************
// 楼层复制
//***************************************************************************************************
//重新绑定立管和标注
void RenewDimInfo(const AcDbObjectId id)
{
AcGePoint3d ptS,ptE;
AcDbEntity *pEnt = NULL;
if (acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead) == Acad::eOk)
{
TDbVPipeDim *pDim = TDbVPipeDim::cast(pEnt);
if (pDim != NULL)
{
ptS = pDim->GetStartPt();
ptE = pDim->GetTurnPt();
}
pEnt->close();
}
RBList rbMak(RTDXF0, _T("ATS_PIPE"),NULL);
PickSet ssSel(SS_FREE);
struct resbuf *pointlist = ads_buildlist(RTPOINT, &ptS, RTPOINT, &ptE, NULL);
ssSel.Get(_T("F"),pointlist,NULL,rbMak);
ads_relrb(pointlist);
AcGePoint3d ptST;
AcDbObjectId idVPipe;
for (long i = 0; i < ssSel.Length(); ++i)
{
OPENOBJ_BEGIN(ssSel[i], AcDb::kForRead, TDbPipe, pPipe);
if(pPipe && pPipe->IsVertical())
{
pPipe->getStartPoint(ptST);
ptST.z = 0.0;
ptS.z = 0.0;
if (ptST.distanceTo(ptS) < 1e-3)
{
idVPipe = pPipe->objectId();
break;
}
}
OPENOBJ_END();
}
if (acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) == Acad::eOk)
{
TDbVPipeDim *pDim = TDbVPipeDim::cast(pEnt);
if (pDim != NULL)
{
if (!idVPipe.isNull())
{
pDim->SetVPipeId(idVPipe);
}
}
pEnt->close();
}
}
void CopyByFloorBasePt()
{
RBList mask(RTDXF0, _T("ATS_FLOORRECT"), NULL);
PickSet ss(SS_FREE);
ss.Get(_T("X"), NULL, NULL, mask);
long len = ss.Length();
if(len < 1)
{
adsout << _T("\n注意:执行本命令之前必须执行【楼层基点】lcjd!");
return;
}
CWnd *pWnd=acedGetAcadFrame();
CFloorCopyDlg dlg(pWnd);
XPointList lstBasePt;
for(long i=0;i<len;i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbFloorRect, pPipe);
if(pPipe){
pPipe->SetShow(TRUE);
CString csName = pPipe->GetFloorName();
dlg.m_lstFloor.Append(tstrnew(csName));
XPoint ptBase = pPipe->GetBase();
lstBasePt.NewAppend(ptBase);
}
OPENOBJ_END();
}
PickSet ss2(SS_FREE);
if(SelectEntities(_T("\n请选择要复制的图元<退出>"), ss2, RBList()) == RTNORM)
{
ss2 -= ss;
XPoint ptLow, ptUp, ptFrom, ptTo;
ss2.GetExtend(ptLow, ptUp);
ptLow.z =0;
ptUp.z =0;
Entity entTo;
for(i=0;i<len;i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbFloorRect, pPipe);
if(pPipe){
XPoint ptCen;
double dWidth(0), dLength(0);
ptCen = pPipe->GetCenter();
dWidth = pPipe->GetWidth();
dLength = pPipe->GetLength();
XRectAngle rect(ptCen, dLength, dWidth);
XPoly2D poly;
rect.AsPoly2D(poly);
int ret1 = ptLow&poly;
int ret2 = ptUp&poly;
if(ret1 == PR_INSIDE && ret2 == PR_INSIDE)
{
ptFrom = pPipe->GetBase();
break;
}
}
OPENOBJ_END();
}
if(!!ptFrom)
{
{
CAcModuleResourceOverride vTemp;
dlg.Create(dlg.IDD, pWnd);
}
dlg.ShowWindow(SW_SHOW);
acedGetAcadDwgView()->SetFocus();
// PickSet ssNew(SS_FREE);
// ssNew.IncludeBegin();
XPushVar<int> tVar(_T("OSMODE"), 0);
if(SelectEntity(_T("\n请选择要复制目标楼层框(或在对话框选择楼层名)<退出>"), entTo, mask) == RTNORM)
{
OPENOBJ_BEGIN(entTo, AcDb::kForRead, TDbFloorRect, pPipe);
if(pPipe){
ptTo = pPipe->GetBase();
}
OPENOBJ_END();
if(ptFrom != ptTo)
{
ads_command(RTSTR, _T("COPY"), RTPICKS, (TLong_ptr *)ss2, RTSTR, _T(""),
RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo, RTNONE);
}
}
else if(dlg.m_iRet > -1)
{
int len = dlg.m_lstRet.Length();
for(int j=0;j<len;j++)
{
int ret = *dlg.m_lstRet[j];
XPoint ptTo2 = *lstBasePt[ret];
if(!!ptTo2 && ptFrom != ptTo2)
{
ads_command(RTSTR, _T("COPY"), RTPICKS, (TLong_ptr *)ss2, RTSTR, _T(""),
RT3DPOINT, &ptFrom, RT3DPOINT, &ptTo2, RTNONE);
}
}
}
dlg.DestroyWindow();
// ssNew.IncludeEnd();
// for(long j=0;j<ssNew.Length();j++){
// Entity ent2 = ssNew[j];
// if(ent2.Is(_T("ATS_VPIPEDIM")))
// {
// AcDbObjectId idNew = NULL;
// acdbGetObjectId(idNew, ent2);
// RenewDimInfo(idNew);
// }
// }
}
}
for(i=0;i<len;i++)
{
Entity ent = ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbFloorRect, pPipe);
if(pPipe){
pPipe->SetShow(FALSE);
}
OPENOBJ_END();
}
}
/////////////////////////////////////////////////////////////////////////////
// CFloorCopyDlg dialog
IMPLEMENT_DYNAMIC(CFloorCopyDlg, CModelessDialog)
CFloorCopyDlg::CFloorCopyDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CFloorCopyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFloorCopyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_iRet = -1;
}
void CFloorCopyDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFloorCopyDlg)
DDX_Control(pDX, IDC_LIST_FLOOR, m_listFloor);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFloorCopyDlg, CModelessDialog)
//{{AFX_MSG_MAP(CFloorCopyDlg)
ON_WM_CLOSE()
ON_LBN_DBLCLK(IDC_LIST_FLOOR, OnDblclkListFloor)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFloorCopyDlg message handlers
BOOL CFloorCopyDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
int len = m_lstFloor.Length();
for(int i=0;i<len;i++)
{
m_listFloor.AddString(m_lstFloor[i]);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFloorCopyDlg::OnOK()
{
CModelessDialog::OnOK();
int idx = m_listFloor.GetCurSel();
m_listFloor.GetText(idx, m_csRet);
m_iRet = idx;
int len = m_listFloor.GetSelCount();
if (len > 0) {
int* intArray = new int[len];
if (m_listFloor.GetSelItems(len, intArray) != LB_ERR) {
for (int i=0; i<len; i++) {
m_lstRet.Append(new int(intArray[i]));
}
}
delete [] intArray;
}
PostCommand(_T(" "), false);
}
void CFloorCopyDlg::OnClose()
{
CModelessDialog::OnClose();
acedPostCommand(_T("\33\33"));
}
void CFloorCopyDlg::OnDblclkListFloor()
{
OnOK();
}