Files
envi-code/SourceCode/Code2026/PIDLineCmd/DlgParamDefine.cpp
T
2026-09-28 15:28:50 +08:00

3065 lines
78 KiB
C++

#include "StdAfx.h"
#include "Resource.h"
#include "AfxPriv.h"
#include "DlgParamDefine.h"
#include "DlgParamInsert.h"
#include "DlgParamImport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SEP_SIZE 3
#define TBAR_SIZE 25
#define BEGIN_ACTIVE_ACAD_IN_DIALOG() \
CWnd* pFrame = acedGetAcadFrame(); \
pFrame->EnableWindow(TRUE); \
ShowWindow(SW_HIDE); \
pFrame->SetFocus() \
#define END_ACTIVE_ACAD_IN_DIALOG() \
pFrame->EnableWindow(FALSE); \
ShowWindow(SW_SHOW); \
EnableWindow(TRUE); \
if (acedIsInputPending()) \
EndDialog(IDCANCEL) \
namespace
{
BOOL GetArcParam(const AcGePoint3d& ptStart, const AcGePoint3d& ptEnd, double dBulge, const AcGeVector3d& vtNormal,
AcGePoint3d& ptCenter, double& dRadius, double& dStartAngle, double& dEndAngle)
{
ASSERT(!_IsZero_(dBulge));
ASSERT(ptStart != ptEnd);
// 调整顺序
const AcGePoint3d* pt1;
const AcGePoint3d* pt2;
if (dBulge < 0.0)
{
pt1 = &ptEnd;
pt2 = &ptStart;
dBulge = -dBulge;
}
else
{
pt1 = &ptStart;
pt2 = &ptEnd;
}
// 直角三角形对边与斜边关系R = L/sin(A/2)
// 代入万能公式 sin(A)=2*tg(A/2)/(1+tg(A/2)*tg(A/2))
// 得到 R = L*(1+B*B) / (2B) -->L:(p1->p2)/2 B:bulge
double dL = pt1->distanceTo(*pt2) / 2.0;
dRadius = dL * (1 + dBulge * dBulge) / (2.0 * dBulge);
double dA = PI / 2.0 - atan(dBulge) * 2.0;
AcGeVector3d vt(*pt2 - *pt1);
vt.rotateBy(dA, vtNormal);
vt.normalize();
ptCenter = *pt1 + vt * dRadius;
acdbWcs2Ecs(asDblArray(AcGeVector3d::kXAxis), asDblArray(vt), asDblArray(vtNormal), true);
dStartAngle = vt.angleTo(*pt1 - ptCenter, vtNormal);
dEndAngle = vt.angleTo(*pt2 - ptCenter, vtNormal);
return TRUE;
}
}
CDlgParamDefine::CDlgParamDefine(CWnd* pParent)
: CDialog(CDlgParamDefine::IDD, pParent), m_bPartModified(FALSE),
m_bMouseDown(FALSE), m_iCurSep(-1), m_bEscape(FALSE),
m_hCopyClass(NULL)
{
//{{AFX_DATA_INIT(CDlgParamDefine)
//}}AFX_DATA_INIT
}
void CDlgParamDefine::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgParamDefine)
DDX_Control(pDX, IDC_TREE_CLASS, m_wndTreeClass);
DDX_Control(pDX, IDC_STC_PREVIEW, m_wndStcPreview);
DDX_Control(pDX, IDC_LST_ATTRIBUTE, m_wndLstAttribute);
DDX_Control(pDX, IDC_LST_RULE, m_wndLstRule);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgParamDefine, CDialog)
//{{AFX_MSG_MAP(CDlgParamDefine)
ON_WM_SIZE()
ON_WM_SIZING()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_CAPTURECHANGED()
ON_WM_SETCURSOR()
ON_COMMAND(ID_CLASS_NEW, OnClassNew)
ON_COMMAND(ID_CLASS_DELETE, OnClassDelete)
ON_COMMAND(ID_CLASS_RENAME, OnClassRename)
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE_CLASS, OnBeginLabelEditTreeClass)
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_CLASS, OnEndLabelEditTreeClass)
ON_COMMAND(ID_ATTR_NEW, OnAttrNew)
ON_COMMAND(ID_ATTR_DELETE, OnAttrDelete)
ON_COMMAND(ID_ATTR_RENAME, OnAttrRename)
ON_COMMAND(ID_RULE_NEW, OnRuleNew)
ON_COMMAND(ID_RULE_SELECT, OnRuleSelect)
ON_COMMAND(ID_RULE_DELETE, OnRuleDelete)
ON_NOTIFY(TVN_SELCHANGING, IDC_TREE_CLASS, OnSelchangingTreeClass)
ON_WM_DESTROY()
ON_COMMAND(ID_ATTR_UP, OnAttrUp)
ON_COMMAND(ID_ATTR_DOWN, OnAttrDown)
ON_COMMAND(ID_RULE_UP, OnRuleUp)
ON_COMMAND(ID_RULE_DOWN, OnRuleDown)
ON_COMMAND(ID_CLASS_SAVE, OnClassSave)
ON_COMMAND(ID_CLASS_TEST, OnClassTest)
ON_COMMAND(ID_CLASS_COPY, OnClassCopy)
ON_COMMAND(ID_ATTR_PASTE, OnAttrPaste)
ON_COMMAND(ID_RULE_PASTE, OnRulePaste)
ON_COMMAND(ID_CLASS_IMPORT, OnClassImport)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USER_CHILDVALUECHANGED, OnPropListBoxNotify)
ON_MESSAGE(WM_POPMESSAGESTRING, OnSetMessageString)
ON_MESSAGE(WM_SETMESSAGESTRING, OnSetMessageString)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
ON_WM_MENUSELECT()
ON_WM_EXITMENULOOP()
END_MESSAGE_MAP()
LRESULT CDlgParamDefine::OnSetMessageString(WPARAM wParam, LPARAM lParam)
{
// set the message bar text
CString sMsgText;
if (lParam != 0)
{
ASSERT(wParam == 0); // can't have both an ID and a string
sMsgText = (LPCTSTR)lParam; // set an explicit string
}
else if (wParam != 0)
{
if (wParam == AFX_IDS_IDLEMESSAGE || wParam == AFX_IDS_HELPMODEMESSAGE)
{
acedRestoreStatusBar();
return 0;
}
else
{
sMsgText.LoadString(wParam);
int iFind = sMsgText.Find(_T('\n'));
if (iFind > 0)
sMsgText = sMsgText.Left(iFind);
}
}
acedGetAcadFrame()->SetMessageText(sMsgText);
return 0;
}
BOOL CDlgParamDefine::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
// need to handle both ANSI and UNICODE versions of the message
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
UINT nID = pNMHDR->idFrom;
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
{
// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);
}
// will be zero on a separator
if (nID != 0)
{
CString sTipText;
sTipText.LoadString(nID);
int iFind = sTipText.Find(_T('\n'))+1;
if (iFind > 0)
sTipText = sTipText.Mid(iFind);
if (sTipText.IsEmpty())
return FALSE;
if (pNMHDR->code == TTN_NEEDTEXTA)
{
#ifdef UNICODE
_wcstombsz(pTTTA->szText, sTipText, sizeof(pTTTA->szText) / sizeof(pTTTA->szText[0]));
#else
strncpy(pTTTA->szText, sTipText, sizeof(pTTTA->szText) / sizeof(TCHAR));
#endif // UNICODE
}
else
{
#ifdef UNICODE
_tcsncpy(pTTTW->szText, sTipText, sizeof(pTTTW->szText) / sizeof(TCHAR));
#else
_mbstowcsz(pTTTW->szText, sTipText, sizeof(pTTTW->szText) / sizeof(pTTTW->szText[0]));
#endif // UNICODE
}
*pResult = 0;
return TRUE;
}
return FALSE;
}
void CDlgParamDefine::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
CDialog::OnMenuSelect(nItemID, nFlags, hSysMenu);
if (nItemID > 0 && nItemID < 0xFFFF
&& (nFlags & MF_POPUP) != MF_POPUP
&& (nFlags & MF_SEPARATOR) != MF_SEPARATOR)
{
CString sText;
sText.LoadString(nItemID);
int iFind = sText.Find('\n');
if (iFind > 0)
sText = sText.Left(iFind);
acedGetAcadFrame()->SetMessageText(sText);
}
}
void CDlgParamDefine::OnExitMenuLoop(BOOL bIsTrackPopupMenu)
{
CDialog::OnExitMenuLoop(bIsTrackPopupMenu);
acedRestoreStatusBar();
}
BOOL CDlgParamDefine::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || (m_bEscape = (pMsg->wParam == VK_ESCAPE))))
{
CEdit* pEdit = m_wndTreeClass.GetEditControl();
if (NULL != pEdit)
{
pEdit->SendMessage(WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
return TRUE;
}
}
// m_wndTBarClass.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
// m_wndTBarAttr.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
return CDialog::PreTranslateMessage(pMsg);
}
BOOL CDlgParamDefine::Create(CWnd* pParentWnd)
{
return CDialog::Create(IDD, pParentWnd);
}
BOOL CDlgParamDefine::OnInitDialog()
{
CDialog::OnInitDialog();
if (m_wndTBarClass.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
&& m_wndTBarClass.LoadToolBar(IDR_CLASS))
{
CRect rc;
m_wndTreeClass.GetWindowRect(&rc);
ScreenToClient(&rc);
CSize szBar = m_wndTBarClass.CalcFixedLayout(FALSE, TRUE);
rc.bottom = rc.top;
rc.top -= TBAR_SIZE;
rc.right = rc.left + szBar.cx;
m_wndTBarClass.MoveWindow(&rc);
}
if (m_wndTBarAttr.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)
&& m_wndTBarAttr.LoadToolBar(IDR_ATTRIBUTE))
{
CRect rc;
m_wndLstAttribute.GetWindowRect(&rc);
ScreenToClient(&rc);
CSize szBar = m_wndTBarAttr.CalcFixedLayout(FALSE, TRUE);
rc.bottom = rc.top;
rc.top -= TBAR_SIZE;
rc.right = rc.left + szBar.cx;
m_wndTBarAttr.MoveWindow(&rc);
}
m_imglstIcon.Create(IDB_ICON, 16, 1, RGB(255, 0, 255));
m_wndTreeClass.SetImageList(&m_imglstIcon, TVSIL_NORMAL);
m_wndLstAttribute.SetNameWidth(100);
m_wndLstRule.SetNameWidth(100);
CRect rc;
GetClientRect(&rc);
m_szMin = rc.Size();
OnRelayout();
CString sRoot;
sRoot.LoadString(IDS_CLASSROOTNAME);
HTREEITEM hRoot = m_wndTreeClass.InsertItem(sRoot, 1, 1);
ASSERT(NULL != hRoot);
m_wndTreeClass.SetItemData(hRoot, 0);
OnInitClassTree(0, hRoot);
m_wndTreeClass.Expand(hRoot, TVE_EXPAND);
return TRUE;
}
void CDlgParamDefine::OnSizing(UINT fwSide, LPRECT pRect)
{
switch (fwSide)
{
case WMSZ_LEFT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->left = pRect->right - m_szMin.cx;
break;
case WMSZ_RIGHT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->right = pRect->left + m_szMin.cx;
break;
case WMSZ_TOP:
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->top = pRect->bottom - m_szMin.cy;
break;
case WMSZ_BOTTOM:
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->bottom = pRect->top + m_szMin.cy;
break;
case WMSZ_TOPLEFT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->left = pRect->right - m_szMin.cx;
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->top = pRect->bottom - m_szMin.cy;
break;
case WMSZ_TOPRIGHT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->right = pRect->left + m_szMin.cx;
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->top = pRect->bottom - m_szMin.cy;
break;
case WMSZ_BOTTOMLEFT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->left = pRect->right - m_szMin.cx;
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->bottom = pRect->top + m_szMin.cy;
break;
case WMSZ_BOTTOMRIGHT:
if (pRect->right - pRect->left < m_szMin.cx)
pRect->right = pRect->left + m_szMin.cx;
if (pRect->bottom - pRect->top < m_szMin.cy)
pRect->bottom = pRect->top + m_szMin.cy;
}
CDialog::OnSizing(fwSide, pRect);
}
void CDlgParamDefine::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
OnRelayout();
}
void CDlgParamDefine::OnRelayout()
{
// 取得客户区
CRect rcClient;
GetClientRect(&rcClient);
rcClient.DeflateRect(10, 5 + TBAR_SIZE, 10, 10);
// 移动预案览窗口到客户区底端
CRect rc1;
m_wndStcPreview.GetWindowRect(&rc1);
ScreenToClient(&rc1);
rc1.OffsetRect(rcClient.left - rc1.left, rcClient.bottom - rc1.bottom);
m_wndStcPreview.MoveWindow(&rc1);
// 调整分类树窗口到的底边
rc1.bottom = rc1.top - SEP_SIZE;
rc1.top = rcClient.top;
m_wndTreeClass.MoveWindow(&rc1);
// 调整属性窗口的宽度到客户区右边
CRect rc2;
m_wndLstAttribute.GetWindowRect(&rc2);
ScreenToClient(&rc2);
rc2.OffsetRect(rcClient.right - rc2.right, rcClient.top - rc2.top);
rc2.left = rc1.right + SEP_SIZE;
m_wndLstAttribute.MoveWindow(&rc2);
// 调整工具条位置
m_wndTBarAttr.SetWindowPos(NULL, rc2.left, rc2.top - TBAR_SIZE, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
// 调整图形定义窗口尺寸到客户区右下角
rc2.top = rc2.bottom + SEP_SIZE;
rc2.bottom = rcClient.bottom;
m_wndLstRule.MoveWindow(&rc2);
}
void CDlgParamDefine::GetSepRect(CRect* pRecSep)
{
ASSERT(pRecSep != NULL);
// 取得客户区
CRect rcClient;
GetClientRect(&rcClient);
rcClient.DeflateRect(10, 5 + TBAR_SIZE, 10, 10);
CRect rc;
m_wndTreeClass.GetWindowRect(&rc);
ScreenToClient(&rc);
pRecSep[0].SetRect(rc.left, rc.bottom, rc.right, rc.bottom + SEP_SIZE);
pRecSep[1].SetRect(rc.right, rcClient.top, rc.right + SEP_SIZE, rcClient.bottom);
m_wndLstAttribute.GetWindowRect(&rc);
ScreenToClient(&rc);
pRecSep[2].SetRect(rc.left, rc.bottom, rc.right, rc.bottom + SEP_SIZE);
}
void CDlgParamDefine::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect pRect[3];
GetSepRect(pRect);
m_iCurSep = 3;
while ((--m_iCurSep) >= 0)
{
if (pRect[m_iCurSep].PtInRect(point))
{
SetCapture();
m_bMouseDown = TRUE;
m_ptLast = point;
break;
}
}
CDialog::OnLButtonDown(nFlags, point);
}
void CDlgParamDefine::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bMouseDown)
{
m_bMouseDown = FALSE;
ReleaseCapture();
}
CDialog::OnLButtonUp(nFlags, point);
}
void CDlgParamDefine::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bMouseDown)
{
CRect rc1, rc2, rc3, rc4;
m_wndTBarClass.GetWindowRect(&rc1);
m_wndTBarAttr.GetWindowRect(&rc2);
int iTBarClass = rc1.Width();
int iTBarAttr = rc2.Width();
m_wndTreeClass.GetWindowRect(&rc1);
ScreenToClient(&rc1);
m_wndStcPreview.GetWindowRect(&rc2);
ScreenToClient(&rc2);
m_wndLstAttribute.GetWindowRect(&rc3);
ScreenToClient(&rc3);
m_wndLstRule.GetWindowRect(&rc4);
ScreenToClient(&rc4);
switch (m_iCurSep)
{
case 0:
rc1.bottom += (point.y - m_ptLast.y);
rc2.top = rc1.bottom + SEP_SIZE;
if (rc1.Height() >= SEP_SIZE && rc2.Height() >= SEP_SIZE
&& point.x > rc1.left && point.x < rc1.right
&& point.y > rc1.bottom && point.y < rc2.top)
{
m_wndTreeClass.MoveWindow(&rc1);
m_wndStcPreview.MoveWindow(&rc2);
}
break;
case 1:
rc1.right += (point.x - m_ptLast.x);
rc2.right = rc1.right;
rc3.left = rc1.right + SEP_SIZE;
rc4.left = rc3.left;
if (rc1.Width() >= iTBarClass && rc3.Width() >= iTBarAttr
&& point.x > rc1.right && point.x < rc3.left
&& point.y > rc1.top && point.y < rc2.bottom)
{
m_wndTreeClass.MoveWindow(&rc1);
m_wndStcPreview.MoveWindow(&rc2);
m_wndLstAttribute.MoveWindow(&rc3);
m_wndLstRule.MoveWindow(&rc4);
// 调整工具条位置
m_wndTBarAttr.SetWindowPos(NULL, rc3.left, rc3.top - TBAR_SIZE, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
}
break;
case 2:
rc3.bottom += (point.y - m_ptLast.y);
rc4.top = rc3.bottom + SEP_SIZE;
if (rc3.Height() >= SEP_SIZE && rc4.Height() >= SEP_SIZE
&& point.x > rc3.left && point.x < rc3.right
&& point.y > rc3.bottom && point.y < rc4.top)
{
m_wndLstAttribute.MoveWindow(&rc3);
m_wndLstRule.MoveWindow(&rc4);
}
break;
}
m_ptLast = point;
}
CDialog::OnMouseMove(nFlags, point);
}
void CDlgParamDefine::OnCaptureChanged(CWnd *pWnd)
{
if (m_bMouseDown)
{
m_bMouseDown = FALSE;
ReleaseCapture();
}
CDialog::OnCaptureChanged(pWnd);
}
BOOL CDlgParamDefine::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_bMouseDown)
{
SetCursor(::LoadCursor(NULL, (m_iCurSep == 1 ? IDC_SIZEWE : IDC_SIZENS)));
return TRUE;
}
// 取得分隔区间
CRect pRect[3];
GetSepRect(pRect);
// 取得当前鼠标位置
CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
if (pRect[0].PtInRect(pt) || pRect[2].PtInRect(pt))
{
SetCursor(::LoadCursor(NULL, IDC_SIZENS));
return TRUE;
}
if (pRect[1].PtInRect(pt))
{
SetCursor(::LoadCursor(NULL, IDC_SIZEWE));
return TRUE;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
void CDlgParamDefine::OnBeginLabelEditTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
HTREEITEM hItem = pTVDispInfo->item.hItem;
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem)
|| m_cCurClass.IsReadOnly())
{
*pResult = 1;
}
else
{
*pResult = 0;
}
}
void CDlgParamDefine::OnEndLabelEditTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
if (!m_bEscape)
{
m_bEscape = FALSE;
CString sText;
CEdit* pEdit = m_wndTreeClass.GetEditControl();
ASSERT(NULL != pEdit);
pEdit->GetWindowText(sText);
HTREEITEM hItem = pTVDispInfo->item.hItem;
if (sText == m_wndTreeClass.GetItemText(hItem))
{
*pResult = 0;
return;
}
BOOL bFind = FALSE;
while (!bFind && NULL != (hItem = m_wndTreeClass.GetPrevSiblingItem(hItem)))
{
bFind = (sText.CompareNoCase(m_wndTreeClass.GetItemText(hItem)) == 0);
}
hItem = pTVDispInfo->item.hItem;
while (!bFind && NULL != (hItem = m_wndTreeClass.GetNextSiblingItem(hItem)))
{
bFind = (sText.CompareNoCase(m_wndTreeClass.GetItemText(hItem)) == 0);
}
if (bFind)
{
CString sMsg;
sMsg.LoadString(IDS_HASSAMENAME);
MessageBox(sMsg);
m_wndTreeClass.EditLabel(pTVDispInfo->item.hItem);
*pResult = 0;
}
else
{
int iIndex = -1;
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.FindTab(pTab, 0);
ASSERT(NULL != pTab);
KTParamTableAttr* pAttr;
if (NULL != (pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
{
iIndex = 0;
pTab->m_sName = sText;
}
else if (NULL != (pAttr = (KTParamTableAttr*)pTab->m_dwUserData) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
{
iIndex = 0;
pTab->m_sValue = sText;
}
else
{
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL != (pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
{
iIndex = m_wndLstAttribute.FindIndex(pItem);
pItem->m_sName = sText;
break;
}
if (NULL != (pAttr = (KTParamTableAttr*)pItem->m_dwUserData) && 0 == _tcsicmp(pAttr->GetField(), _T("Name")))
{
iIndex = m_wndLstAttribute.FindIndex(pItem);
pItem->m_sValue = sText;
break;
}
}
}
if (iIndex >= 0)
{
CRect rc;
m_wndLstAttribute.GetItemRect(iIndex, &rc);
m_wndLstAttribute.InvalidateRect(rc);
}
m_bPartModified |= TRUE;
*pResult = 1;
}
}
else
{
*pResult = 0;
}
}
LRESULT CDlgParamDefine::OnPropListBoxNotify(WPARAM wParam, LPARAM lParam)
{
// 取得数据参数
UINT nType = LOWORD(wParam);
UINT nCode = LOBYTE(HIWORD(wParam));
BOOL bEditName = HIBYTE(HIWORD(wParam));
HWND hPropListBox = (HWND)lParam;
m_bPartModified |= (0 == nType && 0 == nCode || 1 == nType);
if (0 == nType)
{
if (m_wndLstAttribute.m_hWnd == hPropListBox && nCode == 1)
{
CPropertyItem* pItem = NULL;
CPropertyItemTab* pCurTab = NULL;
m_wndLstAttribute.GetCurSel(pCurTab, pItem);
// 类别数据Code项不能重名
if (NULL != pItem && NULL != pItem->m_dwUserData)
{
KTParamTableAttr* pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
if (_tcsicmp(pAttr->GetField(), _T("Code")) == 0)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
if (pService->HasSameClassCode(pItem->m_sValue, m_cCurClass.GetId()))
{
CString sMsg;
sMsg.LoadString(IDS_HASSAMENAME);
MessageBox(sMsg);
pItem->m_sValue = m_cCurClass.GetCode();
m_wndLstAttribute.UpdateCtrl();
}
m_cCurClass.SetCode(pItem->m_sValue);
}
}
// 属性数据Code项不能重名
if (NULL != pCurTab && NULL == pItem && bEditName)
{
KTParamAttribute* pData = (KTParamAttribute*)pCurTab->m_dwUserParam;
ASSERT(NULL != pData);
CPropertyItemTab* pTab;
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstAttribute.GetNextTab(pos);
if (pTab != pCurTab && pTab->m_sName.CompareNoCase(pCurTab->m_sName) == 0)
{
CString sMsg;
sMsg.LoadString(IDS_HASSAMENAME);
MessageBox(sMsg);
pCurTab->m_sName = pData->GetCode();
m_wndLstAttribute.EditName();
break;
}
}
pData->SetCode(pCurTab->m_sName);
}
}
return 0;
}
// 处理约束中曲线和绘制选择变化
if (1 == nType)
{
if (m_wndLstRule.m_hWnd == hPropListBox)
{
// 取得当前条目
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
m_wndLstRule.GetCurSel(pTab, pItem);
if (NULL == pTab || NULL != pItem)
return 0;
if (bEditName)
{
// 曲线变化,删除绘制方式
pTab->m_sValue.Empty();
// 删除参数列表
m_wndLstRule.CollapseTab(pTab);
POSITION pos = pTab->m_listItem.GetTailPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetPrev(pos);
if (NULL != pItem && NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx)
m_wndLstRule.DeleteItem(pTab, pItem);
}
m_wndLstRule.UpdateCtrl();
SendMessage(WM_USER_CHILDVALUECHANGED, MAKEWPARAM(4, MAKEWORD(0, FALSE)), (LPARAM)hPropListBox);
// 刷新
CRect rc;
int iPos = m_wndLstRule.GetCurSel();
m_wndLstRule.GetItemRect(iPos, &rc);
rc.left += m_wndLstRule.GetNameWidth();
m_wndLstRule.InvalidateRect(rc);
}
else
{
// 删除参数列表
m_wndLstRule.CollapseTab(pTab);
POSITION pos = pTab->m_listItem.GetTailPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetPrev(pos);
if (NULL != pItem && NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx)
m_wndLstRule.DeleteItem(pTab, pItem);
}
// 绘制方式变化,更新参数列表
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamRule* pRule = (KTParamRule*)pTab->m_dwUserParam;
ASSERT(NULL != pRule);
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
ASSERT(NULL != pAttr1);
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
ASSERT(NULL != pAttr2);
// 取得属性条目的数据映射
CMapStringToString mapData;
pService->GetTableItemById(_T("GetRuleItemById"), pRule->GetId(), mapData);
// 更新
CString sValue;
mapData[pAttr1->GetField()] = ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapData);
mapData[pAttr2->GetField()] = ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapData);
// 获得参数映射
CMapStringToString mapParamToDesc;
AsDescTable(sValue, pAttr1->GetVarDesc(), mapData);
pService->GetCurveDrawTypeParam(sValue, mapData[pAttr1->GetField()], mapData[pAttr2->GetField()], mapParamToDesc);
// 添加参数
CString sKey;
pos = mapParamToDesc.GetStartPosition();
while (NULL != pos)
{
mapParamToDesc.GetNextAssoc(pos, sKey, sValue);
m_wndLstRule.AddItem(pTab, sValue, _T(""), CPropertyItem::EDT_NONE);
}
m_wndLstRule.ExpandTab(pTab);
}
}
return 0;
}
// 处理选择项下拉列表
if (4 == nType)
{
CPropertyListBox* pPropListBox = DYNAMIC_DOWNCAST(CPropertyListBox, CWnd::FromHandle(hPropListBox));
if (NULL == pPropListBox)
return 0;
// 获得子控件
CComboBox* pSubCtrl = DYNAMIC_DOWNCAST(CComboBox, pPropListBox->GetSubCtrl());
if (NULL == pSubCtrl || !pSubCtrl->IsWindowVisible())
return 0;
// 取得当前条目
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
pPropListBox->GetCurSel(pTab, pItem);
if (NULL == pTab)
return 0;
// 取得附加数据
pItem = (NULL == pItem ? pTab : pItem);
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
KTParamTableAttr* pAttr = (KTParamTableAttr*)(bEditName ? pItem->m_dwUserDataEx : pItem->m_dwUserData);
if (NULL == pData || NULL == pAttr)
return 0;
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得属性条目的数据映射
CMapStringToString mapData;
if (m_wndLstAttribute.m_hWnd == hPropListBox)
pService->GetTableItemById(_T("GetAttributeItemById"), pData->GetId(), mapData);
else if (m_wndLstRule.m_hWnd == hPropListBox)
pService->GetTableItemById(_T("GetRuleItemById"), pData->GetId(), mapData);
// 更新控件上的数据
CString sValue;
CString sDesc1 = pTab->m_sName;
CString sDesc2 = pTab->m_sValue;
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
if (NULL != pAttr1 && NULL != pAttr2 && pAttr1->GetIndex() > pAttr2->GetIndex())
{
// 更换顺序, 按顺序更新
sDesc1 = pTab->m_sValue;
sDesc2 = pTab->m_sName;
pAttr1 = (KTParamTableAttr*)pTab->m_dwUserData;
pAttr2 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
}
if (NULL != pAttr1)
mapData[pAttr1->GetField()] = ByItemDesc(sValue, sDesc1, pAttr1->GetVarDesc(), mapData);
if (NULL != pAttr2)
mapData[pAttr2->GetField()] = ByItemDesc(sValue, sDesc2, pAttr2->GetVarDesc(), mapData);
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
if (NULL == pItem)
continue;
sDesc1 = pItem->m_sName;
sDesc2 = pItem->m_sValue;
pAttr1 = (KTParamTableAttr*)pItem->m_dwUserDataEx;
pAttr2 = (KTParamTableAttr*)pItem->m_dwUserData;
if (NULL != pAttr1 && NULL != pAttr2 && pAttr1->GetIndex() > pAttr2->GetIndex())
{
sDesc1 = pItem->m_sValue;
sDesc2 = pItem->m_sName;
pAttr1 = (KTParamTableAttr*)pItem->m_dwUserData;
pAttr2 = (KTParamTableAttr*)pItem->m_dwUserDataEx;
}
if (NULL != pAttr1)
mapData[pAttr1->GetField()] = ByItemDesc(sValue, sDesc1, pAttr1->GetVarDesc(), mapData);
if (NULL != pAttr2)
mapData[pAttr2->GetField()] = ByItemDesc(sValue, sDesc2, pAttr2->GetVarDesc(), mapData);
}
// 扩展SQL
CString sSQL;
pService->ExpandSQL(pAttr->GetValue(), mapData, sSQL);
// 执行SQL
CStringArray arsItems;
pService->ExecuteSQL(sSQL, arsItems);
// 获取当前数据
int iCurSel = pSubCtrl->GetCurSel();
if (iCurSel >= 0) pSubCtrl->GetLBText(iCurSel, sValue);
else sValue.Empty();
int iSize = arsItems.GetSize();
if (iSize > 0)
{
// 添加到子控件列表中
pSubCtrl->ResetContent();
for (int i = 0; i < iSize; i++)
{
AsItemDesc(arsItems[i], AsItemString(arsItems[i], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
pSubCtrl->AddString(arsItems[i]);
}
// 定位当前数据
if (!sValue.IsEmpty())
{
iCurSel = pSubCtrl->FindStringExact(-1, sValue);
if(iCurSel < 0) {iCurSel = 0; pSubCtrl->InsertString(0, sValue);}
pSubCtrl->SetCurSel(iCurSel);
}
}
return 0;
}
return 0;
}
void CDlgParamDefine::OnSelchangingTreeClass(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
if (NULL != hItem)
{
CWaitCursor waiter;
if (m_bPartModified)
{
CString sMsg;
sMsg.LoadString(IDS_DATANOTSAVED);
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDYES:
// 代号不得为空
if (_tcslen(m_cCurClass.GetCode()) <= 0)
{
sMsg.LoadString(IDS_EMPTYCLASSCODE);
MessageBox(sMsg);
*pResult = TRUE;
return;
}
// 保存旧分类的数据
if (NULL != pNMTreeView->itemOld.hItem)
OnUpdateClassItemData(pNMTreeView->itemOld.hItem);
break;
case IDCANCEL:
*pResult = TRUE;
return;
}
}
// 清除旧分类的属性和约束列表数据
m_cCurClass = KTParamClass();
m_bPartModified = FALSE;
OnCleanAttributeList();
OnCleanRuleList();
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得当前分类数据
ULONG lId = m_wndTreeClass.GetItemData(hItem);
pService->GetClassItemById(lId, m_cCurClass);
//
BOOL bEdit = (!m_cCurClass.IsReadOnly());
// 显示分类数据属性条目
OnShowClassAttrItems(hItem, bEdit);
// 显示分类属性数据条目
OnShowClassData(hItem, bEdit);
// 显示分类约束数据条目
OnShowRuleData(hItem, bEdit);
m_wndLstAttribute.ExpandTab(0);
}
*pResult = 0;
}
void CDlgParamDefine::OnClassNew()
{
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem)
return;
// 创建新命名
CString sName, sText;
sName.LoadString(IDS_NEWCLASS);
sText = sName;
// 找到重名的
int iIndex = 0;
HTREEITEM hChild = m_wndTreeClass.GetChildItem(hItem);
while (NULL != hChild)
{
if (sName.CompareNoCase(m_wndTreeClass.GetItemText(hChild)) == 0)
{
iIndex++;
sName.Format(_T("%s%d"), sText, iIndex);
}
hChild = m_wndTreeClass.GetNextSiblingItem(hChild);
}
hChild = m_wndTreeClass.InsertItem(sName, hItem);
if (NULL == hChild)
return;
m_wndTreeClass.Expand(hItem, TVE_EXPAND);
m_wndTreeClass.SelectItem(hChild);
m_wndTreeClass.EditLabel(hChild);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnClassDelete()
{
if (m_cCurClass.IsReadOnly())
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem)
return;
CString sMsg;
if (NULL != m_wndTreeClass.GetChildItem(hItem))
{
sMsg.LoadString(IDS_HASSUBCLASS);
MessageBox(sMsg);
return;
}
sMsg.LoadString(IDS_ISDELETECLASS);
if (IDYES != MessageBox(sMsg, NULL, MB_YESNO|MB_ICONQUESTION))
return;
ULONG lId = m_wndTreeClass.GetItemData(hItem);
if (0 != lId)
{
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CStringArray arsItemIds;
pService->GetRuleItemIds(lId, arsItemIds);
for (int i = arsItemIds.GetSize() - 1; i >=0; i--)
{
pService->DeleteExpressData(_ttol(arsItemIds[i]));
}
pService->DeleteRuleData(lId);
pService->DeleteAttributeData(lId);
pService->DeleteClassData(lId);
}
m_bPartModified = FALSE;
m_wndTreeClass.DeleteItem(hItem);
if (m_hCopyClass == hItem)
m_hCopyClass = NULL;
}
void CDlgParamDefine::OnClassRename()
{
if (m_cCurClass.IsReadOnly())
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem)
return;
m_wndTreeClass.EditLabel(hItem);
}
void CDlgParamDefine::OnClassSave()
{
if (m_bPartModified)
{
// 代号不得为空
if (_tcslen(m_cCurClass.GetCode()) <= 0)
{
CString sMsg;
sMsg.LoadString(IDS_EMPTYCLASSCODE);
MessageBox(sMsg);
return;
}
// 保存分类的数据
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL != hItem)
OnUpdateClassItemData(hItem);
}
m_bPartModified = FALSE;
}
void CDlgParamDefine::OnClassImport()
{
CDlgParamImport dlg(&m_wndTreeClass);
dlg.DoModal();
}
void CDlgParamDefine::OnClassTest()
{
if (m_bPartModified)
{
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
CString sMsg;
sMsg.LoadString(IDS_DATANOTSAVED);
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDYES:
// 代号不得为空
if (_tcslen(m_cCurClass.GetCode()) <= 0)
{
sMsg.LoadString(IDS_EMPTYCLASSCODE);
MessageBox(sMsg);
return;
}
// 保存分类的数据
if (NULL != hItem)
OnUpdateClassItemData(hItem);
m_bPartModified = FALSE;
break;
case IDCANCEL:
return;
}
}
CWnd* pFrame = acedGetAcadFrame();
pFrame->EnableWindow(TRUE);
ShowWindow(SW_HIDE);
CDlgParamInsert dlg;
dlg.SetClassCode(m_cCurClass.GetCode());
dlg.DoModal();
pFrame->EnableWindow(FALSE);
ShowWindow(SW_SHOW);
EnableWindow(TRUE);
}
void CDlgParamDefine::OnAttrNew()
{
if (m_cCurClass.IsReadOnly())
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
return;
// 创建新命名
CString sName, sValue;
sName.LoadString(IDS_NEWATTRIBUTE);
sValue = sName;
// 找到重名的
int iIndex = 0, iPos = 0;
while (iPos = m_wndLstAttribute.FindTabIndex(sName, iPos) >= 0)
{
iIndex++;
sName.Format(_T("%s%d"), sValue, iIndex);
}
// 收起展开的条目
iIndex = m_wndLstAttribute.GetTabCount();
while ((--iIndex) >= 0)
m_wndLstAttribute.CollapseTab(iIndex);
// 创建属性数据
KTParamAttribute* pData = new KTParamAttribute;
if (NULL == pData)
return;
// 创建条目
CPropertyItemTab* pTab = m_wndLstAttribute.AddTab(sName, TRUE);
if (NULL == pTab)
{
delete pData;
return;
}
// 设置数据
pTab->m_dwUserParam = (DWORD_PTR)pData;
// 更新数据
pData->SetClassId(m_cCurClass.GetId());
pData->SetCode(sName);
sValue.LoadString(IDS_ATTRIBUTENAME);
pData->SetName(sValue);
OnShowAttributeAttrItems(pTab, 0, TRUE);
m_wndLstAttribute.SetCurSel(pTab, -1);
m_wndLstAttribute.EditName();
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnAttrDelete()
{
if (m_cCurClass.IsReadOnly())
return;
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
m_wndLstAttribute.GetCurSel(pTab, pItem);
if (NULL == pTab || NULL != pItem)
return;
ULONG lId = m_cCurClass.GetId();
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
CString sMsg;
sMsg.LoadString(IDS_ISDELETEATTRIBUTE);
if (IDYES != MessageBox(sMsg, NULL, MB_YESNO | MB_ICONQUESTION))
return;
int iTab = m_wndLstAttribute.FindIndex(pTab);
ASSERT(iTab >= 0);
OnCleanAttrTab(pTab);
m_wndLstAttribute.DeleteTab(pTab);
if ((int)m_wndLstAttribute.GetTabCount() <= iTab)
iTab--;
m_wndLstAttribute.SetCurSel(iTab, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnAttrRename()
{
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
m_wndLstAttribute.GetCurSel(pTab, pItem);
if (NULL == pTab || NULL != pItem)
return;
m_wndLstAttribute.EditName();
}
void CDlgParamDefine::OnAttrUp()
{
if (m_cCurClass.IsReadOnly())
return;
int iTab, iIndex;
m_wndLstAttribute.GetCurSel(iTab, iIndex);
if (iTab < 1 || iIndex >= 0)
return;
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.FindTab(pTab, iTab - 1);
if (NULL == pTab)
return;
ULONG lId = m_cCurClass.GetId();
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstAttribute.FindTab(pTab, iTab);
if (NULL == pTab)
return;
pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstAttribute.InsertTab(iTab - 1, *pTab);
m_wndLstAttribute.DeleteTab(pTab);
m_wndLstAttribute.SetCurSel(iTab - 1, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnAttrDown()
{
if (m_cCurClass.IsReadOnly())
return;
int iTab, iIndex;
m_wndLstAttribute.GetCurSel(iTab, iIndex);
if (iTab < 0 || iIndex >= 0)
return;
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.FindTab(pTab, iTab);
if (NULL == pTab)
return;
ULONG lId = m_cCurClass.GetId();
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstAttribute.FindTab(pTab, iTab + 1);
if (NULL == pTab)
return;
pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstAttribute.InsertTab(iTab, *pTab);
m_wndLstAttribute.DeleteTab(pTab);
m_wndLstAttribute.SetCurSel(iTab + 1, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnRuleSelect()
{
if (m_cCurClass.IsReadOnly())
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
return;
// 进入AutoCAD命令操作模式
BEGIN_ACTIVE_ACAD_IN_DIALOG();
// 加载提示文本
CAcModuleResourceOverride theResource;
CString sPrompt;
sPrompt.LoadString(IDS_SELECTENTITY);
// 选择对象
ads_name ssSet;
struct resbuf rb = {NULL, 0, 0};
rb.resval.rstring = _tcsdup(_T("LINE,ARC,CIRCLE,ELLIPSE,TEXT,POINT,SOLID,LWPOLYLINE"));
int iRet = acedSSGet(_T(""), NULL, NULL, &rb, ssSet);
// 退出AutoCAD命令操作模式
END_ACTIVE_ACAD_IN_DIALOG();
// 选择不成功
if (RTNORM != iRet)
return;
// 收起展开的条目
int iIndex = m_wndLstRule.GetTabCount();
while ((--iIndex) >= 0)
m_wndLstRule.CollapseTab(iIndex);
KTParamRule* pData;
CPropertyItemTab* pTab;
CString sCurveType, sDrawType, sText;
CMapStringToString mapVarTypeToValue;
double dVal;
AcGeVector3d vtVal;
AcGePoint3d ptVal;
ads_name ent;
Adesk::Int32 lPos = 0;
acedSSLength(ssSet, &lPos);
while ((--lPos) >= 0)
{
acedSSName(ssSet, lPos, ent);
AcDbEntityPtr pEnt(ent, AcDb::kForRead);
if (NULL == pEnt)
continue;
if (pEnt->isKindOf(AcDbLine::desc()))
{
AcDbLine* pLine = (AcDbLine*)pEnt.GetObject();
sCurveType = _T("Line");
sDrawType = _T("Default");
ptVal = pLine->startPoint();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("StartPoint")] = sText;
ptVal = pLine->endPoint();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("EndPoint")] = sText;
}
else if (pEnt->isKindOf(AcDbArc::desc()))
{
AcDbArc* pArc = (AcDbArc*)pEnt.GetObject();
sCurveType = _T("Arc");
sDrawType = _T("Default");
ptVal = pArc->center();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Center")] = sText;
dVal = pArc->radius();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("Radius")] = sText;
dVal = pArc->startAngle();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("StartAngle")] = sText;
dVal = pArc->endAngle();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("EndAngle")] = sText;
}
else if (pEnt->isKindOf(AcDbCircle::desc()))
{
AcDbCircle* pCircle = (AcDbCircle*)pEnt.GetObject();
sCurveType = _T("Circle");
sDrawType = _T("Default");
ptVal = pCircle->center();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Center")] = sText;
dVal = pCircle->radius();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("Radius")] = sText;
}
else if (pEnt->isKindOf(AcDbEllipse::desc()))
{
AcDbEllipse* pEllips = (AcDbEllipse*)pEnt.GetObject();
sCurveType = _T("Ellipse");
sDrawType = _T("Default");
ptVal = pEllips->center();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Center")] = sText;
dVal = pEllips->majorAxis().length() * 2.0;
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("MajorAxis")] = sText;
dVal = pEllips->minorAxis().length() * 2.0;
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("MinorAxis")] = sText;
vtVal = pEllips->majorAxis();
dVal = vtVal.angleTo(AcGeVector3d::kXAxis, AcGeVector3d::kZAxis);
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("DirectAngle")] = sText;
dVal = pEllips->startAngle();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("StartAngle")] = sText;
dVal = pEllips->endAngle();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("EndAngle")] = sText;
}
else if (pEnt->isKindOf(AcDbText::desc()))
{
AcDbText* pText = (AcDbText*)pEnt.GetObject();
sCurveType = _T("Text");
sDrawType = _T("Default");
ptVal = pText->position();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Position")] = sText;
LPTSTR pszStr = pText->textString();
mapVarTypeToValue[_T("Content")] = pszStr;
acutDelString(pszStr);
dVal = pText->height();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("Height")] = sText;
dVal = pText->rotation();
sText.Format(_T("%f"), dVal);
mapVarTypeToValue[_T("Rotation")] = sText;
}
else if (pEnt->isKindOf(AcDbPoint::desc()))
{
AcDbPoint* pPoint = (AcDbPoint*)pEnt.GetObject();
sCurveType = _T("Point");
sDrawType = _T("Default");
ptVal = pPoint->position();
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Position")] = sText;
}
else if (pEnt->isKindOf(AcDbSolid::desc()))
{
AcDbSolid* pSolid = (AcDbSolid*)pEnt.GetObject();
sCurveType = _T("Solid");
sDrawType = _T("Default");
pSolid->getPointAt(0, ptVal);
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("First")] = sText;
pSolid->getPointAt(1, ptVal);
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Second")] = sText;
pSolid->getPointAt(2, ptVal);
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Third")] = sText;
pSolid->getPointAt(3, ptVal);
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("Fourth")] = sText;
}
else if (pEnt->isKindOf(AcDbPolyline::desc()))
{
AcDbPolyline* pPline = (AcDbPolyline*)pEnt.GetObject();
AcGePoint3d pt;
double dWidth;
int i = 0, iNums = pPline->numVerts();
while (i < iNums)
{
pPline->getWidthsAt(i, dWidth, dWidth);
pPline->getBulgeAt(i, dVal);
pPline->getPointAt(i, ptVal);
if ((++i) < iNums)
pPline->getPointAt(i, pt);
else if (pPline->isClosed())
pPline->getPointAt(0, pt);
else
break;
sText.Format(_T("%f"), dWidth);
mapVarTypeToValue[_T("Width")] = sText;
if (_IsZero_(dVal))
{
sCurveType = _T("Line");
sDrawType = _T("Default");
sText.Format(_T("%f,%f,%f"), ptVal.x, ptVal.y, ptVal.z);
mapVarTypeToValue[_T("StartPoint")] = sText;
sText.Format(_T("%f,%f,%f"), pt.x, pt.y, pt.z);
mapVarTypeToValue[_T("EndPoint")] = sText;
}
else
{
sCurveType = _T("Arc");
sDrawType = _T("Default");
AcGePoint3d ptCenter;
double dRadius, dStartAngle, dEndAngle;
GetArcParam(ptVal, pt, dVal, pPline->normal(), ptCenter, dRadius, dStartAngle, dEndAngle);
sText.Format(_T("%f,%f,%f"), ptCenter.x, ptCenter.y, ptCenter.z);
mapVarTypeToValue[_T("Center")] = sText;
sText.Format(_T("%f"), dRadius);
mapVarTypeToValue[_T("Radius")] = sText;
sText.Format(_T("%f"), dStartAngle);
mapVarTypeToValue[_T("StartAngle")] = sText;
sText.Format(_T("%f"), dEndAngle);
mapVarTypeToValue[_T("EndAngle")] = sText;
}
pData = new KTParamRule;
if (NULL == pData)
continue;
pTab = m_wndLstRule.AddTab(_T(""));
if (NULL == pTab)
{
delete pData;
continue;
}
pData->SetClassId(m_cCurClass.GetId());
pData->SetCurveType(sCurveType);
pData->SetDrawType(sDrawType);
pTab->m_dwUserParam = (DWORD_PTR)pData;
OnShowRuleAttrItems(pTab, 0, TRUE);
OnShowExpression(pTab, mapVarTypeToValue, TRUE);
mapVarTypeToValue.RemoveAll();
m_bPartModified |= TRUE;
}
continue;
}
else
{
continue;
}
pData = new KTParamRule;
if (NULL == pData)
continue;
pTab = m_wndLstRule.AddTab(_T(""));
if (NULL == pTab)
{
delete pData;
continue;
}
pData->SetClassId(m_cCurClass.GetId());
pData->SetCurveType(sCurveType);
pData->SetDrawType(sDrawType);
pTab->m_dwUserParam = (DWORD_PTR)pData;
OnShowRuleAttrItems(pTab, 0, TRUE);
OnShowExpression(pTab, mapVarTypeToValue, TRUE);
mapVarTypeToValue.RemoveAll();
m_bPartModified |= TRUE;
acedSSFree(ssSet);
}
}
void CDlgParamDefine::OnRuleNew()
{
if (m_cCurClass.IsReadOnly())
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
return;
// 收起展开的条目
int iIndex = m_wndLstRule.GetTabCount();
while ((--iIndex) >= 0)
m_wndLstRule.CollapseTab(iIndex);
// 创建属性数据
KTParamRule* pData = new KTParamRule;
if (NULL == pData)
return;
// 创建条目
CPropertyItemTab* pTab = m_wndLstRule.AddTab(_T(""), TRUE);
if (NULL == pTab)
{
delete pData;
return;
}
// 设置数据
pData->SetClassId(m_cCurClass.GetId());
pData->SetCurveType(_T("Line"));
pData->SetDrawType(_T("Default"));
pTab->m_dwUserParam = (DWORD_PTR)pData;
// 显示约束属性数据
OnShowRuleAttrItems(pTab, 0, TRUE);
// 显示约束参数数据
OnShowExpression(pTab, 0, TRUE);
m_wndLstRule.SetCurSel(pTab, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnRuleDelete()
{
if (m_cCurClass.IsReadOnly())
return;
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
m_wndLstRule.GetCurSel(pTab, pItem);
if (NULL == pTab || NULL != pItem)
return;
ULONG lId = m_cCurClass.GetId();
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
int iTab = m_wndLstRule.FindIndex(pTab);
ASSERT(iTab >= 0);
OnCleanRuleTab(pTab);
m_wndLstRule.DeleteTab(pTab);
if ((int)m_wndLstRule.GetTabCount() <= iTab)
iTab--;
m_wndLstRule.SetCurSel(iTab, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnRuleUp()
{
if (m_cCurClass.IsReadOnly())
return;
int iTab, iIndex;
m_wndLstRule.GetCurSel(iTab, iIndex);
if (iTab < 1 || iIndex >= 0)
return;
CPropertyItemTab* pTab = NULL;
m_wndLstRule.FindTab(pTab, iTab - 1);
if (NULL == pTab)
return;
ULONG lId = m_cCurClass.GetId();
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstRule.FindTab(pTab, iTab);
if (NULL == pTab)
return;
pData = (KTParamRule*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstRule.InsertTab(iTab - 1, *pTab);
m_wndLstRule.DeleteTab(pTab);
m_wndLstRule.SetCurSel(iTab - 1, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnRuleDown()
{
if (m_cCurClass.IsReadOnly())
return;
int iTab, iIndex;
m_wndLstRule.GetCurSel(iTab, iIndex);
if (iTab < 0 || iIndex >= 0)
return;
CPropertyItemTab* pTab = NULL;
m_wndLstRule.FindTab(pTab, iTab);
if (NULL == pTab)
return;
ULONG lId = m_cCurClass.GetId();
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstRule.FindTab(pTab, iTab + 1);
if (NULL == pTab)
return;
pData = (KTParamRule*)pTab->m_dwUserParam;
if (NULL == pData || 0 != lId && pData->GetClassId() != lId)
return;
m_wndLstRule.InsertTab(iTab, *pTab);
m_wndLstRule.DeleteTab(pTab);
m_wndLstRule.SetCurSel(iTab + 1, -1);
m_bPartModified |= TRUE;
}
void CDlgParamDefine::OnInitClassTree(ULONG lParent, HTREEITEM hParent)
{
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamClassArray arItems;
pService->GetSubClassItems(lParent, arItems);
ULONG lId;
HTREEITEM hItem;
int iSize = arItems.GetSize();
for (int i = 0; i < iSize; i++)
{
hItem = m_wndTreeClass.InsertItem(arItems[i].GetName(), hParent);
ASSERT(NULL != hItem);
lId = arItems[i].GetId();
m_wndTreeClass.SetItemData(hItem, lId);
OnInitClassTree(lId, hItem);
}
}
void CDlgParamDefine::OnCancel()
{
if (m_bPartModified)
{
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
CString sMsg;
sMsg.LoadString(IDS_DATANOTSAVED);
switch (MessageBox(sMsg, NULL, MB_YESNOCANCEL|MB_ICONQUESTION))
{
case IDYES:
// 代号不得为空
if (_tcslen(m_cCurClass.GetCode()) <= 0)
{
sMsg.LoadString(IDS_EMPTYCLASSCODE);
MessageBox(sMsg);
return;
}
// 保存分类的数据
if (NULL != hItem)
OnUpdateClassItemData(hItem);
m_bPartModified = FALSE;
break;
case IDCANCEL:
return;
}
}
CDialog::OnCancel();
}
void CDlgParamDefine::OnDestroy()
{
CDialog::OnDestroy();
OnCleanAttributeList();
OnCleanRuleList();
}
void CDlgParamDefine::OnCleanAttrTab(CPropertyItemTab* pTab)
{
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL != pItem->m_dwUserData)
{
delete ((KTParamTableAttr*)(pItem->m_dwUserData));
pItem->m_dwUserData = NULL;
}
if (NULL != pItem->m_dwUserDataEx)
{
delete ((KTParamTableAttr*)(pItem->m_dwUserDataEx));
pItem->m_dwUserDataEx = NULL;
}
}
if (NULL != pTab->m_dwUserParam)
{
delete ((KTParamAttribute*)(pTab->m_dwUserParam));
pTab->m_dwUserParam = NULL;
}
if (NULL != pTab->m_dwUserData)
{
delete ((KTParamTableAttr*)(pTab->m_dwUserData));
pTab->m_dwUserData = NULL;
}
if (NULL != pTab->m_dwUserDataEx)
{
delete ((KTParamTableAttr*)(pTab->m_dwUserDataEx));
pTab->m_dwUserDataEx = NULL;
}
}
void CDlgParamDefine::OnCleanAttributeList()
{
CPropertyItemTab* pTab;
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstAttribute.GetNextTab(pos);
ASSERT(NULL != pTab);
OnCleanAttrTab(pTab);
}
m_wndLstAttribute.ResetContent();
}
void CDlgParamDefine::OnCleanRuleTab(CPropertyItemTab* pTab)
{
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL != pItem->m_dwUserData)
{
delete ((KTParamTableAttr*)(pItem->m_dwUserData));
pItem->m_dwUserData = NULL;
}
if (NULL != pItem->m_dwUserDataEx)
{
delete ((KTParamTableAttr*)(pItem->m_dwUserDataEx));
pItem->m_dwUserDataEx = NULL;
}
}
if (NULL != pTab->m_dwUserParam)
{
delete ((KTParamRule*)(pTab->m_dwUserParam));
pTab->m_dwUserParam = NULL;
}
if (NULL != pTab->m_dwUserData)
{
delete ((KTParamTableAttr*)(pTab->m_dwUserData));
pTab->m_dwUserData = NULL;
}
if (NULL != pTab->m_dwUserDataEx)
{
delete ((KTParamTableAttr*)(pTab->m_dwUserDataEx));
pTab->m_dwUserDataEx = NULL;
}
}
void CDlgParamDefine::OnCleanRuleList()
{
CPropertyItemTab* pTab;
POSITION pos = m_wndLstRule.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstRule.GetNextTab(pos);
ASSERT(NULL != pTab);
OnCleanRuleTab(pTab);
}
m_wndLstRule.ResetContent();
}
void CDlgParamDefine::OnUpdateClassItemData(HTREEITEM hItem)
{
CWaitCursor waiter;
// 为顶层条目,没有分类
ASSERT(NULL != hItem);
HTREEITEM hParent = m_wndTreeClass.GetParentItem(hItem);
if (NULL == hParent)
return;
KTParamClass cClassData;
KTParamAttributePtrArray arpAttrData;
KTParamRulePtrArray arpRuleData;
cClassData.SetId(m_wndTreeClass.GetItemData(hItem));
cClassData.SetUpId(m_wndTreeClass.GetItemData(hParent));
cClassData.SetName(m_wndTreeClass.GetItemText(hItem));
int iIndex = 0;
CPropertyItemTab* pTab;
KTParamAttribute* pAttr;
POSITION pos = m_wndLstAttribute.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstAttribute.GetNextTab(pos);
ASSERT(NULL != pTab);
pAttr = (KTParamAttribute*)pTab->m_dwUserParam;
if (NULL == pAttr)
{
OnUpdateClassAttrData(pTab, cClassData);
}
else if (pAttr->GetClassId() == cClassData.GetId())
{
OnUpdateAttributeData(pTab, *pAttr);
pAttr->SetIndex(iIndex++);
arpAttrData.Add(pAttr);
}
}
iIndex = 0;
KTParamRule* pRule;
pos = m_wndLstRule.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstRule.GetNextTab(pos);
ASSERT(NULL != pTab);
pRule = (KTParamRule*)pTab->m_dwUserParam;
ASSERT(NULL != pRule);
//if (pRule->GetClassId() == cClassData.GetId())
{
OnUpdateRuleData(pTab, *pRule);
pRule->SetIndex(iIndex++);
arpRuleData.Add(pRule);
}
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 更新类型数据
BOOL bSuccess = pService->UpdateClassData(&cClassData);
if (bSuccess)
{
if (m_wndTreeClass.GetSelectedItem() == hItem)
m_cCurClass = cClassData;
m_wndTreeClass.SetItemData(hItem, cClassData.GetId());
// 更新属性数据
bSuccess &= pService->UpdateAttributeData(cClassData.GetId(), arpAttrData);
// 更新约束数据
bSuccess &= pService->UpdateRuleData(cClassData.GetId(), arpRuleData);
}
if (!bSuccess)
{
CString sMsg;
sMsg.LoadString(IDS_DATAACCESSERROR);
MessageBox(sMsg);
}
}
void CDlgParamDefine::OnUpdateClassAttrData(CPropertyItemTab* pTab, KTParamClass& cClassData)
{
ASSERT(NULL != pTab);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CMapStringToString mapVarToValue;
pService->GetTableItemById(_T("GetClassItemById"), cClassData.GetId(), mapVarToValue);
// 更新数据
if (0 == cClassData.GetId())
cClassData.MapFieldToValue(mapVarToValue);
CString sValue;
KTParamTableAttr* pAttr;
if (NULL != pTab->m_dwUserData)
{
pAttr = (KTParamTableAttr*)pTab->m_dwUserData;
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
if (NULL != pTab->m_dwUserDataEx)
{
pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx;
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL != pItem->m_dwUserData)
{
pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
if (NULL != pItem->m_dwUserDataEx)
{
pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx;
cClassData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sName, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
}
}
void CDlgParamDefine::OnUpdateAttributeData(CPropertyItemTab* pTab, KTParamAttribute& cAttrData)
{
ASSERT(NULL != pTab);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得属性条目的数据映射
CMapStringToString mapVarToValue;
pService->GetTableItemById(_T("GetAttributeItemById"), cAttrData.GetId(), mapVarToValue);
// 更新数据
if (0 == cAttrData.GetId())
cAttrData.MapFieldToValue(mapVarToValue);
CString sValue;
KTParamTableAttr* pAttr;
if (NULL != pTab->m_dwUserData)
{
pAttr = (KTParamTableAttr*)pTab->m_dwUserData;
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
if (NULL != pTab->m_dwUserDataEx)
{
pAttr = (KTParamTableAttr*)pTab->m_dwUserDataEx;
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL != pItem->m_dwUserData)
{
pAttr = (KTParamTableAttr*)pItem->m_dwUserData;
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sValue, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
if (NULL != pItem->m_dwUserDataEx)
{
pAttr = (KTParamTableAttr*)pItem->m_dwUserDataEx;
cAttrData.SetValue(pAttr->GetField(), ByItemDesc(sValue, pItem->m_sName, pAttr->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr->GetField()] = sValue;
}
}
}
void CDlgParamDefine::OnUpdateRuleData(CPropertyItemTab* pTab, KTParamRule& cRuleData)
{
ASSERT(NULL != pTab);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得属性条目的数据映射
CMapStringToString mapVarToValue;
pService->GetTableItemById(_T("GetRuleItemById"), cRuleData.GetId(), mapVarToValue);
// 更新数据
if (0 == cRuleData.GetId())
cRuleData.MapFieldToValue(mapVarToValue);
CString sValue;
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
ASSERT(NULL != pAttr1);
cRuleData.SetValue(pAttr1->GetField(), ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr1->GetField()] = sValue;
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
ASSERT(NULL != pAttr2);
cRuleData.SetValue(pAttr2->GetField(), ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapVarToValue));
mapVarToValue[pAttr2->GetField()] = sValue;
CMapStringToString mapDescToParam;
AsDescTable(sValue, pAttr1->GetVarDesc(), mapVarToValue);
pService->GetCurveDrawTypeParam(sValue, mapVarToValue[pAttr1->GetField()], mapVarToValue[pAttr2->GetField()], mapDescToParam, TRUE);
KTParamExpression cExpress;
cExpress.SetRuleId(cRuleData.GetId());
int iIndex = 0;
CPropertyItem* pItem;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
ASSERT(NULL == pItem->m_dwUserData && NULL == pItem->m_dwUserDataEx);
cExpress.SetVarType(mapDescToParam[pItem->m_sName]);
cExpress.SetValue(pItem->m_sValue);
cExpress.SetIndex(iIndex++);
cRuleData.m_arExpression.Add(cExpress);
}
}
CPropertyItem::ItemStyle CDlgParamDefine::AsItemStyle(LPCTSTR pszDataType, BOOL bMulti, BOOL bOverride)
{
if (bMulti)
{
if (bOverride)
return CPropertyItem::CMB_DOWN;
else
return CPropertyItem::CMB_LIST;
}
if (0 == _tcsicmp(pszDataType, _T("Int")))
{
return CPropertyItem::EDT_SPIN;
}
else if (0 == _tcsicmp(pszDataType, _T("Real")))
{
return CPropertyItem::EDT_REAL;
}
else if (0 == _tcsicmp(pszDataType, _T("Char")))
{
return CPropertyItem::EDT_NONE;
}
else if (0 == _tcsicmp(pszDataType, _T("Bool")))
{
return CPropertyItem::CMB_LIST_YESNO;
}
else
{
return CPropertyItem::EDT_NONE;
}
}
LPCTSTR CDlgParamDefine::AsItemString(CString& sData, LPCTSTR pszDataType)
{
if (0 == _tcsicmp(pszDataType, _T("Bool")) && !sData.IsEmpty())
{
// 转换数据
if (_istdigit(sData[sData.GetLength() - 1]))
sData = (_ttoi(sData) ? _T("TRUE") : _T("FALSE"));
else if (!sData.IsEmpty() && _istalnum(sData[0]))
;
else
sData = (sData.CompareNoCase(_T("是")) == 0 ? _T("TRUE") : _T("FALSE"));
}
return sData;
}
LPCTSTR CDlgParamDefine::AsDescTable(CString& sDescTable, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
{
if (NULL != _tcschr(pszVarDesc, _T(' ')))
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CString sSQL;
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
{
CStringArray arsTable;
if (pService->ExecuteSQL(sSQL, arsTable))
{
sDescTable = arsTable[0];
return sDescTable;
}
}
}
sDescTable = pszVarDesc;
return sDescTable;
}
LPCTSTR CDlgParamDefine::AsItemDesc(CString& sDesc, LPCTSTR pszData, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
{
if (NULL == pszVarDesc || 0 >= _tcslen(pszVarDesc))
{
sDesc = pszData;
return sDesc;
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CStringArray arsTable;
if (NULL != _tcschr(pszVarDesc, _T(' ')))
{
CString sSQL;
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
pService->ExecuteSQL(sSQL, arsTable);
}
else
arsTable.Add(pszVarDesc);
if (1 != arsTable.GetSize() || arsTable[0].IsEmpty())
{
sDesc = pszData;
return sDesc;
}
// 取得逻辑值数据
CMapStringToString mapValueToDesc;
pService->GetValueToDescMap(arsTable[0], mapValueToDesc);
if (!mapValueToDesc.Lookup(pszData, sDesc))
sDesc = pszData;
return sDesc;
}
LPCTSTR CDlgParamDefine::ByItemDesc(CString& sData, LPCTSTR pszDesc, LPCTSTR pszVarDesc, const CMapStringToString& mapVarToValue)
{
if (NULL == pszVarDesc || 0 >= _tcslen(pszVarDesc))
{
sData = pszDesc;
return sData;
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CStringArray arsTable;
if (NULL != _tcschr(pszVarDesc, _T(' ')))
{
CString sSQL;
if (pService->ExpandSQL(pszVarDesc, mapVarToValue, sSQL))
pService->ExecuteSQL(sSQL, arsTable);
}
else
arsTable.Add(pszVarDesc);
if (1 != arsTable.GetSize() || arsTable[0].IsEmpty())
{
sData = pszDesc;
return sData;
}
// 取得逻辑值数据
CMapStringToString mapDescToValue;
pService->GetDescToValueMap(arsTable[0], mapDescToValue);
if (!mapDescToValue.Lookup(pszDesc, sData))
sData = pszDesc;
return sData;
}
void CDlgParamDefine::OnShowClassData(HTREEITEM hItem, BOOL bEdit)
{
// 取得分类ID
ASSERT(NULL != hItem);
ULONG lId = m_wndTreeClass.GetItemData(hItem);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamClass data;
if (!pService->GetClassItemById(lId, data))
{
// 如果是新建分类,列出父类型数据
if (NULL != (hItem = m_wndTreeClass.GetParentItem(hItem)))
OnShowClassData(hItem, FALSE);
return;
}
if (bEdit)
bEdit = (!data.IsReadOnly());
if (NULL != (hItem = m_wndTreeClass.GetParentItem(hItem)))
OnShowClassData(hItem, FALSE);
OnShowAttributeItems(lId, bEdit);
}
void CDlgParamDefine::OnShowClassAttrItems(HTREEITEM hItem, BOOL bEdit)
{
// 为顶层条目,没有分类
ASSERT(NULL != hItem);
if (NULL == m_wndTreeClass.GetParentItem(hItem))
return;
// 取得分类ID
ULONG lId = m_wndTreeClass.GetItemData(hItem);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得类型条目的数据映射
CMapStringToString mapData;
pService->GetTableItemById(_T("GetClassItemById"), lId, mapData);
mapData[_T("Name")] = m_wndTreeClass.GetItemText(hItem);
// 取得类型表属性数据
KTParamTableAttrPtrArray arpItems;
pService->GetTableAttrItems(_T("Class_Attr"), TRUE, arpItems);
// 准备构造列表
CPropertyItem* pItem = NULL;
CPropertyItemTab* pTab = NULL;
// 构造列表
LPCTSTR pszFlags;
KTParamTableAttr* pAttr;
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
// 取得属性表属性项
pAttr = arpItems[i];
ASSERT(NULL != pAttr && pAttr->IsVisible());
// 如果条目为空,且创建不成功,删除属性项
if (NULL == pTab && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
{
delete pAttr;
continue;
}
// 根据标志处理类型内容位置
pszFlags = pAttr->GetFlags();
// 如为Tab分类
if (NULL != _tcschr(pszFlags, _T('C')))
{
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 判断是否已经有标题域了或者添加失败,有了或添加不成功则删除属性项
if (NULL != pTab->m_dwUserDataEx && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pTab->m_sName.IsEmpty())
pTab->m_sName = pAttr->GetDefault();
pTab->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sValue = pAttr->GetName();
}
else
{
// 判断是否已经有数值域了或者添加失败,有了或添加不成功则删除属性项
if (NULL != pTab->m_dwUserData && NULL == (pTab = m_wndLstAttribute.AddTab(_T(""))))
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pTab->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pTab->m_sValue.IsEmpty())
pTab->m_sValue = pAttr->GetDefault();
pTab->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sName = pAttr->GetName();
}
}
else
{
// 如果条目为空,且创建不成功,删除属性项
if (NULL == pItem && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pItem->m_sName.IsEmpty())
pItem->m_sName = pAttr->GetDefault();
pItem->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sValue = pAttr->GetName();
}
else
{
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserData && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pItem->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pItem->m_sValue.IsEmpty())
pItem->m_sValue = pAttr->GetDefault();
pItem->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sName = pAttr->GetName();
}
}
}
}
void CDlgParamDefine::OnShowAttributeItems(ULONG lId, BOOL bEdit)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 获取属性内容
KTParamAttributePtrArray arpItems;
pService->GetAttributeItems(lId, arpItems);
// 准备构造列表
CPropertyItemTab* pTab;
KTParamAttribute* pAttr;
// 构造列表
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
// 取得属性表属性项
pAttr = arpItems[i];
ASSERT(NULL != pAttr);
// 创建属性分类
pTab = m_wndLstAttribute.AddTab(_T(""));
if (NULL == pTab)
{
delete pAttr;
continue;
}
// 保存当前属性内容
pTab->m_dwUserParam = (DWORD_PTR)pAttr;
// 显示当前属性条目
OnShowAttributeAttrItems(pTab, pAttr->GetId(), bEdit);
}
}
void CDlgParamDefine::OnShowAttributeAttrItems(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得属性条目的数据映射
CMapStringToString mapData;
pService->GetTableItemById(_T("GetAttributeItemById"), lId, mapData);
// 更新数据
KTParamAttribute* pData = (KTParamAttribute*)pTab->m_dwUserParam;
if (0 == pData->GetId())
pData->MapFieldToValue(mapData);
// 取得属性表属性数据
KTParamTableAttrPtrArray arpItems;
pService->GetTableAttrItems(_T("Attribute_Attr"), TRUE, arpItems);
// 准备构造列表
CPropertyItem* pItem = NULL;
ASSERT(NULL != pTab);
// 构造列表
LPCTSTR pszFlags;
KTParamTableAttr* pAttr;
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
// 取得属性表属性项
pAttr = arpItems[i];
ASSERT(NULL != pAttr && pAttr->IsVisible());
// 根据标志处理属性内容位置
pszFlags = pAttr->GetFlags();
// 如为Tab分类
if (NULL != _tcschr(pszFlags, _T('C')))
{
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 判断是否已经有标题域了,有了则删除属性项
if (NULL != pTab->m_dwUserDataEx)
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pTab->m_sName.IsEmpty())
pTab->m_sName = pAttr->GetDefault();
pTab->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sValue = pAttr->GetName();
}
else
{
// 判断是否已经有数值域了,有了则删除属性项
if (NULL != pTab->m_dwUserData)
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pTab->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pTab->m_sValue.IsEmpty())
pTab->m_sValue = pAttr->GetDefault();
pTab->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sName = pAttr->GetName();
}
}
else
{
// 如果条目为空,且创建不成功,删除属性项
if (NULL == pItem && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pItem->m_sName.IsEmpty())
pItem->m_sName = pAttr->GetDefault();
pItem->m_bNameEditable = (bEdit && !pAttr->IsReadOnly());
pItem->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sValue = pAttr->GetName();
}
else
{
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserData && (!m_wndLstAttribute.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pItem->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pItem->m_sValue.IsEmpty())
pItem->m_sValue = pAttr->GetDefault();
pItem->m_bValueEditable = (bEdit && !pAttr->IsReadOnly());
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sName = pAttr->GetName();
}
}
}
}
void CDlgParamDefine::OnShowRuleData(HTREEITEM hItem, BOOL bEdit)
{
// 取得分类ID
ASSERT(NULL != hItem);
ULONG lId = m_wndTreeClass.GetItemData(hItem);
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 获取约束数据
KTParamRulePtrArray arpItems;
pService->GetRuleItems(lId, arpItems);
// 准备构造列表
CPropertyItemTab* pTab;
KTParamRule* pRule;
// 构造列表
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
// 取得约束表项
pRule = arpItems[i];
ASSERT(NULL != pRule);
pTab = m_wndLstRule.AddTab(_T(""));
if (NULL == pTab)
{
delete pRule;
continue;
}
// 保存当前约束内容
pTab->m_dwUserParam = (DWORD_PTR)pRule;
// 显示当前约束条目
OnShowRuleAttrItems(pTab, pRule->GetId(), bEdit);
// 显示当前约束参数
OnShowExpression(pTab, pRule->GetId(), bEdit);
}
}
void CDlgParamDefine::OnShowRuleAttrItems(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得约束条目的数据映射
CMapStringToString mapData;
pService->GetTableItemById(_T("GetRuleItemById"), lId, mapData);
// 更新
KTParamRule* pData = (KTParamRule*)pTab->m_dwUserParam;
mapData[_T("CurveType")] = pData->GetCurveType();
mapData[_T("DrawType")] = pData->GetDrawType();
// 取得约束表属性数据
KTParamTableAttrPtrArray arpItems;
pService->GetTableAttrItems(_T("Rules_Attr"), TRUE, arpItems);
// 准备构造列表
CPropertyItem* pItem = NULL;
ASSERT(NULL != pTab);
// 构造列表
LPCTSTR pszFlags;
KTParamTableAttr* pAttr;
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
// 取得约束表属性项
pAttr = arpItems[i];
ASSERT(NULL != pAttr && pAttr->IsVisible());
// 根据标志处理属性内容位置
pszFlags = pAttr->GetFlags();
// 如为Tab分类
if (NULL != _tcschr(pszFlags, _T('C')))
{
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 判断是否已经有标题域了,有了则删除属性项
if (NULL != pTab->m_dwUserDataEx)
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pTab->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pTab->m_sName.IsEmpty())
pTab->m_sName = pAttr->GetDefault();
pTab->m_bNameEditable = bEdit;
pTab->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sValue = pAttr->GetName();
}
else
{
// 判断是否已经有数值域了,有了则删除属性项
if (NULL != pTab->m_dwUserData)
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pTab->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pTab->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pTab->m_sValue.IsEmpty())
pTab->m_sValue = pAttr->GetDefault();
pTab->m_bValueEditable = bEdit;
pTab->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pTab->m_sName = pAttr->GetName();
}
}
else
{
// 如果条目为空,且创建不成功,删除属性项
if (NULL == pItem && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 如为Tab的标题域
if (NULL != _tcschr(pszFlags, _T('T')))
{
// 如果已经标题域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserDataEx && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新标题域内容
pItem->m_dwUserDataEx = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sName, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果标题为空,则使用默认值
if (pItem->m_sName.IsEmpty())
pItem->m_sName = pAttr->GetDefault();
pItem->m_bNameEditable = bEdit;
pItem->m_eNameStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写数值域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sValue = pAttr->GetName();
}
else
{
// 如果已经数值域了,且添加新条目,如果不成功,则删除属性项
if (NULL != pItem->m_dwUserData && (!m_wndLstRule.AddItem(pTab, _T(""), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail())))
{
delete pAttr;
continue;
}
// 赋值更新数值域内容
pItem->m_dwUserData = (DWORD_PTR)pAttr;
AsItemDesc(pItem->m_sValue, AsItemString(mapData[pAttr->GetField()], pAttr->GetDataType()), pAttr->GetVarDesc(), mapData);
// 如果数值为空,则使用默认值
if (pItem->m_sValue.IsEmpty())
pItem->m_sValue = pAttr->GetDefault();
pItem->m_bValueEditable = bEdit;
pItem->m_eValueStyle = AsItemStyle(pAttr->GetDataType(), (_tcslen(pAttr->GetValue()) > 0), pAttr->IsOverride());
// 如果不是单项,填写标题域内容
if (NULL == _tcschr(pszFlags, _T('S')))
pItem->m_sName = pAttr->GetName();
}
}
}
}
void CDlgParamDefine::OnShowExpression(CPropertyItemTab* pTab, ULONG lId, BOOL bEdit)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 取得约束参数表达式数据
CMapStringToString mapVarTypeToValue;
pService->GetExpressionItemById(lId, mapVarTypeToValue);
OnShowExpression(pTab, mapVarTypeToValue, bEdit);
}
void CDlgParamDefine::OnShowExpression(CPropertyItemTab* pTab, CMapStringToString& mapVarTypeToValue, BOOL bEdit)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamRule* pRule = (KTParamRule*)pTab->m_dwUserParam;
ASSERT(NULL != pRule);
KTParamTableAttr* pAttr1 = (KTParamTableAttr*)pTab->m_dwUserDataEx;
ASSERT(NULL != pAttr1);
KTParamTableAttr* pAttr2 = (KTParamTableAttr*)pTab->m_dwUserData;
ASSERT(NULL != pAttr2);
// 取得约束条目的数据映射
CMapStringToString mapData;
pService->GetTableItemById(_T("GetRuleItemById"), pRule->GetId(), mapData);
// 更新
CString sValue;
mapData[pAttr1->GetField()] = ByItemDesc(sValue, pTab->m_sName, pAttr1->GetVarDesc(), mapData);
mapData[pAttr2->GetField()] = ByItemDesc(sValue, pTab->m_sValue, pAttr2->GetVarDesc(), mapData);
// 获得参数映射
CMapStringToString mapParamToDesc;
AsDescTable(sValue, pAttr1->GetVarDesc(), mapData);
pService->GetCurveDrawTypeParam(sValue, mapData[pAttr1->GetField()], mapData[pAttr2->GetField()], mapParamToDesc);
// 准备构造列表
ASSERT(NULL != pTab);
// 构造列表
sValue.Empty();
CString sKey, sName;
POSITION pos = mapParamToDesc.GetStartPosition();
while (NULL != pos)
{
mapParamToDesc.GetNextAssoc(pos, sKey, sName);
mapVarTypeToValue.Lookup(sKey, sValue);
m_wndLstRule.AddItem(pTab, sName, sValue, CPropertyItem::EDT_NONE, bEdit);
sName.Empty();
sValue.Empty();
}
}
void CDlgParamDefine::OnClassCopy()
{
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || NULL == m_wndTreeClass.GetParentItem(hItem))
return;
m_hCopyClass = hItem;
}
void CDlgParamDefine::OnAttrPaste()
{
if (NULL == m_hCopyClass)
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || hItem == m_hCopyClass)
return;
HTREEITEM hParent = m_wndTreeClass.GetParentItem(hItem);
if (NULL == hParent || m_cCurClass.IsReadOnly())
return;
do
{
if (hParent == m_hCopyClass)
return;
hParent = m_wndTreeClass.GetParentItem(hParent);
} while (NULL != hParent);
ULONG lId = m_wndTreeClass.GetItemData(m_hCopyClass);
if (0 == lId)
return;
UINT nOld = m_wndLstAttribute.GetTabCount();
OnShowAttributeItems(lId, TRUE);
UINT nLen = m_wndLstAttribute.GetTabCount();
ULONG lClassId = m_wndTreeClass.GetItemData(hItem);
CPropertyItemTab* pTab1;
CPropertyItemTab* pTab2;
KTParamAttribute* pAttr1;
KTParamAttribute* pAttr2;
for (UINT n = nOld; n < nLen; n++)
{
if (NULL == m_wndLstAttribute.FindTab(pTab1, n) || NULL == pTab1->m_dwUserParam)
continue;
pAttr1 = (KTParamAttribute*)pTab1->m_dwUserParam;
pAttr1->SetClassId(lClassId);
pAttr1->SetId(NULL);
for (UINT m = 0; m < nOld; m++)
{
if (NULL == m_wndLstAttribute.FindTab(pTab2, m) || NULL == pTab2->m_dwUserParam)
continue;
pAttr2 = (KTParamAttribute*)pTab2->m_dwUserParam;
if (0 == _tcsicmp(pAttr1->GetCode(), pAttr2->GetCode()))
{
--n;
--nLen;
if (pTab2->m_bNameEditable)
{
--nOld;
m_bPartModified |= TRUE;
}
else
{
pTab2 = pTab1;
}
OnCleanAttrTab(pTab2);
m_wndLstAttribute.DeleteTab(pTab2);
break;
}
}
}
m_bPartModified |= (nLen != nOld);
}
void CDlgParamDefine::OnRulePaste()
{
if (NULL == m_hCopyClass)
return;
HTREEITEM hItem = m_wndTreeClass.GetSelectedItem();
if (NULL == hItem || hItem == m_hCopyClass || NULL == m_wndTreeClass.GetParentItem(hItem) || m_cCurClass.IsReadOnly())
return;
UINT nOld = m_wndLstRule.GetTabCount();
OnShowRuleData(m_hCopyClass, TRUE);
UINT nLen = m_wndLstRule.GetTabCount();
ULONG lClassId = m_wndTreeClass.GetItemData(hItem);
CPropertyItemTab* pTab;
KTParamRule* pRule;
for (UINT n = nOld; n < nLen; n++)
{
if (NULL == m_wndLstRule.FindTab(pTab, n) || NULL == pTab->m_dwUserParam)
continue;
pRule = (KTParamRule*)pTab->m_dwUserParam;
pRule->SetClassId(lClassId);
pRule->SetId(NULL);
}
m_bPartModified |= (nLen != nOld);
}