////////////////////////////////////////////////////////////////////////////// //文件: CItem类扩展 //主要功能: // 操作各类元素或完成一定的功能 // //程序编写: 2006-12-07 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include ".\itemlinkcurve.h" namespace NItem { class CItemSolidLink : public CItemLinkCurve { public: CItemSolidLink(CSigmaDoc * ppDoc); virtual ~CItemSolidLink(void); virtual BOOL DoSelectEnd(void); int GetSubMenu() override; void ClearAssistantCurve(void); CList AssistantCurveList; //辅助线列表 }; class CItemSolid : public CItemSolidLink { public: CItemSolid(CSigmaDoc * ppDoc); virtual ~CItemSolid(void); int m_iMaxExtendLength; protected: class CURVE_SEGMENT { public: CURVE_SEGMENT(void) { m_bExtend = FALSE; head = -1e100; tail = 1e100; pCurve = NULL; m_bExtendLastCurve = FALSE; }; int m_bExtend = FALSE; double head, tail; CCurveEx* pCurve; //为了UNDO与REDO而备份状态 CCrossPoint PrevPoint; int m_bExtendLastCurve = 0; }; CList CurveGroup; CCrossPoint PrevPoint, FirstPoint; BOOL m_bExtendFirstCurve = FALSE; BOOL m_bExtendLastCurve = FALSE; CCrossPoint GetPoint(SELECT_ITEM& item, CCurveEx* p1, CCurveEx* p2, CCrossPoint& otherPoint); BOOL CreateTwoCurveSolid(SELECT_ITEM& item1, SELECT_ITEM& item2); public: virtual BOOL SelectItem(POSITION pos, CPoint2D point) override; virtual BOOL DoSelectEnd(void); int GetSubMenu() override; int OnMouseMove(CDC* pDC, UINT nFlags, CPoint point) override; virtual void Undo(void); static CCrossPoint GetNearestCrossPoint(CCrossList& cross, CPoint2D point); int CrossWithExtend(CCurveEx* p1, CCurveEx* p2, CCrossList& cross); int CrossWithMustExtend(CCurveEx* p1, CCurveEx* p2, CCrossList& cross); void GetCurve(CURVE_SEGMENT& segment, CList & list); POSITION CreateCurve(CList& cg); }; class CItemPathFill : public CItem { public: CItemPathFill(CSigmaDoc * ppDoc); virtual ~CItemPathFill(void); //virtual BOOL InitPropertyGrid(CXTPPropertyGrid& grid); //virtual BOOL OnGridItemChangeValue(CXTPPropertyGridItem* pItem); protected: CString m_strBlockName; COLORREF m_colFill = RGB(0, 0, 0); //填充色 int m_fillMode; //填充方式 }; //自动填充 ITEM class CItemSolidAuto : public CItem { public: CItemSolidAuto(CSigmaDoc * ppDoc); virtual ~CItemSolidAuto(void); int m_iMaxExtendLength; virtual void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) override; virtual BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) override; /** @brief 得到所有曲线*/ void GetCurves(); void ClearCurveList(void); int GetSubMenu(); CCurveEx* CreateSolid(); CCurveEx* GetMinInsideCurve(); double CItemSolidAuto::CrossProduct(dfPoint p, dfPoint q); // 判断两线段是否相交,并求得交点,p1、q1是线段1的首尾端点,p2、q2是线段2的首尾端点,cr是交点 bool CItemSolidAuto::Cross(dfPoint p1, dfPoint q1, dfPoint p2, dfPoint q2, dfPoint& cr); public: CPtrList CurveList; CPtrList InsideCurveList; dfPoint dfp; }; };