148 lines
3.5 KiB
C++
148 lines
3.5 KiB
C++
#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<CString> &vec) { m_roomTypes.assign(vec.begin(), vec.end()); }
|
|
std::vector<CString>& 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<CString> m_roomTypes;
|
|
CMapStringToPtr m_mapNameToDbText;
|
|
|
|
// 缓存,出图用
|
|
AcDbVoidPtrArray m_arDrawBuffer;
|
|
|
|
AecDbObjXDataMap m_mapSpecXData;
|
|
};
|
|
|
|
template<class T>
|
|
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();
|
|
}
|
|
|
|
|
|
|