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