#include "stdafx.h" #include "Tgkatana.h" TUTIL_IMPEXP BOOL GetEntFromPt(const AcGePoint3d &pt, LPCTSTR sDxfName, TEntitySet &ent); TUTIL_IMPEXP void SetHandCursorSelectType(LPCTSTR pszType); TUTIL_IMPEXP void SetHandCursorSelectEntity(TEntitySet &ent); TUTIL_IMPEXP BOOL MouseMoveMonitorByHandCursor(MSG *msg); TUTIL_IMPEXP void StartChangeCursor(); TUTIL_IMPEXP void EndChangeCursor(); namespace { bool JudgeKatanaPt(const AcGePoint3d &pt, TEntitySet ent) { OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbWall, pWall) if (pWall) { TADSGePoint3d ptPro; pWall->ProjectToMe(pt, ptPro); AcGePoint3d ptGePro(asPnt3d(ptPro)); if (DOWN_ZERO(ptGePro.distanceTo(pWall->StartPoint()) - GlwKatana::GetLessLength()) || DOWN_ZERO(ptGePro.distanceTo(pWall->EndPoint()) - GlwKatana::GetLessLength())) return false; } OPENOBJ_END() return true; } } void CreateKanata() { TEntitySet ent; SetHandCursorSelectEntity(ent); SetHandCursorSelectType(_T("TCH_WALL")); acedRegisterFilterWinMsg(MouseMoveMonitorByHandCursor); StartChangeCursor(); GlwKatana *pKatana(NULL); AcDbObjectId idNew(AcDbObjectId::kNull), idOld(AcDbObjectId::kNull); AcGePoint3d ptCenter(AcGePoint3d::kOrigin), ptLeft(AcGePoint3d::kOrigin), ptRight(AcGePoint3d::kOrigin); while (true) { TPushAcadVar vOsMode(_T("OSMODE"), OS_INT|OS_NEA|OS_END); ads_point pt; int nRel = acedGetPoint(NULL, _T("\n请选择要斩断的墙."), pt); if (nRel != RTNORM) goto finish; ptCenter = asPnt3d(pt); UCS2WCS(ptCenter); if (!GetEntFromPt(ptCenter, _T("TCH_WALL"), ent)) { acutPrintf(_T("\n请选择墙实体!")); continue; } if (!JudgeKatanaPt(ptCenter, ent)) { continue; } OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWall, pWall) if (pWall) { TADSGePoint3d ptPro; idOld = pWall->objectId(); pWall->ProjectToMe(ptCenter, ptPro); if (pWall->BreakAt(ptPro, idNew, NULL, NULL, true)) break; else continue; } else { acutPrintf(_T("\n请重新选择墙实体!")); continue; } OPENOBJ_END() } pKatana = new GlwKatana(); ent.Redraw(4); finish: EndChangeCursor(); acedRemoveFilterWinMsg(MouseMoveMonitorByHandCursor); if (!pKatana) return; pKatana->setColorIndex(6); pKatana->setLayer(InitLayer(LAY_CLNG_GRID)); AcDbObjectId idKatana = AddToModelSpace(pKatana); if (!idKatana.isValid()) { delete pKatana; return; } OPENOBJ_BEGIN(idKatana, AcDb::kForWrite, GlwKatana, pK) if (pK) { pK->Init(idNew, idOld); } OPENOBJ_END() //CreateKanata(); }