设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 230|回复: 0

cad_把dwg像控件一样放到界面

[复制链接]
  • TA的每日心情
    开心
    2021-6-22 09:39
  • 签到天数: 1542 天

    [LV.Master]伴坛终老

    发表于 2021-3-1 23:00 | 显示全部楼层 |阅读模式
    cad
    1. 右侧的8个小黑块,都是由dwg图纸构成。

    2. 具体用法如例:

    3. CString strPath;//dwg图纸的全路径
    4. AcDbDatabase mDb(false, true);
    5. CDrawDWG draw();
    6. if (_taccess(strPath, 0) == 0)
    7. {
    8.      if (mDb.readDwgFile(strPath) == Acad::eOk && draw.Open(&mDb))
    9.      {
    10.           draw.ZoomE();
    11.           draw.UpdataView();
    12.      }
    13. }
    14. 然后看一下CDrawDWG类的实现

    15. .h

    16. #include "HHDef.h"
    17. #include "MouseBase.h"
    18. #include "constname.h"
    19. class CMouseMG;
    20. class __declspec(dllexport) CDrawDWG: public CWnd
    21. {
    22.         DECLARE_MESSAGE_MAP()
    23. public:
    24.         // 传入要绘制的窗体
    25.         CDrawDWG(Adesk::Boolean bBuildDefaultDrawing,Adesk::Boolean bNoDocument);
    26.         CDrawDWG();
    27.         virtual ~CDrawDWG(void);
    28. protected:
    29.         CMouseMG* m_pMouse;
    30.         CString m_strDWGPath  ;// 当前DWG路径
    31.         AcDbExtents m_PExtents;// 图纸范围
    32.         AcGsView    *m_pView  ;// 图形系统中的视图,用来绘制图形的区域
    33.         AcGsDevice  *m_pDevice;// 图形系统中的设备,
    34.         AcGsModel   *m_pModel ;
    35.         AcDbDatabase*m_pDb    ;// 图形库

    36.         std::vector<CString> m_arrFilePath;// 保存要加密的文件路径
    37.         double m_dWheelScale  ;// 鼠标中键缩放比例,此值只可为正值,即 > 0
    38.         AcGeVector3d m_MoveVector;//view平移的矩阵

    39.         std::map<AcDbEntity*, AcDbEntity*> m_arr;// 保存拷贝出来的实体,找机会释放掉
    40.                        
    41.         Adesk::Boolean m_bBuildDefaultDrawing;        //数据创建时的参数       
    42.         Adesk::Boolean m_bNoDocument;                        //数据创建时的参数       

    43.         AcDbObjectId m_visualStyleId; //控制显示样式

    44.         bool m_bIsBlockDisp;//!< 是否整体显示

    45.         CString m_strLineName;//因导出多个dwg分幅文件命名需要,所以添加了线路名
    46. public:

    47.         // 设置整体显示
    48.         virtual void setBlockDisp(bool bIsBlockDisp);
    49.         // 是否整体显示
    50.         virtual bool isBlockDisp();

    51.         //数据创建时的参数
    52.         virtual void SetNewDataBaseParams(Adesk::Boolean bBuildDefaultDrawing,Adesk::Boolean bNoDocument);

    53.         //-----------------------------------------------------------------------------------
    54.         // 函 数 名:Open
    55.         // 函数介绍:打开DWG文件
    56.         // 参数介绍:LPCTSTR lpDWGFn  DWG文件名
    57.         // 返 回 值:bool
    58.         //-----------------------------------------------------------------------------------
    59.         virtual bool Open(LPCTSTR lpDWGFn);

    60.         virtual bool Open(LPCTSTR lpDWGFn, double dMaxLength, double dMaxWidth, const AcGePoint3d& origin, double dAngle = 0.0, int iColor = -1);
    61.         //-----------------------------------------------------------------------------------
    62.         // 函 数 名:Open
    63.         // 函数介绍:传入数据指针进行构造
    64.         // 参数介绍:AcDbDatabase *pDb
    65.         // 返 回 值:bool
    66.         //-----------------------------------------------------------------------------------
    67.         virtual bool Open( AcDbDatabase *pDb);
    68.         // 快速显示图形,此函数适合多次显示不同数据库内容
    69.         virtual bool QuickOpen( AcDbDatabase *pDb );
    70.         // 关闭文件
    71.         virtual void Close();
    72.         // 清空DWG路径  
    73.         __inline void EmptyDWGPath(){m_strDWGPath.Empty();}

    74.         //! 创建默认数据库(绘制使用)
    75.         AcDbDatabase* CreateDefault();

    76.         // 得到DWG路径
    77.         const CString& GetDWGPath()const;

    78.         //设置线路名
    79.         void SetLineName(const CString& strLineName){m_strLineName = strLineName;}

    80.         AcGsView* GetView(){return m_pView;}

    81.         //获取当前视图的范围
    82.         //double dRatio为预览控件的长高比
    83.         bool GetCurViewExtens(double dRatio, AcDbExtents& curExtens);

    84. public:
    85.         // 添加一个鼠标方法
    86.         template<class _MStyle>
    87.         _MStyle* AddItem(UINT uID)
    88.         {
    89.                 return m_pMouse->AddItem<_MStyle>(uID, this);
    90.         }
    91.         //-----------------------------------------------------------------------------------
    92.         // 函 数 名:SetNormal
    93.         // 函数介绍:设置鼠标为正常模式
    94.         //-----------------------------------------------------------------------------------
    95.         void SetNormal();
    96.         // 设置鼠标方法  
    97.         void SetCurMouse(UINT uId);

    98.         // 判断指定ID,是否为当前ID
    99.         bool IsCurMouse(UINT uId)const{return m_pMouse->GetCurID()==uId;}

    100.         bool SetCurMouseShowRightMenu(UINT uMenuId);

    101.         // 删除所有鼠标样式
    102.         void RemoveAllMouse();

    103.         // 删除一个鼠标样式
    104.         void RemoveMouse(UINT uId);

    105. public:
    106.         //-----------------------------------------------------------------------------------
    107.         // 函 数 名:ViewAddEntity
    108.         // 函数介绍:添加一个实体到视图,视图不负责实体指针的释放
    109.         // 参数介绍:AcDbEntity* pEntity
    110.         //                         bool bIsReSetView=true 是否重设置视窗,一般添加完毕,得设置一下
    111.         //-----------------------------------------------------------------------------------
    112.         void ViewAddEntity(AcDbEntity* pEntity, bool bIsReSetView=true,bool bUpdateView = true);
    113.         //-----------------------------------------------------------------------------------
    114.         // 函 数 名:ViewEreaseEntity
    115.         // 函数介绍:从视图移去一个实体
    116.         // 参数介绍:AcDbEntity* pEntity
    117.         //-----------------------------------------------------------------------------------
    118.         void ViewEreaseEntity(AcDbEntity* pEntity);
    119. public:
    120.         //-----------------------------------------------------------------------------------
    121.         // 函 数 名:SaveDWG
    122.         // 函数介绍:保存文件
    123.         // 返 回 值:bool
    124.         //-----------------------------------------------------------------------------------
    125.         bool SaveDWG();
    126.         //-----------------------------------------------------------------------------------
    127.         // 函 数 名:SaveDWG
    128.         // 函数介绍:保存文件
    129.         // 参数介绍:LPCTSTR lpDWGFn
    130.         // 返 回 值:bool
    131.         //-----------------------------------------------------------------------------------
    132.         bool SaveDWG(LPCTSTR lpDWGFn);

    133.         //将特定数据库中的arrSaveId对象保存为dwg文件
    134.         static bool SSSaveDwg(AcDbDatabase* pDataBase, AcDbObjectIdArray& arrSaveId, const CString& strDesFile);
    135.         //-----------------------------------------------------------------------------------
    136.         // 函 数 名:cloneDBase
    137.         // 函数介绍:由当前图形克隆一个数据库,克隆出的指针需要在外部释放
    138.         // 返 回 值:AcDbDatabase*
    139.         //-----------------------------------------------------------------------------------
    140.         AcDbDatabase* cloneDBase();
    141.         // 得到当前图纸范围
    142.         const AcDbExtents& GetGraphExtents()const{return m_PExtents;}

    143.         void SetGraphExtents(const AcDbExtents& dbExt);
    144.         //-----------------------------------------------------------------------------------
    145.         // 函 数 名:ReLoadDWG
    146.         // 函数介绍:重新读取DWG文件
    147.         // 返 回 值:bool
    148.         //-----------------------------------------------------------------------------------
    149.         bool ReLoadDWG();

    150.         void SetDwgFileName(CString propVal)
    151.         {
    152.                 SetProperty(0x3, VT_BSTR, propVal);
    153.         }

    154.         CString GetDwgFileName()
    155.         {
    156.                 CString result;
    157.                 GetProperty(0x3, VT_BSTR, (void*)&result);
    158.                 return result;
    159.         }

    160.         void Refresh()
    161.         {
    162.                 InvokeHelper(DISPID_REFRESH, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    163.         }
    164. public:
    165.         // 取得0,0点在图上的坐标
    166.         AcGeVector3d GetOxy()const;
    167.         // 取得当前数据库
    168.         AcDbDatabase* GetCurDataBase(){return m_pDb;}
    169. public:
    170.         // 缩放到整个图纸可见
    171.         afx_msg virtual void ZoomE();
    172.         //-----------------------------------------------------------------------------------
    173.         // 函 数 名:MoveAndScaleView
    174.         // 函数介绍:缩放并移动图形
    175.         // 参数介绍:short zDelta
    176.         //           CPoint point
    177.         // 返 回 值:virtual
    178.         //-----------------------------------------------------------------------------------
    179.         virtual void MoveAndScaleView(short zDelta, CPoint point);
    180.         //-----------------------------------------------------------------------------------
    181.         // 函 数 名:Move
    182.         // 函数介绍:移动图形
    183.         // 参数介绍:CPoint p1 开始点
    184.         //           CPoint p2 终止点
    185.         // 返 回 值:virtual void
    186.         //-----------------------------------------------------------------------------------
    187.         virtual void Move(CPoint p1, CPoint p2);
    188.        
    189. public:
    190.         // 设置滚轮缩放速度
    191.         void SetWheelScale(double dWheelScale){m_dWheelScale = dWheelScale;}
    192.         // CPoint中的X转成图上坐标Y
    193.         double Pt2ViewX(int nPtX)const;
    194.         // CPoint中的Y转成图上坐标Y
    195.         double Pt2ViewY(int nPtY)const;
    196.         //-----------------------------------------------------------------------------------
    197.         // 函 数 名:ToPt
    198.         // 函数介绍:鼠标坐标转视图坐标
    199.         // 参数介绍:CPoint pt
    200.         // 返 回 值:AcGePoint3d
    201.         //-----------------------------------------------------------------------------------
    202.         AcGePoint3d ToPt(CPoint pt)const;
    203. protected:
    204.         // 中键滚动缩放图形
    205.         afx_msg virtual BOOL OnMouseWheel (UINT nFlags, short zDelta, CPoint pt);
    206.         // 左键双击
    207.         afx_msg virtual void OnLButtonDblClk(UINT nFlags, CPoint point);
    208.         // 左键按下
    209.         afx_msg virtual void OnLButtonDown(UINT nFlags, CPoint point);
    210.         // 左键弹起
    211.         afx_msg virtual void OnLButtonUp  (UINT nFlags, CPoint point);
    212.         // 中键按下
    213.         afx_msg virtual void OnMButtonDown(UINT nFlags, CPoint point);
    214.         // 中键弹起
    215.         afx_msg virtual void OnMButtonUp  (UINT nFlags, CPoint point);
    216.         // 鼠标移动
    217.         afx_msg virtual void OnMouseMove  (UINT nFlags, CPoint point);
    218.         afx_msg virtual void OnRButtonDown(UINT nFlags, CPoint point);
    219.         afx_msg virtual void OnRButtonUp(UINT nFlags, CPoint point);
    220.         // 双击中键
    221.         afx_msg virtual void OnMButtonDblClk(UINT nFlags, CPoint point);
    222.         afx_msg virtual void OnPaint();
    223.         afx_msg virtual void OnSize(UINT nType, int cx, int cy);
    224.         afx_msg LRESULT virtual OnNcHitTest(CPoint point);
    225.         afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    226.         afx_msg void OnDestroy();
    227. public:
    228.         //-----------------------------------------------------------------------------------
    229.         // 函 数 名:UpdataView
    230.         // 函数介绍:更新视图,在图形有变化时刷新屏幕
    231.         // 返 回 值:void
    232.         //-----------------------------------------------------------------------------------
    233.         void UpdataView();

    234.         //! 删除所有图形  
    235.         void EraseAllEntity();

    236.         // 从视图上移除某些实体
    237.         void EraseEntitys(const AcDbObjectIdArray& arr);
    238.         void EraseEntity(const AcDbObjectId& mId);
    239.         void EraseEntityP(AcDbEntity* pEntity);

    240.         // 设置菜单
    241.         void SetShowMenu(int nMenuId = -1);
    242. public:
    243.         //-----------------------------------------------------------------------------------
    244.         // 函 数 名:RefreshView 创建者:
    245.         // 函数介绍:刷新视图,在数据库增加或删除实体后要调用此函数刷新
    246.         // 返 回 值:bool
    247.         //-----------------------------------------------------------------------------------
    248.         bool RefreshView();
    249.         //-----------------------------------------------------------------------------------
    250.         // 函 数 名:RefreshView
    251.         // 函数介绍:刷新视图 中的部分数据
    252.         // 参数介绍:const AcDbObjectIdArray& arr
    253.         // 返 回 值:bool true:成功,false:失败
    254.         //-----------------------------------------------------------------------------------
    255.         bool RefreshView(const AcDbObjectIdArray& arr);
    256.         //-----------------------------------------------------------------------------------
    257.         // 函 数 名:RefreshId
    258.         // 函数介绍:刷新视图中的某个元素
    259.         // 参数介绍:const AcDbObjectId& mId
    260.         // 返 回 值:bool true:成功,false:失败
    261.         //-----------------------------------------------------------------------------------
    262.         bool RefreshId(const AcDbObjectId& mId);
    263.         bool RefreshIdP(AcDbEntity* pEntity, AcDbExtents* pExtents = NULL);// 是否扩展 李金涛 2011.7.11.9.54

    264.         bool RefereshEntity(AcGiDrawable * pDrawable);

    265.         //得到当前显示范围 从上到下的中线 sty-Add 2001-3-7
    266.         bool GetUpDownMidLine(AcGeLine3d& mLine);
    267.         bool GetUpDownMidLine(AcGePoint3d& ptUp,AcGePoint3d& ptDown);

    268.         //-----------------------------------------------------------------------------------
    269.         // 函 数 名:ReSetView
    270.         // 函数介绍:重新设置视窗
    271.         //-----------------------------------------------------------------------------------
    272.         void ReSetView();

    273.         //改变了访问权限
    274.         bool GetActiveViewPortInfo (ads_real &height, ads_real &width, AcGePoint3d &target, AcGeVector3d &viewDir, ads_real &viewTwist, AcDbObjectId &currentVsId, bool getViewCenter);

    275.         //从外部的数据库中复制至当前库,并刷新视图
    276.         bool CopyAndRefresh(AcDbDatabase* pDb, bool bIsUpdata = true);

    277.         //-----------------------------------------------------------------------------------
    278.         // 函 数 名:GetMid
    279.         // 函数介绍:取2点的中点
    280.         // 参数介绍:const AcGePoint3d& pt1  点1
    281.         //           const AcGePoint3d& pt2  点2
    282.         //           AcGePoint3d& ptMid      返回值
    283.         // 返 回 值:static void
    284.         //-----------------------------------------------------------------------------------
    285.         static AcGePoint3d GetMidPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2);

    286. protected:
    287.         //-----------------------------------------------------------------------------------
    288.         // 函 数 名:InitPtr
    289.         // 函数介绍:初始化其它设备指针
    290.         // 返 回 值:bool
    291.         //-----------------------------------------------------------------------------------
    292.         virtual bool InitPtr();
    293.         //-----------------------------------------------------------------------------------
    294.         // 函 数 名:AfterInitPtr
    295.         // 函数介绍:初始化指针完毕
    296.         // 返 回 值:virtual bool
    297.         //-----------------------------------------------------------------------------------
    298.         virtual bool AfterInitPtr();
    299.         virtual BOOL PreTranslateMessage(MSG* pMsg);
    300.        
    301. protected:
    302.         virtual void PreSubclassWindow();

    303. private:

    304.         // 如果从DWG文件里面读取实体调用这个来改变实体的颜色并移动和缩放
    305.         bool Transform(const AcGeMatrix3d& matrix,const AcGeMatrix3d& matrixAngle, int iColor = -1);
    306. };
    307. .cpp

    308. #include "StdAfx.h"
    309. #include "resource.h"
    310. #include "DrawDWG.h"
    311. #include <axlock.h>
    312. #include "QuickQuery.h"
    313. #include "templatefun.h"
    314. #include "ShareFun.h"
    315. #include "CommonSDK\encdec.h"
    316. #include "ComVar.h"
    317. #include "SSGetTools.h"
    318. #include "GraTools.h"

    319. // 添加实体到视图
    320. bool addEntity(AcDbEntity* pEntity, AcGsView *pView, AcGsModel *pModel)
    321. {
    322.         if (NULL == pView)
    323.                 return false;

    324.         pView->add(pEntity, pModel);
    325.         return true;
    326. }
    327. // 鼠标的常规模式
    328. // #ifndef IDC_CURSOR
    329. // #define IDC_CURSOR 434
    330. // #endif
    331. // #ifndef IDI_PAN
    332. // #define IDI_PAN  435
    333. // #endif
    334. CDrawDWG::CDrawDWG(Adesk::Boolean bBuildDefaultDrawing,Adesk::Boolean bNoDocumen):
    335. m_bBuildDefaultDrawing(bBuildDefaultDrawing),
    336. m_bNoDocument(bNoDocumen),
    337. m_pView(NULL),
    338. m_pDevice(NULL),
    339. m_pModel(NULL),
    340. m_pDb(NULL),
    341. m_dWheelScale(1),
    342. m_bIsBlockDisp(true)
    343. {
    344.         m_pMouse = new CMouseMG;
    345. }

    346. CDrawDWG::CDrawDWG():
    347. m_pView(NULL),
    348. m_pDevice(NULL),
    349. m_pModel(NULL),
    350. m_pDb(NULL),
    351. m_dWheelScale(1),
    352. m_bIsBlockDisp(true)
    353. {
    354.         m_pMouse = new CMouseMG;
    355.         m_bBuildDefaultDrawing=Adesk::kFalse;
    356.         m_bNoDocument=Adesk::kTrue;
    357. }

    358. CDrawDWG::~CDrawDWG(void)
    359. {
    360.         Close();

    361.         if (NULL != m_pMouse)
    362.                 delete m_pMouse;

    363.         m_pMouse = NULL;

    364.         // 加密dwg文件
    365.         //for(int i=0; i<m_arrFilePath.size(); ++i)
    366.         //        encDec::enctryptFile(m_arrFilePath[i]);
    367. }
    368. BEGIN_MESSAGE_MAP(CDrawDWG, CWnd)
    369.         //{{AFX_MSG_MAP(CDrawDWG)
    370.         ON_WM_PAINT()
    371.         ON_WM_SIZE()

    372.         ON_WM_MOUSEWHEEL()
    373.         ON_WM_MOUSEMOVE()

    374.         ON_WM_LBUTTONDOWN()
    375.         ON_WM_LBUTTONUP()

    376.         ON_WM_MBUTTONDOWN()
    377.         ON_WM_MBUTTONUP()
    378.        
    379.         ON_WM_RBUTTONDOWN()
    380.         ON_WM_RBUTTONUP()

    381.         ON_WM_NCHITTEST()
    382.         ON_WM_SETFOCUS()
    383.        
    384.         //}}AFX_MSG_MAP
    385.         ON_WM_SETCURSOR()
    386.         ON_WM_DESTROY()
    387.         ON_COMMAND(ID_ZOOM_E, &CDrawDWG::ZoomE)
    388.         ON_WM_MBUTTONDBLCLK()
    389.         ON_WM_LBUTTONDBLCLK()
    390. END_MESSAGE_MAP()


    391. //
    392. //!
    393. //! @brief 获取真实显示style,解决只显示2dframe的问题
    394. //!
    395. //! @param pDb
    396. //! @param realisticVsId 输出的 visualStyleId
    397. //!
    398. //! @returns (Acad::ErrorStatus)
    399. //!
    400. //! detailed description here.
    401. //!
    402. //!
    403. //        ---------------------------------------------------------------------
    404. //       
    405. //         版本:                1.0
    406. //        ---------------------------------------------------------------------
    407. //         修改记录:
    408. //         日 期        版本           修改人         修改内容
    409. //   2011-07-28                1.0         
    410. //
    411. Acad::ErrorStatus getRealisticVisualStyleId(AcDbDatabase *pDb, AcDbObjectId& realisticVsId)
    412. {               
    413.         if (NULL == pDb)
    414.                 return Acad::eWasErased;

    415.         Acad::ErrorStatus es;
    416.         const ACHAR* styleName = _T("Realistic");
    417.         AcDbDictionary * pVsDict = NULL;
    418.         es = pDb->getVisualStyleDictionary(pVsDict,AcDb::kForRead);
    419.         if ( es != Acad::eOk || pVsDict == NULL )
    420.                 return es;
    421.         es = pVsDict->getAt(styleName,realisticVsId);
    422.         pVsDict->close();
    423.         return es;
    424. }
    425. //-----------------------------------------------------------------------------------
    426. // 函 数 名:Open
    427. // 函数介绍:打开DWG文件
    428. // 参数介绍:LPCTSTR lpDWGFn  DWG文件名
    429. // 返 回 值:bool
    430. //-----------------------------------------------------------------------------------
    431. bool CDrawDWG::Open(LPCTSTR lpDWGFn)
    432. {
    433.         // 先关闭
    434.         Close();

    435.         m_pDb = new AcDbDatabase(false,true);

    436.         if (NULL == m_pDb)
    437.                 return false;

    438.         // 如果已加密,则不再加了
    439.         encDec::CEncDec ed;
    440.         bool bIsEncrypt = false;
    441.         if (ed.wasEncrypted(lpDWGFn) )
    442.         {
    443.                 encDec::decipherFile(lpDWGFn);
    444.                 bIsEncrypt = true;
    445.         }
    446.         Acad::ErrorStatus es = m_pDb->readDwgFile(lpDWGFn, _SH_DENYRW);
    447.         if (bIsEncrypt)
    448.                 encDec::enctryptFile(lpDWGFn);
    449.         m_arrFilePath.push_back(lpDWGFn);

    450.         setTextStyleFont(m_pDb);
    451.         if (es != Acad::eOk)
    452.         {
    453.                 delete m_pDb;
    454.                 m_pDb = NULL;
    455.                 return false;
    456.         }
    457.         // 获取真实显示 style id
    458.         getRealisticVisualStyleId(m_pDb,m_visualStyleId);
    459.         m_pDb->closeInput(true);
    460.         // 初始化指针
    461.         if ( !InitPtr() )
    462.                 return false;
    463.         AfterInitPtr();
    464.         m_strDWGPath = lpDWGFn;
    465.         return true;
    466. }

    467. void CDrawDWG::SetNewDataBaseParams(Adesk::Boolean bBuildDefaultDrawing,Adesk::Boolean bNoDocument)
    468. {
    469.         m_bBuildDefaultDrawing=bBuildDefaultDrawing;
    470.         m_bNoDocument=bNoDocument;
    471. }

    472. //
    473. //! @brief
    474. //! @param LPCTSTR lpDWGFn
    475. //! @param double dMaxLength 最大长度
    476. //! @param double dMaxWidth 最大宽度
    477. //! @param int iColor
    478. //! @exception
    479. //! @return bool
    480. //! @sa
    481. // -----------------------------------------------------------------------
    482. //        作者:               
    483. //        版本:                1.0
    484. // -----------------------------------------------------------------------
    485. //        修改记录:
    486. //        日 期        版本           修改人         修改内容
    487. //         2011-7-13    1.0         
    488. //
    489. bool CDrawDWG::Open(LPCTSTR lpDWGFn, double dMaxLength, double dMaxWidth, const AcGePoint3d& ptOrigin, double dAngle, int iColor)
    490. {
    491.         // 先关闭
    492.         Close();

    493.         m_pDb = new AcDbDatabase(false,true);
    494.         if (NULL == m_pDb)
    495.                 return false;

    496.         // 如果已加密,则不再加了
    497.         encDec::CEncDec ed;
    498.         bool bIsEncrypt = false;
    499.         if (ed.wasEncrypted(lpDWGFn) )
    500.         {
    501.                 encDec::decipherFile(lpDWGFn);
    502.                 bIsEncrypt = true;
    503.         }
    504.         Acad::ErrorStatus es = m_pDb->readDwgFile(lpDWGFn, _SH_DENYRW);
    505.         if (bIsEncrypt)
    506.                 encDec::enctryptFile(lpDWGFn);
    507.         m_arrFilePath.push_back(lpDWGFn);

    508.         setTextStyleFont(m_pDb);
    509.         if (es != Acad::eOk)
    510.         {
    511.                 delete m_pDb;
    512.                 m_pDb = NULL;
    513.                 return false;
    514.         }

    515.         // 通过要求尺寸及实际尺寸得到比例
    516.         HHVerifyErr(m_pDb->updateExt());
    517.         AcGePoint3d p1(m_pDb->extmin());
    518.         AcGePoint3d p2(m_pDb->extmax());

    519.         double dWScale = dMaxLength / (p2.x - p1.x);
    520.         double dHScale = dMaxWidth / (p2.y - p1.y);
    521.         double dScale = min(dWScale, dHScale);

    522.         AcGeMatrix3d matrixS = matrixS.setCoordSystem(origin, xAxis, yAxis, zAxis);
    523.         matrixS = matrixS.scaling(dScale, origin);

    524.         AcGePoint3d pt = p2;
    525.         pt.x -= ( pt.x - p1.x ) / 2.0;
    526.         pt.y -= ( pt.y - p1.y ) / 2.0;

    527.         AcGeVector3d vecDist = ptOrigin*dScale - pt*dScale;
    528.         AcGeMatrix3d matrix = matrix.translation(vecDist);

    529.         for (int i=0; i<3; i++)
    530.         {
    531.                 matrix.entry[i][i] = matrixS.entry[i][i];
    532.         }

    533.        
    534.         AcGeMatrix3d matrixAngle = matrix.rotation(dAngle,zAxis,ptOrigin);

    535.         Transform(matrix, matrixAngle, iColor);


    536.         getRealisticVisualStyleId(m_pDb,m_visualStyleId);
    537.         m_pDb->closeInput(true);
    538.         // 初始化指针
    539.         if ( !InitPtr() )
    540.                 return false;
    541.         AfterInitPtr();
    542.         m_strDWGPath = lpDWGFn;
    543.         return true;
    544. }

    545. bool CDrawDWG::Transform(const AcGeMatrix3d& matrix, const AcGeMatrix3d& matrixAngle, int iColor)
    546. {   
    547.         Acad::ErrorStatus es = Acad::eOk;

    548.         // 打开块表
    549.         AcDbBlockTable *pBlkTbl;
    550.         es = m_pDb->getSymbolTable(pBlkTbl, AcDb::kForRead);//取得块表

    551.         if(es != Acad::eOk)
    552.         {
    553.                 return false;
    554.         }

    555.         // 打开模型空间块表记录
    556.         AcDbBlockTableRecord *pBlkTblRcd;
    557.         es = pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForWrite);
    558.         pBlkTbl->close();//关闭块表

    559.         if(es != Acad::eOk)
    560.         {
    561.                 return false;
    562.         }

    563.         //创建模型空间的遍历器
    564.         AcDbBlockTableRecordIterator *pBlkTblRcdItr;
    565.         es = pBlkTblRcd->newIterator(pBlkTblRcdItr);//创建遍历器

    566.         if(es != Acad::eOk)
    567.         {
    568.                 delete pBlkTblRcdItr;
    569.                 return false;
    570.         }
    571.         pBlkTblRcd->close();

    572.         // 遍历模型空间块表记录
    573.        
    574.         AcDbEntity *pEntity=NULL;

    575.         for(pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step())
    576.         {
    577.                 es = pBlkTblRcdItr->getEntity(pEntity, AcDb::kForWrite);//得到实体指针

    578.                 if (iColor != -1)
    579.                 {
    580.                         pEntity->setColorIndex(iColor);
    581.                 }
    582.                 pEntity->transformBy(matrix);
    583.                 pEntity->transformBy(matrixAngle);

    584.                 pEntity->close();
    585.         }

    586.         delete pBlkTblRcdItr;
    587.         pBlkTblRcdItr = NULL;

    588.         return true;
    589. }

    590. //-----------------------------------------------------------------------------------
    591. // 函 数 名:Open
    592. // 函数介绍:传入数据指针
    593. // 参数介绍:AcDbDatabase *pDb
    594. // 返 回 值:bool
    595. //-----------------------------------------------------------------------------------
    596. bool CDrawDWG::Open( AcDbDatabase *pDb )
    597. {
    598.         // 先关闭
    599.         Close();
    600.         m_pDb = CQKQuery::cloneDBase(pDb);

    601.         if (NULL == m_pDb)
    602.                 return false;
    603.         getRealisticVisualStyleId(m_pDb,m_visualStyleId);
    604.         // 初始化指针
    605.         if ( !InitPtr() )
    606.                 return false;
    607.         AfterInitPtr();
    608.         m_strDWGPath = _T("");
    609.         return true;
    610. }

    611. //
    612. //! @brief
    613. //! @param AcDbDatabase *pDb
    614. //! @exception
    615. //! @return bool
    616. //! @sa
    617. // -----------------------------------------------------------------------
    618. //        作者:               
    619. //        版本:                1.0
    620. // -----------------------------------------------------------------------
    621. //        修改记录:
    622. //        日 期        版本           修改人         修改内容
    623. //        2011-3-7       1.0           
    624. //
    625. bool CDrawDWG::QuickOpen( AcDbDatabase *pDb )
    626. {
    627.         if ( m_pDb==NULL )
    628.         {
    629.                 return Open(pDb);
    630.         }
    631.         // 数据库指针不为空,则删除所有实体,重新加载新数据库实体
    632.         CQKQueryAppVar mSrc(NULL, NULL, pDb);
    633.         CQKQueryAppVar mQkq(NULL, NULL, m_pDb);
    634.         HHVerify(mQkq.LockDoc());
    635.         HHVerify(mQkq.DelAllEntity());
    636.         HHVerify(mQkq.CloneAddEntitys(AcGeMatrix3d::kIdentity, mSrc.GetAllIds()));
    637.         HHVerify(mQkq.UnLockDoc());
    638.        
    639.         return RefreshView(mQkq.GetAllIds());
    640. }

    641. //-----------------------------------------------------------------------------------
    642. // 函 数 名:SaveDoc
    643. // 函数介绍:保存文件
    644. // 返 回 值:bool
    645. //-----------------------------------------------------------------------------------
    646. bool CDrawDWG::SaveDWG()
    647. {
    648.         return SaveDWG(m_strDWGPath);
    649. }
    650. //-----------------------------------------------------------------------------------
    651. // 函 数 名:SaveDWG
    652. // 函数介绍:保存文件
    653. // 参数介绍:LPCTSTR lpDWGFn
    654. // 返 回 值:bool
    655. //-----------------------------------------------------------------------------------
    656. bool CDrawDWG::SaveDWG(LPCTSTR lpDWGFn)
    657. {
    658.         if ( NULL != m_pDb )
    659.         {
    660.                 Acad::ErrorStatus acadRet = m_pDb->saveAs(lpDWGFn);
    661.                 if (  acadRet == Acad::eOk )
    662.                 {
    663.                         return true;
    664.                 }
    665.                 // 保存出错
    666.                 HHAssert(false);
    667.                 return false;
    668.         }
    669.         return false;
    670. }

    671. //将特定数据库中的arrSaveId对象保存为dwg文件
    672. //pDataBase会在外部删除
    673. bool CDrawDWG::SSSaveDwg(AcDbDatabase* pDataBase, AcDbObjectIdArray& arrSaveId, const CString& strDesFile)
    674. {
    675.         if (NULL == pDataBase)
    676.                 return false;

    677.         AcDbBlockTable *pBT = NULL;
    678.         Acad::ErrorStatus es = pDataBase->getSymbolTable(pBT,AcDb::kForRead);
    679.         if(es != Acad::eOk)       
    680.         {
    681.                 //delete pDataBase;
    682.                 return FALSE;
    683.         }

    684.         AcDbBlockTableRecord *pBTR = NULL;
    685.         es = pBT->getAt(ACDB_MODEL_SPACE,pBTR,AcDb::kForRead);
    686.         pBT->close();
    687.         if(es != Acad::eOk)
    688.         {
    689.                 //delete pDataBase;
    690.                 return FALSE;
    691.         }

    692.         AcDbBlockTableRecordIterator *pIterator;
    693.         pBTR->newIterator(pIterator);
    694.         pBTR->close();

    695.         for(pIterator->start();!pIterator->done();pIterator->step())
    696.         {
    697.                 AcDbEntity *pEnt = NULL;
    698.                 es = pIterator->getEntity(pEnt,AcDb::kForWrite);
    699.                 if(es != Acad::eOk)               
    700.                 {
    701.                         delete pIterator;
    702.                         return FALSE;
    703.                 }

    704.                 AcDbHandle handle;
    705.                 pEnt->getAcDbHandle(handle);       

    706.                 bool bDelete = true;
    707.                 for (int i = 0; i < arrSaveId.length(); i++)
    708.                 {
    709.                         AcDbHandle hd = arrSaveId[i].handle();
    710.                         if (hd == handle)
    711.                         {
    712.                                 bDelete = false;
    713.                         }
    714.                 }

    715.                 if (bDelete)
    716.                 {
    717.                         pEnt->erase();
    718.                 }

    719.                 pEnt->close();
    720.         }
    721.         delete pIterator;

    722.         es = pDataBase->saveAs(strDesFile);

    723.         if (es != Acad::eOk)
    724.                 return false;

    725.         return true;
    726. }

    727. //-----------------------------------------------------------------------------------
    728. // 函 数 名:cloneDBase
    729. // 函数介绍:由当前图形克隆一个数据库,克隆出的指针需要在外部释放
    730. // 返 回 值:AcDbDatabase*
    731. //-----------------------------------------------------------------------------------
    732. AcDbDatabase* CDrawDWG::cloneDBase()
    733. {
    734.         return CQKQuery::cloneDBase(m_pDb);
    735. }
    736. //-----------------------------------------------------------------------------------
    737. // 函 数 名:ReLoadDWG
    738. // 函数介绍:重新读取DWG文件
    739. // 返 回 值:bool
    740. //-----------------------------------------------------------------------------------
    741. bool CDrawDWG::ReLoadDWG()
    742. {
    743.         if (NULL != m_pView)
    744.                 m_pView->eraseAll();

    745.         delete m_pDb;
    746.         m_pDb = new AcDbDatabase(false,true);

    747.         // 如果已加密,则不再加了
    748.         encDec::CEncDec ed;
    749.         bool bIsEncrypt = false;
    750.         if (ed.wasEncrypted(m_strDWGPath) )
    751.         {
    752.                 encDec::decipherFile(m_strDWGPath);
    753.                 bIsEncrypt = true;
    754.         }
    755.         Acad::ErrorStatus es = m_pDb->readDwgFile(m_strDWGPath, _SH_DENYRW);
    756.         if (bIsEncrypt)
    757.                 encDec::enctryptFile(m_strDWGPath);
    758.         m_arrFilePath.push_back(m_strDWGPath);

    759.         if (es != Acad::eOk)
    760.         {
    761.                 assert(false);
    762.                 delete m_pDb;
    763.                 m_pDb = NULL;
    764.                 return false;
    765.         }
    766.         getRealisticVisualStyleId(m_pDb,m_visualStyleId);
    767.         RefreshView();
    768.         return true;
    769. }

    770. // 关闭文件
    771. void CDrawDWG::Close()
    772. {
    773.         AcGsManager *pGsManager = acgsGetGsManager();
    774.         HHAssert(pGsManager);
    775.        
    776.         if (NULL == pGsManager)
    777.                 return;

    778.         if (m_pView)
    779.         {
    780.                 m_pView->eraseAll();
    781.                 if (m_pDevice)
    782.                 {
    783.                         bool b = m_pDevice->erase(m_pView);
    784.                         HHAssert(b);
    785.                 }

    786.                 AcGsClassFactory *pFactory = pGsManager->getGSClassFactory();
    787.                 HHAssert(pFactory);
    788.                 pFactory->deleteView(m_pView);
    789.                 m_pView = NULL;
    790.         }

    791.         if (m_pModel)
    792.         {
    793.                 pGsManager->destroyAutoCADModel(m_pModel);
    794.                 m_pModel = NULL;
    795.         }

    796.         if (m_pDevice)
    797.         {
    798.                 pGsManager->destroyAutoCADDevice(m_pDevice);
    799.                 m_pDevice = NULL;
    800.         }

    801.         if (m_pDb)
    802.         {
    803.                 delete m_pDb;
    804.                 m_pDb = NULL;
    805.         }
    806.         m_strDWGPath.Empty();
    807. }
    808. // 缩放到整个图纸可见
    809. void CDrawDWG::ZoomE()
    810. {
    811.         if (NULL == m_pView)
    812.                 return;

    813.         AcGePoint3d ptTargetView = GetMidPoint(m_PExtents.maxPoint(), m_PExtents.minPoint());

    814.         double dLenght = m_PExtents.maxPoint().x - m_PExtents.minPoint().x;
    815.         double dWidth  = m_PExtents.maxPoint().y - m_PExtents.minPoint().y;
    816.         m_pView->setView(ptTargetView + AcGeVector3d::kZAxis,ptTargetView,AcGeVector3d::kYAxis,dLenght*1.05,dWidth*1.05);
    817.         UpdataView();
    818. }
    819. //-----------------------------------------------------------------------------------
    820. // 函 数 名:AfterInitPtr
    821. // 函数介绍:初始化指针完毕
    822. // 返 回 值:virtual bool
    823. //-----------------------------------------------------------------------------------
    824. bool CDrawDWG::AfterInitPtr()
    825. {
    826.         if ( NULL == m_pDb )
    827.         {
    828.                 HHAssert(false);
    829.                 return false;
    830.         }
    831.         // 视图与数据库绑定
    832.         HHVerifyErr(m_pDb->updateExt());
    833.         CQKQuery mQkq(m_pDb);
    834.         HHVerify(mQkq.LockDoc());
    835.         HHVerify(mQkq.UpdataView(m_pView, m_pModel, &m_PExtents, m_bIsBlockDisp));
    836.         HHVerify(mQkq.UnLockDoc());

    837.         ZoomE();

    838.         return true;
    839. }
    840. //-----------------------------------------------------------------------------------
    841. // 函 数 名:InitPtr
    842. // 函数介绍:初始化其它设备指针
    843. // 返 回 值:bool
    844. //-----------------------------------------------------------------------------------
    845. bool CDrawDWG::InitPtr()
    846. {
    847.         // 获得图形系统管理器
    848.         AcGsManager *pGsManager = acgsGetGsManager();
    849.         HHAssert(pGsManager);
    850.         // 获得图形系统类工厂
    851.         AcGsClassFactory *pFactory = pGsManager->getGSClassFactory();
    852.         HHAssert(pFactory);

    853.         // 创建图形系统设备
    854.         m_pDevice = pGsManager->createAutoCADDevice(m_hWnd);
    855.         HHAssert(m_pDevice);

    856.         CRect rect;
    857.         GetClientRect(&rect);

    858.         m_pDevice->onSize(rect.Width(), rect.Height());

    859.         // 创建图形系统视图
    860.         m_pView = pFactory->createView();
    861.         HHAssert(m_pView);
    862.         m_pDevice->add(m_pView);

    863.         //m_pView->setMode(AcGsView::k2DOptimized);
    864.         m_pView->setVisualStyle(AcGiVisualStyle::kRealistic);
    865.         m_pModel = pGsManager->createAutoCADModel();
    866.         HHAssert(m_pModel);

    867.         ReSetView();

    868.         // 加载鼠标样式
    869.         m_pMouse->AddItem<CMouseStyleNormal>(IDC_CURSOR, this);
    870.         // 设置当前鼠标样式
    871.         SetNormal();

    872.         return true;
    873. }
    874. //-----------------------------------------------------------------------------------
    875. // 函 数 名:SetNormal
    876. // 函数介绍:设置鼠标为正常模式
    877. //-----------------------------------------------------------------------------------
    878. void CDrawDWG::SetNormal()
    879. {
    880.         if (NULL == m_pMouse)
    881.                 return;

    882.         m_pMouse->SetCurID(IDC_CURSOR);
    883.         m_pMouse->SetCurMouseShowRightMenu(IDR_MENU_DEF_GRAPH);
    884. }
    885. //函数功能:获得当前视口的信息。
    886. //输出参数:height 视口高度,width 视口宽度,target 视口中心点,viewDir 视口的观察向量,twist 扭曲的视口
    887. bool CDrawDWG::GetActiveViewPortInfo ( ads_real &height, ads_real &width,
    888.                                                                            AcGePoint3d &target, AcGeVector3d &viewDir,
    889.                                                                            ads_real &viewTwist, AcDbObjectId &currentVsId, bool getViewCenter)
    890. {
    891.         // if not ok
    892.         if (m_pDb == NULL)
    893.                 return false;

    894.         // get the current working database as a backup
    895.         //AcDbDatabase *workingDataBase = acdbHostApplicationServices()->workingDatabase();
    896.         // now set the working database
    897.         //acdbHostApplicationServices()->setWorkingDatabase(m_pDb);

    898.         // make sure the active view port is uptodate
    899.         acedVports2VportTableRecords();

    900.         // open the view port records
    901.         AcDbViewportTablePointer pVTable(m_pDb->viewportTableId(), AcDb::kForRead);
    902.         // if we opened them ok
    903.         if (pVTable.openStatus() == Acad::eOk)
    904.         {
    905.                 AcDbViewportTableRecord *pViewPortRec = NULL;
    906.                 Acad::ErrorStatus es = pVTable->getAt (_T("*Active"), pViewPortRec, AcDb::kForRead);
    907.                 if (es == Acad::eOk)
    908.                 {
    909.                         // get the height of the view
    910.                         height = pViewPortRec->height ();
    911.                         // get the width
    912.                         width = pViewPortRec->width ();
    913.                         // if the user wants the center of the viewport used
    914.                         if (getViewCenter == true)
    915.                         {
    916.                                 struct resbuf rb;
    917.                                 memset (&rb, 0, sizeof (struct resbuf));
    918.                                 // get the system var VIEWCTR
    919.                                 acedGetVar (_T("VIEWCTR"), &rb);
    920.                                 // set that as the target
    921.                                 target = AcGePoint3d (rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]);
    922.                         }
    923.                         // we want the viewport's camera target setting
    924.                         else
    925.                         {
    926.                                 // get the target of the view
    927.                                 target = pViewPortRec->target ();
    928.                         }               

    929.                         // get the view direction
    930.                         viewDir = pViewPortRec->viewDirection ();
    931.                         // get the view twist of the viewport
    932.                         viewTwist = pViewPortRec->viewTwist ();
    933.                         // return the current Visual Style
    934.                         currentVsId = pViewPortRec->visualStyle();
    935.                 }
    936.                 // close after use
    937.                 if (NULL != pViewPortRec)
    938.                         pViewPortRec->close();                       
    939.         }       

    940.         // now restore the original working database
    941. //        acdbHostApplicationServices()->setWorkingDatabase(workingDataBase);

    942.         return (true);
    943. }
    944. //-----------------------------------------------------------------------------------
    945. // 函 数 名:GetMidPoint
    946. // 函数介绍:取2点的中点
    947. // 参数介绍:const AcGePoint3d& pt1  点1
    948. //           const AcGePoint3d& pt2  点2
    949. // 返 回 值:static AcGePoint3d
    950. //-----------------------------------------------------------------------------------
    951. AcGePoint3d CDrawDWG::GetMidPoint(const AcGePoint3d& pt1, const AcGePoint3d& pt2)
    952. {
    953.         AcGePoint3d ptMid;
    954.         ptMid.x = 0.5 *(pt1.x + pt2.x);
    955.         ptMid.y = 0.5 *(pt1.y + pt2.y);
    956.         ptMid.z = 0.5 *(pt1.z + pt2.z);
    957.         return ptMid;
    958. }
    959. void CDrawDWG::OnPaint()
    960. {
    961.         __super::OnPaint();
    962.         UpdataView();
    963. }
    964. void CDrawDWG::OnSize(UINT nType, int cx, int cy)
    965. {
    966.         if (!m_pDevice)
    967.                 return;
    968.         CRect rect;
    969.         GetClientRect(&rect);
    970.         m_pDevice->onSize(rect.Width(), rect.Height());
    971. }
    972. //-----------------------------------------------------------------------------------
    973. // 函 数 名:MoveAndScaleView
    974. // 函数介绍:缩放并移动图形
    975. // 参数介绍:short zDelta
    976. //           CPoint point
    977. // 返 回 值:virtual
    978. //-----------------------------------------------------------------------------------
    979. void CDrawDWG::MoveAndScaleView(short zDelta, CPoint point)
    980. {
    981.         if ( !m_pView)
    982.                 return;
    983.         // 1.将鼠标点转成视图坐标
    984. //         double dX1 = Pt2ViewX(point.x);
    985. //         double dY1 = Pt2ViewY(point.y);
    986.         // 2.移动图形
    987.         if (zDelta < 0)
    988.         {
    989.                 m_pView->zoom(0.5);
    990.                 m_dWheelScale *= 0.5;
    991.         }
    992.         else
    993.         {
    994.                 m_pView->zoom(1.5);
    995.                 m_dWheelScale *= 1.5;
    996.         }
    997.         // 3.将鼠标点再次转成视图坐标
    998. //         double dX2 = Pt2ViewX(point.x);
    999. //         double dY2 = Pt2ViewY(point.y);
    1000. //         // 4.根据2次坐标差值,移动图形
    1001. //         AcGeVector3d pan_vec(dX1-dX2, dY1-dY2, 0.0);
    1002. //         m_pView->dolly(pan_vec);
    1003.         UpdataView();
    1004. }
    1005. //-----------------------------------------------------------------------------------
    1006. // 函 数 名:Move
    1007. // 函数介绍:移动图形
    1008. // 参数介绍:CPoint p1 开始点
    1009. //           CPoint p2 终止点
    1010. // 返 回 值:virtual void
    1011. //-----------------------------------------------------------------------------------
    1012. void CDrawDWG::Move(CPoint p1, CPoint p2)
    1013. {
    1014.         if ( NULL == m_pView )
    1015.                 return;
    1016.         //完成从设备坐标系统到世界坐标系统的转换
    1017.         AcGeVector3d pan_vec(-(p2.x-p1.x),p2.y-p1.y,0);
    1018.         pan_vec.transformBy(m_pView->viewingMatrix() * m_pView->worldToDeviceMatrix().inverse());
    1019.         m_pView->dolly(pan_vec);

    1020.         //调整平移的矩阵
    1021.         m_MoveVector += pan_vec;

    1022.         UpdataView();
    1023. }
    1024. BOOL CDrawDWG::OnMouseWheel(UINT nFlags, short zDelta, CPoint point)
    1025. {
    1026.         m_pMouse->OnMouseWheel(nFlags, zDelta, point);
    1027.         // 给父窗口发鼠标消息
    1028.         CWnd* pWnd = GetParent();
    1029.         if ( NULL != pWnd )
    1030.                 pWnd->PostMessage(WM_MOUSEWHEEL, MAKEWPARAM(nFlags, zDelta),  MAKELPARAM(point.x, point.y));
    1031.         return TRUE;
    1032. }

    1033. void CDrawDWG::OnLButtonDown(UINT nFlags, CPoint point)
    1034. {
    1035.         if (NULL == m_pMouse)
    1036.                 return;

    1037.         m_pMouse->OnLButtonDown(nFlags, point);
    1038.         // 给父窗口发鼠标消息
    1039.         CWnd* pWnd = GetParent();
    1040.         if ( NULL != pWnd )
    1041.                 pWnd->PostMessage(WM_LBUTTONDOWN, nFlags,  MAKEWPARAM(point.x, point.y));
    1042.         SetFocus();
    1043. }
    1044. void CDrawDWG::OnLButtonUp(UINT nFlags, CPoint point)
    1045. {
    1046.         if (NULL == m_pMouse)
    1047.                 return;

    1048.         m_pMouse->OnLButtonUp(nFlags, point);
    1049.         // 给父窗口发鼠标消息
    1050.         CWnd* pWnd = GetParent();
    1051.         if ( NULL != pWnd )
    1052.                 pWnd->PostMessage(WM_LBUTTONUP, nFlags,  MAKEWPARAM(point.x, point.y));
    1053.         SetFocus();
    1054. }
    1055. void CDrawDWG::OnMButtonDown(UINT nFlags, CPoint point)
    1056. {
    1057.         if (NULL == m_pMouse)
    1058.                 return;

    1059.         m_pMouse->OnMButtonDown(nFlags, point);
    1060.         // 给父窗口发鼠标消息
    1061.         CWnd* pWnd = GetParent();
    1062.         if ( NULL != pWnd )
    1063.                 pWnd->PostMessage(WM_MBUTTONDOWN, nFlags,  MAKEWPARAM(point.x, point.y));
    1064.         SetFocus();
    1065. }

    1066. void CDrawDWG::OnMButtonUp(UINT nFlags, CPoint point)
    1067. {
    1068.         if (NULL == m_pMouse)
    1069.                 return;

    1070.         m_pMouse->OnMButtonUp(nFlags, point);
    1071.         // 给父窗口发鼠标消息
    1072.         CWnd* pWnd = GetParent();
    1073.         if ( NULL != pWnd )
    1074.                 pWnd->PostMessage(WM_MBUTTONUP, nFlags,  MAKEWPARAM(point.x, point.y));
    1075.         SetFocus();
    1076. }

    1077. //函数功能:鼠标滚轮放大缩小视图
    1078. void CDrawDWG::OnMouseMove(UINT nFlags, CPoint point)
    1079. {
    1080.         if (NULL == m_pMouse)
    1081.                 return;

    1082.         m_pMouse->OnMouseMove(nFlags, point);
    1083.         // 给父窗口发鼠标消息
    1084.         CWnd* pWnd = GetParent();
    1085.         if ( NULL != pWnd )
    1086.         {
    1087.                 //pWnd->SetFocus();
    1088.                 pWnd->PostMessage(WM_MOUSEMOVE, nFlags,  MAKEWPARAM(point.x, point.y));
    1089.         }
    1090.         SetFocus();
    1091. }
    1092. void CDrawDWG::OnRButtonDown(UINT nFlags, CPoint point)
    1093. {
    1094.         if (NULL == m_pMouse)
    1095.                 return;

    1096.         m_pMouse->OnRButtonDown(nFlags, point);
    1097.         // 给父窗口发鼠标消息
    1098.         CWnd* pWnd = GetParent();
    1099.         if ( NULL != pWnd )
    1100.                 pWnd->PostMessage(WM_RBUTTONDOWN, nFlags,  MAKEWPARAM(point.x, point.y));
    1101.         SetFocus();
    1102. }
    1103. void CDrawDWG::OnRButtonUp(UINT nFlags, CPoint point)
    1104. {
    1105.         if (NULL == m_pMouse)
    1106.                 return;

    1107.         m_pMouse->OnRButtonUp(nFlags, point);
    1108.         // 给父窗口发鼠标消息
    1109.         CWnd* pWnd = GetParent();
    1110.         if ( NULL != pWnd )
    1111.                 pWnd->PostMessage(WM_RBUTTONUP, nFlags,  MAKEWPARAM(point.x, point.y));
    1112.         SetFocus();
    1113. }
    1114. void CDrawDWG::OnMButtonDblClk( UINT nFlags, CPoint point )
    1115. {
    1116.         if (NULL == m_pMouse)
    1117.                 return;

    1118.         m_pMouse->OnMButtonDblClk(nFlags, point);
    1119.         // 给父窗口发鼠标消息
    1120.         CWnd* pWnd = GetParent();
    1121.         if ( NULL != pWnd )
    1122.                 pWnd->PostMessage(WM_MBUTTONDBLCLK, nFlags,  MAKEWPARAM(point.x, point.y));
    1123.         SetFocus();
    1124. }
    1125. //
    1126. //! @brief
    1127. //! @param UINT nFlags
    1128. //! @param CPoint point
    1129. //! @exception
    1130. //! @sa
    1131. // -----------------------------------------------------------------------
    1132. //        作者:               
    1133. //        版本:                1.0
    1134. // -----------------------------------------------------------------------
    1135. //        修改记录:
    1136. //        日 期        版本           修改人         修改内容
    1137. //         2011-5-16    1.0           
    1138. //
    1139. void CDrawDWG::OnLButtonDblClk(UINT nFlags, CPoint point)
    1140. {
    1141.         if (NULL == m_pMouse)
    1142.                 return;

    1143.         m_pMouse->OnLButtonDblClk(nFlags, point);
    1144.         // 给父窗口发鼠标消息
    1145.         CWnd* pWnd = GetParent();
    1146.         if ( NULL != pWnd )
    1147.                 pWnd->PostMessage(WM_LBUTTONDBLCLK, nFlags,  MAKEWPARAM(point.x, point.y));
    1148.         SetFocus();
    1149. }

    1150. //-----------------------------------------------------------------------------------
    1151. // 函 数 名:UpdataView
    1152. // 函数介绍:更新视图,在图形有变化时刷新屏幕
    1153. // 返 回 值:void
    1154. //-----------------------------------------------------------------------------------
    1155. void CDrawDWG::UpdataView()
    1156. {
    1157.         if ( NULL == m_pView )
    1158.                 return;
    1159.         m_pView->invalidate();
    1160.         m_pView->update();
    1161. }
    1162. //-----------------------------------------------------------------------------------
    1163. // 函 数 名:RefreshId
    1164. // 函数介绍:刷新视图中的某个元素
    1165. // 参数介绍:const AcDbObjectId& mId
    1166. // 返 回 值:bool true:成功,false:失败
    1167. //-----------------------------------------------------------------------------------
    1168. bool CDrawDWG::RefreshId(const AcDbObjectId& mId)
    1169. {
    1170.         if ( NULL == m_pView )
    1171.                 return false;
    1172.         AcDbEntity* pEntity=NULL;
    1173.         HHVerifyErr2(acdbOpenObject(pEntity, mId,AcDb::kForWrite, true), return false;);
    1174.         HHVerify(RefreshIdP(pEntity));
    1175.         HHVerifyErr(pEntity->close());
    1176.         return true;
    1177. }

    1178. bool CDrawDWG::RefreshIdP( AcDbEntity* pEntity, AcDbExtents* pExtents)
    1179. {
    1180.         if ( NULL == m_pView )
    1181.                 return false;

    1182.         m_pView->erase(pEntity);
    1183.        

    1184.         if ( !pEntity->isErased() && pEntity->visibility()== AcDb::kVisible )
    1185.         {
    1186.                 if (pExtents)
    1187.                 {
    1188.                         m_PExtents.addExt(*pExtents);
    1189.                 }
    1190.                 addEntity(pEntity, m_pView, m_pModel);
    1191.         }

    1192.         return true;
    1193. }
    1194. //-----------------------------------------------------------------------------------
    1195. // 函 数 名:ReSetView
    1196. // 函数介绍:重新设置视窗
    1197. //-----------------------------------------------------------------------------------
    1198. void CDrawDWG::ReSetView()
    1199. {
    1200.         // 张战运 2015/12/18 16:33
    1201.         if (NULL == m_pView)
    1202.                 return;

    1203.         double height = 0.0, width = 0.0, viewTwist = 0.0;
    1204.         AcGePoint3d ptTargetView;
    1205.         AcGeVector3d vecViewDir;
    1206.         AcDbObjectId currentVsId;
    1207.         GetActiveViewPortInfo (height, width, ptTargetView, vecViewDir, viewTwist, currentVsId, true);

    1208.         vecViewDir[X] = -1;
    1209.         m_pView->setView(ptTargetView + vecViewDir, ptTargetView,
    1210.                 AcGeVector3d(0.0, 1.0, 0.0), 1.0, 1.0);

    1211.         m_pView->setVisualStyle(m_visualStyleId);
    1212.         UpdataView();
    1213. }
    1214. //-----------------------------------------------------------------------------------
    1215. // 函 数 名:RefreshView
    1216. // 函数介绍:刷新视图 中的部分数据
    1217. // 参数介绍:const AcDbObjectIdArray& arr
    1218. // 返 回 值:bool true:成功,false:失败
    1219. //-----------------------------------------------------------------------------------
    1220. bool CDrawDWG::RefreshView(const AcDbObjectIdArray& arr)
    1221. {
    1222.         // 张战运 2015/12/18 16:33
    1223.         if (NULL == m_pDb)
    1224.                 return false;

    1225.         CQKQueryIds mQkq(arr, m_pDb);
    1226.         HHVerify(mQkq.LockDoc());
    1227.         HHVerify(mQkq.OpEntity(arr, HHstd::PtrMemFun_1<CDrawDWG>(this,&CDrawDWG::RefreshId)) );
    1228.         HHVerify(mQkq.UnLockDoc());

    1229.         HHVerifyErr(m_pDb->updateExt());

    1230.         HHVerifyErr(m_PExtents.set(m_pDb->extmin(), m_pDb->extmax()));

    1231.         return true;
    1232. }
    1233. void CDrawDWG::EraseAllEntity()
    1234. {
    1235.         if ( m_pView != NULL )
    1236.                 m_pView->eraseAll();
    1237. }
    1238. //-----------------------------------------------------------------------------------
    1239. // 函 数 名:RefreshView
    1240. // 函数介绍:刷新视图,在数据库增加或删除实体后要调用此函数刷新
    1241. // 返 回 值:bool
    1242. //-----------------------------------------------------------------------------------
    1243. bool CDrawDWG::RefreshView()
    1244. {
    1245.         if ( m_pView == NULL )
    1246.                 return false;
    1247.         HHVerifyErr(m_pDb->updateExt());
    1248.         CQKQuery mQKQuery(m_pDb);
    1249.         HHVerify(mQKQuery.LockDoc());
    1250.         HHVerify(mQKQuery.UpdataView(m_pView, m_pModel, &m_PExtents, m_bIsBlockDisp));
    1251.         HHVerify(mQKQuery.UnLockDoc());
    1252.         ReSetView();
    1253.         ZoomE();
    1254.         return true;
    1255. }
    1256. // 取得0,0点在图上的坐标
    1257. AcGeVector3d CDrawDWG::GetOxy()const
    1258. {
    1259.         if ( NULL == m_pView )
    1260.                 return AcGeVector3d (0.0,0.0,0.0);;
    1261.         AcGeMatrix3d matrix(m_pView->screenMatrix());
    1262.         AcGeVector3d mPt(0.0,0.0,0.0);
    1263.         mPt.transformBy(matrix);
    1264.         return mPt;
    1265. }
    1266. // CPoint中的X转成图上坐标Y
    1267. double CDrawDWG::Pt2ViewX(int nPtX)const
    1268. {
    1269.         double dX = 0.0;
    1270.         if (m_pView)
    1271.         {
    1272.                 m_pView->endInteractivity();

    1273.                 AcGeMatrix3d matrix = m_pView->worldToDeviceMatrix();

    1274.                 AcGePoint3d pt(nPtX,0.0,0.0);
    1275.                 pt = pt.transformBy(matrix.inverse());
    1276.                 dX = pt[X];
    1277.         }

    1278.         return dX;
    1279. }
    1280. // CPoint中的Y转成图上坐标Y
    1281. double CDrawDWG::Pt2ViewY(int nPtY)const
    1282. {
    1283.         CPoint pt(0,nPtY);
    1284.         //ScreenToClient(&pt);
    1285.         CRect rect;
    1286.         GetClientRect(rect);
    1287.         pt.y = rect.bottom - pt.y;
    1288.         AcGeVector3d mPt(0.0,pt.y,0.0);

    1289.         double dY = 0.0;
    1290.         if (m_pView)
    1291.         {
    1292.                 m_pView->endInteractivity();

    1293.                 AcGeMatrix3d matrix = m_pView->worldToDeviceMatrix();

    1294.                 AcGePoint3d pt(0.0,pt.y,0.0);
    1295.                 pt = pt.transformBy(matrix.inverse());

    1296.                 dY = pt[Y];
    1297.         }

    1298.         return dY;
    1299. }
    1300. //-----------------------------------------------------------------------------------
    1301. // 函 数 名:ToPt
    1302. // 函数介绍:鼠标坐标转视图坐标
    1303. // 参数介绍:CPoint pt
    1304. // 返 回 值:AcGePoint3d
    1305. //-----------------------------------------------------------------------------------
    1306. AcGePoint3d CDrawDWG::ToPt(CPoint pt)const
    1307. {
    1308.         return AcGePoint3d(Pt2ViewX(pt.x), Pt2ViewY(pt.y), 0.0);
    1309. }
    1310. BOOL CDrawDWG::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    1311. {
    1312.         HCURSOR hCur = m_pMouse->GetCursorHandle();
    1313.         if ( NULL != hCur )
    1314.         {
    1315.                 SetCursor(hCur);
    1316.                 return TRUE;
    1317.         }
    1318.         return CWnd::OnSetCursor(pWnd, nHitTest, message);
    1319. }
    1320. LRESULT CDrawDWG::OnNcHitTest(CPoint point)
    1321. {
    1322.         return HTCLIENT;
    1323. }
    1324. BOOL CDrawDWG::PreTranslateMessage(MSG* pMsg)
    1325. {
    1326.         if( pMsg->message == WM_KEYDOWN )
    1327.         {
    1328.                 // 如果鼠标事件处理了键盘按下消息,则不传递给父类了
    1329.                 if ( m_pMouse->OnProcKeyDown(pMsg->wParam) )
    1330.                 {
    1331.                         return TRUE;
    1332.                 }
    1333.                 CWnd* pWnd = GetParent();
    1334.                 if ( NULL != pWnd )
    1335.                 {
    1336.                         pWnd->PostMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
    1337.                         return TRUE;
    1338.                 }
    1339.         }
    1340.         return CWnd::PreTranslateMessage(pMsg);
    1341. }

    1342. void CDrawDWG::OnDestroy()
    1343. {
    1344.         CWnd::OnDestroy();

    1345.         Close();
    1346. }

    1347. //-----------------------------------------------------------------------------------
    1348. // 函 数 名:ViewAddEntity
    1349. // 函数介绍:添加一个实体到视图,视图不负责实体指针的释放
    1350. // 参数介绍:AcDbEntity* pEntity
    1351. //                         bool bIsReSetView=true 是否重设置视窗,一般添加完毕,得设置一下
    1352. //-----------------------------------------------------------------------------------
    1353. void CDrawDWG::ViewAddEntity(AcDbEntity* pEntity, bool bIsReSetView/*=true*/,bool bUpdateView /*= true*/)
    1354. {
    1355.         // 张战运 2015/12/18 16:33
    1356.         if (NULL == m_pView)
    1357.                 return;

    1358.         HHAssert(m_pView);
    1359.         addEntity(pEntity, m_pView, m_pModel);

    1360.         CQKQuery mQkq(m_pDb);
    1361.         HHVerify(mQkq.LockDoc());
    1362.         AcDbExtents extents;
    1363.         mQkq.GetEntExtent(pEntity, extents);
    1364.         HHVerify(mQkq.UnLockDoc());

    1365.         // 判断一下新得到的实体坐标
    1366.         m_PExtents.addExt(extents);
    1367.         if ( bIsReSetView )
    1368.                 ReSetView();
    1369.         else if (bUpdateView)
    1370.                 UpdataView();
    1371. }
    1372. //-----------------------------------------------------------------------------------
    1373. // 函 数 名:ViewEreaseEntity
    1374. // 函数介绍:从视图移去一个实体
    1375. // 参数介绍:AcDbEntity* pEntity
    1376. //-----------------------------------------------------------------------------------
    1377. void CDrawDWG::ViewEreaseEntity(AcDbEntity* pEntity)
    1378. {
    1379.         if (NULL == m_pView)
    1380.                 return;

    1381.         HHAssert(m_pView);
    1382.         m_pView->erase(pEntity);
    1383. }
    1384. void CDrawDWG::PreSubclassWindow()
    1385. {
    1386.         CWnd::PreSubclassWindow();
    1387.         InitPtr();
    1388. }

    1389. //
    1390. //! @brief
    1391. //! @param UINT uId
    1392. //! @exception
    1393. //! @sa
    1394. // -----------------------------------------------------------------------
    1395. //        作者:               
    1396. //        版本:                1.0
    1397. // -----------------------------------------------------------------------
    1398. //        修改记录:
    1399. //        日 期        版本           修改人         修改内容
    1400. //         2011-2-22    1.0           
    1401. //
    1402. void CDrawDWG::SetCurMouse( UINT uId )
    1403. {
    1404.         // 张战运 2015/12/18 16:33
    1405.         if (NULL == m_pMouse)
    1406.                 return;

    1407.         m_pMouse->SetCurID(uId);
    1408. }

    1409. //
    1410. //! @brief
    1411. //! @exception
    1412. //! @sa
    1413. // -----------------------------------------------------------------------
    1414. //        作者:               
    1415. //        版本:                1.0
    1416. // -----------------------------------------------------------------------
    1417. //        修改记录:
    1418. //        日 期        版本           修改人         修改内容
    1419. //         2011-2-23    1.0            
    1420. //
    1421. void CDrawDWG::RemoveAllMouse()
    1422. {
    1423.         if (NULL == m_pMouse)
    1424.                 return;

    1425.         m_pMouse->DelAll();
    1426. }

    1427. //
    1428. //! @brief
    1429. //! @param UINT uId
    1430. //! @exception
    1431. //! @sa
    1432. // -----------------------------------------------------------------------
    1433. //        作者:               
    1434. //        版本:                1.0
    1435. // -----------------------------------------------------------------------
    1436. //        修改记录:
    1437. //        日 期        版本           修改人         修改内容
    1438. //         2011-2-23    1.0           
    1439. //
    1440. void CDrawDWG::RemoveMouse( UINT uId )
    1441. {
    1442.         // 张战运 2015/12/18 16:33
    1443.         if (NULL == m_pMouse)
    1444.                 return;

    1445.         m_pMouse->DelItem(uId);
    1446. }

    1447. bool CDrawDWG::GetUpDownMidLine(AcGeLine3d& mLine)
    1448. {
    1449.         if(m_pDb==NULL)
    1450.                 return false;

    1451.         HHVerifyErr(m_pDb->updateExt());
    1452.         CQKQuery mQkq(m_pDb);
    1453.         HHVerify(mQkq.LockDoc());
    1454.         HHVerify(mQkq.UpdataView(m_pView, m_pModel, &m_PExtents, m_bIsBlockDisp));
    1455.         HHVerify(mQkq.UnLockDoc());

    1456.         double dMinX=m_PExtents.minPoint().x;
    1457.         double dMinY=m_PExtents.minPoint().y;
    1458.         double dMaxX=m_PExtents.maxPoint().x;
    1459.         double dMaxY=m_PExtents.maxPoint().y;
    1460.                
    1461.         AcGePoint3d pt1((dMinX+dMaxX)/2,dMaxY,0);
    1462.         AcGePoint3d pt2((dMinX+dMaxX)/2,dMinY,0);

    1463.         mLine.set(pt1,pt2);

    1464.         return true;
    1465. }

    1466. bool CDrawDWG::GetUpDownMidLine(AcGePoint3d& ptUp,AcGePoint3d& ptDown)
    1467. {
    1468.         if(m_pDb==NULL)
    1469.                 return false;

    1470.         HHVerifyErr(m_pDb->updateExt());
    1471.         CQKQuery mQkq(m_pDb);
    1472.         HHVerify(mQkq.LockDoc());
    1473.         HHVerify(mQkq.UpdataView(m_pView, m_pModel, &m_PExtents, m_bIsBlockDisp));
    1474.         HHVerify(mQkq.UnLockDoc());

    1475.         double dMinX=m_PExtents.minPoint().x;
    1476.         double dMinY=m_PExtents.minPoint().y;
    1477.         double dMaxX=m_PExtents.maxPoint().x;
    1478.         double dMaxY=m_PExtents.maxPoint().y;

    1479.         ptUp.x=(dMinX+dMaxX)/2;
    1480.         ptUp.y=dMaxY;

    1481.         ptDown.x=(dMinX+dMaxX)/2;
    1482.         ptDown.y=dMinY;

    1483.         return true;
    1484. }


    1485. //
    1486. //! @brief
    1487. //! @param UINT uMenuId
    1488. //! @exception
    1489. //! @sa
    1490. // -----------------------------------------------------------------------
    1491. //        作者:               
    1492. //        版本:                1.0
    1493. // -----------------------------------------------------------------------
    1494. //        修改记录:
    1495. //        日 期        版本           修改人         修改内容
    1496. //         2011-3-18    1.0           
    1497. //
    1498. bool CDrawDWG::SetCurMouseShowRightMenu( UINT uMenuId )
    1499. {
    1500.         if (NULL == m_pMouse)
    1501.                 return false;

    1502.         return m_pMouse->SetCurMouseShowRightMenu(uMenuId);
    1503. }

    1504. //
    1505. //! @brief 设置菜单
    1506. //! @param int nMenuId
    1507. //! @exception
    1508. //! @sa
    1509. // -----------------------------------------------------------------------
    1510. //        作者:               
    1511. //        版本:                1.0
    1512. // -----------------------------------------------------------------------
    1513. //        修改记录:
    1514. //        日 期        版本           修改人         修改内容
    1515. //         2011-4-26    1.0           
    1516. //
    1517. void CDrawDWG::SetShowMenu( int nMenuId )
    1518. {
    1519.         if (NULL == m_pMouse)
    1520.                 return;

    1521.         m_pMouse->SetCurMouseShowRightMenu(nMenuId==-1?IDR_MENU_DEF_GRAPH:nMenuId);
    1522. }

    1523. //
    1524. //! @brief
    1525. //! @param const AcDbObjectIdArray& arr
    1526. //! @exception
    1527. //! @sa
    1528. // -----------------------------------------------------------------------
    1529. //        作者:               
    1530. //        版本:                1.0
    1531. // -----------------------------------------------------------------------
    1532. //        修改记录:
    1533. //        日 期        版本           修改人         修改内容
    1534. //         2011-4-26    1.0            
    1535. //
    1536. void CDrawDWG::EraseEntitys( const AcDbObjectIdArray& arr )
    1537. {
    1538.         if (NULL == m_pDb)
    1539.                 return;

    1540.         CQKQueryIds mQkq(arr, m_pDb);
    1541.         HHVerify(mQkq.LockDoc());
    1542.         HHVerify(mQkq.OpEntity(arr, HHstd::PtrMemFun_1<CDrawDWG>(this,&CDrawDWG::EraseEntity)) );
    1543.         HHVerify(mQkq.UnLockDoc());

    1544.         HHVerifyErr(m_pDb->updateExt());

    1545.         HHVerifyErr(m_PExtents.set(m_pDb->extmin(), m_pDb->extmax()));
    1546. }

    1547. //
    1548. //! @brief
    1549. //! @param const AcDbObjectId& mId
    1550. //! @exception
    1551. //! @sa
    1552. // -----------------------------------------------------------------------
    1553. //        作者:               
    1554. //        版本:                1.0
    1555. // -----------------------------------------------------------------------
    1556. //        修改记录:
    1557. //        日 期        版本           修改人         修改内容
    1558. //         2011-4-26    1.0            
    1559. //
    1560. void CDrawDWG::EraseEntity( const AcDbObjectId& mId )
    1561. {
    1562.         if ( mId.isNull() || !mId.isValid() )
    1563.                 return;

    1564.         AcDbEntity* pEntity=NULL;
    1565.         HHVerifyErr2(acdbOpenObject(pEntity, mId,AcDb::kForWrite, true), return;);

    1566.         if (NULL == pEntity)
    1567.                 return;

    1568.         ViewEreaseEntity(pEntity);
    1569.         //m_pView->erase(pEntity);
    1570.         HHVerifyErr(pEntity->close());
    1571. }

    1572. /**
    1573. * @brief 更新实体,但不刷新视图
    1574. *
    1575. * @param pDrawable
    1576. *
    1577. * @returns (bool)
    1578. */
    1579. bool CDrawDWG::RefereshEntity(AcGiDrawable * pDrawable )
    1580. {
    1581.         if (pDrawable == NULL) return true;
    1582.         AcDbEntity * p = AcDbEntity::cast(pDrawable);
    1583.         if ( p == NULL )
    1584.                 return false;

    1585.         ViewEreaseEntity(p);
    1586.         addEntity(p, m_pView, m_pModel);

    1587.         return true;
    1588. }

    1589. void CDrawDWG::EraseEntityP( AcDbEntity* pEntity )
    1590. {
    1591.         if ( NULL == pEntity )
    1592.                 return;
    1593.         ViewEreaseEntity(pEntity);
    1594. }

    1595. void CDrawDWG::SetGraphExtents(const AcDbExtents& dbExt)
    1596. {
    1597.         m_PExtents = dbExt;
    1598. }

    1599. const CString& CDrawDWG::GetDWGPath() const
    1600. {
    1601.         return m_strDWGPath;
    1602. }

    1603. AcDbDatabase* CDrawDWG::CreateDefault()
    1604. {
    1605.         m_pDb = new AcDbDatabase(false,true);
    1606.         return m_pDb;
    1607. }

    1608. void CDrawDWG::setBlockDisp(bool bIsBlockDisp)
    1609. {
    1610.         m_bIsBlockDisp = bIsBlockDisp;
    1611. }

    1612. bool CDrawDWG::isBlockDisp()
    1613. {
    1614.         return m_bIsBlockDisp;
    1615. }

    1616. //获取当前视图的范围
    1617. bool CDrawDWG::GetCurViewExtens(double dRatio, AcDbExtents& curExtens)
    1618. {
    1619.         if (NULL == m_pView)
    1620.                 return false;

    1621.         AcGePoint3d ptTarget(m_pView->target());
    1622.         double dHeight = m_pView->fieldHeight();
    1623.         double dWidth = m_pView->fieldWidth();

    1624.         //注,宽度与高度可能有当前预览的实体有关,而不是完全根据当前窗口决定,
    1625.         // 故在此根据预览窗口的长高比进行调整
    1626.         double dMax = dHeight;
    1627.         if (dMax < dWidth)
    1628.                 dMax = dWidth;

    1629.         if (dRatio > 1)
    1630.         {
    1631.                 dWidth = dMax;
    1632.                 dHeight = dMax / dRatio;
    1633.         }
    1634.         else
    1635.         {
    1636.                 dWidth = dMax * dRatio;
    1637.                 dHeight = dMax;
    1638.         }
    1639.                
    1640.         AcGePoint3d minPoint(ptTarget);
    1641.         AcGePoint3d maxPoint(ptTarget);
    1642.         minPoint.x -= dWidth/2;
    1643.         minPoint.y -= dHeight/2;
    1644.         minPoint.z = 0.0;
    1645.         maxPoint.x += dWidth/2;
    1646.         maxPoint.y += dHeight/2;
    1647.         maxPoint.z = 0.0;

    1648.         if (Acad::eOk != curExtens.set(minPoint, maxPoint))
    1649.                 return false;
    1650.         else
    1651.                 return true;
    1652. }

    1653. //从外部的数据库中复制至当前库,并刷新视图
    1654. bool CDrawDWG::CopyAndRefresh(AcDbDatabase* pDb, bool bIsUpdata/* = true*/)
    1655. {
    1656.         if (NULL == pDb || NULL == m_pDb)
    1657.                 return false;

    1658.         AcDbObjectIdArray arrNewIds;
    1659.         if (!CGraBasicTools::GetDataBaseAllIds(pDb, arrNewIds))
    1660.                 return false;

    1661.         //清空数据库中所有对象
    1662.         AcDbObjectIdArray arrAllIds;
    1663.         CGraBasicTools::GetDataBaseAllIds(m_pDb, arrAllIds);
    1664.         CQKQueryLayer mQkq(m_pDb);
    1665.         mQkq.SetIds(arrAllIds);
    1666.         mQkq.DelAllEntity();

    1667.         //拷贝实体
    1668.         AcDbObjectIdArray arrIdCloned;
    1669.         mQkq.cloneOids(arrNewIds,ACDB_MODEL_SPACE,arrIdCloned);

    1670.         RefreshView();

    1671.         if (bIsUpdata)
    1672.         {
    1673.                 m_pView->zoom(m_dWheelScale);
    1674.                 m_pView->dolly(m_MoveVector);
    1675.                 UpdataView();
    1676.         }

    1677.         return true;
    1678. }
    复制代码

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛