#pragma once #include "GsPreviewCtrl.h" #include "AecDbObjXDataMap.h" #include "EarThwormDef.h" #include "AecDbEarthWorm.h" class AecDbEarthWorm; class CBaseDialog: public CDialog { public: DECLARE_DYNAMIC(CBaseDialog) // pszTag 一个与对话框一一对应的字符串,记录配置文件字段所用,详见UIDataCache::FindNode() // GSViewID 为派生类对话中 gsview 控件的id 如果为 -1 则说明派生对话框中没有 gsview 控件 CBaseDialog(UINT IDD, LPCTSTR pszTag, UINT GSViewID = -1, CWnd *pParent = NULL); virtual ~CBaseDialog(); bool GetFnctNode(EWFnctNode *nodePtr); bool SetFnctNode(EWFnctNode *nodePtr); bool IsInplaceEdit(){ return m_bInplaceEdit; } void SetInplaceEdit(bool b){ m_bInplaceEdit = b; } void SetIdxOfRoom(int idx){ m_idxRoom = idx; } int GetIdxOfRoom(){ return m_idxRoom; } void SetCrossSectionScr(LPCTSTR psz){ m_sCrossSectionScr = psz; } void SetCrossSectionScr(const AcDbObjectId &id); bool GetCrossSectionScr(CString& sCrossSectionScr); AecDbObjXDataMap* GetSpecMapData( ); void SetRoomFeature(const AecDbEarthWorm *pEw); void SetRoomFeature(const AcDbObjectId &id); void SetRoomFeature(const std::vector &vec) { m_roomTypes.assign(vec.begin(), vec.end()); } std::vector& GetRoomTypes() { return m_roomTypes; } virtual void SetDefaultFnctNode(EWFnctNode &fncNode){} // 当插入防火墙,通风口,逃生口时,会判断哪个舱室进行插入 static bool CheckRoom(const double dCheck, int idxRoom); int GetDrawBuffer(AcDbVoidPtrArray& arDrawbuffer) const; protected: DECLARE_MESSAGE_MAP() void ShowEarthWorm(); virtual BOOL OnInitDialog(); afx_msg LRESULT OnViewLButtonDown(WPARAM wp,LPARAM lp); afx_msg void OnOK(); virtual void OnViewLButtonDownMsg(); public: // 为选中的舱体画上红框 // 只在inplace模式时使用 void SelectRoom(int idx); bool RoomHasSplitRoom(int nRoomIndex); public: //舱室名称和偏移 CMapStringToString m_mapIndexToName; //附属脚本如支架 CMapStringToString m_mapAddtion; protected: // 保存对话框数据 EWFnctNode m_data; // 与派生类对话框一一对应的字符串 CString m_sTag; // 是否是在位编辑? true - 是 bool m_bInplaceEdit; // 舱位信息 int m_idxRoom; // gsview中要显示实体的几何数据 CString m_sCrossSectionScr; // gsview控件 CGsPreviewCtrl m_wndViewCtrl; // gsview控件在派生类中的资源id UINT m_idGSView; // 舱体方框 float m_dChamferInter; AcDbPolyline* m_pRectCell; // 舱体类型 std::vector m_roomTypes; CMapStringToPtr m_mapNameToDbText; // 缓存,出图用 AcDbVoidPtrArray m_arDrawBuffer; AecDbObjXDataMap m_mapSpecXData; }; template void EW_CmdFncEx(EWFnctNode* pData,AcDbObjectId& idHost) { EWFnctNode fncNode; memset(&fncNode,0,sizeof(EWFnctNode)); memcpy(&fncNode,pData,sizeof(EWFnctNode)); AcDbEntity* pEnt = NULL; if (Acad::eOk != acdbOpenAcDbEntity(pEnt, idHost, AcDb::kForWrite)) return; // 将来还会判断是否是room类型 AecDbEarthWorm* pWorm = AecDbEarthWorm::cast(pEnt); if (pWorm == NULL) { pEnt->close(); return; } CString strSrc(_T("")); pWorm->GetCrossSectionScr(strSrc); //无法显示当前夹点的信息!!!,原对话框Set模式要改动 CAcModuleResourceOverride myResources; T wDlg; wDlg.SetInplaceEdit(true); wDlg.SetCrossSectionScr(strSrc); wDlg.SetFnctNode(pData); INT_PTR nRes = wDlg.DoModal(); if (nRes == IDOK) { //取出更改数据 wDlg.GetFnctNode(&fncNode); //记住szLockid,定位数据 _tcscpy(fncNode.szLockId,pData->szLockId); fncNode.dDistFromPre = pData->dDistFromPre; //再更新pData memcpy(pData,&fncNode,sizeof(EWFnctNode)); //更具pData->szLockId直接更新 pWorm->UpdateFncNode(pData); } pEnt->close(); }