// FloorCopyDlg.cpp : implementation file // #include "stdafx.h" #include "FloorCopyDlg.h" #include "DbFloorRect.h" //#include #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;iSetShow(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;iSetShow(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;iSetShow(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;iGetCenter(); 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 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;jSetShow(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 0) { int* intArray = new int[len]; if (m_listFloor.GetSelItems(len, intArray) != LB_ERR) { for (int i=0; i