Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

148 lines
3.7 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();
}