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

3168 lines
76 KiB
C++

#include "stdafx.h"
#include "StdArx.h"
#include "XMLCDlg.h"
#include "CNameDlg.h"
#include "CProSetDlg.h"
#include "FloorViewNameDlg.h"
#include "EarThwormDef.h"
#include "CoreTools.h"
#include "KTCadUtility.h"
#include "CCopyAxFrFloorDlg.h"
#include "KTSetting.h"
#include "entityfilter.h"
#define IMG_ROOT 0
#define IMG_VIEW 1
#define IMG_VIEW_ON 2
#define IMG_FLOOR 5
#define IMG_FLOOR_ON 3
#define IMG_ENT_TYPE 7
#define IMG_ENT_NAME_CHECK 9
#define IMG_ENT_NAME_UNCHECK 8
#define FLOOR_XY _T("楼层平面")
#define FLOOR_3D _T("三维视图")
//static const LPCTSTR g_pszViews[] = { _T("楼层平面"),_T("楼层立面"),_T("楼层剖面"),_T("系统图"), _T("原理图"),_T("配筋图"),_T("大样图"),_T("详图"),_T("三维视图"),NULL};
static const LPCTSTR g_pszViews[] = { _T("楼层平面"),NULL};
extern CString IDCreate();
bool HasIntersectOnZ(double dZmin, double dZmax, double dFrEl, double dToEl);
namespace
{
// 获得本层实体
void getEntitiesOfFloor(FloorViewData *pViewData
, const double &dBomEl
, AcDbObjectIdArray &idsIn // 层内实体
, AcDbObjectIdArray &idsOut) // 层外实体
{
idsIn.removeAll();
idsOut.removeAll();
double dFrEl = dBomEl, dToEl = dBomEl;
if (pViewData != NULL)
{
dToEl += pViewData->m_bFloorIndxTo
? ((pViewData->m_nFloorIndxTo - pViewData->m_nFloorIndxFr + 1) * pViewData->m_nFloorH)
: pViewData->m_nFloorH;
}
ads_name ss, ent;
resbuf *pFilter = acutBuildList(0, _T("AEC_*,INSERT"), 0);
int nRet = acedSSGet(_T("A"), NULL, NULL, pFilter, ss);
acutRelRb(pFilter);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
Acad::ErrorStatus es;
AcDbObjectId idAxisLn = KTSetting::InitLayer(_T("LAY_AXIS"));
AcDbObjectId idAxisLb = KTSetting::InitLayer(_T("LAY_DIMAX"));
AcDbExtents ext;
AcDbObjectId id;
for (int i = 0; i < nLen; ++i)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (!id.isValid()) continue;
AcDbEntityPointer ent(id, AcDb::kForRead);
if (ent.openStatus() != Acad::eOk) continue;
AecDbCurveBase *pCrvB = AecDbCurveBase::cast(ent);
if (pCrvB != NULL)
es = pCrvB->subGet3dGeomExtents(ext);
AecDbEntityBase *pEntB = AecDbEntityBase::cast(ent);
if (pEntB != NULL)
es = pEntB->subGet3dGeomExtents(ext);
if (pEntB == NULL && pCrvB == NULL)
{
AcDbBlockReference *pBK = AcDbBlockReference::cast(ent);
if (pBK != NULL)
{
if (pBK->layerId() == idAxisLb)
continue;
es = pBK->geomExtentsBestFit(ext);
}
else
{
if (ent->layerId() == idAxisLb ||
ent->layerId() == idAxisLn)
continue;
es = ent->getGeomExtents(ext);
}
}
if (es != Acad::eOk) continue;
if (fabs(dToEl - dFrEl) < 1.e-3)
{
idsIn.append(id);
}
else
{
//标高有交集,即可
if (HasIntersectOnZ(ext.minPoint().z, ext.maxPoint().z, dFrEl, dToEl))
idsIn.append(id);
else
idsOut.append(id);
}
}
acedSSFree(ss);
//轴网
pFilter = acutBuildList(0, _T("DIMENSION,LINE,INSERT"), 0);
nRet = acedSSGet(_T("A"), NULL, NULL, pFilter, ss);
acutRelRb(pFilter);
nLen = 0;
acedSSLength(ss, &nLen);
for (int i = 0; i < nLen; ++i)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (!id.isValid()) continue;
AcDbEntityPointer ent(id, AcDb::kForRead);
if (ent.openStatus() != Acad::eOk) continue;
if (idAxisLn == ent->layerId() || idAxisLb == ent->layerId())
{
AcDbBlockReference *pBK = AcDbBlockReference::cast(ent);
if (pBK != NULL)
{
ext.addPoint(pBK->position());
}
else
{
AcDbDimension *pDim = AcDbDimension::cast(ent);
if (pDim != NULL)
{
ext.addPoint(pDim->textPosition());
}
else
{
es = ent->getGeomExtents(ext);
}
}
if (es != Acad::eOk) continue;
if (fabs(dToEl - dFrEl) < 1.e-3)
{
if (idsIn.find(id) == -1)
idsIn.append(id);
}
else
{
//标高有交集,即可 轴网取max
if (HasIntersectOnZ(ext.maxPoint().z, ext.maxPoint().z, dFrEl, dToEl))
{
//acutPrintf( _T("\nDXF=%s"), ent->isA()->dxfName());
if (idsIn.find(id) == -1)
idsIn.append(id);
}
else
{
if (idsOut.find(id) == -1)
idsOut.append(id);
}
}
}
}
acedSSFree(ss);
}
// 分析实体类型
void analyzeTypesOfEntities(const AcDbObjectIdArray &ids
, std::map<AcDbObjectId, std::vector<CString>> &alltypes)
{
std::vector<CString> ss;
for (int i(0); i < ids.length(); ++i)
{
const AcDbObjectId &id(ids[i]);
ss.clear();
CEntityProperty::getTypeTreeOfEntity(id, ss);
if (!ss.empty())
alltypes.insert(std::make_pair(id, ss));
}
}
// 展开所有节点
void expandAll(CTreeListCtrl &tree, HTREEITEM hItem, UINT nCode = TVE_EXPAND)
{
if (hItem == NULL)
return;
// 展开当前节点
tree.Expand(hItem, nCode);
// 递归展开所有子节点
HTREEITEM hChild = tree.GetChildItem(hItem);
while (hChild)
{
expandAll(tree, hChild, nCode);
hChild = tree.GetNextSiblingItem(hChild);
}
}
// 展开指定层数的子节点
void expandItem(CTreeCtrl &tree, HTREEITEM hItem, int nLevel)
{
if (hItem == NULL || nLevel <= 0)
return;
// 展开当前节点
tree.Expand(hItem, TVE_EXPAND);
// 如果只需要展开到当前层,停止递归
if (nLevel == 1)
return;
// 遍历当前节点的所有子节点
HTREEITEM hChild = tree.GetChildItem(hItem);
while (hChild != NULL)
{
expandItem(tree, hChild, nLevel - 1);
hChild = tree.GetNextSiblingItem(hChild);
}
}
// 删除hParent下所有子节点
void deleteAllChildItems(CTreeCtrl &tree, HTREEITEM hParent)
{
if (hParent == NULL)
return;
HTREEITEM hChild = tree.GetChildItem(hParent);
while (hChild)
{
HTREEITEM hNext = tree.GetNextSiblingItem(hChild);
tree.DeleteItem(hChild);
hChild = hNext;
}
}
// 查找hParent下的名称为psz的子项
HTREEITEM findChildItem(CTreeCtrl &wndlist, HTREEITEM hParent, LPCTSTR psz)
{
if (!hParent || !psz) return NULL;
HTREEITEM hChild = wndlist.GetChildItem(hParent);
CString sName(_T(""));
while (hChild)
{
HTREEITEM hNext = wndlist.GetNextSiblingItem(hChild);
sName = wndlist.GetItemText(hChild);
if (sName == psz)
return hChild;
hChild = hNext;
}
return NULL;
}
// 是否点击图标区域
bool isClickedOnICON(CTreeListCtrl &wndlist)
{
DWORD dwPos = GetMessagePos(); // 获取当前鼠标位置(屏幕坐标)
CPoint pt(GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos));
wndlist.ScreenToClient(&pt); // 转换为客户区坐标
// 如果是图标区域,离开
UINT uFlags = 0;
HTREEITEM hItem = wndlist.HitTest(pt, &uFlags);
if (hItem && (uFlags & TVHT_ONITEMICON)) return true;
return false;
}
// 是否点击 +/- 区域
bool isClickedExpandIcon(CTreeListCtrl &wndlist)
{
DWORD dwPos = GetMessagePos(); // 获取当前鼠标位置(屏幕坐标)
CPoint pt(GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos));
wndlist.ScreenToClient(&pt); // 转换为客户区坐标
// 如果是图标区域,离开
UINT uFlags = 0;
HTREEITEM hItem = wndlist.HitTest(pt, &uFlags);
if (hItem && (uFlags & TVHT_ONITEMBUTTON)) return true;
return false;
}
// 实体加入选择集
void addToPickFirst(AcDbObjectIdArray &ids)
{
CEntityProperty::addToPickFirst(ids, true);
}
// item 的图标是否是给定的?
bool isItemImgIdx(CTreeListCtrl &wndList, HTREEITEM hItem, int imageIndex)
{
if (!hItem) return false;
int img1 = -1, img2 = -1;
wndList.GetItemImage(hItem, img1, img2);
return img1 == imageIndex;
}
// 设置item 的图标
void setItemImgIdx(CTreeListCtrl &wndList, HTREEITEM hItem, int imageIndex)
{
if (!hItem) return;
wndList.SetItemImage(hItem, imageIndex, imageIndex);
}
// 设置check状态
void setCheckState(CTreeListCtrl &wndlist, HTREEITEM hItem, bool bCheck)
{
if (!hItem) return;
setItemImgIdx(wndlist, hItem, bCheck ? IMG_ENT_NAME_CHECK : IMG_ENT_NAME_UNCHECK);
}
// 获得check状态
bool getCheckState(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return false;
return isItemImgIdx(wndlist, hItem, IMG_ENT_NAME_CHECK);
}
// 是否是层项
bool isFloorItem(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return false;
if (isItemImgIdx(wndlist, hItem, IMG_FLOOR)
|| isItemImgIdx(wndlist, hItem, IMG_FLOOR_ON))
return true;
return false;
}
// 是否是checkbox项
bool isCheckboxItem(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return false;
if (isItemImgIdx(wndlist, hItem, IMG_ENT_NAME_CHECK)
|| isItemImgIdx(wndlist, hItem, IMG_ENT_NAME_UNCHECK))
return true;
return false;
}
// 是否是实体类型项
bool isTypeItem(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return false;
// 有子节点的checkbox项,就是类型项
return (isCheckboxItem(wndlist, hItem)
&& wndlist.GetChildItem(hItem) != NULL);
}
// 是否是实体项
bool isLeafItem(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return false;
// 没有子节点的checkbox项,就是实体项
return (isCheckboxItem(wndlist, hItem)
&& wndlist.GetChildItem(hItem) == NULL);
}
// 给定一个 层项、类型项、实体项 得到层项
HTREEITEM getFloorItem(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return NULL;
HTREEITEM hParent = hItem;
while (hParent)
{
if (isFloorItem(wndlist, hParent))
return hParent;
hParent = wndlist.GetParentItem(hParent);
}
return NULL; // 没找到满足条件的父节点
}
// 鼠标点击图标位置,改变图标
void changeImg(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return;
// 不是 checkbox 项 离开
if (!isCheckboxItem(wndlist, hItem)) return;
// 没有点击到图标,离开
if (!isClickedOnICON(wndlist)) return;
bool bNewState(!getCheckState(wndlist, hItem));
setCheckState(wndlist, hItem, bNewState);
// 不是类型节点就可以走了,是的话, 处理子节点
if (!isTypeItem(wndlist, hItem)) return;
HTREEITEM hNxt, hChd(wndlist.GetChildItem(hItem));
while (hChd != NULL)
{
hNxt = wndlist.GetNextItem(hChd, TVGN_NEXT);
// hChd的状态应与修改前父节点状态一致
setCheckState(wndlist, hChd, !bNewState);
changeImg(wndlist, hChd);
hChd = hNxt;
}
}
// 删除 hItem 下面所有 checkbox 项
void deleteCheckboxItems(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return;
HTREEITEM hChild = wndlist.GetChildItem(hItem);
while (hChild != NULL)
{
HTREEITEM hNext = wndlist.GetNextSiblingItem(hChild);
deleteCheckboxItems(wndlist, hChild);
hChild = hNext;
}
if (isCheckboxItem(wndlist, hItem))
wndlist.DeleteItem(hItem);
}
// 获得鼠标选中的项或这一项的所有子项
void collectLeavesByPickedItem(CTreeListCtrl &wndlist
, HTREEITEM hItem
, std::vector<HTREEITEM> &items)
{
if (!hItem) return;
// 楼层项、非实体的checkbox项
if (isFloorItem(wndlist, hItem) ||
(isCheckboxItem(wndlist, hItem)
&& !isLeafItem(wndlist, hItem)) )
{
HTREEITEM hNxt, hChd(wndlist.GetChildItem(hItem));
while (hChd != NULL)
{
hNxt = wndlist.GetNextItem(hChd, TVGN_NEXT);
collectLeavesByPickedItem(wndlist, hChd, items);
hChd = hNxt;
}
}
if (isLeafItem(wndlist, hItem))
{
AcDbObjectId id(AcDbObjectId::kNull);
id.setFromOldId((Adesk::IntDbId)wndlist.GetItemData(hItem));
if (id.isValid())
items.push_back(hItem);
}
}
// 获得鼠标选中的项或这一项的所有实体
void collectLeavesByPickedItem(CTreeListCtrl &wndlist
, HTREEITEM hItem
, AcDbObjectIdArray &ids)
{
std::vector<HTREEITEM> items;
collectLeavesByPickedItem(wndlist, hItem, items);
AcDbObjectId id(AcDbObjectId::kNull);
for (size_t i(0); i < items.size(); ++i)
{
id.setFromOldId((Adesk::IntDbId)wndlist.GetItemData(items[i]));
if (id.isValid())
ids.append(id);
}
}
// inner use
void _getCheckedLeaves( CTreeListCtrl &wndlist
, HTREEITEM hItem
, std::vector<HTREEITEM> &items )
{
if (!hItem) return;
// 楼层项、非实体的checkbox项
if (isFloorItem(wndlist, hItem) ||
(isCheckboxItem(wndlist, hItem)
&& !isLeafItem(wndlist, hItem)) )
{
HTREEITEM hNxt, hChd(wndlist.GetChildItem(hItem));
while (hChd != NULL)
{
hNxt = wndlist.GetNextItem(hChd, TVGN_NEXT);
_getCheckedLeaves(wndlist, hChd, items);
hChd = hNxt;
}
}
if (isLeafItem(wndlist, hItem) && getCheckState(wndlist, hItem))
{
AcDbObjectId id(AcDbObjectId::kNull);
id.setFromOldId((Adesk::IntDbId)wndlist.GetItemData(hItem));
if (id.isValid())
items.push_back(hItem);
}
}
// 获得checkbox为选择状态的实体
void collectCheckedLeavesFromFloor(CTreeListCtrl &wndlist
, HTREEITEM hItem
, std::vector<HTREEITEM> &items )
{
if (!hItem) return;
HTREEITEM hFloorItem = getFloorItem(wndlist, hItem);
if (!hFloorItem) return;
_getCheckedLeaves(wndlist, hFloorItem, items);
}
// 获得checkbox为选择状态的项
void collectCheckedLeavesFromFloor(CTreeListCtrl &wndlist
, HTREEITEM hItem
, AcDbObjectIdArray &ids )
{
if (!hItem) return;
std::vector<HTREEITEM> items;
collectCheckedLeavesFromFloor(wndlist, hItem, items);
AcDbObjectId id(AcDbObjectId::kNull);
for (size_t i(0); i < items.size(); ++i)
{
id.setFromOldId((Adesk::IntDbId)wndlist.GetItemData(items[i]));
if (id.isValid())
ids.append(id);
}
}
// 更新hItem所在层项下面实体的状态
void updateInfo(CTreeListCtrl &tree , HTREEITEM hItem)
{
if (isLeafItem(tree, hItem)) return;
if (isFloorItem(tree, hItem))
{
HTREEITEM hNxt, hChd(tree.GetChildItem(hItem));
while (hChd != NULL)
{
hNxt = tree.GetNextItem(hChd, TVGN_NEXT);
updateInfo(tree, hChd);
hChd = hNxt;
}
return;
}
int countOfHide(0), countOfLock(0), countOfNone(0);
std::vector<HTREEITEM> items;
// 收集所有子节点的叶子数量
collectLeavesByPickedItem(tree, hItem, items);
if (items.empty()) return;
CString s(_T(""));
//s.Format(_T("%s(%d)"), tree.GetItemText(hItem), (int)items.size());
//tree.SetItemText(hItem, s);
CEntityProperty::EEntityState st(CEntityProperty::eNoneState);
AcDbObjectId id(AcDbObjectId::kNull);
for (size_t i(0); i < items.size(); ++i)
{
id.setFromOldId((Adesk::IntDbId)tree.GetItemData(items[i]));
if (!id.isValid()) continue;
st = CEntityProperty::entityState(id);
if (st == CEntityProperty::eHide)
{
countOfHide++;
tree.SetItemText(items[i], _T("隐藏"), 1);
}
else if (st == CEntityProperty::eLocked)
{
countOfLock++;
tree.SetItemText(items[i], _T("锁定"), 1);
}
else
{
countOfNone++;
tree.SetItemText(items[i], _T(""), 1);
}
}
if (countOfHide == items.size())
tree.SetItemText(hItem, _T("全部隐藏"), 1);
else if (countOfLock == items.size())
tree.SetItemText(hItem, _T("全部锁定"), 1);
else if (countOfNone == items.size())
tree.SetItemText(hItem, _T(""), 1);
else
{
s.Format(_T("隐藏(%d) 锁定(%d)"), countOfHide, countOfLock);
tree.SetItemText(hItem, s, 1);
}
// 处理子节点中,不是叶子的节点
if (isTypeItem(tree, hItem))
{
HTREEITEM hNxt, hChd(tree.GetChildItem(hItem));
while (hChd != NULL)
{
hNxt = tree.GetNextItem(hChd, TVGN_NEXT);
updateInfo(tree, hChd);
hChd = hNxt;
}
}
}
// 统计叶子节点数量,并更新非叶子节点名称
int updateCountOfLeaf(CTreeListCtrl &tree, HTREEITEM hItem)
{
if (!hItem)
return 0;
HTREEITEM hChild = tree.GetChildItem(hItem);
// 如果没有子节点,本身是叶子
if (hChild == NULL)
return 1;
// 递归统计子节点的叶子数量
int leafCount = 0;
while (hChild)
{
leafCount += updateCountOfLeaf(tree, hChild);
hChild = tree.GetNextSiblingItem(hChild);
}
// 更新非叶子节点的文本
CString oldText = tree.GetItemText(hItem);
CString newText;
newText.Format(_T("%s (%d)"), oldText, leafCount);
if (!isFloorItem(tree, hItem))
tree.SetItemText(hItem, newText);
return leafCount;
}
void makeTypeTreeOfEntity(const std::map<AcDbObjectId, std::vector<CString>> &allTypes
, CTreeListCtrl &wndlist
, HTREEITEM hRoot)
{
int imgIdx(IMG_ENT_NAME_UNCHECK);
std::map<AcDbObjectId, std::vector<CString>>::const_iterator it(allTypes.begin());
// 遍历每一条类型路径
for (; it != allTypes.end(); ++it)
{
const AcDbObjectId &id(it->first);
const std::vector<CString> &types = it->second;
if (types.empty())
continue;
HTREEITEM hParent = hRoot;
// 逐级插入节点,最后一个单独处理
for (size_t j = 0; j < types.size() - 1; ++j)
{
const CString &name = types[j];
HTREEITEM hChild = wndlist.GetChildItem(hParent);
HTREEITEM hFound = NULL;
// 查找是否已有同名子节点
while (hChild)
{
CString text = wndlist.GetItemText(hChild);
if (text.CompareNoCase(name) == 0)
{
hFound = hChild;
break;
}
hChild = wndlist.GetNextSiblingItem(hChild);
}
// 没找到则插入新节点
if (hFound == NULL)
{
hFound = wndlist.InsertItem(name, imgIdx, imgIdx, hParent);
}
// 进入下一层
hParent = hFound;
}
// 处理路径中最后一个项目
{
HTREEITEM hItem(NULL);
const CString &lastname(*types.rbegin());
// 如果存在,判断是否有子节点
// 如果存在子节点,则作为子节点插入hSubItem
// 如果不存在子节点,则在hSubItem下面插入两个
HTREEITEM hSubItem = findChildItem(wndlist, hParent, lastname);
if (hSubItem)
{
if (wndlist.GetChildItem(hSubItem))
{
/* 操作前
|hParent
| |-lastname(hSubItem)
| | |-lastname
...
*/
hItem = wndlist.InsertItem(lastname, imgIdx, imgIdx, hSubItem);
/* 操作后
|hParent
| |-lastname(hSubItem)
| | |-lastname
| | |-lastname (new item)
...
*/
}
else
{
//在hSubItem下面插入一个新的item,并且把dw设置进去
//这个操作相当与把原hSubItem,下调一级
// 得到原有的hSubItem的数据,然后清空
DWORD_PTR dw = wndlist.GetItemData(hSubItem);
wndlist.SetItemData(hSubItem, NULL);
/* 操作前
|hParent
| |-lastname(hSubItem 无子节点) (有数据)
*/
// 在原hSubItem下插入一个新的lastname,作为原hSubItem的替代
hItem = wndlist.InsertItem(lastname, imgIdx, imgIdx, hSubItem);
if (hItem)
wndlist.SetItemData(hItem, dw);
// 再在原hSubItem下插入一个,这个相当与本次要插入的项
hItem = wndlist.InsertItem(lastname, imgIdx, imgIdx, hSubItem);
/* 操作后
|hParent
| |-lastname(hSubItem 有子节点) (无数据)
| | |-lastname (替代hSubItem,使用hSubItem数据)
| | |-lastname (new item)
*/
}
}
else // 直接插入
{
/* 操作前
|hParent
*/
hItem = wndlist.InsertItem(lastname, imgIdx, imgIdx, hParent);
/* 操作后
|hParent
| |-lastname
*/
}
if (hItem)
wndlist.SetItemData(hItem, id.asOldId());
}
}
// 展开根节点(可选)
expandItem(wndlist, hRoot, 1);
updateCountOfLeaf(wndlist, hRoot);
}
// 添加实体项(实体类型和实体名称)
void makeEntityTreeForFloor(const AcDbObjectIdArray &ids, CTreeListCtrl &wndlist, HTREEITEM hTreeItem)
{
if (!hTreeItem) return;
if (!isFloorItem(wndlist, hTreeItem)) return;
std::map<AcDbObjectId, std::vector<CString>> alltypes;
analyzeTypesOfEntities(ids, alltypes);
makeTypeTreeOfEntity(alltypes, wndlist, hTreeItem);
// 现在更新实体状态(插入item后立刻更新无效)
updateInfo(wndlist, hTreeItem);
}
// 将 hItem 下面的实体加入选择集
void selectEntities(CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return;
if (isClickedOnICON(wndlist)) return;
CString s = wndlist.CTreeCtrl::GetItemText(hItem);
AcDbObjectIdArray ids;
collectLeavesByPickedItem(wndlist, hItem, ids);
addToPickFirst(ids);
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
}
// 处理右键菜单
void processPopmenu(const DWORD &mid, CTreeListCtrl &wndlist, HTREEITEM hItem)
{
if (!hItem) return;
AcAxDocLock lock;
/*
处理逻辑:
先按照checked的状态选一次,如果选到了,则说明用户只想操作选中的这几个item
如果没有选中状态的item,会有一下三种情况
1.选中的是实体项(单独处理这一个)
2.选中的类型项(处理整个类型)
3.选中的是楼层项(处理整个楼层)
*/
AcDbObjectIdArray ids;
collectCheckedLeavesFromFloor(wndlist, hItem, ids);
if (ids.isEmpty())
collectLeavesByPickedItem(wndlist, hItem, ids);
if (ids.isEmpty())
return;
switch (mid)
{
case IDM_ENTITY_LOCK:
CEntityProperty::setLockedLayerForEntities(ids);
break;
case IDM_ENTITY_HIDE:
CEntityProperty::setHideLayerForEntities(ids);
break;
case IDM_ENTITY_SHOW:
CEntityProperty::resetLayerForEntities(ids);
break;
default:
break;
}
updateInfo(wndlist, getFloorItem(wndlist, hItem));
}
}
IMPLEMENT_DYNAMIC(CXMLCDlg, CDialog)
CXMLCDlg::CXMLCDlg(CWnd* pParent /*=NULL*/)
: CDialog(IDD_XMLC_DLG, pParent)
, m_bAutoSelEnt(false)
{
}
CXMLCDlg::~CXMLCDlg()
{
}
void CXMLCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_wndBt1);
DDX_Control(pDX, IDC_BUTTON2, m_wndBt2);
DDX_Control(pDX, IDC_BUTTON3, m_wndBt3);
DDX_Control(pDX, IDC_BUTTON4, m_wndBt4);
DDX_Control(pDX, IDC_BUTTON5, m_wndBt5);
DDX_Control(pDX, IDC_BUTTON6, m_wndBt6);
DDX_Control(pDX, IDC_BUTTON8, m_wndBt8);
DDX_Control(pDX, IDC_BUTTON9, m_wndBt9);
}
BEGIN_MESSAGE_MAP(CXMLCDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CXMLCDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CXMLCDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CXMLCDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CXMLCDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CXMLCDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDC_BUTTON6, &CXMLCDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON8, &CXMLCDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CXMLCDlg::OnBnClickedButton9)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CXMLCDlg::onAcadKeepFocus)
ON_WM_SIZE()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CXMLCDlg::OnSelChanged)
ON_NOTIFY(NM_RCLICK, IDC_TREE1, &CXMLCDlg::OnNMClickTree1)
ON_NOTIFY(NM_CLICK, IDC_TREE1, &CXMLCDlg::OnNMClickTree)
ON_BN_CLICKED(IDC_XMLC_CHK_AUTOSEL, &CXMLCDlg::OnBnClickedChkAutoseL)
END_MESSAGE_MAP()
LONG_PTR CXMLCDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if (!(rect.PtInRect(pt)))
{
return FALSE;
}
return TRUE;
}
BOOL CXMLCDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndChkAutoSel.Create(_T("自动选择实体")
, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX
, CRect(10, 10, 150, 30)
, this
, IDC_XMLC_CHK_AUTOSEL);
m_wndChkAutoSel.SetFont(GetFont());
m_wndChkAutoSel.SetCheck(m_bAutoSelEnt ? BST_CHECKED : BST_UNCHECKED);
CRect rc;
GetDlgItem(IDC_STATIC_TREE)->GetWindowRect(rc);
ScreenToClient(&rc);
GetDlgItem(IDC_STATIC_TREE)->ShowWindow(SW_HIDE);
unsigned uStyle = TVS_HASBUTTONS | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_FULLROWSELECT;
unsigned uExStyle = TVS_EX_ITEMLINES | TVS_EX_ITEMLINES | TVS_EX_ALTERNATECOLOR | TVS_EX_SUBSELECT | TVS_EX_FULLROWMARK;
m_wndFloorView.Create(uStyle | WS_CHILD | WS_VISIBLE | WS_BORDER, rc, this, IDC_TREE1);
m_wndFloorView.SetExtendedStyle(uExStyle);
m_wndFloorView.ShowWindow(SW_SHOW);
CBitmap bmp;
if (!bmp.LoadBitmap(IDB_BITMAPPRIV))
{
AfxMessageBox(_T("Can't load bitmap: %x\n"), IDB_BITMAPPRIV);
ASSERT(FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap(&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist.Create(16, bmpObj.bmHeight, nFlags, 0, 0);
m_Imagelist.Add(&bmp, RGB(255, 0, 0));
m_wndFloorView.SetImageList(&m_Imagelist, TVSIL_NORMAL);
CBitmap bmp24;
if (!bmp24.LoadBitmap(IDB_BITMAP_XMLC))
{
AfxMessageBox(_T("Can't load bitmap: IDB_BITMAP32"));
ASSERT(FALSE);
return FALSE;
}
BITMAP bmpObj24;
bmp24.GetBitmap(&bmpObj24);
m_Imagelist24.Create(24, bmpObj24.bmHeight, nFlags, 0, 0);
m_Imagelist24.Add(&bmp24, RGB(255, 0, 0));
m_wndBt1.SetIcon(m_Imagelist24.ExtractIcon(0));
m_wndBt2.SetIcon(m_Imagelist24.ExtractIcon(1));
m_wndBt3.SetIcon(m_Imagelist24.ExtractIcon(2));
m_wndBt4.SetIcon(m_Imagelist24.ExtractIcon(3));
m_wndBt5.SetIcon(m_Imagelist24.ExtractIcon(4));
m_wndBt6.SetIcon(m_Imagelist24.ExtractIcon(5));
m_wndBt8.SetIcon(m_Imagelist24.ExtractIcon(6));
m_wndBt9.SetIcon(m_Imagelist24.ExtractIcon(7));
m_wndBt5.ShowWindow(SW_HIDE);
m_wndBt6.ShowWindow(SW_HIDE);
m_wndBt8.ShowWindow(SW_HIDE);
InitObjListColumn();
Refrush();
GetWindowRect(&m_rcMain);
m_wndBt1.GetWindowRect(&m_rcBt);
return TRUE;
}
BOOL CXMLCDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg != NULL && pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CXMLCDlg::OnCancel()
{
}
void CXMLCDlg::InitObjListColumn()
{
LPCTSTR lpszCols[] = { _T("名称"),_T("始层"),_T("底标高"),_T("终层"),_T("层高"),_T("状态"),_T("ID"),_T("DWG"),NULL};
int lnColumns[] = { 200,200,50,50,50,50,10,10,0 };
LV_COLUMN lvColumn;
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvColumn.fmt = LVCFMT_LEFT;
lvColumn.cx = 120;
for (int i = 0; lpszCols[i] != NULL; i++)
{
lvColumn.cx = lnColumns[i];
lvColumn.pszText = const_cast<LPTSTR>(lpszCols[i]);
m_wndFloorView.InsertColumn(i, &lvColumn);
}
}
void CXMLCDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (::IsWindow(m_wndFloorView.m_hWnd))
{
CRect rc;
GetClientRect(&rc);
rc.DeflateRect(7, 7, 7, m_rcBt.Height() + 7);
m_wndFloorView.MoveWindow(rc);
}
if (::IsWindow(m_wndBt1.m_hWnd) &&
::IsWindow(m_wndBt2.m_hWnd) &&
::IsWindow(m_wndBt3.m_hWnd) &&
::IsWindow(m_wndBt4.m_hWnd) &&
::IsWindow(m_wndBt5.m_hWnd) &&
::IsWindow(m_wndBt6.m_hWnd) &&
::IsWindow(m_wndBt8.m_hWnd) &&
::IsWindow(m_wndBt9.m_hWnd) &&
::IsWindow(m_wndChkAutoSel.m_hWnd) )
{
CRect rc, rcItem;
GetClientRect(&rc);
rcItem = rc;
rcItem.left += 7;
rcItem.top = rcItem.bottom - 7 - m_rcBt.Height();
rcItem.right = rcItem.left + m_rcBt.Width();
m_wndBt1.MoveWindow(rcItem);
int w(m_rcBt.Width() + 5);
rcItem.left += w;
rcItem.right += w;
m_wndBt2.MoveWindow(rcItem);
rcItem.left += w;
rcItem.right += w;
m_wndBt3.MoveWindow(rcItem);
rcItem.left += w;
rcItem.right += w;
m_wndBt4.MoveWindow(rcItem);
rcItem.left += w;
rcItem.right += w;
//m_wndBt5.MoveWindow(rcItem);
m_wndBt9.MoveWindow(rcItem);
double dScale(CoreTools::GetDPIScale());
int i140((int)(140 * dScale + .5))
, i15((int)(15 * dScale + .5))
, i5((int)(5 * dScale + .5))
, i3((int)(3 * dScale + .5));
CSize szChk(i140, i15);
CRect rcChk(CPoint(rcItem.right + i5, rcItem.bottom - szChk.cy - i3), szChk);
m_wndChkAutoSel.MoveWindow(rcChk);
rcItem.left += m_rcBt.Width();
rcItem.right += m_rcBt.Width();
//m_wndBt6.MoveWindow(rcItem);
rcItem.left += m_rcBt.Width();
rcItem.right += m_rcBt.Width();
//m_wndBt8.MoveWindow(rcItem);
rcItem.left += m_rcBt.Width();
rcItem.right += m_rcBt.Width();
//m_wndBt9.MoveWindow(rcItem);
}
}
static void DisableFloorRec()
{
AcAxDocLock lock;
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->SetFocusOn(false);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
}
void CXMLCDlg::OnSelChanged(NMHDR *pNmHdr, LRESULT *pResult)
{
NM_TREEVIEW *pNmTreeView = (NM_TREEVIEW *)pNmHdr;
FloorViewData viewData;
if (pNmTreeView && pNmTreeView->itemNew.hItem)
{
//增加选择
HTREEITEM hItem = pNmTreeView->itemNew.hItem;
CString sText = m_wndFloorView.GetItemText(hItem);
if (!GetItemViewData(hItem, viewData))
{
//当前节点置灰
DisableFloorRec();
return;
}
//1.显示当前选择的楼层
AcAxDocLock lock;
SetActive(hItem, viewData);
}
}
UINT CXMLCDlg::EnableMenuItem(HTREEITEM hItem, UINT nID)
{
int nImg = -1, nImg2 = -1,i = 0;
m_wndFloorView.GetItemImage(hItem, nImg, nImg2);
CString sName = m_wndFloorView.GetItemText(hItem);
UINT nFlag = MF_ENABLED;
switch (nID)
{
case ID_NEWPRO:
{
break;
}
case ID_NEWFLR:
{
if (sName.CompareNoCase(FLOOR_XY) != 0)
{
nFlag = MF_DISABLED;
}
break;
}
case ID_DELFLR:
case ID_MODFLR:
case ID_3DAXLN:
case ID_SHOWFR:
case ID_HIDEFR:
{
if (nImg != IMG_FLOOR)
{
nFlag = MF_DISABLED;
}
break;
}
case ID_3D:
{
if (sName.CompareNoCase(FLOOR_3D) != 0)
{
nFlag = MF_DISABLED;
}
break;
}
case ID_REFRSH:
{
break;
}
case ID_CROSSSEL:
case ID_SELDWG:
{
//{ _T("楼层平面"),_T("楼层立面"),_T("楼层剖面"),_T("系统图"), _T("原理图"),_T("配筋图"),_T("三维视图"),NULL }
for (i = 0;i < sizeof(g_pszViews) / sizeof(g_pszViews[0]); i++)
{
if (g_pszViews[i] == NULL)
break;
if (sName.CompareNoCase(g_pszViews[i]) == 0)
{
if (i > 0 && i < 8)
{
nFlag = MF_ENABLED;
}
else
{
nFlag = MF_DISABLED;
}
break;
}
}
break;
}
case ID_OPENDWG:
{
if (nImg != IMG_FLOOR)
{
nFlag = MF_DISABLED;
}
else
{
FloorViewData data;
memset(&data, 0, sizeof(FloorViewData));
if (!GetItemViewData(hItem, data))
{
nFlag = MF_DISABLED;
}
else
{
if (_tcslen(data.m_szFilePath) > 0)
{
CFileFind fd;
if (!fd.FindFile(data.m_szFilePath))
{
nFlag = MF_DISABLED;
}
}
}
}
break;
}
default:
break;
}
return nFlag;
}
void CXMLCDlg::OnNMClickTree(NMHDR * pNMHDR, LRESULT * pResult)
{
NM_TREEVIEW *pNmTreeView = (NM_TREEVIEW *)pNMHDR;
HTREEITEM hItem(pNmTreeView->itemNew.hItem);
// 没有子节点才重新刷新,防止反复单击同一项
if (isFloorItem(m_wndFloorView, hItem) && !m_wndFloorView.GetChildItem(hItem))
{
deleteCheckboxItems(m_wndFloorView, m_wndFloorView.GetRootItem());
FloorViewData viewData;
if (!GetItemViewData(hItem, viewData)) return;
double dBomEl = GetBomElTo(hItem, viewData);
//getEntitiesOfFloor(&viewData, dBomEl, m_idIns, m_idOuts);
makeEntityTreeForFloor(m_idIns, m_wndFloorView, hItem);
}
// 如果点中了checkbox,修改图标(只处理有checkbox图标的项)
changeImg(m_wndFloorView, pNmTreeView->itemNew.hItem);
// 如果点中了非图标区域,选择实体(只处理楼层项和有checkbox的项)
if (m_bAutoSelEnt)
selectEntities(m_wndFloorView, pNmTreeView->itemNew.hItem);
*pResult = 0;
}
void CXMLCDlg::OnBnClickedChkAutoseL()
{
m_bAutoSelEnt = !m_bAutoSelEnt;
m_wndChkAutoSel.SetCheck(m_bAutoSelEnt ? BST_CHECKED : BST_UNCHECKED);
}
void CXMLCDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
CPoint point, ptcursor;
::GetCursorPos(&point);
ptcursor = point;
CAcModuleResourceOverride myResources;
CMenu menu;
menu.CreatePopupMenu();
HTREEITEM hItem = m_wndFloorView.GetSelectedItem();
DWORD dwDefState(MF_BYCOMMAND | MF_STRING | MF_ENABLED);
if (hItem != NULL)
{
if (!isCheckboxItem(m_wndFloorView, hItem))
{
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_NEWPRO), ID_NEWPRO, _T("建项目(&P)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_PROMODI), ID_PROMODI, _T("修改项目(&M)"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_NEWFLR), ID_NEWFLR, _T("建楼层(&N)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_DELFLR), ID_DELFLR, _T("删楼层(&D)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_MODFLR), ID_MODFLR, _T("修改楼层(&F)"));
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_3DAXLN), ID_3DAXLN, _T("3D轴网(&A)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_3DAXCPY), ID_3DAXCPY, _T("复制轴网到本层(&C)"));
menu.AppendMenu(MF_SEPARATOR);
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_SHOWFR), ID_SHOWFR, _T("显楼层(&S)"));
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_HIDEFR), ID_HIDEFR, _T("隐楼层(&Y)"));
//menu.AppendMenu(MF_SEPARATOR);
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_3D), ID_3D, _T("显示三维(&W)"));
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_REFRSH), ID_REFRSH, _T("刷新(&R)"));
//menu.AppendMenu(MF_SEPARATOR);
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_CROSSSEL), ID_CROSSSEL, _T("图面框选(&K)"));
//2024-11-27 暂时关闭
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_SELDWG), ID_SELDWG, _T("关联外部文件(&F)"));
//menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_OPENDWG), ID_OPENDWG, _T("打开关联文件(&O)"));
if (isFloorItem(m_wndFloorView, hItem) && m_wndFloorView.GetChildItem(hItem))
{
menu.AppendMenu(MF_SEPARATOR);
menu.AppendMenu(dwDefState , IDM_ENTITY_LOCK , _T("锁定(&L)"));
menu.AppendMenu(dwDefState , IDM_ENTITY_HIDE , _T("隐藏(&H)"));
menu.AppendMenu(dwDefState , IDM_ENTITY_SHOW , _T("恢复(&X)"));
}
}
else
{
menu.AppendMenu(dwDefState , IDM_ENTITY_LOCK , _T("锁定(&L)"));
menu.AppendMenu(dwDefState , IDM_ENTITY_HIDE , _T("隐藏(&H)"));
menu.AppendMenu(dwDefState , IDM_ENTITY_SHOW , _T("恢复(&X)"));
}
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y, &m_wndFloorView);
switch (nID)
{
case IDM_ENTITY_LOCK:
case IDM_ENTITY_HIDE:
case IDM_ENTITY_SHOW:
{
processPopmenu(nID, m_wndFloorView, hItem);
break;
}
case ID_NEWPRO:
{
OnBnClickedButton1();
break;
}
case ID_PROMODI:
{
OnModifyPro();
break;
}
case ID_NEWFLR:
{
OnBnClickedButton2();
break;
}
case ID_DELFLR:
{
OnBnClickedButton3();
break;
}
case ID_MODFLR:
{
OnModifyFloor();
break;
}
case ID_3DAXLN:
{
OnBnClickedButton4();
break;
}
case ID_3DAXCPY:
{
On3DAxisLineCopy();
}
case ID_SHOWFR:
{
OnBnClickedButton5();
break;
}
case ID_HIDEFR:
{
OnBnClickedButton6();
break;
}
case ID_3D:
{
OnBnClickedButton8();
break;
}
case ID_REFRSH:
{
OnBnClickedButton9();
break;
}
case ID_CROSSSEL:
{
OnCrossSelFloorView(hItem);
break;
}
case ID_SELDWG:
{
OnSeldwgFloorView(hItem);
break;
}
case ID_OPENDWG:
{
OnOpenFloorViewdwgFile(hItem);
}
default:
break;
}
}
else
{
if (m_wndFloorView.GetCount() == 0)
{
menu.AppendMenu(MF_BYCOMMAND | MF_STRING | EnableMenuItem(hItem, ID_REFRSH), ID_REFRSH, _T("刷新(&R)"));
int nID = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, ptcursor.x, ptcursor.y, &m_wndFloorView);
switch (nID)
{
case ID_REFRSH:
{
OnBnClickedButton9();
break;
}
default:
break;
}
}
}
}
//刷新
void CXMLCDlg::Refrush()
{
//+--项目名称
// +---视图名称
// +----楼层名称
m_wndFloorView.DeleteAllItems();
//先建好平面,立面 节点
//g_pszViews
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME - FloorEx Handle - FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForRead);
if (es == Acad::eOk)
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
CString sProjName;
pRec->GetProjectName(sProjName);
double dBomEl = 0.0;
dBomEl = pRec->GetBomEl();
CString sBom, sRem, sBasePt;
HTREEITEM hProject = NULL;
pRec->GetRem(sRem);
AcGePoint3d ptBase;
pRec->GetBasePoint(ptBase);
sBasePt.Format(_T("%g,%g,%g"),ptBase.x,ptBase.y,ptBase.z);
//项目名称
hProject = m_wndFloorView.InsertItem(sProjName, IMG_ROOT, IMG_ROOT);
m_wndFloorView.SelectItem(m_wndFloorView.GetRootItem());
m_wndFloorView.Expand(m_wndFloorView.GetRootItem(), TVE_EXPAND);
sBom.Format(_T("%.1f"), dBomEl);
int nItem = m_wndFloorView.GetRowOfItem(hProject);
m_wndFloorView.ListSetItem(nItem, 1, _T(""));
m_wndFloorView.ListSetItem(nItem, 2, sBom);
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 4, _T(""));
m_wndFloorView.ListSetItem(nItem, 5, _T(""));
m_wndFloorView.ListSetItem(nItem, 6, sBasePt);
m_wndFloorView.ListSetItem(nItem, 7, sRem);
//建立视图节点
CMapStringToPtr mapView2Item;
HTREEITEM hItem = NULL,hView = NULL, hFloor = NULL;
for (int i = 0; i < sizeof(g_pszViews) / sizeof(g_pszViews[0]); i++)
{
if (g_pszViews[i] != NULL)
{
hItem = m_wndFloorView.InsertItem(g_pszViews[i], IMG_VIEW, IMG_VIEW_ON, hProject);
mapView2Item.SetAt(g_pszViews[i], hItem);
m_wndFloorView.SelectItem(hProject);
m_wndFloorView.Expand(hProject, TVE_EXPAND);
nItem = m_wndFloorView.GetRowOfItem(hItem);
m_wndFloorView.ListSetItem(nItem, 1, _T(""));
m_wndFloorView.ListSetItem(nItem, 2, _T(""));
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 4, _T(""));
m_wndFloorView.ListSetItem(nItem, 5, _T(""));
m_wndFloorView.ListSetItem(nItem, 6, _T(""));
m_wndFloorView.ListSetItem(nItem, 7, _T(""));
}
}
//楼层名称
FloorViewData viewData;
memset(&viewData, 0, sizeof(FloorViewData));
CString sFr, sTo,sH, sTmp;
for(int ii = 0;ii < pRec->GetCount();ii++)
{
pRec->GetFloorViewRecord(ii, viewData);
if (mapView2Item.Lookup(viewData.m_szFloorView, (void*&)hView))
{
//楼层名称
hFloor = m_wndFloorView.InsertItem(viewData.m_szName, IMG_FLOOR, IMG_FLOOR_ON, hView);
m_wndFloorView.SelectItem(hView);
m_wndFloorView.Expand(hView, TVE_EXPAND);
//temp point
FloorViewData *pViewData = &viewData;
nItem = m_wndFloorView.GetRowOfItem(hFloor);
sFr.Format(_T("%d"), pViewData->m_nFloorIndxFr);
m_wndFloorView.ListSetItem(nItem, 1, sFr);
//底标高
sFr.Format(_T("%.3f"), GetBomElTo(pRec,viewData));
m_wndFloorView.ListSetItem(nItem, 2, sFr);
if (pViewData->m_bFloorIndxTo)
{
sTo.Format(_T("%d"), pViewData->m_nFloorIndxTo);
m_wndFloorView.ListSetItem(nItem, 3, sTo);
}
sH.Format(_T("%d"), pViewData->m_nFloorH);
m_wndFloorView.ListSetItem(nItem, 4, sH);
sTmp = pViewData->m_nActive ? _T("活动") : _T("非活动");
m_wndFloorView.ListSetItem(nItem, 5, sTmp);
m_wndFloorView.ListSetItem(nItem, 6, pViewData->m_szID);
m_wndFloorView.ListSetItem(nItem, 7, pViewData->m_szFilePath);
}
}
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
}
//刷新
void CXMLCDlg::OnBnClickedButton9()
{
Refrush();
}
//新建项目
void CXMLCDlg::NewProjectFloorView(CString& sName,double dBomEl,CString& sBasePt,CString& sRem)
{
AcGePoint3d ptBase;
std::vector<CString> arXYZ;
CoreTools::SplitString(sBasePt, _T(","), arXYZ);
if (arXYZ.size() == 3)
{
ptBase.x = _ttof(arXYZ.at(0));
ptBase.y = _ttof(arXYZ.at(1));
ptBase.z = _ttof(arXYZ.at(2));
}
HTREEITEM hRoot = m_wndFloorView.GetRootItem();
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForWrite))
{
pObj->createExtensionDictionary();
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForWrite);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME - FloorEx Handle - FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite);
if (es == Acad::eKeyNotFound)
{
AecFloorViewDataRecord *pFvRec = new AecFloorViewDataRecord;
pFvRec->SetProjectName(sName);
pFvRec->SetBomEl(dBomEl);
pFvRec->SetBasePoint(ptBase);
pFvRec->SetRem(sRem);
AcDbObjectId idRec;
pDic->setAt(KEY_NAME, pFvRec, idRec);
pFvRec->close();
}
else if (es == Acad::eOk)
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->SetProjectName(sName);
pRec->SetBomEl(dBomEl);
pRec->SetBasePoint(ptBase);
pRec->SetRem(sRem);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
//g_pszViews
if (hRoot == NULL)
{
HTREEITEM hRoot = m_wndFloorView.InsertItem(sName, IMG_ROOT, IMG_ROOT);
CString sBom;
sBom.Format(_T("%.1f"), dBomEl);
int nItem = m_wndFloorView.GetRowOfItem(hRoot);
m_wndFloorView.ListSetItem(nItem, 1, _T(""));
m_wndFloorView.ListSetItem(nItem, 2, sBom);
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 4, _T(""));
m_wndFloorView.ListSetItem(nItem, 5, _T(""));
m_wndFloorView.ListSetItem(nItem, 6, sBasePt);
m_wndFloorView.ListSetItem(nItem, 7, sRem);
HTREEITEM hItem = NULL;
for (int i = 0; i < sizeof(g_pszViews) / sizeof(g_pszViews[0]); i++)
{
if (g_pszViews[i] != NULL)
{
hItem = m_wndFloorView.InsertItem(g_pszViews[i], IMG_VIEW, IMG_VIEW_ON, hRoot);
nItem = m_wndFloorView.GetRowOfItem(hItem);
m_wndFloorView.ListSetItem(nItem, 1, _T(""));
m_wndFloorView.ListSetItem(nItem, 2, _T(""));
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 4, _T(""));
m_wndFloorView.ListSetItem(nItem, 5, _T(""));
m_wndFloorView.ListSetItem(nItem, 6, _T(""));
m_wndFloorView.ListSetItem(nItem, 7, _T(""));
}
}
m_wndFloorView.SelectItem(hRoot);
m_wndFloorView.Expand(hRoot, TVE_EXPAND);
}
else
{
CString sBom;
sBom.Format(_T("%.1f"), dBomEl);
int nItem = m_wndFloorView.GetRowOfItem(hRoot);
m_wndFloorView.ListSetItem(nItem, 2, sBom);
m_wndFloorView.SetItemText(hRoot, sName);
HTREEITEM hProject = m_wndFloorView.GetChildItem(hRoot);
if (hProject != NULL)
{
nItem = m_wndFloorView.GetRowOfItem(hProject);
m_wndFloorView.ListSetItem(nItem, 1, _T(""));
m_wndFloorView.ListSetItem(nItem, 2, _T(""));
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 4, _T(""));
m_wndFloorView.ListSetItem(nItem, 5, _T(""));
m_wndFloorView.ListSetItem(nItem, 6, sBasePt);
m_wndFloorView.ListSetItem(nItem, 7, sRem);
}
}
}
//新建项目
void CXMLCDlg::OnBnClickedButton1()
{
//+--项目名称--对齐点 标高
// +---视图名称
// +----楼层名称
CAcModuleResourceOverride myResources;
CProSetDlg dlg;
HTREEITEM hRoot = m_wndFloorView.GetRootItem();
if (hRoot != NULL)
{
dlg.m_sName = m_wndFloorView.GetItemText(hRoot);
}
if (IDOK == dlg.DoModal())
{
NewProjectFloorView(dlg.m_sName,dlg.m_dBomEl,dlg.m_sBasePt,dlg.m_sRem);
}
}
void CXMLCDlg::OnModifyPro()
{
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
CString sProjName, sRem, sBasePt;
double dBomEl = 0.0;
AcGePoint3d ptBase;
bool bHsPro = false;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME - FloorEx Handle - FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForRead);
if (es == Acad::eOk)
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->GetProjectName(sProjName);
dBomEl = pRec->GetBomEl();
pRec->GetRem(sRem);
pRec->GetBasePoint(ptBase);
sBasePt.Format(_T("%g,%g,%g"), ptBase.x, ptBase.y, ptBase.z);
bHsPro = true;
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
if (bHsPro)
{
CAcModuleResourceOverride myResources;
CProSetDlg dlg;
dlg.m_sName = sProjName;
dlg.m_dBomEl = dBomEl;
dlg.m_sBasePt = sBasePt;
dlg.m_sRem = sRem;
if (IDOK == dlg.DoModal())
{
NewProjectFloorView(dlg.m_sName, dlg.m_dBomEl, dlg.m_sBasePt, dlg.m_sRem);
}
}
}
//项目标高
double CXMLCDlg::GetProBomEl()
{
CString sTmp = _T("0.0");
HTREEITEM hRoot = m_wndFloorView.GetRootItem();
if (hRoot != NULL)
{
int nItem = m_wndFloorView.GetRowOfItem(hRoot);
if (nItem != -1)
{
sTmp = m_wndFloorView.ListGetItemText(nItem, 2);
}
}
CString sReal = sTmp;
int nPos = sTmp.Find(_T(':'));
if (nPos != -1)
{
sReal = sTmp.Mid(nPos + 1);
}
return _ttof(sReal);
}
BOOL CXMLCDlg::GetItemViewData(HTREEITEM hItem, FloorViewData &data)
{
memset(&data, 0, sizeof(FloorViewData));
int nImage = -1,nImge2 = -1;
m_wndFloorView.GetItemImage(hItem, nImage, nImge2);
if (nImage != IMG_FLOOR)//不是楼层
{
return FALSE;
}
CString sTmp;
int nItem = m_wndFloorView.GetRowOfItem(hItem);
if (nItem != -1)
{
//FloorIndxFr不能为空
sTmp = m_wndFloorView.ListGetItemText(nItem, 1);
data.m_nFloorIndxFr = _ttoi(sTmp);
//底标高
//ListGetItemText(nItem,2)
//终止层
sTmp = m_wndFloorView.ListGetItemText(nItem, 3);
data.m_nFloorIndxTo = _ttoi(sTmp);
if (data.m_nFloorIndxTo > data.m_nFloorIndxFr)
data.m_bFloorIndxTo = TRUE;
sTmp = m_wndFloorView.ListGetItemText(nItem, 4);
data.m_nFloorH = _ttoi(sTmp);
//状态
sTmp = m_wndFloorView.ListGetItemText(nItem, 5);
data.m_nActive = _ttoi(sTmp);
sTmp = m_wndFloorView.ListGetItemText(nItem, 6);
_tcscpy(data.m_szID, (LPCTSTR)sTmp);
sTmp = m_wndFloorView.ListGetItemText(nItem, 7);
_tcscpy(data.m_szFilePath, (LPCTSTR)sTmp);
sTmp = m_wndFloorView.ListGetItemText(nItem, 0);
_tcscpy(data.m_szName, (LPCTSTR)sTmp);
HTREEITEM hParent = m_wndFloorView.GetParentItem(hItem);
if (hParent == NULL)
{
return FALSE;
}
sTmp = m_wndFloorView.GetItemText(hParent);
_tcscpy(data.m_szFloorView, (LPCTSTR)sTmp);
return TRUE;
}
return FALSE;
}
//新建楼层
void CXMLCDlg::OnBnClickedButton2()
{
if (m_wndFloorView.GetCount() == 0)
{
AfxMessageBox(_T("请新建项目!"));
return;
}
CAcModuleResourceOverride myResources;
CFloorViewNameDlg dlg;
dlg.m_bNewFloor = TRUE;
if (IDOK == dlg.DoModal())
{
//...
HTREEITEM hViewFind = NULL;
HTREEITEM hRoot = m_wndFloorView.GetRootItem();
if (hRoot != NULL)//项目
{
//判断是否已经存在
HTREEITEM hFloor = NULL;
CString sText,sViewName;
HTREEITEM hView = m_wndFloorView.GetChildItem(hRoot);
while (hView != NULL)
{
hFloor = m_wndFloorView.GetChildItem(hView);
while (hFloor != NULL)
{
sText = m_wndFloorView.GetItemText(hFloor);
if (sText.CompareNoCase(dlg.m_sName) == 0)
{
AfxMessageBox(_T("楼层名称同名,已经存在!"));
return;
}
hFloor = m_wndFloorView.GetNextSiblingItem(hFloor);
}
sViewName = m_wndFloorView.GetItemText(hView);
if (sViewName.CompareNoCase(dlg.m_sFloorView) == 0)
{
hViewFind = hView;
break;
}
if (hViewFind != NULL)
break;
hView = m_wndFloorView.GetNextSiblingItem(hView);
}
//找到楼层视图名
if (hViewFind == NULL)
{
CString sTip;
sTip.Format(_T("没有找到楼层视图节点%s"), dlg.m_sFloorView);
AfxMessageBox(sTip);
return;
}
//创建楼层
hFloor = m_wndFloorView.InsertItem(dlg.m_sName, IMG_FLOOR, IMG_FLOOR_ON, hViewFind);
m_wndFloorView.SelectItem(hViewFind);
m_wndFloorView.Expand(hViewFind, TVE_EXPAND);
int nItem = m_wndFloorView.GetRowOfItem(hFloor);
CString sFr, sTo, sH;
sFr.Format(_T("%d"), dlg.m_nFloorIndxFr);
m_wndFloorView.ListSetItem(nItem, 1, sFr);
if (dlg.m_bFloorIndxTo)
{
sTo.Format(_T("%d"), dlg.m_nFloorIndxTo);
m_wndFloorView.ListSetItem(nItem, 3, sTo);
}
sH.Format(_T("%d"), dlg.m_nFloorH);
m_wndFloorView.ListSetItem(nItem, 4, sH);
m_wndFloorView.ListSetItem(nItem, 5, _T("非活动"));
FloorViewData viewData;
memset(&viewData, 0, sizeof(FloorViewData));
viewData.m_nFloorIndxFr = dlg.m_nFloorIndxFr;
viewData.m_bFloorIndxTo = dlg.m_bFloorIndxTo;
viewData.m_nFloorIndxTo = dlg.m_nFloorIndxTo;
viewData.m_nFloorH = dlg.m_nFloorH;
viewData.m_nActive = 0;
_tcscpy(viewData.m_szID, IDCreate());
m_wndFloorView.ListSetItem(nItem, 6, viewData.m_szID);
_tcscpy(viewData.m_szFloorView, (LPCTSTR)dlg.m_sFloorView);
_tcscpy(viewData.m_szName, (LPCTSTR)dlg.m_sName);
//底标高
sFr.Format(_T("%.3f"), GetBomElTo(hFloor, viewData));
m_wndFloorView.ListSetItem(nItem, 2, sFr);
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForWrite))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->AddFloorViewRecord(viewData);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
}
}
}
double CXMLCDlg::GetBomElTo(AecFloorViewDataRecord *pRec, FloorViewData &vtTo)
{
double dBomEl = pRec->GetBomEl();
FloorViewData vtDL;
for (int i = 0;i < pRec->GetCount();i++)
{
pRec->GetFloorViewRecord(i, vtDL);
if (vtDL.m_nFloorIndxFr < vtTo.m_nFloorIndxFr)
{
if (vtDL.m_bFloorIndxTo)
{
dBomEl += (vtDL.m_nFloorIndxTo - vtDL.m_nFloorIndxFr + 1) * vtDL.m_nFloorH;
}
else
{
dBomEl += vtDL.m_nFloorH;
}
}
}
return dBomEl;
}
double CXMLCDlg::GetBomElTo(HTREEITEM hCurFloor,FloorViewData& vtTo)
{
double dBomEl = GetProBomEl();
HTREEITEM hFloorView = m_wndFloorView.GetParentItem(hCurFloor);//项目
if (hFloorView != NULL)
{
FloorViewData vtDL;
HTREEITEM hChild = m_wndFloorView.GetChildItem(hFloorView);//楼层视图
while (hChild != NULL)
{
if (GetItemViewData(hChild, vtDL))
{
if (vtDL.m_nFloorIndxFr < vtTo.m_nFloorIndxFr)
{
if (vtDL.m_bFloorIndxTo)
{
dBomEl += (vtDL.m_nFloorIndxTo - vtDL.m_nFloorIndxFr + 1) * vtDL.m_nFloorH;
}
else
{
dBomEl += vtDL.m_nFloorH;
}
}
}
hChild = m_wndFloorView.GetNextSiblingItem(hChild);
}
}
return dBomEl;
}
//三维轴网
void CXMLCDlg::OnBnClickedButton4()
{
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1,nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage == IMG_FLOOR)//是楼层
{
FloorViewData viewData;
if (!GetItemViewData(hSelect, viewData))
{
AfxMessageBox(_T("没有获取到楼层数据设置!"));
return;
}
//或取到此层的底标高
double dBomEl = GetBomElTo(hSelect,viewData);
//获取底标高+之前的层高
struct resbuf rb;
acedGetVar(_T("elevation"), &rb);
rb.resval.rreal = dBomEl;
acedSetVar(_T("elevation"), &rb);
struct resbuf rb3;
acedGetVar(_T("userr3"), &rb3);
rb3.resval.rreal = viewData.m_bFloorIndxTo ? ((viewData.m_nFloorIndxTo - viewData.m_nFloorIndxFr + 1) * viewData.m_nFloorH) : viewData.m_nFloorH;
acedSetVar(_T("userr3"), &rb3);
//布置轴网
acedPostCommand(_T("PL_BZZW "));
}
else
{
AfxMessageBox(_T("请选择楼层节点创建轴网!"));
}
}
else
{
AfxMessageBox(_T("请选择楼层节点创建轴网!"));
}
}
//复制轴网
void CXMLCDlg::On3DAxisLineCopy()
{
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1, nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage != IMG_FLOOR)//是楼层
{
AfxMessageBox(_T("选择节点不是楼层,请选择目标楼层复制轴网到该层!"));
return;
}
}
CMapStringToPtr mapNameToItem;
//弹出界面,选择某层轴网
HTREEITEM hRoot = m_wndFloorView.GetRootItem();
if (hRoot != NULL)
{
HTREEITEM hFloorXY = m_wndFloorView.GetChildItem(hRoot);
CString sName = m_wndFloorView.GetItemText(hFloorXY);
if (sName.CompareNoCase(FLOOR_XY) == 0)
{
HTREEITEM hParent = m_wndFloorView.GetParentItem(hSelect);
if (hParent != hFloorXY)
{
AfxMessageBox(_T("选择节点不是标准楼层,请选择目标标准楼层复制轴网到该层!"));
return;
}
HTREEITEM hChild = m_wndFloorView.GetChildItem(hFloorXY);
while (hChild != NULL)
{
int nImage = -1, nImage2 = -1;
m_wndFloorView.GetItemImage(hChild, nImage, nImage2);
if (nImage == IMG_FLOOR)//是楼层
{
if (hChild != hSelect)
{
sName = m_wndFloorView.GetItemText(hChild);
mapNameToItem.SetAt(sName, hChild);
}
}
hChild = m_wndFloorView.GetNextSiblingItem(hChild);
}
CAcModuleResourceOverride myResources;
CCopyAxFrFloorDlg dlg;
dlg.SetFloorMap(&mapNameToItem);
if (IDOK == dlg.DoModal())
{
HTREEITEM hFromFloor;
CString sFromFloor;
dlg.GetSelectFloor(sFromFloor);
mapNameToItem.Lookup(sFromFloor, (void *&)hFromFloor);
FloorViewData viewData;
if (!GetItemViewData(hFromFloor, viewData))
{
AfxMessageBox(_T("没有获取到楼层数据设置!"));
return;
}
AcDbObjectIdArray arIds;
GetFloorAxisLines(viewData.m_szID, arIds);
double dStaBomEl = GetProBomEl();
FloorViewData viewDataTo;
if (!GetItemViewData(hSelect, viewDataTo))
{
AfxMessageBox(_T("没有获取到当前楼层数据!"));
return;
}
//或取到此层的底标高
double dBomEl = GetBomElTo(hSelect, viewDataTo);
AcAxDocLock lock;
SetActive(hSelect, viewDataTo);
AcGePoint3d ptS, ptE, ptC;
AcDbEntity *pEnt = NULL;
Acad::ErrorStatus es;
AcDbObjectId idT;
for (int i = 0;i < arIds.length();i++)
{
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, arIds.at(i), AcDb::kForRead)))
{
AcDbEntity *pEntCln = (AcDbEntity *)pEnt->clone();
if (pEntCln != NULL)
{
AcDbLine *pLn = AcDbLine::cast(pEntCln);
if (pLn != NULL)
{
ptS = pLn->startPoint();
ptS.z = dBomEl;
ptE = pLn->endPoint();
ptE.z = dBomEl;
pLn->setStartPoint(ptS);
pLn->setEndPoint(ptE);
}
AcDbArc *pArc = AcDbArc::cast(pEntCln);
if (pArc != NULL)
{
ptC = pArc->center();
ptC.z = dBomEl;
pArc->setCenter(ptC);
}
CKTCadUtility::AddToBlockTableRecord(pEntCln);
pEntCln->close();
}
pEnt->close();
}
}
}
}
}
}
//删除楼层
void CXMLCDlg::OnBnClickedButton3()
{
//删除节点
//删除链点
//删除框
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1, nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage == IMG_FLOOR)
{
FloorViewData vData;
memset(&vData, 0, sizeof(FloorViewData));
//删除节点
CString sFloor = m_wndFloorView.GetItemText(hSelect);
m_wndFloorView.DeleteItem(hSelect);
//删除链点
AcAxDocLock lock;
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->GetFloorViewRecord(sFloor, vData);
pRec->RemoveFloorViewRecord(sFloor);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
if (_tcscmp(vData.m_szFloorView, FLOOR_XY) == 0)
RemoveFloorEntities(vData.m_szID);
else
RemoveFloorFrame(vData.m_szName);
}
else
{
AfxMessageBox(_T("请选择楼层节点删除!"));
}
}
}
void CXMLCDlg::OnModifyFloor()
{
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1, nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage == IMG_FLOOR)
{
FloorViewData vData;
memset(&vData, 0, sizeof(FloorViewData));
//节点
CString sFloor = m_wndFloorView.GetItemText(hSelect);
//链点
AcAxDocLock lock;
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->GetFloorViewRecord(sFloor, vData);
CAcModuleResourceOverride myResources;
CFloorViewNameDlg dlg;
dlg.m_nFloorIndxFr = vData.m_nFloorIndxFr;
dlg.m_bFloorIndxTo = vData.m_bFloorIndxTo;
dlg.m_nFloorIndxTo = vData.m_nFloorIndxTo;
dlg.m_nFloorH = vData.m_nFloorH;
dlg.m_sFloorView = vData.m_szFloorView;
dlg.m_sName = vData.m_szName;
dlg.m_dFloorElFr = GetBomElTo(pRec, vData);
if (IDOK == dlg.DoModal())
{
vData.m_nFloorIndxFr = dlg.m_nFloorIndxFr;
vData.m_bFloorIndxTo = dlg.m_bFloorIndxTo;
vData.m_nFloorIndxTo = dlg.m_nFloorIndxTo;
vData.m_nFloorH = dlg.m_nFloorH;
_tcscpy(vData.m_szFloorView, (LPCTSTR)dlg.m_sFloorView);
_tcscpy(vData.m_szName, (LPCTSTR)dlg.m_sName);
int nItem = m_wndFloorView.GetRowOfItem(hSelect);
m_wndFloorView.ListSetItem(nItem, 0, dlg.m_sName);
CString sFr, sTo, sH,sEl;
sFr.Format(_T("%d"), dlg.m_nFloorIndxFr);
m_wndFloorView.ListSetItem(nItem, 1, sFr);
sEl.Format(_T("%.3f"), GetBomElTo(pRec, vData));
m_wndFloorView.ListSetItem(nItem, 2, sEl);
if (dlg.m_bFloorIndxTo)
{
sTo.Format(_T("%d"), dlg.m_nFloorIndxTo);
m_wndFloorView.ListSetItem(nItem, 3, sTo);
}
sH.Format(_T("%d"), dlg.m_nFloorH);
m_wndFloorView.ListSetItem(nItem, 4, sH);
m_wndFloorView.ListSetItem(nItem, 5, vData.m_nActive ? _T("活动") : _T("非活动"));
//先删除,后加
pRec->RemoveFloorViewRecord(sFloor);
pRec->AddFloorViewRecord(vData);
}
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
}
}
}
//显示楼层
void CXMLCDlg::OnBnClickedButton5()
{
//框内实体设置显示
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1, nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage == IMG_FLOOR)
{
CString sFloor = m_wndFloorView.GetItemText(hSelect);
FloorViewData viewData;
if (!GetItemViewData(hSelect, viewData))
{
AfxMessageBox(_T("没有获取到楼层数据设置!"));
return;
}
if (_tcslen(viewData.m_szFilePath) > 0)
{
CString sFile = viewData.m_szFilePath; sFile.MakeLower();
if (sFile.Find(_T(".dwg")) != -1)
{
AfxMessageBox(_T("本楼层为外部Dwg文件楼层,请代开外部dwg文件操作!"));
return;
}
}
AcAxDocLock lock;
if (_tcscmp(viewData.m_szFloorView, FLOOR_XY) == 0)
{
double dBomEl = GetBomElTo(hSelect, viewData);
ShowFloorEntities(&viewData, dBomEl, 1);
}
else
{
ShowFloorFrame(viewData.m_szName, 1);
}
}
else
{
AfxMessageBox(_T("请选择楼层节点显示!"));
}
}
}
//隐藏楼层
void CXMLCDlg::OnBnClickedButton6()
{
//框内实体隐藏
//框内实体设置显示
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
int nImage = -1,nImage2 = -1;
m_wndFloorView.GetItemImage(hSelect, nImage, nImage2);
if (nImage == IMG_FLOOR)
{
CString sFloor = m_wndFloorView.GetItemText(hSelect);
FloorViewData ViewData;
if (!GetItemViewData(hSelect, ViewData))
{
return;
}
if (_tcslen(ViewData.m_szFilePath) > 0)
{
CString sFile = ViewData.m_szFilePath; sFile.MakeLower();
if (sFile.Find(_T(".dwg")) != -1)
{
AfxMessageBox(_T("本楼层为外部Dwg文件楼层,请代开外部dwg文件操作!"));
return;
}
}
double dBomEl = GetBomElTo(hSelect, ViewData);
AcAxDocLock lock;
if (_tcscmp(ViewData.m_szFloorView, FLOOR_XY) == 0)
ShowFloorEntities(&ViewData, dBomEl, 0);
else
ShowFloorFrame(ViewData.m_szName, 0);
}
else
{
AfxMessageBox(_T("请选择楼层节点隐藏!"));
}
}
}
//组装三维
void CXMLCDlg::OnBnClickedButton8()
{
//1.层实体做块记录
//2.wbclone到db
//首选选择三维视图节点
CString sFloor;
HTREEITEM hSelect = m_wndFloorView.GetSelectedItem();
if (hSelect != NULL)
{
sFloor = m_wndFloorView.GetItemText(hSelect);
}
if (sFloor.CompareNoCase(FLOOR_3D) != 0)
{
AfxMessageBox(_T("请先选择三维视图节点,显示三维!"));
return;
}
//1.获取当前图所有的楼层框
AcAxDocLock lock;
ShowFloorEntities(NULL,0.0,1);
// 转到西南轴侧
SHacedCommand(RTSTR, _T("_view"), RTSTR, _T("_swiso"), NULL);
#ifdef ZWCAD
SHacedCommand(RTSTR, _T("_SHADEMODE"), RTSTR, _T("_G"), RTNONE);
#else
SHacedCommand(RTSTR, _T("_vscurrent"), RTSTR, _T("c"), RTNONE);
#endif
}
//框选**图
void CXMLCDlg::OnCrossSelFloorView(HTREEITEM hView)
{
//框选,加入楼层框
ads_point pt1, pt2;
int nRes = acedGetPoint(NULL, _T("\n请框选范围左下角点:"), pt1);
if (nRes == RTNORM)
{
nRes = acedGetCorner(pt1, _T("\n请框选范围左下角点:"), pt2);
if (nRes == RTNORM)
{
CAcModuleResourceOverride myResources;
CNameDlg dlg;
if (IDOK == dlg.DoModal())
{
CString sText;
HTREEITEM hFloor = m_wndFloorView.GetChildItem(hView);
while (hFloor != NULL)
{
sText = m_wndFloorView.GetItemText(hFloor);
if (sText.CompareNoCase(dlg.m_sName) == 0)
{
AfxMessageBox(_T("楼层名称同名,已经存在!"));
return;
}
hFloor = m_wndFloorView.GetNextSiblingItem(hFloor);
}
FloorViewData vData;
memset(&vData, 0, sizeof(FloorViewData));
CString sFloor = m_wndFloorView.GetItemText(hView);
_tcscpy(vData.m_szFloorView, sFloor);
_tcscpy(vData.m_szID, IDCreate());
_tcscpy(vData.m_szName, dlg.m_sName);
vData.m_nActive = 1;
//创建楼层
hFloor = m_wndFloorView.InsertItem(dlg.m_sName, IMG_FLOOR, IMG_FLOOR_ON, hView);
m_wndFloorView.SelectItem(hView);
m_wndFloorView.Expand(hView, TVE_EXPAND);
int nItem = m_wndFloorView.GetRowOfItem(hFloor);
CString sFr = _T(""), sTo = _T(""), sH = _T("");
m_wndFloorView.ListSetItem(nItem, 1, sFr);
m_wndFloorView.ListSetItem(nItem, 3, _T(""));
m_wndFloorView.ListSetItem(nItem, 3, sTo);
m_wndFloorView.ListSetItem(nItem, 4, sH);
m_wndFloorView.ListSetItem(nItem, 5, _T("活动"));
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForWrite))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->AddFloorViewRecord(vData);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
//加入楼层框
ads_point pt11, pt22;
acdbUcs2Wcs(pt1, pt11, false);
acdbUcs2Wcs(pt2, pt22, false);
AcDbXFloorFrame *pFloorFr = new AcDbXFloorFrame;
pFloorFr->SetFloorFrame(sFloor, asPnt3d(pt11), asPnt3d(pt22), asPnt3d(pt11));
pFloorFr->SetFloorName(dlg.m_sName);
pFloorFr->GetFloorViewName(sFloor);
CoreTools::AddToModelSpace(pFloorFr);
}
}
}
}
//选择dwg文件 **图
void CXMLCDlg::OnSeldwgFloorView(HTREEITEM hView)
{
const TCHAR *pszFilter = _T("dwg文件 (*.dwg;)|*.dwg|");
CFileDialog dlg(TRUE, _T("dwg"), NULL, OFN_HIDEREADONLY, pszFilter, NULL);
TCHAR strFileName[MAX_PATH] = _T("");
TCHAR strFileTitle[] = _T("选择视图对应的DWG文件");
int maxChar = MAX_PATH;
dlg.m_ofn.lpstrFile = strFileName;
dlg.m_ofn.nMaxFile = maxChar;
dlg.m_ofn.lpstrTitle = strFileTitle;
if (dlg.DoModal() != IDOK)
{
return;
}
CString sFilePath = dlg.GetPathName();
CString sFileName = dlg.GetFileName();
CString sText;
HTREEITEM hFloor = m_wndFloorView.GetChildItem(hView);
while (hFloor != NULL)
{
sText = m_wndFloorView.GetItemText(hFloor);
if (sText.CompareNoCase(sFileName) == 0)
{
AfxMessageBox(_T("楼层名称同名,已经存在!"));
return;
}
hFloor = m_wndFloorView.GetNextSiblingItem(hFloor);
}
FloorViewData vData;
memset(&vData, 0, sizeof(FloorViewData));
CString sFloor = m_wndFloorView.GetItemText(hView);
_tcscpy(vData.m_szFloorView, sFloor);
_tcscpy(vData.m_szID, IDCreate());
_tcscpy(vData.m_szName, sFileName);
_tcscpy(vData.m_szFilePath, sFilePath);
vData.m_nActive = 0;
//创建楼层
hFloor = m_wndFloorView.InsertItem(sFileName, IMG_FLOOR, IMG_FLOOR_ON, hView);
m_wndFloorView.SelectItem(hView);
m_wndFloorView.Expand(hView, TVE_EXPAND);
int nItem = m_wndFloorView.GetRowOfItem(hFloor);
CString sFr = _T(""), sTo = _T(""), sH = _T("");
m_wndFloorView.ListSetItem(nItem, 1, sFr);
m_wndFloorView.ListSetItem(nItem, 2, _T(""));
m_wndFloorView.ListSetItem(nItem, 3, sTo);
m_wndFloorView.ListSetItem(nItem, 4, sH);
m_wndFloorView.ListSetItem(nItem, 5, _T("非活动"));
m_wndFloorView.ListSetItem(nItem, 6, vData.m_szID);
m_wndFloorView.ListSetItem(nItem, 7, sFilePath);
AcAxDocLock lock;
//模型空间的字典中放置
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForWrite))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
pRec->AddFloorViewRecord(vData);
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
}
typedef struct OpenFileParam
{
TCHAR szDwgFile[MAX_PATH];
CWnd *pParent;
}OPENFILEPARAM;
static void OpenDwgFile(void *pData)
{
OpenFileParam *pParam = (OpenFileParam *)pData;
AcApDocument *pDoc = acDocManager->curDocument();
if (acDocManager->isApplicationContext())
{
#if ARX < 21
acDocManager->pushResourceHandle(acedGetAcadResourceInstance());
#endif
acDocManager->appContextOpenDocument(pParam->szDwgFile);
acDocManager->popResourceHandle();
}
}
//打开dwg文件 **图
void CXMLCDlg::OnOpenFloorViewdwgFile(HTREEITEM hItem)
{
FloorViewData data;
memset(&data, 0, sizeof(FloorViewData));
if (!GetItemViewData(hItem, data))
{
return;
}
else
{
if (_tcslen(data.m_szFilePath) > 0)
{
CFileFind fd;
if (fd.FindFile(data.m_szFilePath))
{
static OpenFileParam param;
memset(&param, 0, sizeof(OpenFileParam));
_tcscpy(param.szDwgFile, data.m_szFilePath);
param.pParent = &m_wndFloorView;
acDocManager->executeInApplicationContext(OpenDwgFile, (void *)&param);
}
}
}
}
void CXMLCDlg::SetActive(HTREEITEM hHit, FloorViewData& viewData)
{
HTREEITEM hRoot = m_wndFloorView.GetParentItem(hHit);
if (hRoot != NULL)//是楼层视图
{
//判断是否已经存在
int nItem = -1;
HTREEITEM hView = m_wndFloorView.GetChildItem(hRoot);
while (hView != NULL)
{
nItem = m_wndFloorView.GetRowOfItem(hView);
if (hHit == hView)
{
m_wndFloorView.ListSetItem(nItem, 5, _T("活动"));
}
else
{
m_wndFloorView.ListSetItem(nItem, 5, _T("非活动"));
}
hView = m_wndFloorView.GetNextSiblingItem(hView);
}
}
double dBomEl = 0.0;
//模型空间的字典中放置
bool bZoomTo = false;
AcDbDatabase *pDb = acdbCurDwg();
if (pDb == NULL) return;
AcDbObjectId idSpace = pDb->currentSpaceId();
AcDbObject *pObj = NULL;
if (Acad::eOk == acdbOpenObject(pObj, idSpace, AcDb::kForRead))
{
AcDbObjectId idDic = pObj->extensionDictionary();
AcDbDictionary *pDic = NULL;
Acad::ErrorStatus es = acdbOpenObject(pDic, idDic, AcDb::kForRead);
if (es == Acad::eOk)
{
//AcDbXFloorFrame handle
//PRO_NAME- FloorEx Handle- FloorEx Handle- FloorEx Handle- FloorEx Handle...
AcDbObject *pSubObj = NULL;
if (Acad::eOk == (es = pDic->getAt(KEY_NAME, pSubObj, AcDb::kForWrite)))
{
AecFloorViewDataRecord *pRec = AecFloorViewDataRecord::cast(pSubObj);
if (pRec != NULL)
{
if (_tcscmp(viewData.m_szFloorView, FLOOR_XY) == 0)
{
pRec->SetActive(viewData.m_szName, 1);
dBomEl = GetBomElTo(pRec, viewData);
//同时显示本层实体
ShowFloorEntities(&viewData, dBomEl, 1);
}
else
{
bZoomTo = true;
}
}
pSubObj->close();
}
pDic->close();
}
pObj->close();
}
if (bZoomTo)
{
CString sFloorName;
//找到名称是 viewData.m_szName 的楼层框
CString sFile = viewData.m_szFilePath;
sFile.MakeLower();
if ( sFile.Find(_T(".dwg")) == -1)//不是外部参照
{
ads_name ss, ent;
AcDbObjectId id;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_XFLOORFR"), 0);//AcDbXFloorFrame
int nRes = acedSSGet(_T("A"), NULL, NULL, pRb, ss);
acutRelRb(pRb);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
CString sFloorNo;
AcGePoint3d pt1, pt2, pt3;
bool bZoom = false;
AcDbEntity *pEnt = NULL;
for (int i = 0;i < nLen;i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
AcDbXFloorFrame *pFloorFr = AcDbXFloorFrame::cast(pEnt);
pFloorFr->GetFloorName(sFloorName);
pFloorFr->GetFloorFrame(sFloorNo, pt1, pt2,pt3);
if (sFloorName.CompareNoCase(viewData.m_szName) == 0)
{
bZoom = true;
pEnt->close();
break;
}
pEnt->close();
}
}
acedSSFree(ss);
if (bZoom)
{
CKTCadUtility::Zoom(pt1, pt2);
}
}
}
else
{
//actrTransactionManager->flushGraphics();
acedUpdateDisplay();
}
}
void CXMLCDlg::GetFloorAxisLines(LPCTSTR pszID,AcDbObjectIdArray& arIds)
{
AcAxDocLock lock;
ads_name ss, ent;
int nRet = acedSSGet(_T("A"), NULL, NULL, NULL, ss);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
AcDbObjectId id, idAxis;
idAxis = KTSetting::InitLayer(_T("LAY_AXIS"));;
Acad::ErrorStatus es;
AcDbEntity *pEnt = NULL;
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead)))
{
struct resbuf *pRb = pEnt->xData(KEY_FLOOR);
if (pRb != NULL)
{
struct resbuf *pTmp = pRb->rbnext;
//while (pTmp != NULL)
{
if (pTmp->restype == AcDb::kDxfXdAsciiString)
{
if (_tcscmp(pTmp->resval.rstring, pszID) == 0)
{
if (pEnt->layerId() == idAxis)
{
arIds.append(id);
}
}
}
pTmp = pTmp->rbnext;
}
acutRelRb(pRb);
}
pEnt->close();
}
}
acedSSFree(ss);
}
static bool HasIntersectOnZ(double dZmin, double dZmax, double dFrEl, double dToEl)
{
//判断无交集
if (fabs(dZmin - dZmax) < 1.e-6)//等高 是轴网,二维线
{
double dZ = dZmin;
if ( (dZ - dFrEl) < -1.e-6)//相等可以
return false;
if (fabs(dZ - dToEl) < 1.e-6)//排除落在顶层位置
return false;
if (fabs(dZ - dFrEl) < 1.e-6)
return true;
}
if ( (dZmax - dFrEl) < 1.e-6)//排除相等
return false;
if ( (dZmin - dToEl) > -1.e-6)//排除相等
return false;
return true;
}
void CXMLCDlg::ShowFloorEntities(FloorViewData *pViewData, double dBomEl, Adesk::Int16 nActive)
{
getEntitiesOfFloor(pViewData, dBomEl, m_idIns, m_idOuts);
for (int i(0); i < m_idIns.length(); ++i)
{
AcDbEntityPointer ent(m_idIns[i], AcDb::kForWrite);
if (ent.openStatus() != Acad::eOk) continue;
ent->setVisibility(nActive ? AcDb::kVisible : AcDb::kInvisible);
}
for (int i(0); i < m_idOuts.length(); ++i)
{
AcDbEntityPointer ent(m_idOuts[i], AcDb::kForWrite);
if (ent.openStatus() != Acad::eOk) continue;
ent->setVisibility(nActive ? AcDb::kInvisible : AcDb::kVisible);
}
}
void CXMLCDlg::RemoveFloorEntities(LPCTSTR pszID)
{
/*
ads_name ss, ent;
int nRet = acedSSGet(_T("A"), NULL, NULL, NULL, ss);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
AcDbObjectId id;
AcDbEntity *pEnt = NULL;
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
struct resbuf *pRb = pEnt->xData(KEY_FLOOR);
if (pRb != NULL)
{
struct resbuf *pTmp = pRb;
while (pTmp != NULL)
{
if (pTmp->restype == AcDb::kDxfXdAsciiString)
{
if (_tcscmp(pTmp->resval.rstring, pszID) == 0)
{
if (pEnt->visibility() == AcDb::kInvisible)
{
pEnt->setVisibility(AcDb::kVisible);
}
// 存在清空
struct resbuf *pTmp2 = acutNewRb(AcDb::kDxfRegAppName);
acutNewString(KEY_FLOOR, pTmp2->resval.rstring);
pEnt->setXData(pTmp2);
acutRelRb(pTmp2);
break;
}
}
pTmp = pTmp->rbnext;
}
acutRelRb(pRb);
}
pEnt->close();
}
}*/
}
void CXMLCDlg::RemoveFloorFrame(LPCTSTR pszName)
{
ads_name ss, ent;
AcDbObjectId id;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_XFLOORFR"), 0);
int nRes = acedSSGet(_T("A"), NULL, NULL, pRb, ss);
acutRelRb(pRb);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
CString sFloorName;
Acad::ErrorStatus es;
AcDbEntity *pEnt = NULL;
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == (es = acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite)))
{
AcDbXFloorFrame *pFloorFr = AcDbXFloorFrame::cast(pEnt);
pFloorFr->GetFloorName(sFloorName);
if (sFloorName.CompareNoCase(pszName) == 0)
{
pEnt->erase();
pEnt->close();
break;
}
pEnt->close();
}
}
acedSSFree(ss);
}
void CXMLCDlg::ShowFloorFrame(LPCTSTR pszName,Adesk::Int16 nActive)
{
ads_name ss, ent;
AcDbObjectId id;
struct resbuf *pRb = acutBuildList(RTDXF0, _T("AEC_XFLOORFR"), 0);
int nRes = acedSSGet(_T("A"), NULL, NULL, pRb, ss);
acutRelRb(pRb);
Adesk::Int32 nLen = 0;
acedSSLength(ss, &nLen);
CString sFloorName,sFloorNo;
AcGePoint3d pt1, pt2, pt3;
bool bFind = false;
AcDbEntity *pEnt = NULL;
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForRead))
{
AcDbXFloorFrame *pFloorFr = AcDbXFloorFrame::cast(pEnt);
pFloorFr->GetFloorName(sFloorName);
pFloorFr->GetFloorFrame(sFloorNo, pt1, pt2, pt3);
if (sFloorName.CompareNoCase(pszName) == 0)
{
bFind = true;
break;
}
pEnt->close();
}
}
acedSSFree(ss);
if (bFind)
{
ads_point pt11, pt22;
acdbWcs2Ucs(asDblArray(pt1), pt11, false);
acdbWcs2Ucs(asDblArray(pt2), pt22, false);
nRes = acedSSGet(_T("C"), pt11, pt22, NULL, ss);
nLen = 0;
acedSSLength(ss, &nLen);
for (int i = 0; i < nLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, id, AcDb::kForWrite))
{
pEnt->setVisibility(nActive ? AcDb::kVisible : AcDb::kInvisible);
pEnt->close();
}
}
acedSSFree(ss);
}
}