#include "StdAfx.h" #include "TDbProtectEntity.h" #include "TDbBlockInsert.h" #include "TDbColumn.h" #include "TDbWallPatch.h" #include "TAecSpaceCell.h" #include "TAecSpaceWall.h" #include "TSearchSpaceFromWall.h" #include "TArchAppDocGlobals.h" #include "CFindShortWallDlg.h" #include "CProtectSetDlg.h" #include "TArchDocReactor.h" #include "imgdef.h" #include "imgent.h" #include "dbobjptr.h" #include "rxregsvc.h" #if ADS > 15 #include "AcStatusBar.h" #endif using namespace TchGeLib; extern HINSTANCE _hdllInstance; static ads_real minLenWall = 200.0; //extern TCHAR g_sAppPath[]; TARCH_IMPEXP const TCHAR *xgAppname = NULL; TARCH_IMPEXP BOOL g_bAxisWall = TRUE; extern double g_nDefaultScale; extern int g_nRunMode; extern TARCH_IMPEXP int g_nProductId; namespace { #if ADS <= 18 double _ttof(LPCTSTR psz) { if (!psz) return .0; USES_CONVERSION; return atof(W2A(psz)); } #endif } void PolyCurveEnt() { TEntitySet ent; if (SelectEntity(_T("\n选择多段线:"),ent,TRBList(RTDXF0,_T("LINE,ARC,CIRCLE,POLYLINE,LWPOLYLINE"),NULL)) != RTNORM) { return; } TDbPolyCurveEnt *pCurve = new TDbPolyCurveEnt; TGGePoly3D poly3d(ent); AcGeMatrix3d mat; mat.setToWorldToPlane(Ucs2Wcs(TADSGePoint3d(0,0,1),TRUE).AsAcGeVector3d()); poly3d.TransformBy(mat); pCurve->SetPathPoly(poly3d,Ucs2Wcs(TADSGePoint3d(0,0,1),TRUE).AsAcGeVector3d()); ent.Erase(); AddToModelSpace(pCurve,Adesk::kTrue); } BOOL IsInsideColumn(const TADSGePoint3d &pt) { TADSGePoint3d ptTemp = pt; ptTemp.z = 0; TDPtrList lstPoly; GetAllColumnBoundry(lstPoly); for (int i = 0; iat(_T("AcDbWipeout"))); if (pClass == NULL) { return FALSE; } AcDbObjectId idFirst; BOOL bFirstWipeOut = FALSE; OPENOBJ_BEGIN(idBlock, AcDb::kForWrite, AcDbBlockTableRecord, pBlock); ASSERT(pBlock); AcDbBlockTableRecordIterator* pBlockIterator = NULL; Acad::ErrorStatus es = pBlock->newIterator(pBlockIterator); ASSERT(es == Acad::eOk && pBlockIterator); AcDbEntity *pEnt = NULL; if (pBlockIterator->getEntity(pEnt, AcDb::kForRead) == Acad::eOk) { idFirst = pEnt->objectId(); AcRxClass *pMyClass = pEnt->isA(); if (pMyClass == pClass) { bFirstWipeOut = TRUE; if (!nMaskFlag) { if (pEnt->upgradeOpen() == Acad::eOk) { pEnt->erase(); pEnt->downgradeOpen(); } } pEnt->close(); } else { BOOL bCanSwapId = TRUE; if (pMyClass == AcDb2dPolyline::desc() || pMyClass == AcDb3dPolyline::desc() || pMyClass == AcDbPolygonMesh::desc() || pMyClass == AcDbPolyFaceMesh::desc() || pMyClass == AcDbMInsertBlock::desc() || pMyClass == AcDbBlockReference::desc()) { bCanSwapId = FALSE; } pEnt->close(); if (nMaskFlag && bCanSwapId) { AcDbPoint *pPoint = new AcDbPoint(AcGePoint3d(0,0,0)); pBlock->appendAcDbEntity(pPoint); pPoint->swapIdWith(idFirst); AcDbEntity *pWipeOut = (AcDbEntity *)pClass->create(); Acad::ErrorStatus es = pPoint->handOverTo(pWipeOut); if (es == Acad::eObjectToBeDeleted) { pWipeOut->close(); delete pPoint; bFirstWipeOut = TRUE; } else { pPoint->close(); delete pWipeOut; } } } } delete pBlockIterator; OPENOBJ_END(); if (!nMaskFlag) { return TRUE; } if (!bFirstWipeOut) { return FALSE; } TGGePoly2D polyBound(1); BOOL bOutline = (GetBlockBoundary(idBlock, polyBound) == RTNORM); OPENOBJ_BEGIN(idFirst, AcDb::kForWrite, AcDbRasterImage, pAcDbRasterImage); if (pAcDbRasterImage) { TADSGePoint3d origin = ptLow; double xDir = 0.0; double yDir = xDir + PI / 2.0; AcGeVector3d u(cos(xDir), sin(xDir), 0), v(cos(yDir), sin(yDir), 0); u *= (ptUp.x - ptLow.x); v *= (ptUp.y - ptLow.y); pAcDbRasterImage->setOrientation(origin, u, v); if (!nMaskFlag) { pAcDbRasterImage->erase(); } else if (nMaskFlag & BIF_POLYMASK) { if (bOutline) { AcGeMatrix3d mat3d; pAcDbRasterImage->getPixelToModelTransform(mat3d); mat3d.invert(); AcDbRasterImage::ClipBoundaryType ClipBoundaryType; AcGePoint2dArray ClipBoundary; TGGePoly2D polyDest(1); polyBound.Disperse1(polyDest, _AS_SYS_UNIT(g_nCirDeviation)); int nCount = polyDest.Length(); for (int i = 0; i <= nCount; i++) { TADSGePoint3d ptVert = *polyDest[i == nCount ? 0 : i]; ((AcGePoint3d &)ptVert).transformBy(mat3d); ClipBoundary.append(ptVert); } ClipBoundaryType = AcDbRasterImage::kPoly; pAcDbRasterImage->setClipBoundary(ClipBoundaryType, ClipBoundary); } } else { pAcDbRasterImage->setClipBoundaryToWholeImage(); } } OPENOBJ_END(); return TRUE; } AcDbObjectId GetBlock2dFromBlock3d(AcDbObjectId idBlock) { AcDbObjectId idBlock2d; OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock); if (pBlock) { resbuf *pxData = pBlock->xData(TCHXD); // 读扩展数据 if (pxData) { resbuf *pNext = pxData->rbnext; if (pNext && pNext->restype == 1005) { AcDbHandle handle(pNext->resval.rstring); pBlock->database()->getAcDbObjectId(idBlock2d, false, handle); } ads_relrb(pxData); } } OPENOBJ_END(); return idBlock2d; } void InitAppDocGlobals(BOOL bTrue) { if (bTrue) { ASSERT(TArchDocReactor::g_pTArchAppDocGlobals == NULL); TArchDocReactor::g_pTArchAppDocGlobals = new TArchAppDocGlobals(); TArchDocReactor::g_pTArchAppDocGlobals->InitDocGlobals(curDoc()); } else { ASSERT(TArchDocReactor::g_pTArchAppDocGlobals != NULL); TArchDocReactor::g_pTArchAppDocGlobals->OnUnloadApp(); delete TArchDocReactor::g_pTArchAppDocGlobals; TArchDocReactor::g_pTArchAppDocGlobals = NULL; } } void ModifyWallAtCorner(TADSGePointList &lstCorners0, TDPtrList &lstColumns,AcDbObjectId idBlock,LPVOID pReserve) { CFindShortWallDlg::g_bAskAgain = TRUE; CFindShortWallDlg::m_nHowToDo = 0; // 如果没有变化的墙角和柱子, 则返回 if (!lstCorners0 && !lstColumns) { return; } // 复制一份, 以避免Reactor修改墙角表 TADSGePointList lstCorners; for (int idx = 0; idx < lstCorners0.Length(); idx++) { lstCorners.Append(new TADSGePoint3d(*lstCorners0[idx])); } //缩小求解范围 // 过滤出需要局部考虑的墙体 TADSGePoint3d ptMin, ptMax; BOOL bInitExt = FALSE; if (!!lstCorners) { lstCorners.GetExtend(ptMin,ptMax); bInitExt = TRUE; } TGGePoly2D poly(1); TADSGePoint3d pt1, pt2; for (idx = 0; idx < lstColumns.Length(); idx++) { poly.Reset(); lstColumns[idx]->GetOutline(poly); poly.GetExtend(pt1, pt2); if (!bInitExt) { ptMin = pt1; ptMax = pt2; bInitExt = TRUE; } else { ptMin = Min(ptMin, pt1); ptMax = Max(ptMax, pt2); } } // 取得需要更新的墙体集合A, 这些墙体的墙角需要重新计算, 当然连接的墙体需要重新搜索 double nDistPrec = 800; ptMin.x -= nDistPrec; ptMin.y -= nDistPrec; ptMax.x += nDistPrec; ptMax.y += nDistPrec; TADSGePoint3d ptMinUpd = ptMin, ptMaxUpd = ptMax; //范围A: ptMinUpd-ptAxUpd TPickEntSet ssMin(SS_FREE), ss(SS_FREE); if (GetSafeSelectionEx2(ssMin, 1, ptMin, ptMax, TDbWall::desc(),idBlock) != Acad::eOk) { return; } // 取得有关的墙体集合C, 要更新的墙体需要参考它们的参数. // 集合C-集合A = 集合B, 集合B的墙体的墙角不需要重新计算. // 但是计算集合A的墙角需要用到集合B, 因此B也在整个拓扑网路中. // V2.0 版直接记录拓扑, 由于集合A的实体发生合并或分解, 这样 // 集合B中的实体可能记录了对集合A的拓扑连接关系, 这一关系也需要更新 // 因此: 1. 集合A更新范围A内的端点的拓扑; 2.集合B更新范围B内的端点的拓扑 TADSGePoint3d ptExtMin, ptExtMax; ssMin.GetExtend(ptExtMin, ptExtMax); ptMin = Min(ptMin, ptExtMin); ptMax = Max(ptMax, ptExtMax); // Modify on 2003/9/12,缺保范围C大于等于范围A ptMin.x -= nDistPrec; ptMin.y -= nDistPrec; ptMax.x += nDistPrec; ptMax.y += nDistPrec; //add by xlc on 100531 提速优化 if (pReserve != NULL) { typedef CMap CMapLongToExtents; CMapLongToExtents* pMap = (CMapLongToExtents*)pReserve; AcDbExtents ext(ptMin,ptMax); pMap->SetAt(idBlock.asOldId(),ext); if (pMap->Lookup(100,ext)) { return; } } if (GetSafeSelectionEx2(ss, 1, ptMin, ptMax, TDbWall::desc(),idBlock) != Acad::eOk) { return; } TPickEntSet ssB(SS_FREE); ssB += ss; //add by xlc on 101125 解决图块在位编辑后墙角更新不全的问题 if(_tcsicmp(GetCurCommand(), _T("REFCLOSE"))!=0) { ssB -= ssMin; } //取得所有的柱子裁剪区域 TDPtrList lstClipBoundry; TPickEntSet ssColu(SS_FREE); if (GetSafeSelection2(ssColu, 1, ptMin, ptMax, TDbColumn::desc(),idBlock) == Acad::eOk) { // 过滤出需要局部考虑的柱子 TEntitySet eColu; AcDbObjectId *idColu = NULL; long nColuCount = ssColu.Length(); for (long n = 0; n < nColuCount; n++) { eColu = ssColu[n]; OPENOBJ_BEGIN(eColu, AcDb::kForRead, TDbColumn, pColu); if (pColu && !pColu->IsFortifyColumn()) { idColu = new AcDbObjectId; VERIFY(acdbGetObjectId(*idColu, eColu) == Acad::eOk); lstClipBoundry.Append(idColu); } OPENOBJ_END(); } } LAB_BEGIN: TSearchSpaceFromWall aSearch; try { aSearch.InitStart(ss, lstClipBoundry); //实际并不搜索房间, } catch(TSearchException e) { if (e.m_nHowToDo == HF_DELETE || e.m_nHowToDo == HF_STOP_DELETE) { OPENOBJ_BEGIN(e.m_idObj, AcDb::kForWrite, AcDbEntity, pDbEnt); if (pDbEnt) { pDbEnt->erase(); } OPENOBJ_END(); } if (e.m_nHowToDo == HF_DELETE || e.m_nHowToDo == HF_MARK || e.m_nHowToDo == HF_NONE) { ss -= e.m_idObj; goto LAB_BEGIN; } return; } catch(TDupWallException e) { if (e.m_nHowToDo == HF_DELETEA || e.m_nHowToDo == HF_DELETEB) { AcDbObjectId idObj = (e.m_nHowToDo == HF_DELETEA ? e.m_idObjA : e.m_idObjB); OPENOBJ_BEGIN(idObj, AcDb::kForWrite, AcDbEntity, pDbEnt); if (pDbEnt) { pDbEnt->erase(); } OPENOBJ_END(); ss -= idObj; goto LAB_BEGIN; } return; } catch(...) { TchGeLib::adsout << _T("\n出现了例外情况!"); acedPostCommandPrompt(); return; } // 加入柱子所包含的墙角 TADSGePointList lstAllCorners; aSearch.GetAllCorners(lstAllCorners); //取得所有的墙角 if (lstAllCorners.Length() > 0) //add by xlc on 100517没有墙角时不对柱子进行运算 { TADSGePoint3d ptCorner; for (int m = 0; m < lstColumns.Length(); m++) { if (lstAllCorners.Length() == 0) { break; } const TGGePoly2D &poly = lstColumns[m]->GetOutlinePoly(); if (!poly) { continue; } for (int n = 0; n < lstAllCorners.Length(); n++) { ptCorner = *lstAllCorners[n]; ptCorner.z = poly.Head()->z; // Z add this line on 2003/3/18 if ((ptCorner & ((TGGePoly2D &)poly)) == PR_INSIDE) { lstCorners.NewAppend(ptCorner); lstAllCorners.Remove(n); n -= 1; } } } } TPickEntSet ssDel(SS_FREE); //被合并的墙 try { if (lstCorners.Length() > 0) //add by xlc on 100517没有墙角时不对柱子进行运算 { aSearch.MergeWalls(lstCorners, ssDel); //先尽量合并墙段, 只处理发生变化的墙角 ss -= ssDel; // Z add this line on 2003/11/14 aSearch.BreakWalls(lstCorners, ss); //在断点处,或裁剪区域中心打断墙体 } } catch(TDupWallException e) { if (e.m_nHowToDo == HF_DELETEA || e.m_nHowToDo == HF_DELETEB) { AcDbObjectId idObj = (e.m_nHowToDo == HF_DELETEA ? e.m_idObjA : e.m_idObjB); OPENOBJ_BEGIN(idObj, AcDb::kForWrite, AcDbEntity, pDbEnt); ssDel += idObj; //Add on 2002/2/27 if (pDbEnt) { pDbEnt->erase(); } OPENOBJ_END(); ss -= idObj; goto LAB_BEGIN; } return; } catch(...) { TchGeLib::adsout << _T("\n出现了例外情况!"); acedPostCommandPrompt(); return; } // 更新墙体 TPickEntSet ssUpdateWalls(SS_FREE); //Note: 应当在aSearch范围内搜索更快 if (GetSafeSelectionEx2(ssUpdateWalls, 1, ptMinUpd, ptMaxUpd, TDbWall::desc(),idBlock) == Acad::eOk) { // 更新集合A在范围A内的端点拓扑 TGGeRectAngle boxA(ptMinUpd, ptMaxUpd); TEntitySet ent; long len = ssUpdateWalls.Length(); for (long i = 0; i < len; i++) { ent = ssUpdateWalls[i]; TAcDbObjectPtr obj(ent.name, AcDb::kForWrite); if (!obj) { //Extend一墙体时, 指针还没有关闭 } else { TDbWall *pWall = TDbWall::cast(obj.m_pObject); if (pWall) { pWall->assertWriteEnabled(); pWall->CalSideParameters(ent, TSearchSpaceFromWall::g_lstAllSortWalls, &boxA); } } } for (i = 0; iassertWriteEnabled(); pWall->CalSideParameters1(&boxA); } } } // 更新集合B在范围B内的端点拓扑 TGGeRectAngle boxB(ptMin, ptMax); // Modify on 2003/9/8, boxA change to boxB // 更新集合C在范围B内的柱子的拓扑 aSearch.UpdateColuLinkage(&boxB); len = ssB.Length(); for (i = 0L; i < len; i++) { TEntitySet entB = ssB[i]; OPENOBJ_BEGIN(entB, AcDb::kForWrite, TDbWall, pWall); if (pWall) { pWall->assertWriteEnabled(); pWall->CalSideParameters(entB,TSearchSpaceFromWall::g_lstAllSortWalls, &boxB); } OPENOBJ_END(); } for (i = 0L; i < len; i++) { TEntitySet entB = ssB[i]; OPENOBJ_BEGIN(entB, AcDb::kForWrite, TDbWall, pWall); if (pWall) { pWall->assertWriteEnabled(); pWall->CalSideParameters1(&boxB); } OPENOBJ_END(); } } if (!!ssDel) { //清除预先选中的物体 TPickEntSet gSet(SS_FREE), pSet(SS_FREE); if (GetPickFirst(gSet, pSet) == RTNORM) { if (gSet.Length() || pSet.Length()) { acedPostCommand(_T("\33")); } } } } void GetDwgStamp() { TDbConfig *p = GetDwgGlobal(AcDb::kForRead,g_pCurrentDb); int nRet = (p ? p->GetControlFlag() : 0); if (p) { p->close(); } int bInvalidEver = ((nRet & CONF_INVALID_EVER)); int bInvalidLast = ((nRet & CONF_INVALID_LAST)); if (bInvalidEver && bInvalidLast) { TchGeLib::adsout << _T("\n非法使用产生的图形!"); } else if (bInvalidEver) { TchGeLib::adsout << _T("\n图形曾经用非法软件保存过!"); } else if (bInvalidLast) { TchGeLib::adsout << _T("\n图形最近用非法软件保存过!"); } else { TchGeLib::adsout << _T("\n合法软件创建的图形!"); } } BOOL IsAcadIdle() { TArchPerDocData * pDocDat = GetCurDocData(); return (pDocDat && pDocDat->m_bAcadIdle); } BOOL IsCommandLineEmpty() { TArchPerDocData * pDocDat = GetCurDocData(); return (!pDocDat || pDocDat->m_nPos == 0); } int InsertBlock() { AsureWCS(); TADSGePoint3d ptCen; VERIFY(TGGetVar(_T("VIEWCTR"), &ptCen) == RTNORM); resbuf *rb = ads_getargs(); if (!rb || rb->restype != RTSTR) { return RTNORM; } TRBList rbList = rb; TCHAR *pszBlock = rb->resval.rstring; rb = rb->rbnext; double sx = 1.0, sy = 1.0, sz = 1.0; if (rb) { if (rb->restype == RTSHORT) { sx = rb->resval.rint; } else if (rb->restype == RTREAL) { sx = rb->resval.rreal; } else { return RTNORM; } rb = rb->rbnext; if (rb) { if (rb->restype == RTSHORT) { sy = rb->resval.rint; } else if (rb->restype == RTREAL) { sy = rb->resval.rreal; } else { return RTNORM; } rb = rb->rbnext; if (rb) { if (rb->restype == RTSHORT) { sz = rb->resval.rint; } else if (rb->restype == RTREAL) { sz = rb->resval.rreal; } else { return RTNORM; } } } } int nRet = RTNORM; if (!InitBlock(pszBlock)) { return RTERROR; } MakeTBlockInsert(pszBlock, ptCen, sx, sy, sz, 0.0, 0); if (nRet == RTNORM) { TEntitySet ent; ent.GetLast(); IDragInsertBlock(ptCen, ent, IBF_ROT90 | IBF_MIRLR | IBF_MIRUD | IBF_FRAME | IBF_ROTATE | IBF_BASEPT); } return RTNORM; } // 通过一点确定一房间的轮廓 int GenSpaceOutline(const TADSGePoint3d &ptPick, TGGePoly2D &poly, int bCenter) { g_bFindExtSpace = FALSE; // 找到所有墙,refreshed by W on 050826 TDPtrList ssWalls; if (GetEntFromBlockByDxf(ssWalls,_T("ATS_WALL,ATS_CURTAIN_WALL"),1) != Acad::eOk) { return RTERROR; } TDPtrList lstColu; GetEntFromBlockByDxf(lstColu, _T("ATS_COLUMN")); int nRet = RTERROR; // add by lgy 20120222,9.0房间轮廓命令无法正常执行,添加一goto语句的标记 SEARCHSPACE_LAB_BEGIN: TSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } // add by lgy 20120222 当图中存在完全包含在柱内的短墙时,房间轮廓命令无法正常执行 catch (TSearchException e) { if (e.m_nHowToDo == HF_DELETE || e.m_nHowToDo == HF_MARK || e.m_nHowToDo == HF_NONE) { for (int i = 0; i < ssWalls.Length(); i++) { if (*ssWalls[i] == e.m_idObj) { ssWalls.Remove(i); // 从选择集中过滤掉“小短墙” } } goto SEARCHSPACE_LAB_BEGIN; } return RTERROR; } catch (...) { TchGeLib::adsout << _T("\n发生例外情况!"); return RTERROR; } int nWallNumber = aSearch.walls.Length(); TAecSpaceWall *pNearestWall = NULL; ads_real nMinDist = 0.0; for (int i = 0; i < nWallNumber; i++) { TADSGePoint3d ptProject; TAecSpaceWall *pWall = aSearch.walls[i]; if (pWall->ProjectToMe(ptPick, ptProject) != RTNORM || (ptProject & (*pWall)) != PR_INSIDE) { continue; } ptProject.z = ptPick.z; //忽略Z坐标 ads_real nDist = ads_distance(ptPick, ptProject); if (!pNearestWall) { nMinDist = nDist; pNearestWall = pWall; } else if (nDist < nMinDist) { nMinDist = nDist; pNearestWall = pWall; } } int nWho = 0; //1:left; 2:right BOOL bSubtract = TRUE; //用相减的方法,适合于室内; 否则为室外 TAecSpaceCell lSpace, rSpace; if (pNearestWall && aSearch.SearchTwoSpace(*pNearestWall, lSpace, rSpace) == RTNORM) { TGGePoly2D lPoly, rPoly; if (bCenter) { lSpace.CenterPoly2D(lPoly); rSpace.CenterPoly2D(rPoly); } else { lSpace.InternalPoly2D(lPoly, 1); rSpace.InternalPoly2D(rPoly, 1); } int nPrFlag1 = ptPick & lPoly; int nPrFlag2 = ptPick & rPoly; if (nPrFlag1 == PR_INSIDE && nPrFlag2 == PR_INSIDE) { ads_real nArea1 = lPoly.Area(); ads_real nArea2 = rPoly.Area(); if (nArea1 < nArea2) { poly = lPoly; nWho = 1; } else { poly = rPoly; nWho = 2; } nRet = RTNORM; } else if (nPrFlag1 == PR_INSIDE) { poly = lPoly; nWho = 1; nRet = RTNORM; } else if (nPrFlag2 == PR_INSIDE) { poly = rPoly; nWho = 2; nRet = RTNORM; } else { ads_real nArea1 = lPoly.Area(); ads_real nArea2 = rPoly.Area(); if (nArea1 > nArea2) { poly = lPoly; nWho = 1; } else { poly = rPoly; nWho = 2; } nRet = RTNORM; bSubtract = FALSE; } } else if (pNearestWall) { lSpace.Reset(); rSpace.Reset(); if (aSearch.SearchOneSpace(*pNearestWall, 0, lSpace) == RTNORM) { if (bCenter) { lSpace.CenterPoly2D(poly); } else { lSpace.InternalPoly2D(poly, 1); } if ((ptPick & poly) == PR_INSIDE) { nWho = 1; nRet = RTNORM; } } else if (aSearch.SearchOneSpace(*pNearestWall, 1, rSpace) == RTNORM) { if (bCenter) { rSpace.CenterPoly2D(poly); } else { rSpace.InternalPoly2D(poly, 1); } if ((ptPick & poly) == PR_INSIDE) { nWho = 2; nRet = RTNORM; } } } if (!bCenter && nWho) { //扣除柱子部分 TAecSpaceCell *pSpace = nWho == 1 ? &lSpace : &rSpace; if (bSubtract == FALSE) { poly.Reset(); pSpace->InternalPoly2D(poly, 2); g_bFindExtSpace = TRUE; } } poly.Compress(); if (nRet == RTNORM && poly.PathArea() > 0.0) { poly.Reverse(); //确保为逆时针 } return nRet; } void PrePlot() { g_bPrinting = TRUE; TGSetVar(_T("SORTENTS"), 127); TPickEntSet ssMaskObj(SS_FREE); // TRBList mask(RTDXF0, _T("ATS_SPACE,ATS_TEXT"), NULL); // 房间对象无法使用wipeout方式屏蔽 -- wyg20090804 // sg modify 091105,暂时恢复房间对象屏蔽CAD填充的功能,等待房间对象屏蔽自身填充功能修改后,再去掉 // TRBList mask(RTDXF0, _T("ATS_TEXT"), NULL); //modify by xlc on 110519 阳台不增加wipeout //modify by xlc on 110314 阳台增加wipeout TRBList mask(RTDXF0, _T("ATS_SPACE,ATS_TEXT"), NULL); //TRBList mask(RTDXF0, _T("ATS_SPACE,ATS_TEXT,ATS_BALCONY"), NULL); if (ssMaskObj.Get(_T("X"), NULL, NULL, mask) == RTNORM) { long lCount = ssMaskObj.Length(); for (long idx = 0L; idx < lCount; idx++) { TEntitySet ent = ssMaskObj[idx]; AcDbVoidPtrArray ssWipeouts; OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt != NULL) { if (pEnt->isKindOf(TDbText::desc())) { AcDbEntity *pWipeOut = ((TDbText *)pEnt)->CreateWipeOut(); if (pWipeOut) { ssWipeouts.append(pWipeOut); } } else if (pEnt->isKindOf(TDbSpace::desc())) { // add by xlc on 101201 解决带填充的房间对象打印预览后顺序变化的问题 if(((TDbSpace *)pEnt)->HasHatch() && !!((TDbSpace *)pEnt)->GetHatchStyle()) { continue; } ((TDbSpace *)pEnt)->CreateWipeOut(ssWipeouts); } //else if (pEnt->isKindOf(TDbBalcony::desc())) //{ // AcDbEntity *pWipeOut = ((TDbBalcony *)pEnt)->CreateWipeOut(); // if (pWipeOut) // { // ssWipeouts.append(pWipeOut); // } //} int num = ssWipeouts.length(); for (int n = 0; n < num; n++) { AcDbEntity *pWipeOut = (AcDbEntity *)ssWipeouts[n]; pWipeOut->setLayer(InitLayer(_T("_TCH_WIPEOUT"), FALSE)); AcDbObjectId idInsert = pEnt->objectId(); AcDbObjectId idWipeOut = AddToModelSpace(pWipeOut, TRUE); pEnt->swapIdWith(idWipeOut); } } OPENOBJ_END(); } } AcDbObjectId idLayMask = InitLayer(LAY_MASK, FALSE); TPickEntSet ssOld(SS_FREE); if (ssOld.Get(_T("X"),NULL,NULL,TRBList(RTDXF0, _T("AEC_BLOCK_INSERT,ATS_MVINSERT"), 8, LAY_MASK, NULL)) == RTNORM) { ssOld.Erase(); } TPickEntSet ssMask(SS_FREE); if (ssMask.Get(_T("X"), NULL, NULL, TRBList(RTDXF0, _T("AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL)) == RTNORM) { AcDbObjectIdArray idArray; AcRxClass* pClass = AcRxClass::cast(acrxClassDictionary->at(_T("AcDbWipeout"))); long lCount = ssMask.Length(); for (long idx = 0L; idx < lCount; idx++) { TEntitySet ent = ssMask[idx]; AcDbEntity *pEnt; AcDbObjectId idEnt; acdbGetObjectId(idEnt, ent.name); BOOL bMaskWipeOut = FALSE; if (acdbOpenObject(pEnt, idEnt, AcDb::kForRead) == Acad::eOk && pEnt != NULL) { AcDbObjectId idBlock; if (pEnt->isKindOf(TDbMultiViewInsert::desc())) { TDbMultiViewInsert *pIns = TDbMultiViewInsert::cast(pEnt); idBlock = pIns->GetBlockId(FALSE); } else if (pEnt->isKindOf(TDbBlockInsert::desc())) { TDbBlockInsert *pIns = TDbBlockInsert::cast(pEnt); idBlock = pIns->blockTableRecord(); } if (idArray.contains(idBlock)) { bMaskWipeOut = TRUE; } else { OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock); if (pBlock && IsMaskBlock(*pBlock, pClass)) { bMaskWipeOut = TRUE; } OPENOBJ_END(); if (bMaskWipeOut) { idArray.append(idBlock); } } pEnt->close(); } if (bMaskWipeOut) { if (acdbOpenObject(pEnt, idEnt, AcDb::kForWrite) == Acad::eOk ) { AcDbBlockReference *pNewBlock = NULL; TCString sBlock3d; if (pEnt->isKindOf(TDbMultiViewInsert::desc())) { TDbMultiViewInsert *pIns = TDbMultiViewInsert::cast(pEnt); pNewBlock = pIns->NewBlock(FALSE); sBlock3d = GetSymbolName(pIns->GetBlockId(TRUE)); } else if (pEnt->isKindOf(TDbBlockInsert::desc())) { TDbBlockInsert *pIns = TDbBlockInsert::cast(pEnt); pNewBlock = pIns->NewBlockInsert(); } ASSERT(pNewBlock); resbuf *rb = NULL; if (!sBlock3d) { rb = ads_buildlist(1001, _T("_TCH_MASK"), 1070, 1, NULL); } else { rb = ads_buildlist(1001, _T("_TCH_MASK"), 1070, 2, 1000, (const TCHAR *)sBlock3d, NULL); } Acad::ErrorStatus es = pEnt->handOverTo(pNewBlock); if (es == Acad::eObjectToBeDeleted) { if (!XSymbolTable(_T("APPID"), _T("_TCH_MASK"))) { ads_regapp(_T("_TCH_MASK")); } pNewBlock->setXData(rb); pNewBlock->close(); delete pEnt; } else { pEnt->close(); delete pNewBlock; } ads_relrb(rb); } } } } } void PostPlot() { TPickEntSet ssMaskObj(SS_FREE); TRBList mask(RTDXF0, _T("WIPEOUT"), 8, _T("_TCH_WIPEOUT"), NULL); if (ssMaskObj.Get(_T("X"), NULL, NULL, mask) == RTNORM) //文字屏蔽产生的临时物体 { ssMaskObj.Erase(); } TPickEntSet ssMask(SS_FREE); if (ssMask.Get(_T("X"), NULL, NULL, TRBList(RTDXF0, _T("INSERT"), 1001, _T("_TCH_MASK"), NULL)) == RTNORM) { long lCount = ssMask.Length(); for (long idx = 0L; idx < lCount; idx++) { TEntitySet ent = ssMask[idx]; AcDbBlockReference *pInsert1 = NULL; AcDbObjectId idEnt; acdbGetObjectId(idEnt, ent.name); if (acdbOpenObject(pInsert1, idEnt, AcDb::kForWrite) == Acad::eOk && pInsert1 != NULL) { resbuf *rbXData = pInsert1->xData(_T("_TCH_MASK")); AcDbObjectId idBlock3d; if (rbXData) { resbuf *rbNext = rbXData->rbnext; if (rbNext && rbNext->restype == 1070 && rbNext->resval.rint == 2) { rbNext = rbNext->rbnext; if (rbNext && rbNext->restype == 1000) { idBlock3d = GetBlockIdFromString(rbNext->resval.rstring); } } ads_relrb(rbXData); } AcDbEntity *pNewEnt = NULL; if (idBlock3d.isValid()) { TDbMultiViewInsert *pInsert2 = new TDbMultiViewInsert; pInsert2->setPropertiesFrom(pInsert1); pInsert2->SetBlockId(FALSE, pInsert1->blockTableRecord()); pInsert2->SetBlockId(TRUE, idBlock3d); TADSGePoint3d ptLoc = pInsert1->position(); pInsert2->SetLocation(ptLoc); pInsert2->SetScaleFactors(pInsert1->scaleFactors()); pInsert2->SetRotation(pInsert1->rotation()); pNewEnt = pInsert2; } else { TDbBlockInsert *pInsert2 = new TDbBlockInsert; pInsert2->setPropertiesFrom(pInsert1); pInsert2->setBlockTableRecord(pInsert1->blockTableRecord()); pInsert2->setNormal(pInsert1->normal()); pInsert2->setPosition(pInsert1->position()); pInsert2->setScaleFactors(pInsert1->scaleFactors()); pInsert2->setRotation(pInsert1->rotation()); pNewEnt = pInsert2; } Acad::ErrorStatus es = pInsert1->handOverTo(pNewEnt); if (es == Acad::eObjectToBeDeleted) { resbuf *xd = ads_buildlist(1001, _T("_TCH_MASK"), NULL); if (!XSymbolTable(_T("APPID"), _T("_TCH_MASK"))) { ads_regapp(_T("_TCH_MASK")); } pNewEnt->setXData(xd); pNewEnt->close(); delete pInsert1; ads_relrb(xd); } else { pInsert1->close(); delete pNewEnt; } } } } g_bPrinting = FALSE; } void InitDbWallPatch(BOOL bTrue) { if (bTrue) { TDbWallPatch::rxInit(); TDbWallPatch::SetEditMethod(EditWallPathc0); TDbWallPatch::InitMatchProtocol(TRUE); } else { TDbWallPatch::InitMatchProtocol(FALSE); deleteAcRxClass(TDbWallPatch::desc()); } } void InitDbWall(BOOL bTrue) { if (bTrue) { TDbWall::rxInit(); acrxBuildClassHierarchy(); TDbWall::InitMatchProtocol(TRUE); } else { TDbWall::InitMatchProtocol(FALSE); deleteAcRxClass(TDbWall::desc()); } } void InitDbColumn(BOOL bTrue) { if (bTrue) { TDbColumn::rxInit(); acrxBuildClassHierarchy(); TDbColumn::InitMatchProtocol(TRUE); } else { TDbColumn::InitMatchProtocol(FALSE); deleteAcRxClass(TDbColumn::desc()); } } void InitDbPolyCurveEnt(BOOL bTrue) { if (bTrue) { TDbPolyCurveEnt::rxInit(); acrxBuildClassHierarchy(); TDbPolyCurveEnt::InitMatchProtocol(TRUE); } else { TDbPolyCurveEnt::InitMatchProtocol(FALSE); deleteAcRxClass(TDbPolyCurveEnt::desc()); } } void InitDbBlockInsert(BOOL bTrue) { if (bTrue) { TDbBlockInsert::rxInit(); TDbMultiViewInsert::rxInit(); acrxBuildClassHierarchy(); TDbMultiViewInsert::InitMatchProtocol(TRUE); } else { deleteAcRxClass(TDbBlockInsert::desc()); deleteAcRxClass(TDbMultiViewInsert::desc()); } } void InitDbProtectEntity(BOOL bTrue) { if (bTrue) { TDbProtectEntity::rxInit(); acrxBuildClassHierarchy(); TDbProtectEntity::SetEditMethod(EditProtectEntity); TDbProtectEntity::InitMatchProtocol(TRUE); } else { TDbProtectEntity::InitMatchProtocol(FALSE); deleteAcRxClass(TDbProtectEntity::desc()); } } //COMMAND:TProtect void ProtectEntity() { TchGeLib::adsout<<_T("\n执行本命令前,请先备份图形!"); TPickEntSet ss(SS_FREE); TRBList mask1 = ads_buildlist(-4, _T(""), NULL); if (SelectEntities(_T("\n选择需要保护的图元<退出>:"),ss,mask1) != RTNORM) { return; } TRBList mask(RTDXF0, _T("VIEWPORT"), NULL); ss.BaseExclude(mask); if (ss.Length() < 1) { return; } TDbProtectEntity *pNewEntity = new TDbProtectEntity; AcDbObjectId idEnt = pNewEntity->AddToCSpace(Adesk::kFalse); pNewEntity->createExtensionDictionary(); AcDbObjectId idDict = pNewEntity->extensionDictionary(); pNewEntity->close(); AcDbDictionary *pDict = NULL; acdbOpenObject(pDict,idDict,AcDb::kForWrite); if (pDict == NULL) { TchGeLib::adsout<<_T("建立只读对象失败!"); delete pNewEntity; return; } AcDbBlockTableRecord *pRecord = new AcDbBlockTableRecord; pRecord->setName(_T("TCH_PR")); AcDbObjectId idRecord; Acad::ErrorStatus es = pDict->setAt(DICT_ENTRY_NAME,pRecord,idRecord); pRecord->close(); pDict->close(); AcDbObjectIdArray idArray; ss.AsIdArray(idArray); long count = idArray.length(); AcDbIdMapping idMap; es = acdbHostApplicationServices()->workingDatabase()->deepCloneObjects(idArray,idRecord,idMap); if (es != Acad::eOk) { TchGeLib::adsout<<_T("建立只读对象失败!"); } else { ss.Erase(); } EditProtectEntity(idEnt); } // 修改图块, 屏蔽或取消屏蔽 int ModifyInsert(Entity ent, int nMaskFlag) { AcDbObjectId idBlock; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); if(!pEnt) { return RTERROR; } if(pEnt->isKindOf(TDbMultiViewInsert::desc())) { TDbMultiViewInsert *pIns=TDbMultiViewInsert::cast(pEnt); idBlock=pIns->GetBlockId(FALSE); } else if(pEnt->isKindOf(AcDbBlockReference::desc())) { AcDbBlockReference *pIns=AcDbBlockReference::cast(pEnt); idBlock=pIns->blockTableRecord(); } OPENOBJ_END(); if(!idBlock) { return RTERROR; } if((nMaskFlag&BIF_POLYMASK)) { XPoly2D x(1); if(GetBlockBoundary(idBlock, x, TRUE)!=RTNORM) { TchGeLib::adsout << _T("\n无法确定图块的精确边界!"); return RTERROR; } } if(InitBlockWipeout(idBlock, nMaskFlag)) { PickSet ss(SS_FREE); if(ss.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL))==RTNORM) { UpdateGraphic(ss); } } else { return RTERROR; } return RTNORM; } //COMMAND:TUnProtect void UnProtect() { TEntitySet ent; if (SelectEntity(_T("\n选择保护图元:"),ent,TRBList(RTDXF0,_T("ATS_PROTECT_ENTITY"),NULL)) != RTNORM) { return; } OPENOBJ_BEGIN(ent,AcDb::kForWrite,TDbProtectEntity,pEnt); if (pEnt != NULL) { if (UnProtect(pEnt)) { pEnt->erase(); } } OPENOBJ_END(); } // Command: 取消屏蔽 //支持删除wipeout,modified by W on 081217 void BlockUnMask() { TPushAcadVar cmdecho(_T("CMDECHO"), 0); SHads_command(RTSTR,_T("WIPEOUT"),RTSTR,_T("F"),RTSTR,_T("On"),RTNONE); TRBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT,WIPEOUT"), NULL); TPickEntSet ss(SS_FREE); if (SelectEntities(_T("\n选择图块或屏蔽对象:"), ss, mask) == RTNORM) { long lCount = ss.Length(); for (long i = 0L; i < lCount; i++) { TEntitySet ent = ss[i]; if (ent.Is(_T("WIPEOUT"))) { ent.Delete(); } else { if (ModifyInsert(ent, 0) != RTNORM) { } } } } SHads_command(RTSTR,_T("WIPEOUT"),RTSTR,_T("F"),RTSTR,_T("Off"),RTNONE); //还无法判断wipeout框状态,所以就关了,(保存在AcDbDictionary系统词典) } // Command: 矩形屏蔽 void BringFront1() { TEntitySet ent; TRBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL); if (SelectEntity(_T("\n选择图块:"), ent, mask) == RTNORM) { if (ModifyInsert(ent, BIF_RECTMASK) != RTNORM) { TchGeLib::adsout << _T("\n无法完成矩形屏蔽!"); } } } // Command: 精确屏蔽 void BringFront2() { TEntitySet ent; TRBList mask(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL); if (SelectEntity(_T("\n选择图块:"), ent, mask) == RTNORM) { if (ModifyInsert(ent, BIF_POLYMASK) != RTNORM) { TchGeLib::adsout << _T("\n无法完成精确屏蔽!"); } } } // Command: 转化图块 void ConvertInsert() { TEntitySet ent; TRBList mask(RTDXF0, _T("INSERT"), NULL); if (SelectEntity(_T("\n选择图块:"), ent, mask) == RTNORM) { int nAttribFlag; int nRet = RTERROR; if (ent.GetData(66, &nAttribFlag) == RTNORM && nAttribFlag != 0) { TchGeLib::adsout << _T("\n存在属性,不能转化!"); return; } AcDbBlockReference *pInsert1 = NULL; AcDbObjectId idEnt; acdbGetObjectId(idEnt, ent.name); if (acdbOpenObject(pInsert1, idEnt, AcDb::kForWrite) == Acad::eOk && pInsert1 != NULL) { if (pInsert1->isKindOf(AcDbMInsertBlock::desc())) { TchGeLib::adsout << _T("\n多重引用块,不能转化!"); pInsert1->close(); return; } AcDbObjectId idBlock = pInsert1->blockTableRecord(); TDbBlockInsert *pInsert2 = new TDbBlockInsert; pInsert2->setPropertiesFrom(pInsert1); pInsert2->setNormal(pInsert1->normal()); pInsert2->setBlockTableRecord(idBlock); pInsert2->setPosition(pInsert1->position()); pInsert2->setScaleFactors(pInsert1->scaleFactors()); pInsert2->setRotation(pInsert1->rotation()); Acad::ErrorStatus es = pInsert1->handOverTo(pInsert2); if (es == Acad::eObjectToBeDeleted) { pInsert2->close(); delete pInsert1; } else { delete pInsert2; pInsert1->close(); } } } } // 用在设置宽度的命令 static int _GetWallWidth() { resbuf *rb, *ebuf = ads_getargs(); if (ebuf) { rb = ebuf; if (rb) { if (rb->restype == RTREAL) { g_nIntWallWidth = _AS_MM(rb->resval.rreal); } else if (rb->restype == RTSHORT) { g_nIntWallWidth = _AS_MM(rb->resval.rint); } rb = rb->rbnext; } if (rb) { if (rb->restype == RTREAL) { g_nIntWidth = _AS_MM(rb->resval.rreal); } else if (rb->restype==RTSHORT) { g_nIntWidth = _AS_MM(rb->resval.rint); } rb = rb->rbnext; } if (rb) { if (rb->restype == RTREAL) { g_nExtWidth = _AS_MM(rb->resval.rreal); } else if (rb->restype == RTSHORT) { g_nExtWidth = _AS_MM(rb->resval.rint); } rb = rb->rbnext; } if (rb) { ads_real nOldLen = minLenWall; if (rb->restype == RTREAL) { minLenWall = _AS_MM(rb->resval.rreal); } else if (rb->restype == RTSHORT) { minLenWall = _AS_MM(rb->resval.rint); } rb = rb->rbnext; if (minLenWall < 0) { minLenWall = nOldLen; } } ads_relrb(ebuf); return RTNORM; } return RTERROR; } // Command: // 设置缺省的墙宽 int SetWallWidth() { if(_GetWallWidth()==RTNORM) { return RTNORM; } TCString iw(_T("\n内墙宽<%g>: "), _AS_SYS_UNIT(g_nIntWallWidth)); TCString intw(_T("\n外墙内侧宽<%g>: "), _AS_SYS_UNIT(g_nIntWidth)); TCString extw(_T("\n外墙外侧宽<%g>: "), _AS_SYS_UNIT(g_nExtWidth)); ads_real r1, r2, r3; int rc = -1; ads_initget(RSG_NONEG|RSG_NOZERO, NULL); rc = ads_getreal(iw, &r1); if (rc == RTERROR || rc==RTCAN) { return rc; } else if (rc == RTNORM) { g_nIntWallWidth=_AS_MM(r1); } rc = ads_getreal(intw, &r2); if (rc == RTERROR || rc == RTCAN) { return rc; } else if (rc == RTNORM) { g_nIntWidth=_AS_MM(r2); } rc = ads_getreal(extw, &r3); if (rc == RTERROR || rc == RTCAN) { return rc; } else if (rc == RTNORM) { g_nExtWidth = _AS_MM(r3); } return RTNORM; } //对象编辑 int EditProtectEntity(AcDbObjectId id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbProtectEntity, pEnt); if (pEnt != NULL) { if (pEnt->CanExplode()) //可分解时,设置新密码 { if (pEnt->upgradeOpen() == Acad::eOk) { CTemporaryResourceOverride vTemp; CProtectSetDlg dlg(pEnt); dlg.DoModal(); pEnt->downgradeOpen(); } } else //不能分解时,输入旧密码 { TCHAR sCode1[256] = _T(""); if (acedGetString(NULL,_T("\n输入密码<退出>:"),sCode1) == RTNORM) { if (pEnt->upgradeOpen() == Acad::eOk) { pEnt->SetCode1(sCode1); pEnt->downgradeOpen(); if (!pEnt->CanExplode()) { TchGeLib::adsout<<_T("\n密码错误!"); } else { TchGeLib::adsout<<_T("\n密码正确,此只读对象进入可分解、可通过对象编辑修改保护权限的临时状态!"); } } } } } OPENOBJ_END(); return RTNORM; } bool UnProtect(TDbProtectEntity*pEnt) { AcDbBlockTableRecord *pRecord = NULL; acdbOpenObject(pRecord,pEnt->GetBlockRecordId(),AcDb::kForWrite); if (pRecord != NULL) { AcDbBlockTableRecordIterator *pIter = NULL; pRecord->newIterator(pIter); if (pIter != NULL) { AcDbObjectIdArray idArray; for (pIter->start(); !pIter->done(); pIter->step()) { AcDbObjectId id; AcDbEntity *pSubEnt; pIter->getEntity(pSubEnt,AcDb::kForWrite); if (pSubEnt != NULL) { TDbProtectEntity* pProtect = TDbProtectEntity::cast(pSubEnt); if (pProtect != NULL) { UnProtect(pProtect); } else { pIter->getEntityId(id); idArray.append(id); } pSubEnt->close(); } } if (idArray.length() > 0) { AcDbObjectId idMSpace; { TAcDbBlockTableRecPtr mspace(ACDB_MODEL_SPACE, AcDb::kForWrite); idMSpace = mspace.m_pBlockTableRec->objectId(); } AcDbIdMapping idMap; Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->deepCloneObjects(idArray,idMSpace,idMap); int pos; idArray.find(NULL,pos); } delete pIter; } pRecord->erase(); pRecord->close(); } return true; } int DragInsertBlock1(const TCHAR *szBlock, int nFlag, const AcGeScale3d &scales) { TADSGePoint3d ptInsert; VERIFY(TGGetVar(_T("VIEWCTR"), &ptInsert) == RTNORM); AcDbObjectId idInsert = (nFlag&IBF_TINSERT) ? MakeTBlockInsert(szBlock,ptInsert, scales[0], scales[1], scales[2],Ucs2Wcs(0),0) : MakeBlockInsert(szBlock,ptInsert, scales[0], scales[1], scales[2], Ucs2Wcs(0)); if (!idInsert) { return RTERROR; } TEntitySet ent; VERIFY(acdbGetAdsName(ent.name, idInsert) == Acad::eOk); OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); ASSERT(pEnt); pEnt->draw(); OPENOBJ_END(); int rc = RTNORM; ptInsert = Wcs2Ucs(ptInsert); while(rc == RTNORM) { rc = IDragInsertBlock(ptInsert, ent, nFlag); if (rc == RTNORM && (nFlag&IBF_MINSERT)) { TPushAcadVar osmode(_T("OSMODE"), 0); SHads_command(RTSTR, _T(".COPY"), RTENAME, (TLong_ptr *)ent, RTSTR, _T(""), RT3DPOINT, &ptInsert,RT3DPOINT, &ptInsert, RTNONE); ent.FreeGroups(); ent.GetLast(); } else { break; } } return rc; } int IDragInsertBlock(TADSGePoint3d &ptBase, TEntitySet &ent, int nFlag) { double nScale = 1.0; ent.GetData(41, &nScale); TPickEntSet ss(SS_FREE); ss += ent; int nOptFlag = IBF_ROT90|IBF_MIRLR|IBF_MIRUD|IBF_ALIGN|IBF_FRAME|IBF_ROTATE|IBF_BASEPT|IBF_RESEL|IBF_SCALE; TCString szPrompt(256); szPrompt << _T("\n点取插入点或 "); if (nFlag & nOptFlag) { szPrompt << _T("["); } BOOL bInitOption = FALSE; int nOptionArray[9] = {IBF_ROT90,IBF_MIRLR,IBF_MIRUD,IBF_ALIGN,IBF_FRAME,IBF_ROTATE,IBF_BASEPT,IBF_RESEL,IBF_SCALE}; const TCHAR * szOptionPrompt[9] = {_T("转90(A)"), _T("左右(S)"), _T("上下(D)"), _T("对齐(F)"), _T("外框(E)"), _T("转角(R)"), _T("基点(T)"), _T("更换(C)"), _T("比例(X)"),}; TCHAR szKeywordArray[10] = _T("ASDFERTCX"); TCString sKeywords; for (int n = 0; n < 9; n++) { if (nFlag&nOptionArray[n]) { if (bInitOption) { szPrompt << _T("/"); sKeywords << _T(" "); } bInitOption = TRUE; szPrompt << szOptionPrompt[n]; TCHAR szTemp[2] = _T(""); szTemp[0] = szKeywordArray[n]; szTemp[1] = EOS; sKeywords << szTemp; } } if (nFlag & nOptFlag) { szPrompt << _T("]"); } szPrompt << _T("<退出>:"); int rc = 0; TCHAR draggenprompt[512] = _T(""); int cur = 0; TADSGePoint3d ptFinal; //modify by xlc on 081019 水专业插图库时预览位置不正确 //g_ptBase = ptBase; TAdvanceSampler::g_ptBase = ptBase; TchGeLib::adsout << szPrompt; LAB_DRAG: ss.RedrawAll(2); sKeywords<<_T(" ~"); INITGET_BEG(0, !sKeywords? NULL : (const TCHAR *)sKeywords); //modify by xlc on 081019 水专业插图库时预览位置不正确 //rc = ads_draggen(ss, draggenprompt, cur, MoveSamplerStatic, ptFinal); rc = ads_draggen(ss, draggenprompt, cur, TAdvanceSampler::MoveSampler, ptFinal); INITGET_END(); if (rc == RTKWORD) { TADSGePoint3d g_ptNewBase = GetCursorWcs(); TCString sKeyChar; VERIFY(ads_getinput(sKeyChar) == RTNORM); ads_matrix mat; //modify by xlc on 081019 水专业插图库时预览位置不正确 //Ucs2Wcs( g_ptBase).GetMoveMatrix(g_ptNewBase, mat); Ucs2Wcs( TAdvanceSampler::g_ptBase).GetMoveMatrix(g_ptNewBase, mat); VERIFY(ads_xformss(ss, mat) == RTNORM); ads_printf(_T("%c%c %c"), 8,8,8); //modify by xlc on 081019 水专业插图库时预览位置不正确 //g_ptBase = Wcs2Ucs(g_ptNewBase); TAdvanceSampler::g_ptBase = Wcs2Ucs(g_ptNewBase); if (sKeyChar[0] == _T('A') || sKeyChar[0] == _T('S') || sKeyChar[0] == _T('D')) { TPushAcadVar nMode(_T("OSMODE"), 0); TADSGePoint3d ptOther; //modify by xlc on 081019 水专业插图库时预览位置不正确 //if (sKeyChar[0] == _T('S')) //{ // ptOther = g_ptBase+TADSGePoint3d(0,100,0); // SHads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, & g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), RTNONE); //} //else if (sKeyChar[0] == _T('D')) //{ // ptOther = g_ptBase+TADSGePoint3d(100,0,0); // SHads_command(RTSTR, _T(".MIRROR"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, & g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), RTNONE); //} //else if (sKeyChar[0] == _T('A')) //{ // SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, & g_ptBase, RTREAL, 90.0, RTNONE); //} if (sKeyChar[0] == _T('S')) { ptOther = TAdvanceSampler::g_ptBase+TADSGePoint3d(0,100,0); SHads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, & TAdvanceSampler::g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), RTNONE); } else if (sKeyChar[0] == _T('D')) { ptOther = TAdvanceSampler::g_ptBase+TADSGePoint3d(100,0,0); SHads_command(RTSTR, _T(".MIRROR"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, & TAdvanceSampler::g_ptBase, RT3DPOINT, &ptOther, RTSTR, _T("Y"), RTNONE); } else if (sKeyChar[0] == _T('A')) { SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, & TAdvanceSampler::g_ptBase, RTREAL, 90.0, RTNONE); } rc = RTNORM; } else if (sKeyChar[0] == _T('C')) { rc = IBF_RESEL; } else if (sKeyChar[0] == _T('X')) { CString csPrompt; double nNewScale(nScale); csPrompt.Format(_T("\n请输入比例:<%.1f> "), nScale); ads_getreal(csPrompt, &nNewScale); nScale = nNewScale / nScale; //modify by xlc on 081019 水专业插图库时预览位置不正确 //SHads_command(RTSTR, _T(".SCALE"), RTPICKS, (long *)ss, RTSTR, _T(""), // RT3DPOINT, & g_ptBase, RTREAL, nScale, RTNONE); rc = SHads_command(RTSTR, _T(".SCALE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, & TAdvanceSampler::g_ptBase, RTREAL, nScale, RTNONE); nScale = nNewScale; if (rc == RTNORM) { TchGeLib::adsout << szPrompt; } } else if (sKeyChar[0] == _T('R')) { double nRot = 0.0; TchGeLib::adsout << _T("\n旋转角度: "); //modify by xlc on 081019 水专业插图库时预览位置不正确 //rc = SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, // RTSTR, _T(""), RT3DPOINT, & g_ptBase, RTSTR, _T("\\"), RTNONE); rc = SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, & TAdvanceSampler::g_ptBase, RTSTR, _T("\\"), RTNONE); if (rc == RTNORM) { TchGeLib::adsout << szPrompt; } } else if (sKeyChar[0] == _T('T')) { int nOsMode = 0; TGGetVar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; TPushAcadVar vOsMode(_T("OSMODE"), nOsMode); //modify by xlc on 081019 水专业插图库时预览位置不正确 //rc = GetPickPoint(NULL, _T("\n输入插入点"), g_ptBase); rc = GetPickPoint(NULL, _T("\n输入插入点"), TAdvanceSampler::g_ptBase); if (rc == RTNORM) { TchGeLib::adsout << szPrompt; } } else if (sKeyChar[0] == _T('E')) { OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); ASSERT(pEnt); pEnt->draw(); OPENOBJ_END(); ss.RedrawAll(2); TADSGePoint3d ptCorn1, ptCorn2; rc = GetPickPoint(NULL, _T("\n第一个角点"), ptCorn1); if (rc == RTNORM) { double m_nRot = 0.0; TADSGePoint3d ptIns; ent.FreeGroups(); ent.GetData(50, &m_nRot); TVector3D vtRot(cos(m_nRot), sin(m_nRot)); vtRot = Wcs2Ucs(vtRot, TRUE); TchGeLib::adsout << _T("\n另一个角点: "); rc = GetRectAngleStatic(ptCorn1, ads_angle(TADSGePoint3d(), vtRot), ptCorn2); if (rc == RTNORM) { ptCorn1 = Ucs2Wcs(ptCorn1); ptCorn2 = Ucs2Wcs(ptCorn2); double nAngle1 = AngleRangeTo2PI(ads_angle(ptCorn1, ptCorn2)-m_nRot); double nDist = ptCorn1.Distance2d(ptCorn2); TADSGePoint3d m_ptCen; Midpoint(ptCorn1, ptCorn2, m_ptCen); double m_nSizeX = nDist*fabs(cos(nAngle1)); double m_nSizeY = nDist*fabs(sin(nAngle1)); ads_matrix matRotOld, matMove, matScale, matRotNew, matTransform; double nSizeX, nSizeY, nSizeZ, nRot; TADSGePoint3d ptCen, ptNewCen; OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbBlockReference, pBlkSrc); ASSERT(pBlkSrc); VERIFY(GetBlockRefSizeInfo(pBlkSrc, ptIns, &nRot, ptCen, &nSizeX, &nSizeY, &nSizeZ) == RTNORM); ptNewCen = m_ptCen; ptNewCen.z += nSizeZ/2.0; // 绕旧中心旋转-nRotOld -> 绕旧中心Scale -> 平移到新中心 -> 旋转 RotNew // or // 绕旧中心旋转-nRotOld -> 绕旧中心Scale -> 旋转 RotNew -> 平移到新中心 (Current Method) AcGeScale3d bScale = pBlkSrc->scaleFactors(); double sx = 1, sy = 1, sz = 1; if (fabs(nSizeX) > 1.0E-6) { bScale[0] *= sx = m_nSizeX/nSizeX; } if (fabs(nSizeY) > 1.0E-6) { bScale[1] *= sy = m_nSizeY/nSizeY; } ptCen.GetRotationMatrix(-nRot, matRotOld); ptCen.GetScaleMatrix(sx, sy, sz, matScale); ptCen.GetRotationMatrix(m_nRot, matRotNew); ptCen.GetMoveMatrix(ptNewCen, matMove); MatrixMultiply(matTransform, matMove, matRotNew, matScale, matRotOld, NULL); ptIns.TransformBy(matTransform); //换算新的基点位置 //modify by xlc on 081019 水专业插图库时预览位置不正确 //TADSGePoint3d ptBaseWcs = Ucs2Wcs( g_ptBase); //ptBaseWcs.TransformBy(matTransform); //g_ptBase = Wcs2Ucs(ptBaseWcs); TADSGePoint3d ptBaseWcs = Ucs2Wcs( TAdvanceSampler::g_ptBase); ptBaseWcs.TransformBy(matTransform); TAdvanceSampler::g_ptBase = Wcs2Ucs(ptBaseWcs); pBlkSrc->setPosition(ptIns); pBlkSrc->setScaleFactors(bScale); OPENOBJ_END(); //modify by xlc on 081019 水专业插图库时预览位置不正确 //ptBase = g_ptBase; ptBase = TAdvanceSampler::g_ptBase; return RTNORM; } } } else if (sKeyChar[0] == _T('F')) { int nOsMode = 0; TGGetVar(_T("OSMODE"), &nOsMode); nOsMode &= ~0x4000; nOsMode |= OS_INT|OS_NEA|OS_PER|OS_END|OS_MID|OS_CEN; TPushAcadVar vOsMode(_T("OSMODE"), nOsMode); //modify by xlc on 081019 水专业插图库时预览位置不正确 //TADSGePoint3d pt1 = g_ptBase, pt2, qt1, qt2; TADSGePoint3d pt1 = TAdvanceSampler::g_ptBase, pt2, qt1, qt2; if (ads_getpoint(NULL, _T("\n对齐参考点:"), pt1) == RTNORM && ads_getpoint(pt1, _T("\n对齐参考轴:"), pt2) == RTNORM && ads_getpoint(NULL, _T("\n对齐目标点:"), qt1) == RTNORM && ads_getpoint(qt1, _T("\n对齐目标轴:"), qt2) == RTNORM) { TPushAcadVar osmode(_T("OSMODE"), 0); double nRot = AngleRangeTo2PI(ads_angle(qt1, qt2)-ads_angle(pt1, pt2)); SHads_command(RTSTR, _T(".MOVE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &pt1, RT3DPOINT, &qt1, RTNONE); SHads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""), RT3DPOINT, &qt1, RTREAL, nRot*180/PI, RTNONE); rc = RTNORM; ptBase = qt1; return rc; } } else if (sKeyChar[0] == _T('~')) { return RTNIL; } if (rc == RTNORM) { goto LAB_DRAG; } } switch (rc) { case RTNORM: { ads_matrix mat; //modify by xlc on 081019 水专业插图库时预览位置不正确 //Ucs2Wcs( g_ptBase).GetMoveMatrix(Ucs2Wcs(ptFinal), mat); Ucs2Wcs( TAdvanceSampler::g_ptBase).GetMoveMatrix(Ucs2Wcs(ptFinal), mat); VERIFY(ads_xformss(ss, mat) == RTNORM); ptBase = ptFinal; break; } case RTCAN: case RTNONE: case RTERROR: default: ent.Delete(); break; } return rc; } // 从二维图块中提取外轮廓线 int GetBoundaryFromInsert2D(TEntitySet &ent, TGGePoly2D &polyOutline) { if (GetExistOutlineFromInsert(ent, polyOutline) == RTNORM) { return RTNORM; } TDPtrList lstSegs; if (GetCurveFromInsert2D(ent, lstSegs) != RTNORM || !lstSegs) { return RTERROR; } return GetExternalBoundaryFromCurves(lstSegs, polyOutline); } void SearchSpace(TPickEntSet &ssWalls,const TDPtrList &lstColu,TDPtrList &res) { TSearchSpaceFromWall aSearch; try { aSearch.InitStart(ssWalls, lstColu); } catch (...) { TchGeLib::adsout << /*UMSG*/_T("\n发生例外情况!"); return; } TAecSpaceCell * extCell = aSearch.SearchSpaces(); TDbSpace *pDbExtSpace = NULL; for (int n = 0; nCenterPoly2D(polySpace); polySpace.SetElevation(0.0); //投影到z = 0的平面上 TADSGePoint3d ptLoc; polySpace.Center(ptLoc); ptLoc.z = 0.0; if ((ptLoc&polySpace) != PR_INSIDE) { TGGePoly polyTemp; polySpace.MapToPolygon(polyTemp, 20); if (!!polyTemp) { TGGePolygonEx polyTri(polyTemp); TDPtrList lstTri; if (polyTri.Trianglize(lstTri, TRUE) == RTNORM && !!lstTri) { TGGeTriangle *pTri = lstTri[0]; ptLoc.x = (pTri->vertex1.x+pTri->vertex2.x+pTri->vertex3.x)/3.0; ptLoc.y = (pTri->vertex1.y+pTri->vertex2.y+pTri->vertex3.y)/3.0; } } } TDbSpace *pDbSpace = new TDbSpace; pDbSpace->m_sName = _T("房间"); pDbSpace->m_ptLocation = ptLoc; pDbSpace->SetTextStyleId(InitTextStyle(TS_SPACE)); pDbSpace->UpdateFrom(*pSpace, pSpace == extCell); if (pSpace == extCell) { pDbExtSpace = pDbSpace; pDbExtSpace->m_sName = _T("建筑面积"); pDbExtSpace->m_sCode = _T("0"); } else { res.Append(pDbSpace); } } if (pDbExtSpace != NULL) { res.Append(pDbExtSpace); } } TCString GetCurCommand() { TCString sCmd; TArchPerDocData *pData = GetCurDocData(); if (pData) { sCmd = pData->m_sCurCommand; } return sCmd; } AcDbObjectId MakeBlockInsert(const TCHAR *pszBlock, TADSGePoint3d ptInsert,double sx, double sy, double sz, double rot) { AcDbObjectId idBlock = InitBlock(pszBlock); if (!idBlock) { return idBlock; } AcDbBlockReference *pInsert = new AcDbBlockReference(ptInsert, idBlock); pInsert->setScaleFactors(AcGeScale3d(sx, sy, sz)); pInsert->setRotation(rot); AcDbObjectId idInsert = AddToCurrentSpace(pInsert, Adesk::kTrue); if (!idInsert) { delete pInsert; } return idInsert; } void GetAllColumnBoundry(TDPtrList &lstClipBoundry) { TDPtrList ssColumns; GetEntFromBlockByDxf(ssColumns, _T("ATS_COLUMN")); int ssLen = ssColumns.Length(); for (long i = 0; iIsFortifyColumn()) { const TGGePoly2D &polyOut = pColumn->GetOutlinePoly(); if (!!polyOut) { TGGePoly2D *pPoly = new TGGePoly2D(polyOut); lstClipBoundry.Append(pPoly); } } } } void UpdateTDbEntity() { BOOL bSaveGlobal = DocGetIsDwgBegin(); DocSetIsDwgBegin(FALSE); TPickEntSet ss(SS_FREE); TRBList mask(RTDXF0, _T("TCH_*"), NULL); if (ss.Get(_T("X"), NULL, NULL, mask) == RTNORM) { long lCount = ss.Length(); for (long i = 0L; i < lCount; i++) { TEntitySet ent = ss[i]; OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt); if (pEnt) { pEnt->assertWriteEnabled(); } OPENOBJ_END(); } } DocSetIsDwgBegin(bSaveGlobal); } void UpdateGraphic(TPickEntSet &ss) { BOOL bOld = g_bDwgBegin; DocSetIsDwgBegin(FALSE); AcAxDocLock docLock; VERIFY(docLock.lockStatus() == Acad::eOk); long lCount = ss.Length(); for (long i = 0L; i pSq(objId, AcDb::kForWrite); if (pSq.openStatus() == Acad::eOk) { pSq->recordGraphicsModified(); pSq->downgradeOpen(); pSq->draw(); } } DocSetIsDwgBegin(bOld); } void UpdateGraphic(const TDPtrList &ss) { BOOL bOld = g_bDwgBegin; DocSetIsDwgBegin(FALSE); AcAxDocLock docLock; VERIFY(docLock.lockStatus() == Acad::eOk); int lCount = ss.Length(); for (int i = 0; iGetOutline(poly); pColu->GetColSurFacePoly2D(poly); } else { nRetCode = RTERROR; } OPENOBJ_END(); return nRetCode; } TARCH_IMPEXP int GetApplicationPath(TCHAR *vPath) { return GetApplicationPath(vPath,_hdllInstance); } // 初始化Aol库的连接 void InitAol(const TCHAR *szAppName) { if (szAppName) { TEntitySet::ApplicationName = xgAppname = szAppName; } GetApplicationPath(g_sAppPath,_hdllInstance); //确保类型之间的等价转换 assert(sizeof(TADSGePoint3d) == sizeof(AcGePoint3d)); assert(sizeof(ads_matrix) == sizeof(AcGeMatrix3d)); TCString sAcadVer; TGGetVar(_T("ACADVER"), sAcadVer); g_nAcadVer = _tstof(sAcadVer); //提醒tch_kernal导出 { TImageDrawDC dc; TImageDrawDCEx dc1; TDbWall wall; BOOL a = g_bAxisWall; TEntityBase *pBase = &wall; } } TDPtrList& GetAllSortWalls() { return TSearchSpaceFromWall::g_lstAllSortWalls; } AcDbObjectId MakeTBlockInsert(const TCHAR *pszBlock, TADSGePoint3d ptInsert, double sx, double sy, double sz, double rot, int nMask) { AcDbObjectId idBlock = InitBlock(pszBlock); if (!idBlock) { return idBlock; } TDbBlockInsert *pInsert = new TDbBlockInsert; pInsert->setBlockTableRecord(idBlock); pInsert->setPosition(ptInsert); pInsert->setScaleFactors(AcGeScale3d(sx, sy, sz)); pInsert->setRotation(rot); pInsert->SetMaskFlag(nMask); AcDbObjectId idInsert = AddToCurrentSpace(pInsert, Adesk::kTrue); if (!idInsert) { delete pInsert; } return idInsert; } void MdiOpenDwgFile(const TCHAR *pszFile, const TCHAR *pszCmdStr) { extern TCHAR g_szFileNameToOpen[]; extern TCHAR g_szInitCmdStr[]; extern CWnd *g_pContextMenu; if (g_pContextMenu) { _tcscpy(g_szFileNameToOpen, pszFile); if (pszCmdStr) { _tcscpy(g_szInitCmdStr, pszCmdStr); } else { g_szInitCmdStr[0] = EOS; } g_pContextMenu->PostMessage(WM_TCH_OPEN_FILE); } } void OpenDwgWithCurNls(CString &csFileName) { TSplitpathOperator parser(csFileName); BOOL bDxf = (_tcsicmp(parser.m_sExt, _T(".DXF")) == 0); TchExport::ConvertDwgCodePage(csFileName); if (bDxf) { if (SHads_command(RTSTR, _T(".dxfin"), RTSTR, (const TCHAR *)csFileName, RTNONE) != RTNORM) { TchGeLib::adsout << _T("\n必须为干净的空图才可以输入DXF文件!"); } } else { MdiOpenDwgFile(csFileName, NULL); } } int GetViewDrawMode() { if ((CFG_DrawMode & DRAW_2D) && !(CFG_DrawMode & DRAW_3D)) { return DRAW_2D; } else if ((CFG_DrawMode & DRAW_3D) && !(CFG_DrawMode & DRAW_2D)) { return DRAW_3D; } else if (CFG_DrawMode & (DRAW_3D | DRAW_2D)) { TADSGePoint3d viewDir; TGGetVar(_T("VIEWDIR"), &viewDir); viewDir = Ucs2Wcs(viewDir, TRUE); if (fabs(viewDir.x) > 1.0E-6 || fabs(viewDir.y) > 1.0E-6) { return DRAW_3D; } else { return DRAW_2D; } } return 0; } // 从图块中寻找_HOLE图层上的PLINE int GetExistOutlineFromInsert(const TEntitySet &e, TGGePoly2D &polyOutline) { AcDbObjectId idBlock; TEntitySet ent = e; int nCode = (ent.Is(_T("ATS_MVINSERT")) ? 1 : 2); TCString sBlock; ent.GetData(nCode, (TCHAR *)sBlock); idBlock = GetBlockIdFromString(sBlock); if (!idBlock) { return RTERROR; } ads_matrix mat; GetInsertMatrix(ent, mat); OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock); AcDbBlockTableRecordIterator* pBlockIterator = NULL; VERIFY(pBlock->newIterator(pBlockIterator) == Acad::eOk && pBlockIterator); for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEntity = NULL; VERIFY(pBlockIterator->getEntity(pEntity, AcDb::kForRead) == Acad::eOk && pEntity); TAcDbObjectPtr obj(pEntity); TCHAR *pszLayer = pEntity->layer(); if (_tcsicmp(pszLayer, LAY_BOUNDARY) != 0) { delete[] pszLayer; continue; } delete[] pszLayer; TEntitySet ent0; acdbGetAdsName(ent0.name, pEntity->objectId()); obj.Close(); if (!(!ent0)) { TGGePoly2D poly(ent0); if (!poly) { ; } else { polyOutline = poly; polyOutline.TransUCS(mat); return RTNORM; } } } OPENOBJ_END(); return RTERROR; } // poly2d--UCS int GetClipBoundary1(TGGePoly2D &poly2d) { TADSGePoint3d ptStart; TchGeLib::adsout << _T("\n矩形的第一个角点或 [多边形裁剪(P)/多段线定边界(L)/图块定边界(B)]<退出>:"); int nCode; INITGET_BEG(0, _T("P L B")); nCode = ads_getpoint(NULL, _T(""), ptStart); INITGET_END(); if (nCode != RTKWORD && nCode != RTNORM) { return nCode; } TGGiScreenDrawStream dc; dc.m_nDrawMode = 1; if (nCode == RTNORM) { TADSGePoint3d ptOther; int nCode = GetCornerPoint(ptStart, _T("\n另一个角点<退出>:"), ptOther); if (nCode != RTNORM) { return nCode; } TGGeRectAngle rect(ptStart, ptOther); rect.AsPoly2D(poly2d); dc << poly2d; } else { nCode = RTNORM; TCString sKey; ads_getinput(sKey); if (sKey[0] == _T('P')) { if (ads_getpoint(NULL, _T("\n多边形起点<退出>:"), ptStart) != RTNORM) { return RTERROR; } TADSGePoint3d pt2; TDPtrStack aStack; aStack.Push(new TADSGePoint3d(ptStart)); while(1) { TADSGePoint3d &ptFrom = *aStack.Top(); if (aStack.Length() >= 3) { TchGeLib::adsout << _T("\n下一点或 [回退(U)]<封闭>: "); } else { TchGeLib::adsout << _T("\n下一点或 [回退(U)]<退出>: "); } int rc; INITGET_BEG(0, _T("U")); rc = ads_getpoint(ptFrom, _T(""), pt2); INITGET_END(); if (rc == RTCAN) { aStack.Reset(); return rc; } else if (rc == RTKWORD) { if (*aStack.Top() != ptStart) {// Not on first state TADSGePoint3d *pPt2 = aStack.Pop(); TADSGePoint3d *pPt1 = aStack.Top(); dc.SetColor(-1); dc << TGGeLine(*pPt1, *pPt2); delete pPt2; } } else { if (rc == RTNONE) { if (aStack.Length() < 3) { return RTERROR; } else { pt2 = ptStart; } } TGGeLine ln(*aStack.Top(), pt2); if (ln.GetLength()>_DIST_SNAP) { dc.SetColor(7); dc << ln; if (!(rc == RTNONE)) { aStack.Push(new TADSGePoint3d(pt2)); } else { break; } } } } poly2d.Reset(); TADSGePoint3d *ptCur = NULL; while((ptCur = aStack.Pop()) != NULL) { poly2d.AppendNode(*ptCur); delete ptCur; } } else if (sKey[0] == _T('L')) { TEntitySet entFront; if (SelectEntity(_T("\n请选择封闭的多段线作为裁减边界<退出>: "), entFront, TRBList(RTDXF0, _T("POLYLINE,LWPOLYLINE"), 70, 1, NULL)) != RTNORM) { return RTERROR; } poly2d = TGGePoly2D(entFront); poly2d.TransUCS(TGroups(0), TGroups(1)); dc << poly2d; } else if (sKey[0] == _T('B')) { TEntitySet entFront; if (SelectEntity(_T("\n请选择图块作为裁减边界<退出>: "), entFront, TRBList(RTDXF0, _T("INSERT,AEC_BLOCK_INSERT,ATS_MVINSERT"), NULL)) != RTNORM) { return RTERROR; } if (GetBoundaryFromInsert2D(entFront, poly2d) != RTNORM) { TchGeLib::adsout << _T("\n无法搜到图块的边界!"); { return RTERROR; } } poly2d.TransUCS(TGroups(0), TGroups(1)); dc << poly2d; int nAnser = YesNoQuestion(_T("\n系统确定的图块轮廓线是否正确")); if (nAnser != Q_YES) { TchGeLib::adsout << _T("\n请用其他方法确定裁减边界!"); return RTERROR; } } } poly2d.Compress(); if (!poly2d || poly2d.Length() < 3) { return RTERROR; } return RTNORM; } template void DELETE_ARR_(T *&arr) { if (arr != NULL) { delete[] arr; arr = NULL; } } bool getSections(LPCTSTR szPath, std::vector §ions) { if (_taccess(szPath, 0x0) != 0x0) return false; DWORD dw(0), len(MAX_PATH); TCHAR *buf = new TCHAR[len]; ::memset(buf, 0, sizeof(TCHAR) * len); dw = ::GetPrivateProfileSectionNames(buf, len, szPath); while (dw == len - 2) { DELETE_ARR_(buf); len += MAX_PATH; buf = new TCHAR[len]; ::memset(buf, 0, sizeof(TCHAR) * len); dw = ::GetPrivateProfileSectionNames(buf, len, szPath); } TCHAR *psz(buf); while ((len = (DWORD)_tcslen(psz))) { sections.push_back(psz); psz += len + 1; } DELETE_ARR_(buf); return !sections.empty(); } bool getSectionContent(LPCTSTR szPath, LPCTSTR szSection, std::vector> &mapV) { if (_taccess(szPath, 0x0) != 0x0) return false; DWORD dw(0), len(MAX_PATH); TCHAR *buf = new TCHAR[len]; ::memset(buf, 0, sizeof(TCHAR) * len); dw = ::GetPrivateProfileSection(szSection, buf, len, szPath); while (dw == len - 2) { DELETE_ARR_(buf); len += MAX_PATH; buf = new TCHAR[len]; ::memset(buf, 0, sizeof(TCHAR) * len); dw = ::GetPrivateProfileSection(szSection, buf, len, szPath); } TCHAR *psz(buf); mapV.clear(); std::map::const_iterator it; int idx(-1); CString str(_T("")), pre(_T("")), back(_T("")); while ((len = (DWORD)_tcslen(psz))) { str = psz; idx = str.Find(_T('=')); if (idx != -1) { pre = str.Left(idx); back = str.Right(str.GetLength() - idx - 1); mapV.push_back(std::make_pair(pre, back)); } psz += len + 1; } DELETE_ARR_(buf); return !mapV.empty(); } bool getSectionContent(LPCTSTR szPath, LPCTSTR szSection, std::map &mapV) { std::vector> bims; getSectionContent(szPath, szSection, bims); for (size_t i = 0; i < bims.size(); ++i) { mapV.insert(bims[i]); } return !mapV.empty(); } bool setSectionContent(LPCTSTR szPath, LPCTSTR szSection, const std::map &mapV) { if (!szSection) return false; //if (_taccess(szPath, 0x0) != 0x0) return false; // 拼字符串 std::map::const_iterator it = mapV.begin(); std::wstring ss; for (; it != mapV.end(); ++it) { ss += it->first; ss += _T("="); ss += it->second; ss.push_back(_T('\0')); } ss.push_back(_T('\0')); return ::WritePrivateProfileSection(szSection, ss.c_str(), szPath) == FALSE ? false : true; } namespace { CString GetArxDir() { TCHAR szPath[MAX_PATH]; ::GetModuleFileName(_hdllInstance, szPath, MAX_PATH); CString sPath(szPath); sPath = sPath.Left(sPath.ReverseFind(_T('\\'))); return sPath; } bool getMeterUnitDraw() { #ifndef ZWCAD CString dllPath(GetArxDir() + _T("\\Dimension.arx")); #else CString dllPath(GetArxDir() + _T("\\Dimension.zrx")); #endif typedef int(_cdecl *getUnitOfDraw)(); HMODULE hmod = ::LoadLibrary(dllPath); if (!hmod) return false; getUnitOfDraw func_getUnitOfDraw = (getUnitOfDraw)::GetProcAddress(hmod, "getUnitOfDraw"); if (!func_getUnitOfDraw) { ::FreeLibrary(hmod); return false; } int nRet = func_getUnitOfDraw(); return nRet == 1 ? true : false; } bool setMeterUnitDraw(const BOOL &bMeter) { #ifndef ZWCAD CString dllPath(GetArxDir() + _T("\\Dimension.arx")); #else CString dllPath(GetArxDir() + _T("\\Dimension.zrx")); #endif typedef void(_cdecl *setUnitOfDraw)(const bool &); HMODULE hmod = ::LoadLibrary(dllPath); if (!hmod) return false; setUnitOfDraw func_setUnitOfDraw = (setUnitOfDraw)::GetProcAddress(hmod, "setUnitOfDraw"); if (!func_setUnitOfDraw) { ::FreeLibrary(hmod); return false; } func_setUnitOfDraw(bMeter); return true; } } bool _docGetPScale(double &dRet) { dRet = (g_nDefaultScale*_UNIT_SCALE); int nTileMode = 0, cvport = 0; if (TGGetVar(_T("TILEMODE"), &nTileMode) == RTNORM && nTileMode == 0 && TGGetVar(_T("CVPORT"), &cvport) == RTNORM && cvport == 1) { dRet = 1.; return true; //PAPERSPACE } XString sIni; if (FindFile(_T("ZT_config.ini"), sIni)) { std::map data; getSectionContent(sIni, _T("zt_setting"), data); std::map::const_iterator it(data.find(_T("PScale"))); if (it != data.end()) { dRet = _ttof(it->second); return true; } } return false; } bool _docSetPScale(const double &d) { XString sIni; double dRet(g_nDefaultScale*_UNIT_SCALE); if (FindFile(_T("ZT_config.ini"), sIni)) { std::map data; getSectionContent(sIni, _T("zt_setting"), data); std::map::iterator it(data.find(_T("PScale"))); if (it != data.end()) { it->second.Format(_T("%g"), d); setSectionContent(sIni, _T("zt_setting"), data); g_nDefaultScale = d; return true; } } return false; } bool _docGetMeterUnitDraw(BOOL &bMeter) { bMeter = getMeterUnitDraw(); return true; XString sIni; if (FindFile(_T("ZT_config.ini"), sIni)) { std::map data; getSectionContent(sIni, _T("zt_setting"), data); std::map::const_iterator it(data.find(_T("MeterUnitDraw"))); if (it != data.end()) { bMeter = _ttoi(it->second) == 0 ? FALSE : TRUE; return true; } } return false; } bool _docSetMeterUnitDraw(const BOOL &bMeter) { return setMeterUnitDraw(bMeter); XString sIni; if (FindFile(_T("ZT_config.ini"), sIni)) { std::map data; getSectionContent(sIni, _T("zt_setting"), data); std::map::iterator it(data.find(_T("MeterUnitDraw"))); if (it != data.end()) { it->second.Format(_T("%d"), bMeter == FALSE ? 0 : 1); setSectionContent(sIni, _T("zt_setting"), data); return true; } } return false; } double DocGetPScale() { double dRet(g_nDefaultScale*_UNIT_SCALE); if (_docGetPScale(dRet)) { return dRet; } int nTileMode = 0, cvport = 0; if (TGGetVar(_T("TILEMODE"), &nTileMode) == RTNORM && nTileMode == 0 && TGGetVar(_T("CVPORT"), &cvport) == RTNORM && cvport == 1) { return 1.0; //PAPERSPACE } TDbConfig *p = GetDwgGlobal(AcDb::kForRead, g_pCurrentDb); dRet = (p ? p->GetPScale() : g_nDefaultScale*_UNIT_SCALE); if (p) { p->close(); } } TPickEntSet & DocGetPickFirst() { TArchPerDocData *p = GetCurDocData(); ASSERT(p); if (p != NULL) { return p->m_ssPickFirst; } else { static TPickEntSet ssInvalid; return ssInvalid; } } TEntitySet& DocGetEntMouseOn() { TArchPerDocData *p = GetCurDocData(); ASSERT(p); if (p != NULL) { return p->m_entMouseOn; } else { static TEntitySet entInvalid; return entInvalid; } } TPickEntSet & DocGetPickGrip() { TArchPerDocData *p = GetCurDocData(); ASSERT(p); if (p != NULL) { return p->m_ssPickGrip; } else { static TPickEntSet ssInvalid; return ssInvalid; } } void ClearKeyboardBuffer() { TArchPerDocData * pDocDat = GetCurDocData(); if (pDocDat != NULL) { pDocDat->m_szCommandStr[0] = EOS; pDocDat->m_nPos = 0; } } bool IsLispExpress() { TArchPerDocData * pDocDat = GetCurDocData(); if (pDocDat != NULL) { return pDocDat->m_szCommandStr[0] == _T('('); } return false; } TArchPerDocData * GetCurDocData() { if (!TArchDocReactor::g_pTArchAppDocGlobals) { return NULL; } TArchPerDocData *pData = TArchDocReactor::g_pTArchAppDocGlobals->FindNode(curDoc(), TArchPerDocData::CompareForFind); return pData; } int SelectUpFace(AcGePlane &plane) { TEntitySet ent; TADSGePoint3d pt; if (ent.FilterSelect1(GetApertureWcs(), _T("\n请选择三维坡屋顶坡面<退出>:"), TRBList(), pt) != RTNORM) { return RTERROR; } BOOL bUp = TRUE; if (ent.Is(_T("3DFACE")) || ent.Is(_T("POLYLINE"))) { bUp = FALSE; } pt = Ucs2Wcs(pt); AcDbVoidPtrArray entSet; int nDrawMode = DocGetDrawMode(); DocSetDrawMode(DRAW_3D); OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); InitModel(TMasterProperties(), pEnt, NULL, entSet); OPENOBJ_END(); DocSetDrawMode(nDrawMode); int num = entSet.length(); for (int i = 0; iisA() == AcDbFace::desc()) { AcDbFace *pFace = AcDbFace::cast(pEnt); int nHitFlag = HitTestOnEdge(pFace, pt, TRUE); if (nHitFlag >= 0) { TGGe3DFace faceUcs, faceWcs; for (int n = 0; n<4; n++) { pFace->getVertexAt(n, faceWcs.GetVertex(n)); } TVector3D vtNorm = faceWcs.GetNormal(); if (vtNorm.z < 1.0E-9 && bUp) { continue; //法向不正确 } for (n = 0; n<4; n++) { faceUcs.SetVertex(n, Wcs2Ucs(faceWcs.GetVertex(n))); } if (faceUcs.IsLinear() || faceUcs.IsPoint()) { continue; } TGGiScreenDrawStream dc(7, 1); dc << faceUcs; int nCode = YesNoQuestion(_T("\n是否为加亮的坡面")); ads_redraw(NULL,0); if (nCode == RTCAN) { return nCode; } else if (nCode == Q_YES) { if (vtNorm.z<1.0E-9) { plane.set((AcGePoint3d &)faceWcs.GetVertex(2), (AcGePoint3d &)faceWcs.GetVertex(1), (AcGePoint3d &)faceWcs.GetVertex(0)); } else { plane.set((AcGePoint3d &)faceWcs.GetVertex(0), (AcGePoint3d &)faceWcs.GetVertex(1), (AcGePoint3d &)faceWcs.GetVertex(2)); } return RTNORM; } } } } ReleaseEntSet(entSet); ads_retnil(); return RTNONE; } void InitDLRegistry(HMODULE modHandle, const TCHAR *szAppName0) //应用程序名(可为任意字符)) { // 检查HKEY_LOCAL_MACHINE是否有写操作权限 HKEY hKey = NULL; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Autodesk\\AutoCAD"), 0, KEY_WRITE, &hKey)) { return; } RegCloseKey(hKey); if (g_nProductId == kTSUN) { return; } TCString sAppName; sAppName << _T("T8") << g_nProductId << szAppName0; TCHAR szAppName[256] = _T(""); _tcscpy(szAppName, sAppName); #if (ADS<16) CString strAppInfoLoc,strAppLoc; strAppInfoLoc = GetRegLocation(); strAppInfoLoc = strAppInfoLoc+_T("\\TchApps"); acrxRegisterApp((AcadApp::LoadReasons)(AcadApp::kOnCommandInvocation| AcadApp::kOnLoadRequest), szAppName, strAppInfoLoc, 2); CString strThisAppInfoLoc = strAppInfoLoc+_T("\\")+szAppName; //Name................................................... { TRegProperty regProp(strThisAppInfoLoc,_T("Name")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.SetValue(szAppName,szAppName); } //Loader................................................. { TCHAR modulePath[512]; DWORD pathLength = GetModuleFileName(modHandle, modulePath, 512); if (pathLength == 0) { assert(FALSE); return ; } TRegProperty regProp(strThisAppInfoLoc, _T("Loader")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.SetValue(_T("MODULE"),modulePath); } #else // sg modify 120228,自R19平台起,API进行了调整,下面的函数作废了 //const TCHAR *pszRegAcad=acrxProductKey(); const TCHAR *pszRegAcad=NULL; #if (ADS > 18) pszRegAcad = acdbHostApplicationServices()->getMachineRegistryProductRootKey(); #else pszRegAcad = acrxProductKey(); #endif acrxRegisterApp((AcadApp::LoadReasons)(AcadApp::kOnCommandInvocation| AcadApp::kOnLoadRequest), szAppName); TCString strThisAppInfoLoc; strThisAppInfoLoc << pszRegAcad << _T("\\Applications"); //Loader................................................. { TCHAR modulePath[512]; DWORD pathLength = GetModuleFileName(modHandle, modulePath, 512); if (pathLength == 0) { assert(FALSE); return ; } TRegProperty regProp(strThisAppInfoLoc, szAppName); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.SetValue(_T("Description"), szAppName0); regProp.SetValue(_T("Loader"), modulePath); } #endif { // Commands HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, strThisAppInfoLoc, 0L,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS) { if (RegDeleteKey(hKey, _T("Commands")) != ERROR_SUCCESS) { ; } #if (ADS>15) if (RegDeleteKey(hKey, _T("TGroups")) != ERROR_SUCCESS) { ; } #endif RegCloseKey(hKey); } } } //const TCHAR *pszCustObjInfo) //自定义实体的应用程序名列表(如果不需要监测到自定义实体时加载,可为NULL) void UpdateDLRegistry(const TCHAR *szAppName0, const STArxCommandTable cmdTable[], const UINT eleNum) { // 检查HKEY_LOCAL_MACHINE是否有写操作权限 HKEY hKey = NULL; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Autodesk\\AutoCAD"), 0, KEY_WRITE, &hKey)) { return; } RegCloseKey(hKey); if (g_nProductId == kTSUN) { return; } TCString sAppName; sAppName << _T("T8") << g_nProductId << szAppName0; TCHAR szAppName[256] = _T(""); _tcscpy(szAppName, sAppName); CString strAppInfoLoc; #if (ADS>15) // sg modify 120228,自R19平台起,API进行了调整,下面的函数作废了 //const TCHAR *pszRegAcad=acrxProductKey(); const TCHAR *pszRegAcad=NULL; #if (ADS > 18) pszRegAcad = acdbHostApplicationServices()->getMachineRegistryProductRootKey(); #else pszRegAcad = acrxProductKey(); #endif strAppInfoLoc += pszRegAcad; strAppInfoLoc += _T("\\Applications\\"); strAppInfoLoc += szAppName; CString strThisAppInfoLoc = strAppInfoLoc; #else strAppInfoLoc = GetRegLocation(); strAppInfoLoc = strAppInfoLoc+_T("\\TchApps"); CString strThisAppInfoLoc = strAppInfoLoc+_T("\\")+szAppName; #endif //Command................................................ { TRegProperty regProp(strThisAppInfoLoc, _T("Commands")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); for (UINT i = 0; i15) // Group { TRegProperty regProp(strThisAppInfoLoc, _T("TGroups")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.SetValue(szAppName0, szAppName0); } #endif } void UpdateDLRegistry(const TCHAR *szAppName0, const STExtern_fun cmdTable[], const UINT eleNum) { // 检查HKEY_LOCAL_MACHINE是否有写操作权限 HKEY hKey = NULL; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Autodesk\\AutoCAD"), 0, KEY_WRITE, &hKey)) { return; } RegCloseKey(hKey); if (g_nProductId == kTSUN) { return; } TCString sAppName; sAppName << _T("T8") << g_nProductId << szAppName0; TCHAR szAppName[256] = _T(""); _tcscpy(szAppName, sAppName); CString strAppInfoLoc; #if (ADS>15) // sg modify 120228,自R19平台起,API进行了调整,下面的函数作废了 //const TCHAR *pszRegAcad=acrxProductKey(); const TCHAR *pszRegAcad=NULL; #if (ADS > 18) pszRegAcad = acdbHostApplicationServices()->getMachineRegistryProductRootKey(); #else pszRegAcad = acrxProductKey(); #endif strAppInfoLoc += pszRegAcad; strAppInfoLoc += _T("\\Applications\\"); strAppInfoLoc += szAppName; CString strThisAppInfoLoc = strAppInfoLoc; #else strAppInfoLoc = GetRegLocation(); strAppInfoLoc = strAppInfoLoc+_T("\\TchApps"); CString strThisAppInfoLoc = strAppInfoLoc+_T("\\")+szAppName; #endif //Command................................................ { TRegProperty regProp(strThisAppInfoLoc, _T("Commands")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); for (UINT i = 0; i15) // Group { TRegProperty regProp(strThisAppInfoLoc, _T("TGroups")); regProp.SetTopRootKey(HKEY_LOCAL_MACHINE); regProp.SetValue(szAppName0, szAppName0); } #endif } void DocStatus() { Refresh_DIST_SNAP(); int nFlag = GetCustomFlag(); if (!(nFlag&CUSTOM_NO_STATUS)) { if (!g_nRunMode) { TCString sStatus; sStatus << _T("比例 1:") << DocGetPScale(); TPickEntSet ss(SS_FREE); //本次加亮的全部对象 if (ss.Get(_T("I"),NULL,NULL,TRBList(RTDXF0,_T("TCH_*"),NULL)) == RTNORM) { double nScale = -1; long len = ss.Length(); for (long i = 0;iGetPScale(); if (nScale<0) { nScale = nScale1; } else if (fabs(nScale-nScale1)>0.001) { break; } } } OPENOBJ_END() } TCString sTemp; if (i == len&&nScale>0) { sTemp << _T("比例 1:") << nScale; sStatus = sTemp; } else if (iGetPane(0); if (pPane != NULL) { pPane->SetVisible(TRUE); pPane->SetText((const TCHAR*)sStatus); pBar->Update(); } } #endif } else { #if ADS<16 TGSetVar(_T("MODEMACRO"), _T("")); #else AcApStatusBar *pBar = acedGetApplicationStatusBar(); if (pBar) { AcPane *pPane = pBar->GetPane(0); if (pPane != NULL) { pPane->SetVisible(FALSE); pPane->SetText(_T("")); pBar->Update(); } } #endif } } } int GetBlockBoundary(AcDbObjectId idBlock, TGGePoly2D &poly, BOOL bAddIfNone) { int nRet = RTNONE; OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock); if (!pBlock) { return RTERROR; } AcDbBlockTableRecordIterator* pBlockIterator = NULL; Acad::ErrorStatus es = pBlock->newIterator(pBlockIterator); ASSERT(es == Acad::eOk && !!pBlockIterator); for (pBlockIterator->start(); !pBlockIterator->done(); pBlockIterator->step()) { AcDbEntity *pEntity; es = pBlockIterator->getEntity(pEntity, AcDb::kForRead); ASSERT(es == Acad::eOk); TAcDbObjectPtr obj(pEntity); if (!pEntity->isKindOf(AcDbPolyline::desc())) { continue; } AcDbPolyline *pline = AcDbPolyline::cast(pEntity); ASSERT(pline); TCHAR *pszLayer = pEntity->layer(); ASSERT(pszLayer); TCString szPattern(256); szPattern << LAY_BOUNDARY << _T(",*|") << LAY_BOUNDARY; if (pline->isClosed() && ads_wcmatch(pszLayer, szPattern) == RTNORM) { PolyConvert(*pline, poly); delete [] pszLayer; delete pBlockIterator; return RTNORM; } delete [] pszLayer; } delete pBlockIterator; if (bAddIfNone) { TDPtrList lstSegs; ads_matrix matIdent; TGGePoly2D polyOutline(1); AsAdsMatrix(AcGeMatrix3d::kIdentity, matIdent); Get2DCurveFromBlock(*pBlock, matIdent, lstSegs); if (GetExternalBoundaryFromCurves(lstSegs, polyOutline) == RTNORM) { if (pBlock->upgradeOpen() == Acad::eOk) { AcDbPolyline *pBound = new AcDbPolyline; PolyConvert(polyOutline, *pBound); AcDbObjectId idLay = InitLayer(LAY_BOUNDARY, FALSE); arxAssureLayer(LAY_BOUNDARY, LAYSTAT_FREEZE); pBound->setLayer(idLay); VERIFY(pBlock->appendAcDbEntity(pBound) == Acad::eOk); pBound->close(); pBlock->downgradeOpen(); poly = polyOutline; nRet = RTNORM; } } } OPENOBJ_END(); return nRet; } // 取得点ptCen附近并在ptLow,ptUp内部的轴线交点 BOOL GetAxisInter(const TADSGePoint3d& ptLow, const TADSGePoint3d& ptUp, TADSGePointDir2d& ptRes) { TADSGePoint3d ptCen; Midpoint(ptLow, ptUp, ptCen); TPickEntSet ssAxis(SS_FREE), ss1(SS_FREE), ss2(SS_FREE); BOOL bNearAxis1 = (GetSafeSelection(ss1, FALSE, ptLow, ptUp, AcDbLine::desc()) == Acad::eOk); BOOL bNearAxis2 = (GetSafeSelection(ss2, FALSE, ptLow, ptUp, AcDbArc::desc()) == Acad::eOk); BOOL bNearAxis = (bNearAxis1 || bNearAxis2); ssAxis += ss1; ssAxis += ss2; if (bNearAxis) { ssAxis.BaseFilter(TRBList(8, LAY_AXIS, NULL)); bNearAxis = (ssAxis.Length() == 2); } if (!bNearAxis) { return FALSE; } BOOL bRes = FALSE; TEntitySet eAxis1 = ssAxis[0L]; TEntitySet eAxis2 = ssAxis[1L]; TGGeCurveSegment cv1(eAxis1, LS_FINITE), cv2(eAxis2, LS_FINITE); TADSGePoint3d ptInt[2]; int nIntNum = cv1.Intersection(cv2, ptInt[0], ptInt[1]); if (!nIntNum) { return FALSE; } if (nIntNum == 1) { (TADSGePoint3d &)ptRes = ptInt[0]; } else { (TADSGePoint3d &)ptRes = TGGeLine(ptInt[0], ptInt[1]).NearPoint(ptCen); } ptRes.nDirection = GetXDirection(cv1, cv2,ptRes); return TRUE; } // 选择墙的一侧 // loc(OUT) -- 墙面上的位置 // drt(OUT) -- 墙面的切向(法向+PI/2.0) int SelectWallSide(TEntitySet &entWall, TADSGePoint3d & loc, double *drt) { int nOldOsnap = g_nOsnapType; DocSetWallOsnapType(1); TEntitySet ent; TRBList mask(RTDXF0, _T("ATS_WALL,ATS_CURTAIN_WALL"), NULL); TADSGePoint3d ptPick; int nRetCode = RTNORM; if ((nRetCode = SelectEntity1(_T("\n请点取墙体一侧<退出>: "), ent, ptPick, mask)) != RTNORM) { DocSetWallOsnapType(nOldOsnap); return nRetCode; } DocSetWallOsnapType(nOldOsnap); ptPick = Ucs2Wcs(ptPick); TAcDbObjectPtr obj(ent, AcDb::kForWrite); if (!obj) { return RTERROR; } TDbWall *pWall = TDbWall::cast(obj.m_pObject); if (!pWall) { return RTERROR; } TDbWall &wall = *pWall; TGGeCurveSegment lCurve, rCurve, selCurve; wall.GetSideCurve(lCurve, rCurve); TADSGePoint3d ptLeft, ptRight; //在左右两侧的投影 if (lCurve.ProjectToMe(ptPick, ptLeft) != RTNORM || rCurve.ProjectToMe(ptPick, ptRight) != RTNORM) { return RTERROR; } if (ptPick.Distance(ptLeft) < ptPick.Distance(ptRight)) { selCurve = lCurve; } else { selCurve = rCurve; } TGGeCurveSegment segCen = wall.OffsetGeomCenter(); TADSGePoint3d ptOnCen, ptOnSide; if (segCen.ProjectToMe(ptPick, ptOnCen) != RTNORM || selCurve.ProjectToMe(ptPick, ptOnSide) != RTNORM) { TchGeLib::adsout << _T("\n请正确点取!"); return RTERROR; } double nOrthDrt = ads_angle(ptOnCen, ptOnSide); *drt = AngleRangeTo2PI(nOrthDrt+PI/2.0); loc = ptOnSide; entWall = ent; return RTNORM; } int EditWallPathc0(AcDbObjectId id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbWallPatch, pPatch); if (!pPatch) { return RTERROR; } double nElev = pPatch->GetElevation(); double nHeight = pPatch->GetHeight(); TchGeLib::adsout << _T("\n请输入墙体造型的高度或 [底标高(E)]<") << Dist2Str(nHeight) << _T(">:"); int nRet; INITGET_BEG(RSG_NONEG, _T("E")); nRet = ads_getreal(_T(""), &nHeight); INITGET_END(); if (nRet == RTNORM) { if (pPatch->upgradeOpen() == Acad::eOk) { pPatch->SetHeight(nHeight); pPatch->downgradeOpen(); } } else if (nRet == RTKWORD) { if (GetReal(_T("\n墙体造型底标高"), nElev) == RTNORM) { if (pPatch->upgradeOpen() == Acad::eOk) { pPatch->SetElevation(nElev); pPatch->downgradeOpen(); } } } OPENOBJ_END(); return RTNORM; } // 产生内轮廓线 int GenSpacePoly(const TADSGePoint3d &ptPick, TGGePoly2D &poly) { return GenSpaceOutline(ptPick, poly, 0); } //选单个实体,优先从全局选择集中筛选 int SelectEntity(const TCHAR *szPrompt, TEntitySet &entResult, const TRBList &rbBaseMask) { if (!g_ssPickFirst || g_ssPickFirst.Length() != 1L) { TEntitySet ent; int nRet = RTERROR; nRet = ent.FilterSelect(szPrompt, rbBaseMask); if (nRet == RTNORM) { entResult = ent; } return nRet; } else { ads_sssetfirst(NULL, NULL); TEntitySet ent = g_ssPickFirst[0L]; ent.GetGroups(0); if (ent.MatchBase(rbBaseMask)) { entResult = ent; g_ssPickFirst.Free(); return RTNORM; } else { int nRet = ent.FilterSelect(szPrompt, rbBaseMask); if (nRet == RTNORM) { entResult = ent; } return nRet; } } return RTERROR; } // 选单个实体,优先从全局选择集中筛选, ptPick--UCS int SelectEntity(const TCHAR *szPrompt, TEntitySet &entResult, TADSGePoint3d &ptPick, const TRBList &rbBaseMask) { g_ssPickFirst.Free(); TEntitySet ent; int nRet = RTERROR; nRet = ent.FilterSelect(szPrompt, rbBaseMask, ptPick); if (nRet == RTNORM) { entResult = ent; } return nRet; } // 选单个实体,优先从全局选择集中筛选 int SelectEntity1(const TCHAR *szPrompt, TEntitySet &entResult, TADSGePoint3d &ptPick, const TRBList &rbBaseMask) { g_ssPickFirst.Free(); TEntitySet ent; int nRet = RTERROR; nRet = ent.FilterSelect1(GetPickBoxWcs()/2, szPrompt, rbBaseMask, ptPick); if (nRet == RTNORM) { entResult = ent; } return nRet; } // 选单个实体,优先从全局选择集中筛选 int SelectEntity1(double nPrec, const TCHAR *szPrompt, TEntitySet &entResult, TADSGePoint3d &ptPick, const TRBList &rbBaseMask) { g_ssPickFirst.Free(); TEntitySet ent; int nRet = RTERROR; nRet = ent.FilterSelect1(nPrec, szPrompt, rbBaseMask, ptPick); if (nRet == RTNORM) { entResult = ent; } return nRet; } //选多个实体,优先从全局选择集中筛选 int SelectEntities(const TCHAR *szPrompt, TPickEntSet &ssResult, const TRBList &rbBaseMask) { TPickEntSet ssPickFirst(SS_FREE|SS_CREATE); if (!!g_ssPickFirst) { ssPickFirst += g_ssPickFirst; } ssPickFirst.BaseFilter(rbBaseMask); int nRetCode = RTNORM; int nCount = ssPickFirst.Length(); if (!ssPickFirst || !ssPickFirst.Length()) { const TCHAR *szPrompts[2] = { szPrompt, _T("移除物体") }; ads_sssetfirst(NULL, NULL); nRetCode = ssResult.Get(_T(":$"), szPrompts,NULL,rbBaseMask); } else { ads_sssetfirst(NULL, NULL); g_ssPickFirst.Free(); ssResult += ssPickFirst; } return nRetCode; } int SelectEntities(const TCHAR *szPrompt, TPickEntSet &ssResult, const TRBList &rbBaseMask,const TCHAR* szKeyword,TCHAR& cRet) { int nRet; INITGET_BEG(-2,szKeyword) nRet = SelectEntities(szPrompt, ssResult, rbBaseMask); INITGET_END(); if (g_cKeyword != 0) { cRet = g_cKeyword; ssResult.Free(); return RTKWORD; } return nRet; } int SelectEntity(const TCHAR *szPrompt, TEntitySet &entResult, TADSGePoint3d &ptPick, const TRBList &rbBaseMask,const TCHAR* szKeyword,TCHAR& cRet) { int nRet; INITGET_BEG(-2,szKeyword) nRet = SelectEntity(szPrompt, entResult,ptPick, rbBaseMask); INITGET_END(); if (g_cKeyword != 0) { cRet = g_cKeyword; return RTKWORD; } return nRet; } int SelectEntity(const TCHAR *szPrompt, TEntitySet &entResult, const TRBList &rbBaseMask,const TCHAR* szKeyword,TCHAR& cRet) { int nRet; INITGET_BEG(-2,szKeyword) nRet = SelectEntity(szPrompt, entResult,rbBaseMask); INITGET_END(); if (g_cKeyword != 0) { cRet = g_cKeyword; return RTKWORD; } return nRet; } int GetPrepickEntity(TEntitySet &entResult, const TRBList &rbBaseMask) { if (!!g_ssPickFirst) { TPickEntSet ss(SS_FREE|SS_CREATE); ss += g_ssPickFirst; ss.BaseFilter(rbBaseMask); if (ss.Length() == 1) { entResult = g_ssPickFirst[0L]; return RTNORM; } } return RTERROR; } AcDbObjectId GetPrepickEntity(const TRBList &rbBaseMask) { AcDbObjectId idRet; TEntitySet ent; if (GetPrepickEntity(ent, rbBaseMask) == RTNORM) { acdbGetObjectId(idRet, ent); } return idRet; } TCString GetFullCmdName(const TCHAR *szName) { TCString szCmd; //2012-12-12 LH 根据上华公司沈睿副总经理要求去除上华命令前缀功能 即TXX_Name 去除前缀TXX_ //if (TRUE) if(FALSE) { szCmd << _T("T9") << g_nProductId << _T("_") << szName; } else { szCmd = szName; } return szCmd; } void TchAddCommand(const TCHAR *szAppName0,const STArxCommandTable cmdTable[], const UINT eleNum, BOOL bLispCmd) { if (TchGeLib::g_nProtectCode == 0)//表面加密:不加载命令 { return; } int num = (int)eleNum; for (int i = 0; iaddCommand(szAppName0, szCmd, szCmd, cmdTable[i].nCmdFlag, cmdTable[i].pFun, NULL, (bLispCmd ? i :-1)); ASSERT(es == Acad::eOk); } } // 得一个面的参数 int GetFace() { TEntitySet ent; TADSGePoint3d pt; if(ent.FilterSelect1(GetApertureWcs(), _T("\n请选择三维坡屋顶坡面<退出>:"), TRBList(), pt)!=RTNORM) { return RTERROR; } pt = Ucs2Wcs(pt); AcDbVoidPtrArray entSet; int nDrawMode = DocGetDrawMode(); DocSetDrawMode(DRAW_3D); OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt); InitModel(TMasterProperties(), pEnt, NULL, entSet); OPENOBJ_END(); DocSetDrawMode(nDrawMode); int num = entSet.length(); for (int i = 0; i < num; i++) { AcDbEntity *pEnt = (AcDbEntity *)entSet[i]; ASSERT(pEnt); if (pEnt->isA() == AcDbFace::desc()) { AcDbFace *pFace = AcDbFace::cast(pEnt); int nHitFlag = HitTestOnEdge(pFace, pt, TRUE); if (nHitFlag >= 0) { TGGe3DFace faceUcs, faceWcs; AcGePoint3d ptVert; for (int n = 0; n < 4; n++) { pFace->getVertexAt(n, ptVert); faceUcs.SetVertex(n, Wcs2Ucs(ptVert)); } TVector3D vtNorm = faceWcs.GetNormal(); if (vtNorm.z < 1.0E-9) { continue; //法向不正确 } if (faceUcs.IsLinear() || faceUcs.IsPoint()) { continue; } TGGiScreenDrawStream dc(7, 1); dc << faceUcs; int nCode = YesNoQuestion(_T("\n是否为加亮的坡面")); ads_redraw(NULL,0); if (nCode == RTCAN) { ReleaseEntSet(entSet); return nCode; } else if (nCode == Q_YES) { TADSGePoint3d ptIns; if (GetPickPoint(NULL, _T("\n位置点"), ptIns) != RTNORM) { ReleaseEntSet(entSet); return RTCAN; } for (int n = 0; n < 4; n++) { faceUcs.SetVertex(n, Ucs2Wcs(faceUcs.GetVertex(n))); } for (n = 0; n < 4; n++) { int nNext = DePeriod(4, n+1); TGGeLine aLine(faceUcs.GetVertex(n), faceUcs.GetVertex(nNext)); if (aLine.GetLength() < _DIST_SNAP) { switch(nNext) { case 0: break; // Just ignore vertex[3] case 1: faceUcs.SetVertex(1, faceUcs.GetVertex(2)); faceUcs.SetVertex(2, faceUcs.GetVertex(3)); break; case 2: faceUcs.SetVertex(2, faceUcs.GetVertex(3)); break; } break; } } TADSGePoint3d ptInsert = ptIns; TADSGePoint3d ptUp = ptInsert + TADSGePoint3d(0,0,100); AcGeLine3d ln((AcGePoint3d &)ptInsert, (AcGePoint3d &)ptUp); AcGePlane plane; plane.set((AcGePoint3d &)faceUcs.GetVertex(0), (AcGePoint3d &)faceUcs.GetVertex(1), (AcGePoint3d &)faceUcs.GetVertex(2)); if (!plane.intersectWith(ln, ptInsert)) { ReleaseEntSet(entSet); return RTERROR; } TRBList rbRet = ads_buildlist(RT3DPOINT, &ptInsert, RTLB, RT3DPOINT, &faceUcs.GetVertex(0), RT3DPOINT, &faceUcs.GetVertex(1), RT3DPOINT, &faceUcs.GetVertex(2), RT3DPOINT, &faceUcs.GetVertex(0), RTLE, NULL); ads_retlist(rbRet); ReleaseEntSet(entSet); return RTNORM; } } } } ReleaseEntSet(entSet); ads_retnil(); return RTNONE; } int TGRegApp(LPCTSTR pszAppName, AcDbDatabase* pDb) { ASSERT(NULL != pszAppName && 0 < _tcslen(pszAppName)); if (NULL == pDb) { return acdbRegApp(pszAppName); } AcDbRegAppTable* pTable = NULL; pDb->getRegAppTable(pTable, AcDb::kForWrite); if (NULL == pTable) return RTERROR; AcDbRegAppTableRecord* pRecord = new AcDbRegAppTableRecord; if (NULL == pRecord) { pTable->close(); return RTERROR; } pRecord->setName(pszAppName); Acad::ErrorStatus es = pTable->add(pRecord); pTable->close(); if (Acad::eOk != es) { delete pRecord; return RTERROR; } pRecord->close(); return RTNORM; } void GetOffsetPoly2D(const TGGePoly2D& polySrc, TGGePoly2D& polyOut, double dOffset, bool bZoomOut/* = ture*/ ) { polyOut = polySrc; AcDbCurve *pCurve = NULL; pCurve = polySrc.AsAcDbCurve(); if (!bZoomOut) { dOffset *= -1.0; } double dOldLen = 0.0; double dEndT = 0.0; pCurve->getEndParam(dEndT); pCurve->getDistAtParam(dEndT,dOldLen); AcDbVoidPtrArray offsetCurves; pCurve->getOffsetCurves(dOffset,offsetCurves); if (offsetCurves.length() > 0) { AcDbPolyline *pPline = (AcDbPolyline*)offsetCurves[0]; if (pPline != NULL) { double dNewLen = 0.0; pPline->getEndParam(dEndT); pPline->getDistAtParam(dEndT,dNewLen); if ((bZoomOut && dNewLen < dOldLen) || (!bZoomOut && dNewLen > dOldLen)) {//如果放大,却得到了缩小的poly或者如果缩小却得到放大的poly offsetCurves.removeAt(0); pCurve->getOffsetCurves(-dOffset,offsetCurves); if (offsetCurves.length() > 0) { pPline = (AcDbPolyline*)offsetCurves[0]; } } polyOut.SetAcDbCurve(pPline); delete pPline; } } delete pCurve; } void DrawEntInsulate(const TDPtrList &lstInsulateCurves) { //单独绘制保温层标识 wlw 11.03.17 int nSysInsutlate = 0; TGGetVar(_T("USERI5"), &nSysInsutlate); AcGePoint3d pts,pte; AcDbObjectId idLayer = InitLayer(LAY_SURFACE,FALSE); if (nSysInsutlate == 999) { AcDbLine *pline = NULL; for (int l = 0; l < lstInsulateCurves.Length(); l++) { pts = (lstInsulateCurves[l]).StartPoint().AsAcGePoint3d(); pte = (lstInsulateCurves[l]).EndPoint().AsAcGePoint3d(); pline = new AcDbLine(pts,pte); pline->setLayer(idLayer); AddToCurrentSpace(pline,Adesk::kTrue); } } } AcDbFace* GetFaceFromSegment(const TGGeCurveSegment& segment, double dHeight) { AcDbFace* pface = NULL; AcGePoint3d ptArray[4]; ptArray[0] = ptArray[1] = segment.StartPoint(); ptArray[2] = ptArray[3] = segment.EndPoint(); ptArray[1][2] += dHeight; ptArray[2][2] += dHeight; pface = new AcDbFace(ptArray[0],ptArray[1],ptArray[2],ptArray[3]); return pface; } #ifdef TASD //结构用 TARCH_IMPEXP int g_nColuForce = TDbColumn::eNormal; //底层墙柱显示工况 TARCH_IMPEXP int g_nLoadDrawMode = 0; // 荷载显示控制 TARCH_IMPEXP int g_nLoadViewMode = 7; // 荷载显示控制 TARCH_IMPEXP BOOL g_bDetailMode = TRUE; // 特殊梁柱是否简图模式 TARCH_IMPEXP double g_dCLTextHeight; //单元编号文字字高 TARCH_IMPEXP int g_nCLTextColorBeam; //梁单元编号文字颜色 TARCH_IMPEXP int g_nCLTextColorColu; //柱单元编号文字颜色 TARCH_IMPEXP int g_nCLTextColorWall; //剪力墙单元编号文字颜色 TARCH_IMPEXP int g_nCLTextColorSlab; //板单元编号文字颜色 TARCH_IMPEXP int g_nCLTextColorNode; //节点编号文字颜色 TARCH_IMPEXP double g_dBHTextHeight; //截面尺寸文字字高 TARCH_IMPEXP int g_nBHTextColorBeam; //梁截面尺寸文字颜色 TARCH_IMPEXP int g_nBHTextColorColu; //柱截面尺寸文字颜色 TARCH_IMPEXP int g_nBHTextColorWall; //剪力墙截面尺寸文字颜色 TARCH_IMPEXP int g_nBHTextColorSlab; //板截面尺寸文字颜色 TARCH_IMPEXP int g_nBHTextColorSlabHole; //板洞截面尺寸文字颜色 TARCH_IMPEXP double g_dRGTextHeight; //刚域文字字高 TARCH_IMPEXP int g_nRGTextColorBeam; //梁刚域文字颜色 TARCH_IMPEXP int g_nRGTextColorColu; //柱刚域文字颜色 TARCH_IMPEXP int g_nGraph = FORCE_NORMAL;// 显示的力图的种类 TARCH_IMPEXP double g_dMGrapTextH = 5; // 弯矩包络图文字高 TARCH_IMPEXP double g_dMGrapScal = 10; // 弯矩包络图比例 TARCH_IMPEXP double g_dNGrapTextH = 3; // 轴力文字高度 TARCH_IMPEXP double g_dReinbarWidth = 30.0f;//钢筋线宽 TARCH_IMPEXP double g_dReinbarLenS = 100.0f;//钢筋直钩平直长度 TARCH_IMPEXP double g_dReinbarLenO = 100.0f;//钢筋斜钩平直长度 TARCH_IMPEXP double g_dReinbarLenB = 100.0f;//钢筋弯钩平直长度 TARCH_IMPEXP double g_dReinbarDiaB = 45.0f; //钢筋弯钩直径 TARCH_IMPEXP double g_dReinbarDotWidth = 50.0f;//点钢筋直径 TARCH_IMPEXP double g_dStirrupsLen = 100.0f;//箍筋平直长度 TARCH_IMPEXP int g_nDrawModeSlab = 0; //楼板显示控制 TARCH_IMPEXP int g_nDrawModeSlabBorder = 0;//楼板边界显示控制 TARCH_IMPEXP double g_dCrackGraphTextH = 3.5; // 字高 TARCH_IMPEXP double g_dCrackLimit = 0.3; // 裂缝限制值 TARCH_IMPEXP double g_dDeflectGraphTextH = 3.5; // 字高 TARCH_IMPEXP double g_dDeflectGraphScale = 10; // 幅度 TARCH_IMPEXP BOOL g_bShowCrack = FALSE; // 显示裂缝图 TARCH_IMPEXP BOOL g_bShowDef = FALSE; // 显示挠度图 TARCH_IMPEXP double g_dSGrapTextH = 5; // 剪力包络图文字高 TARCH_IMPEXP double g_dSGrapScal = 10; // 剪力包络图幅值 TARCH_IMPEXP BOOL g_bAutoBreak = TRUE; //梁柱自动打断控制参数 TARCH_IMPEXP BOOL g_bAutoUpdate = TRUE; // 自动更新图形控制参数 TARCH_IMPEXP double g_dNodeDiameter = 0.8; // 节点直径 TARCH_IMPEXP Adesk::UInt16 g_iSolidNodeColor = 0; // 实节点颜色 TARCH_IMPEXP Adesk::UInt16 g_iVirtualNodeColor = 0; // 虚节点颜色 TARCH_IMPEXP int g_nReinAreaMode = eNorm; //配筋面积显示方式 TARCH_IMPEXP int g_nReinAreaModeColu = eNorm; //柱配筋面积显示方式 TARCH_IMPEXP int g_nReinAreaModeWall = 0; //墙配筋面积显示方式 TARCH_IMPEXP BOOL g_bSplitFloor = TRUE; #define WALL_BODY_CAL 0x001 #define WALL_COLU_CAL 0x002 #define WALL_BEAM_CAL 0x004 #define WALL_BODY_REAL 0x010 #define WALL_COLU_REAL 0x020 #define WALL_BEAM_REAL 0x040 BOOL GetViewStyle(int nStyle) { switch(nStyle) { case BYGRAPHIC: return ((g_nLoadViewMode & GRAPHIC) != 0); break; case BYUNVARYING: return ((g_nLoadViewMode & UNVARYINGLOAD) != 0); break; case BYVARYING: return ((g_nLoadViewMode & VARYINGLOAD) != 0); break; } return FALSE; } void SetViewStyle(int nStyle, BOOL bTrue) { if(bTrue) { switch(nStyle) { case BYGRAPHIC: g_nLoadViewMode |= GRAPHIC; break; case BYUNVARYING: g_nLoadViewMode |= UNVARYINGLOAD; break; case BYVARYING: g_nLoadViewMode |= VARYINGLOAD; break; } } else { switch(nStyle) { case BYGRAPHIC: g_nLoadViewMode &= ~GRAPHIC; break; case BYUNVARYING: g_nLoadViewMode &= ~UNVARYINGLOAD; break; case BYVARYING: g_nLoadViewMode &= ~VARYINGLOAD; break; } } } // add by wjx on 120325 // 去除小数末尾的零 // in: dDara:数据 // in: nNum:保留的小数位 -1:只去除末尾的0, 否则就是小数位(如果是整数精度没用) CString TrimDoubleZero(double dData, int nNum) { CString str; str.Format(_T("%f"), dData); str.TrimRight(_T("0")); // 去除末尾的0 CString strDot = str.Right(1); if(_T(".") == strDot) // 如果末尾是小数点去除小数点 { str.TrimRight(_T(".")); return str; } if(-1 == nNum) { return str; } else if(0 == nNum) // 保留整数部分 { str.Format(_T("%.f"), dData); } else // 精确到小数 { int nDotPos = str.Find(_T(".")); if(-1 == nDotPos) { return str; // 如果小数部分都是0精确位数没用 } else { int nLen = str.GetLength(); if(nLen > (nDotPos + nNum + 1)) { nLen = nDotPos + nNum + 1; } CString strDot = str.Left(nLen); str = strDot; } } return str; } void SetWallBodyCal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_BODY_CAL; } else { g_nReinAreaModeWall &= ~WALL_BODY_CAL; } } BOOL IsWallBodyCal() { return ((g_nReinAreaModeWall & WALL_BODY_CAL) != 0); } void SetWallBeamCal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_BEAM_CAL; } else { g_nReinAreaModeWall &= ~WALL_BEAM_CAL; } } BOOL IsWallBeamCal() { return ((g_nReinAreaModeWall & WALL_BEAM_CAL) != 0); } void SetWallColuCal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_COLU_CAL; } else { g_nReinAreaModeWall &= ~WALL_COLU_CAL; } } BOOL IsWallColuCal() { return ((g_nReinAreaModeWall & WALL_COLU_CAL) != 0); } void SetWallBodyReal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_BODY_REAL; } else { g_nReinAreaModeWall &= ~WALL_BODY_REAL; } } BOOL IsWallBodyReal() { return ((g_nReinAreaModeWall & WALL_BODY_REAL) != 0); } void SetWallBeamReal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_BEAM_REAL; } else { g_nReinAreaModeWall &= ~WALL_BEAM_REAL; } } BOOL IsWallBeamReal() { return ((g_nReinAreaModeWall & WALL_BEAM_REAL) != 0); } void SetWallColuReal(BOOL bTrue) { if (bTrue) { g_nReinAreaModeWall |= WALL_COLU_REAL; } else { g_nReinAreaModeWall &= ~WALL_COLU_REAL; } } BOOL IsWallColuReal() { return ((g_nReinAreaModeWall & WALL_COLU_REAL) != 0); } #endif