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

972 lines
23 KiB
C++

#include "StdAfx.h"
#include "resource.h"
#include "DlgParamInsert.h"
#include "KTEntityDragMgr.h"
#include "KTParamService.h"
#include "KTExpressCalc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
namespace
{
void EraseObjects(const AcDbObjectIdArray& arid)
{
AcDbObject* pObj;
int iPos = arid.length();
while ((--iPos) >= 0)
{
if (Acad::eOk != acdbOpenObject(pObj, arid[iPos], AcDb::kForWrite))
continue;
pObj->erase();
pObj->close();
}
}
AcDbObjectId CreateBlock(AcDbVoidPtrArray& arpEnt
, const AcGePoint3d& ptOrigin
, LPCTSTR pszBlk = NULL
, AcDbDatabase* pDb = NULL
, BOOL bDeleteSrc = TRUE)
{
AcDbObjectId id;
if (pDb == NULL)
{
pDb = acdbHostApplicationServices()->workingDatabase();
}
KTASSERT(pDb != NULL);
AcDbBlockTable* pBT = NULL;
pDb->getSymbolTable(pBT, AcDb::kForWrite);
if (pBT == NULL)
return id;
AcDbBlockTableRecord* pBTR = NULL;
BOOL bAnonymous = (pszBlk == NULL || _tcslen(pszBlk) <= 0);
if (!bAnonymous && pBT->has(pszBlk))
{
pBT->getAt(pszBlk, pBTR, AcDb::kForWrite);
KTCHECK(pBTR != NULL);
id = pBTR->objectId();
pBT->close();
AcDbBlockTableRecordIterator* pIT = NULL;
pBTR->newIterator(pIT);
if (NULL != pIT)
{
AcDbEntity* pEnt;
for (; !pIT->done(); pIT->step())
{
if (Acad::eOk == pIT->getEntity(pEnt, AcDb::kForWrite))
{
pEnt->erase();
pEnt->close();
}
}
delete pIT;
}
}
else
{
pBTR = new AcDbBlockTableRecord;
KTCHECK(pBTR != NULL);
pBT->add(id, pBTR);
pBT->close();
if (!id.isValid())
{
delete pBTR;
return id;
}
}
if (bAnonymous)
pBTR->setName(_T("*U"));
else
pBTR->setName(pszBlk);
pBTR->setOrigin(ptOrigin);
AcDbEntity* pEnt;
int iLen = arpEnt.length();
for (int i = iLen - 1; i >= 0; i--)
{
pEnt = (AcDbEntity*)arpEnt[i];
KTASSERT(pEnt != NULL && pEnt->isKindOf(AcDbEntity::desc()));
if (pEnt->objectId().isValid())
continue;
if (pBTR->appendAcDbEntity(pEnt) == Acad::eOk)
pEnt->close();
else
delete pEnt;
arpEnt.removeAt(i);
}
pBTR->close();
AcDbEntity* pCpyEnt;
iLen = arpEnt.length();
for (i = iLen - 1; i >= 0; i--)
{
pEnt = (AcDbEntity*)arpEnt[i];
KTASSERT(pEnt != NULL && pEnt->isKindOf(AcDbEntity::desc()));
KTASSERT(pEnt->objectId().isValid());
pCpyEnt = NULL;
CKTCadUtility::DeepCloneObject((AcDbObject*&)pCpyEnt, pEnt, id);
pCpyEnt->close();
if (bDeleteSrc && (pEnt->isWriteEnabled() || pEnt->upgradeOpen() == Acad::eOk))
pEnt->erase();
pEnt->close();
arpEnt.removeAt(i);
}
return id;
}
Acad::ErrorStatus AppendEntity(AcDbEntity* pEnt
, BOOL bClose = TRUE
, LPCTSTR pszBlk = NULL
, AcDbDatabase* pDb = NULL)
{
if (NULL == pDb)
pDb = acdbHostApplicationServices()->workingDatabase();
ASSERT(NULL != pDb);
if (NULL == pszBlk)
{
if (pDb->tilemode())
pszBlk = acdbSymUtil()->blockModelSpaceName();
else
pszBlk = acdbSymUtil()->blockPaperSpaceName();
}
ASSERT(NULL != pszBlk);
AcDbBlockTable* pBT = NULL;
Acad::ErrorStatus es = pDb->getBlockTable(pBT, AcDb::kForRead);
if (Acad::eOk == es)
{
AcDbBlockTableRecord* pBTR = NULL;
es = pBT->getAt(pszBlk, pBTR, AcDb::kForWrite);
if (Acad::eOk == es)
{
es = pBTR->appendAcDbEntity(pEnt);
if (Acad::eOk == es)
{
if (bClose)
pEnt->close();
}
pBTR->close();
}
pBT->close();
}
return es;
}
}
CDlgParamInsert::CDlgParamInsert(CWnd* pParent)
: CDialog(CDlgParamInsert::IDD, pParent)
, m_bAttrModified(FALSE)
, m_lAttributesCount(0)
{
}
void CDlgParamInsert::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgParamInsert)
DDX_Control(pDX, IDC_CMB_CLASS, m_wndCmbClass);
DDX_Control(pDX, IDC_RAD_BLOCK, m_wndRadBlock);
DDX_Control(pDX, IDC_RAD_GROUP, m_wndRadGroup);
DDX_Control(pDX, IDC_STC_PREVIEW, m_wndViewCtrl);
DDX_Control(pDX, IDC_STC_DESC, m_wndStcDesc);
DDX_Control(pDX, IDC_LST_ATTRIBUTE, m_wndLstAttribute);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgParamInsert, CDialog)
//{{AFX_MSG_MAP(CDlgParamInsert)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BTN_PREVIEW, OnBtnPreview)
ON_CBN_SELENDOK(IDC_CMB_CLASS, OnSelendokCmbClass)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USER_CHILDVALUECHANGED, OnPropListBoxNotify)
END_MESSAGE_MAP()
BOOL CDlgParamInsert::Create(CWnd* pParentWnd)
{
return CDialog::Create(IDD, pParentWnd);
}
BOOL CDlgParamInsert::OnInitDialog()
{
CDialog::OnInitDialog();
//if (!m_wndViewCtrl.SubclassDlgItem(IDC_STC_PREVIEW, this))
//{
// // 错误时,结束对话框
// EndDialog(IDCANCEL);
// return FALSE;
//}
m_wndRadBlock.SetCheck(1);
m_wndLstAttribute.SetNameWidth(100);
CString sRoot;
sRoot.LoadString(IDS_CLASSROOTNAME);
m_wndCmbClass.AddString(sRoot);
OnInitClassList(0, NULL);
SetClassCode(m_cClassData.GetCode());
OnBtnPreview();
return TRUE;
}
void CDlgParamInsert::OnDestroy()
{
CDialog::OnDestroy();
//if (NULL != m_pDbPreview)
//{
// delete m_pDbPreview;
// m_pDbPreview = NULL;
//}
OnCleanAttributeList();
}
void CDlgParamInsert::OnInitClassList(ULONG lUpId, LPCTSTR pszPrefix)
{
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamClassArray arItems;
pService->GetSubClassItems(lUpId, arItems);
int iSize = arItems.GetSize() - 1;
if (iSize < 0)
return;
CString sPrefix1(pszPrefix), sPrefix2(pszPrefix);
sPrefix1 += _T("├"); sPrefix2 += _T("│");
int iIndex;
for (int i = 0; i < iSize; i++)
{
iIndex = m_wndCmbClass.AddString(sPrefix1 + arItems[i].GetName());
ASSERT(iIndex >= 0);
lUpId = arItems[i].GetId();
m_wndCmbClass.SetItemData(iIndex, lUpId);
OnInitClassList(lUpId, sPrefix2);
}
sPrefix1 = pszPrefix; sPrefix2 = pszPrefix;
sPrefix1 += _T("└"); sPrefix2 += _T(" ");
iIndex = m_wndCmbClass.AddString(sPrefix1 + arItems[i].GetName());
ASSERT(iIndex >= 0);
lUpId = arItems[i].GetId();
m_wndCmbClass.SetItemData(iIndex, lUpId);
OnInitClassList(lUpId, sPrefix2);
}
CPropertyItem::ItemStyle CDlgParamInsert::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 CDlgParamInsert::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 CDlgParamInsert::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 CDlgParamInsert::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 CDlgParamInsert::OnCleanAttributeList()
{
CPropertyItem* pItem;
CPropertyItemTab* pTab;
KTParamAttribute* pData;
POSITION pos1, pos = m_wndLstAttribute.GetFirstTabPositon();
while (NULL != pos)
{
pTab = m_wndLstAttribute.GetNextTab(pos);
ASSERT(NULL != pTab);
ASSERT(NULL == pTab->m_dwUserParam);
pos1 = pTab->m_listItem.GetHeadPosition();
while (NULL != pos1)
{
pItem = pTab->m_listItem.GetNext(pos1);
pData = (KTParamAttribute*)pItem->m_dwUserData;
if (NULL != pData)
delete pData;
ASSERT(NULL == pItem->m_dwUserDataEx);
}
}
ULONG lIndex;
pos = m_mapHideAttribute.GetStartPosition();
while (NULL != pos)
{
m_mapHideAttribute.GetNextAssoc(pos, lIndex, pData);
if (NULL != pData)
delete pData;
}
m_bAttrModified = FALSE;
m_lAttributesCount = 0;
m_mapAttrToValue.RemoveAll();
m_mapHideAttribute.RemoveAll();
m_wndLstAttribute.ResetContent();
}
LRESULT CDlgParamInsert::OnPropListBoxNotify(WPARAM wParam, LPARAM lParam)
{
// 取得数据参数
UINT nType = LOWORD(wParam);
UINT nCode = LOBYTE(HIWORD(wParam));
BOOL bEditName = HIBYTE(HIWORD(wParam));
HWND hPropListBox = (HWND)lParam;
m_bAttrModified |= (0 == nType && 0 == nCode || 1 == nType);
// 处理选项变化后,数据重新计算
if (m_bAttrModified && (1 == nType || 0 == nType && 1 == nCode))
{
m_bAttrModified = FALSE;
// 更新当前数据
CString sValue;
KTParamAttribute* pData;
CPropertyItem* pItem = NULL;
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.GetCurSel(pTab, pItem);
if (NULL != pItem && NULL != pItem->m_dwUserData)
{
pData = (KTParamAttribute*)pItem->m_dwUserData;
ByItemDesc(sValue, pItem->m_sValue, pData->GetVarDesc(), m_mapAttrToValue);
AsItemString(sValue, pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), sValue);
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 更新其他依赖数据
m_wndLstAttribute.FindTab(pTab, 0);
if (NULL != pTab)
{
ULONG lIndex = 0;
CStringArray arsValue;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL == pItem->m_dwUserData)
continue;
// 更新序号之前的隐藏条目
pData = (KTParamAttribute*)pItem->m_dwUserData;
while (lIndex <= pData->GetIndex())
{
if (m_mapHideAttribute.Lookup(lIndex++, pData) && NULL != pData)
{
arsValue.RemoveAll();
GetAvalidValueList(pData->GetValue(), m_mapAttrToValue, arsValue);
if (arsValue.GetSize() == 1)
{
AsItemString(arsValue[0], pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), arsValue[0]);
}
}
}
// 更新当前条目
arsValue.RemoveAll();
pData = (KTParamAttribute*)pItem->m_dwUserData;
GetAvalidValueList(pData->GetValue(), m_mapAttrToValue, arsValue);
if (arsValue.GetSize() == 1)
{
AsItemString(arsValue[0], pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), arsValue[0]);
pItem->m_sValue = AsItemDesc(sValue, arsValue[0], pData->GetVarDesc(), m_mapAttrToValue);
}
}
// 更新剩余的隐藏条目
while (lIndex <= m_lAttributesCount)
{
if (m_mapHideAttribute.Lookup(lIndex++, pData) && NULL != pData)
{
arsValue.RemoveAll();
GetAvalidValueList(pData->GetValue(), m_mapAttrToValue, arsValue);
if (arsValue.GetSize() == 1)
{
AsItemString(arsValue[0], pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), arsValue[0]);
}
}
}
m_wndLstAttribute.Invalidate();
}
}
if (4 == nType)
{
// 取得当前条目
CPropertyItemTab* pTab = NULL;
CPropertyItem* pItem = NULL;
m_wndLstAttribute.GetCurSel(pTab, pItem);
// 取得附加数据
CString sValue;
KTParamAttribute* pData = NULL;
if (NULL != pItem)
{
pData = (KTParamAttribute*)pItem->m_dwUserData;
if (NULL == pData)
return 0;
sValue.Format(_T("%s %s"), pData->GetCode(), pData->GetDesc());
}
else if (NULL != pTab)
{
sValue = m_cClassData.GetDesc();
}
// 更新说明信息
m_wndStcDesc.SetWindowText(sValue);
// 处理选择项下拉列表
// 获得子控件
CComboBox* pSubCtrl = DYNAMIC_DOWNCAST(CComboBox, m_wndLstAttribute.GetSubCtrl());
if (NULL == pData || NULL == pSubCtrl || !pSubCtrl->IsWindowVisible())
return 0;
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CStringArray arsValue;
GetAvalidValueList(pData->GetValue(), m_mapAttrToValue, arsValue);
int iSize = arsValue.GetSize();
if (iSize > 0)
{
// 添加到子控件列表中
pSubCtrl->ResetContent();
for (int i = 0; i < iSize; i++)
{
AsItemString(arsValue[i], pData->GetDataType());
AsItemDesc(sValue, arsValue[i], pData->GetVarDesc(), m_mapAttrToValue);
pSubCtrl->AddString(sValue);
}
// 定位当前数据
if (!pItem->m_sValue.IsEmpty())
{
i = pSubCtrl->FindStringExact(-1, pItem->m_sValue);
if (i < 0) pSubCtrl->InsertString((i = 0), pItem->m_sValue);
pSubCtrl->SetCurSel(i);
}
}
}
return 0;
}
BOOL CDlgParamInsert::ExpressCalcVarProc(LPCTSTR pszVariable, double& dValue, WPARAM wParam, LPARAM lParam)
{
ASSERT(NULL != lParam);
CMapStringToString* pMapVar = (CMapStringToString*)lParam;
CString sValue;
if (!pMapVar->Lookup(pszVariable, sValue))
{
if (_tcsicmp(pszVariable, _T("PI")) == 0)
{
dValue = PI;
return TRUE;
}
return FALSE;
}
dValue = _tcstod(sValue, NULL);
return TRUE;
}
void CDlgParamInsert::GetAvalidValueList(LPCTSTR pszValueExpress, const CMapStringToString& mapData, CStringArray& arsValue)
{
if (pszValueExpress == NULL || _tclen(pszValueExpress) <= 0)
return;
while (pszValueExpress[0] == _T(' '))
pszValueExpress++;
if (pszValueExpress[0] == _T('\0') || _tcsnicmp(pszValueExpress, _T("Keyin"), 5) == 0)
return;
if (_T('=') == pszValueExpress[0] && (pszValueExpress++)
|| _tcsnicmp(pszValueExpress, _T("Equal"), 5) == 0 && (pszValueExpress += 5))
{
double dResult;
KTExpressCalc calc;
calc.SetVariableProc(ExpressCalcVarProc, NULL, (LPARAM)&m_mapAttrToValue);
if (calc.Calculate(pszValueExpress, dResult))
{
CString sValue;
sValue.Format(_T("%g"), dResult);
arsValue.Add(sValue);
}
}
else if (_T('#') == pszValueExpress[0] && (pszValueExpress++)
|| _tcsnicmp(pszValueExpress, _T("Values"), 6) == 0 && (pszValueExpress += 6))
{
CString sValue;
while (pszValueExpress[0] != _T('\0'))
{
switch (pszValueExpress[0])
{
case _T(','):
case _T(' '):
if (!sValue.IsEmpty())
arsValue.Add(sValue);
sValue.Empty();
break;
default:
sValue += pszValueExpress[0];
break;
}
pszValueExpress++;
}
if (!sValue.IsEmpty())
arsValue.Add(sValue);
}
else
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
CString sSQL;
pService->ExpandSQL(pszValueExpress, mapData, sSQL);
pService->ExecuteSQL(sSQL, arsValue);
}
}
void CDlgParamInsert::OnSelendokCmbClass()
{
int iSel = m_wndCmbClass.GetCurSel();
if (iSel < 0)
return;
SetClassCode(m_wndCmbClass.GetItemData(iSel));
OnBtnPreview();
}
void CDlgParamInsert::SetClassCode(ULONG lId)
{
OnCleanAttributeList();
m_cClassData.SetId(lId);
if (0 == lId || !IsWindow(m_hWnd))
return;
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
if (!pService->GetClassItemById(m_cClassData.GetId(), m_cClassData))
return;
lId = m_cClassData.GetId();
int iSel = m_wndCmbClass.GetCurSel();
if (iSel < 0 || m_wndCmbClass.GetItemData(iSel) != lId)
{
iSel = m_wndCmbClass.GetCount();
while ((--iSel) >= 0)
{
if (m_wndCmbClass.GetItemData(iSel) == lId)
{
m_wndCmbClass.SetCurSel(iSel);
break;
}
}
}
m_wndStcDesc.SetWindowText(m_cClassData.GetDesc());
CPropertyItemTab* pTab = m_wndLstAttribute.AddTab(m_cClassData.GetName(), TRUE, FALSE, m_cClassData.GetCode());
if (NULL == pTab)
return;
m_mapAttrToValue.SetAt(_T("Name"), m_cClassData.GetName());
m_mapAttrToValue.SetAt(_T("Code"), m_cClassData.GetCode());
OnShowAttributeAttrItems(pTab, lId);
}
void CDlgParamInsert::SetClassCode(LPCTSTR pszCode)
{
OnCleanAttributeList();
m_cClassData.SetCode(pszCode);
if (NULL == m_cClassData.GetCode() || !IsWindow(m_hWnd))
return;
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
if (!pService->GetClassItemByCode(m_cClassData.GetCode(), m_cClassData))
return;
ULONG lId = m_cClassData.GetId();
int iSel = m_wndCmbClass.GetCurSel();
if (iSel < 0 || m_wndCmbClass.GetItemData(iSel) != lId)
{
iSel = m_wndCmbClass.GetCount();
while ((--iSel) >= 0)
{
if (m_wndCmbClass.GetItemData(iSel) == lId)
{
m_wndCmbClass.SetCurSel(iSel);
break;
}
}
}
m_wndStcDesc.SetWindowText(m_cClassData.GetDesc());
CPropertyItemTab* pTab = m_wndLstAttribute.AddTab(m_cClassData.GetName(), TRUE, FALSE, m_cClassData.GetCode());
if (NULL == pTab)
return;
m_mapAttrToValue.SetAt(_T("Name"), m_cClassData.GetName());
m_mapAttrToValue.SetAt(_T("Code"), m_cClassData.GetCode());
OnShowAttributeAttrItems(pTab, lId);
}
void CDlgParamInsert::OnShowAttributeAttrItems(CPropertyItemTab* pTab, ULONG lId)
{
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
KTParamClass data;
if (!pService->GetClassItemById(lId, data))
return;
if (data.GetUpId() != 0)
OnShowAttributeAttrItems(pTab, data.GetUpId());
KTParamAttributePtrArray arpItems;
if (!pService->GetAttributeItems(lId, arpItems))
return;
CString sValue;
CPropertyItem* pItem;
KTParamAttribute* pData;
int iSize = arpItems.GetSize();
for (int i = 0; i < iSize; i++)
{
pData = arpItems[i];
ASSERT(NULL != pData);
pData->SetIndex(m_lAttributesCount++);
if (!pData->IsVisible())
{
m_mapHideAttribute.SetAt(pData->GetIndex(), pData);
continue;
}
if (!m_wndLstAttribute.AddItem(pTab, pData->GetName(), _T(""), CPropertyItem::EDT_NONE)
|| NULL == (pItem = pTab->m_listItem.GetTail()))
{
delete pData;
continue;
}
pItem->m_dwUserData = (DWORD_PTR)pData;
pItem->m_bValueEditable = !pData->IsReadOnly();
pItem->m_eValueStyle = AsItemStyle(pData->GetDataType(), (_tcslen(pData->GetValue()) > 0), pData->IsOverride());
CStringArray arsValue;
GetAvalidValueList(pData->GetValue(), m_mapAttrToValue, arsValue);
if (arsValue.GetSize() == 1)
{
AsItemString(arsValue[0], pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), arsValue[0]);
AsItemDesc(pItem->m_sValue, arsValue[0], pData->GetVarDesc(), m_mapAttrToValue);
}
else
{
sValue = pData->GetDefault();
m_mapAttrToValue.SetAt(pData->GetCode(), AsItemString(sValue, pData->GetDataType()));
AsItemDesc(pItem->m_sValue, sValue, pData->GetVarDesc(), m_mapAttrToValue);
}
}
}
void CDlgParamInsert::OnBtnPreview()
{
CWaitCursor waitor;
// 更新数据
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.FindTab(pTab, 0);
if (NULL != pTab)
{
CString sValue;
KTParamAttribute* pData;
CPropertyItem* pItem = NULL;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL == pItem->m_dwUserData)
continue;
pData = (KTParamAttribute*)pItem->m_dwUserData;
ByItemDesc(sValue, pItem->m_sValue, pData->GetVarDesc(), m_mapAttrToValue);
AsItemString(sValue, pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), sValue);
}
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
m_wndViewCtrl.clearAll();
m_wndViewCtrl.init(true);
m_wndViewCtrl.SetOrbitFlag(OBF_PAN | OBF_ZOOM | OBF_COTE);
// 创建实体
AcDbVoidPtrArray arpPart;
pService->CreateParamPart(arpPart, m_mapAttrToValue, m_cClassData.GetCode());
AcDbExtents extAll, ext;
for (int i = 0; i < arpPart.length(); ++i)
{
AcDbEntity *pEnt((AcDbEntity*)arpPart[i]);
pEnt->getGeomExtents(ext);
extAll.addExt(ext);
}
m_wndViewCtrl.InitFromCurrentView2D(extAll, true);
for (int i = 0; i < arpPart.length(); ++i)
{
AcDbEntity *pEnt((AcDbEntity*)arpPart[i]);
m_wndViewCtrl.Add(pEnt);
}
AcGeMatrix3d mat;
mat.setToScaling(.8);
m_wndViewCtrl.model()->setTransform(mat);
m_wndViewCtrl.view()->invalidate();
m_wndViewCtrl.Invalidate();
m_wndViewCtrl.RedrawWindow();
}
void CDlgParamInsert::OnOK()
{
CWaitCursor waitor;
// 更新数据
CPropertyItemTab* pTab = NULL;
m_wndLstAttribute.FindTab(pTab, 0);
if (NULL != pTab)
{
CString sValue;
KTParamAttribute* pData;
CPropertyItem* pItem = NULL;
POSITION pos = pTab->m_listItem.GetHeadPosition();
while (NULL != pos)
{
pItem = pTab->m_listItem.GetNext(pos);
ASSERT(NULL != pItem);
if (NULL == pItem->m_dwUserData)
continue;
pData = (KTParamAttribute*)pItem->m_dwUserData;
ByItemDesc(sValue, pItem->m_sValue, pData->GetVarDesc(), m_mapAttrToValue);
AsItemString(sValue, pData->GetDataType());
m_mapAttrToValue.SetAt(pData->GetCode(), sValue);
}
}
// 检查参数化数据库
KTParamService* pService = GetKTParamService();
ASSERT(NULL != pService);
// 创建实体
AcDbVoidPtrArray arpPart;
pService->CreateParamPart(arpPart, m_mapAttrToValue, m_cClassData.GetCode());
if (arpPart.isEmpty())
return;
CWnd* pFrame = acedGetAcadFrame();
pFrame->EnableWindow(TRUE);
ShowWindow(SW_HIDE);
CKTEntityDragMgr drag(AcGePoint3d::kOrigin, arpPart, TRUE);
drag.EnableMove(TRUE);
drag.EnableScale(TRUE);
drag.EnableRotate(TRUE);
if (drag.DoDrag())
{
if (m_wndRadBlock.GetCheck())
{
AcDbObjectId id = CKTCadUtility::CreateBlockTableRecord(arpPart, drag.GetDragPoint());
AcDbBlockReference *pRef = new AcDbBlockReference(drag.GetDragPoint(), id);
ASSERT(NULL != pRef);
AppendEntity(pRef);
}
else if (m_wndRadGroup.GetCheck())
{
AcDbObjectIdArray arid;
drag.append(arid);
CKTCadUtility::CreateAcDbGroup(arid);
}
else
{
drag.append();
}
}
acTransactionManagerPtr()->flushGraphics();
acedUpdateDisplay();
pFrame->EnableWindow(FALSE);
ShowWindow(SW_SHOW);
EnableWindow(TRUE);
}