Compare commits
28
Commits
cb38f5071b
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
006b251370 | ||
|
|
2f8b639cea | ||
|
|
5650ea28b8 | ||
|
|
59dcfe9e25 | ||
|
|
4e73873163 | ||
|
|
c84bc78869 | ||
|
|
806726c11b | ||
|
|
bbb899c0a0 | ||
|
|
775b3c181c | ||
|
|
c0c04952dc | ||
|
|
c41e7edf44 | ||
|
|
35a412f6f5 | ||
|
|
c4569ecac3 | ||
|
|
a1c7d39dc6 | ||
|
|
fdfb6e5bbb | ||
|
|
1db5368592 | ||
|
|
4961b696ff | ||
|
|
199abb989c | ||
|
|
7f2f37f005 | ||
|
|
0467086e65 | ||
|
|
63ed4744fb | ||
|
|
9d9077a03e | ||
|
|
8628fcc7e0 | ||
|
|
b7b9827994 | ||
|
|
b96cb1bed2 | ||
|
|
d107cfd47f | ||
|
|
84f255ff22 | ||
|
|
a94ecf8d40 |
No files matched your search
+12
-1
@@ -1,5 +1,16 @@
|
|||||||
Arx/
|
Arx/
|
||||||
Zrx/
|
ZRX/
|
||||||
cmake_output/
|
cmake_output/
|
||||||
bin/
|
bin/
|
||||||
lib/
|
lib/
|
||||||
|
*.dwg
|
||||||
|
*.png
|
||||||
|
*.dwl
|
||||||
|
*.dwl2
|
||||||
|
*.pdf
|
||||||
|
*.pcf
|
||||||
|
*.bat
|
||||||
|
*.scr
|
||||||
|
*.py
|
||||||
|
*.tmp
|
||||||
|
*.aps
|
||||||
+2
-1
@@ -10,7 +10,8 @@ This file provides guidance to CodeBuddy Code when working with code in this rep
|
|||||||
- **形态**:ObjectARX / ZRX 插件(DLL,后缀 `.arx` / `.zrx`),运行在 CAD 宿主内,含大量 MFC 界面与自定义图元实体。
|
- **形态**:ObjectARX / ZRX 插件(DLL,后缀 `.arx` / `.zrx`),运行在 CAD 宿主内,含大量 MFC 界面与自定义图元实体。
|
||||||
- **CMake 项目名**:`SHS_Code2026`(version 1.0.0)。
|
- **CMake 项目名**:`SHS_Code2026`(version 1.0.0)。
|
||||||
- **主代码目录**:`SourceCode/Code2026/`(C++ 约 2888 `.cpp` + 3104 `.h`;另有天正 `tg_shs/` 系列库)。
|
- **主代码目录**:`SourceCode/Code2026/`(C++ 约 2888 `.cpp` + 3104 `.h`;另有天正 `tg_shs/` 系列库)。
|
||||||
- **远端**:`origin` = `ssh://gjm@47.93.46.28:1216/srv/git/new-start.git`,主分支 `main`。提交信息用中文。
|
- **远端**:`origin` = `ssh://git@39.107.55.179:222/gjm/envi-code.git`,主分支 `main`。提交信息用中文。
|
||||||
|
- **SSH**:远端走 SSH 222 端口,需在本机 `~/.ssh/config` 或 ssh-agent 中指定可用私钥(各机器私钥不同,**不要把私钥文件名写进仓库**)。
|
||||||
|
|
||||||
目标平台(由 preset 与编译宏区分):
|
目标平台(由 preset 与编译宏区分):
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -9,6 +9,7 @@ set(SOURCES
|
|||||||
"AecBaseDoubleClickEdit.cpp"
|
"AecBaseDoubleClickEdit.cpp"
|
||||||
"AecDbCurveBase.cpp"
|
"AecDbCurveBase.cpp"
|
||||||
"AecDbEntityBase.cpp"
|
"AecDbEntityBase.cpp"
|
||||||
|
"AecDbEntityCommon.cpp"
|
||||||
"AecDbObjXDataMap.cpp"
|
"AecDbObjXDataMap.cpp"
|
||||||
"AecGiSubEntityTraits.cpp"
|
"AecGiSubEntityTraits.cpp"
|
||||||
"AecGripCback.cpp"
|
"AecGripCback.cpp"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "CCKSXDlg.h"
|
#include "CCKSXDlg.h"
|
||||||
#include "AecDbObjXDataMap.h"
|
#include "AecDbObjXDataMap.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC(CCKSXDlg, CDialog)
|
IMPLEMENT_DYNAMIC(CCKSXDlg, CDialog)
|
||||||
|
|
||||||
@@ -77,10 +78,19 @@ BOOL CCKSXDlg::OnInitDialog()
|
|||||||
|
|
||||||
void CCKSXDlg::ListXDataMap(AecDbObjXDataMap *pXDataMap)
|
void CCKSXDlg::ListXDataMap(AecDbObjXDataMap *pXDataMap)
|
||||||
{
|
{
|
||||||
if (pXDataMap != NULL)
|
if (pXDataMap == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_wndListXData.DeleteAllItems();
|
||||||
|
|
||||||
|
std::vector<CString> vecItems;
|
||||||
|
pXDataMap->List(vecItems);
|
||||||
|
|
||||||
|
// List() 每个元素输出两项:先 key(名称列),后 value(数据列)。
|
||||||
|
for (size_t i = 0; i + 1 < vecItems.size(); i += 2)
|
||||||
{
|
{
|
||||||
m_wndListXData.DeleteAllItems();
|
int nItem = m_wndListXData.InsertItem(m_wndListXData.GetItemCount(), vecItems[i]);
|
||||||
pXDataMap->List(&m_wndListXData, 0);
|
m_wndListXData.SetItemText(nItem, 1, vecItems[i + 1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2668,11 +2668,11 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
|
|||||||
nVt = xdata1.nVt;
|
nVt = xdata1.nVt;
|
||||||
switch (nVt)
|
switch (nVt)
|
||||||
{
|
{
|
||||||
case VT_I4: // 整型
|
case AecXData::kTypeInt: // 整型
|
||||||
sVal1.Format(_T("%d"),(int)xdata1.nVal);
|
sVal1.Format(_T("%d"),(int)xdata1.nVal);
|
||||||
sVal2.Format(_T("%d"),(int)xdata2.nVal);
|
sVal2.Format(_T("%d"),(int)xdata2.nVal);
|
||||||
break;
|
break;
|
||||||
case VT_UI4: //s id
|
case AecXData::kTypeSoftId: //s id
|
||||||
#ifndef _WIN64
|
#ifndef _WIN64
|
||||||
sVal1.Format(_T("%ld"),xdata1.nVal);
|
sVal1.Format(_T("%ld"),xdata1.nVal);
|
||||||
sVal2.Format(_T("%ld"),xdata2.nVal);
|
sVal2.Format(_T("%ld"),xdata2.nVal);
|
||||||
@@ -2681,7 +2681,7 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
|
|||||||
sVal2.Format(_T("%d"),xdata2.nVal);
|
sVal2.Format(_T("%d"),xdata2.nVal);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case VT_UI8: //h id
|
case AecXData::kTypeHardId: //h id
|
||||||
#ifndef _WIN64
|
#ifndef _WIN64
|
||||||
sVal1.Format(_T("%ld"),xdata1.nVal);
|
sVal1.Format(_T("%ld"),xdata1.nVal);
|
||||||
sVal2.Format(_T("%ld"),xdata2.nVal);
|
sVal2.Format(_T("%ld"),xdata2.nVal);
|
||||||
@@ -2690,33 +2690,33 @@ void CJSTZDlg::ShowToCompareList(LPCTSTR pszName,AecDbObjXDataMap& map1,AecDbObj
|
|||||||
sVal2.Format(_T("%d"),xdata2.nVal);
|
sVal2.Format(_T("%d"),xdata2.nVal);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case VT_R8: // 浮点
|
case AecXData::kTypeDouble: // 浮点
|
||||||
sVal1.Format(_T("%.3f"),xdata1.dVal[0]);
|
sVal1.Format(_T("%.3f"),xdata1.dVal[0]);
|
||||||
sVal2.Format(_T("%.3f"),xdata2.dVal[0]);
|
sVal2.Format(_T("%.3f"),xdata2.dVal[0]);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8): // 点
|
case AecXData::kTypePoint: // 点
|
||||||
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
||||||
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8 + 1): // cad变化点
|
case AecXData::kTypePointWorld: // cad变化点
|
||||||
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
||||||
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8 + 2): // 向量
|
case AecXData::kTypeVector: // 向量
|
||||||
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
||||||
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8 + 3): // 变化向量
|
case AecXData::kTypeVectorWorld: // 变化向量
|
||||||
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
sVal1.Format(_T("%.3f,%.3f,%.3f"),xdata1.dVal[0],xdata1.dVal[1],xdata1.dVal[2]);
|
||||||
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
sVal2.Format(_T("%.3f,%.3f,%.3f"),xdata2.dVal[0],xdata2.dVal[1],xdata2.dVal[2]);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8 + 4): // 矩阵
|
case AecXData::kTypeMatrix: // 矩阵
|
||||||
sVal1.Format(_T("%s"),xdata1.pszVal);
|
sVal1 = AecDbObjXDataMap::MatrixToString(xdata1);
|
||||||
sVal2.Format(_T("%s"),xdata2.pszVal);
|
sVal2 = AecDbObjXDataMap::MatrixToString(xdata2);
|
||||||
break;
|
break;
|
||||||
case (VT_BYREF | VT_R8 + 5): // binarydata
|
case AecXData::kTypeBinary: // binarydata
|
||||||
break;
|
break;
|
||||||
case VT_BSTR: // 字符串
|
case AecXData::kTypeString: // 字符串
|
||||||
sVal1.Format(_T("%s"),xdata1.pszVal);
|
sVal1.Format(_T("%s"),xdata1.pszVal);
|
||||||
sVal2.Format(_T("%s"),xdata2.pszVal);
|
sVal2.Format(_T("%s"),xdata2.pszVal);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -375,7 +375,8 @@ namespace
|
|||||||
{
|
{
|
||||||
if (!txt || !*txt) return AcDbObjectId::kNull;
|
if (!txt || !*txt) return AcDbObjectId::kNull;
|
||||||
const AcGePoint2d q = apply(p);
|
const AcGePoint2d q = apply(p);
|
||||||
AcDbText *pEnt = new AcDbText(AcGePoint3d(q.x, q.y, 0.0), txt, AcDbObjectId::kNull, h, 0.0);
|
const double hh = h * m_scale; // 文字高度也要随缩放变换(与 addCircle 的 r*m_scale 一致)
|
||||||
|
AcDbText *pEnt = new AcDbText(AcGePoint3d(q.x, q.y, 0.0), txt, AcDbObjectId::kNull, hh, 0.0);
|
||||||
return append(pEnt, layer);
|
return append(pEnt, layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,7 +385,8 @@ namespace
|
|||||||
{
|
{
|
||||||
if (!txt || !*txt) return AcDbObjectId::kNull;
|
if (!txt || !*txt) return AcDbObjectId::kNull;
|
||||||
const AcGePoint2d q = apply(p);
|
const AcGePoint2d q = apply(p);
|
||||||
AcDbText *pEnt = new AcDbText(AcGePoint3d(q.x, q.y, 0.0), txt, AcDbObjectId::kNull, h, rot);
|
const double hh = h * m_scale; // 文字高度也要随缩放变换
|
||||||
|
AcDbText *pEnt = new AcDbText(AcGePoint3d(q.x, q.y, 0.0), txt, AcDbObjectId::kNull, hh, rot);
|
||||||
if (hMode == 1) pEnt->setHorizontalMode(AcDb::kTextCenter);
|
if (hMode == 1) pEnt->setHorizontalMode(AcDb::kTextCenter);
|
||||||
else if (hMode == 2) pEnt->setHorizontalMode(AcDb::kTextRight);
|
else if (hMode == 2) pEnt->setHorizontalMode(AcDb::kTextRight);
|
||||||
pEnt->setVerticalMode(AcDb::kTextVertMid);
|
pEnt->setVerticalMode(AcDb::kTextVertMid);
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ namespace
|
|||||||
for (AecDbObjXDataMap::It it = pMap->Begin(); it != pMap->End(); ++it)
|
for (AecDbObjXDataMap::It it = pMap->Begin(); it != pMap->End(); ++it)
|
||||||
{
|
{
|
||||||
const AecXData &xd = it->second;
|
const AecXData &xd = it->second;
|
||||||
if (xd.nVt == VT_BSTR && xd.pszVal)
|
if (xd.nVt == AecXData::kTypeString && xd.pszVal)
|
||||||
{
|
{
|
||||||
CString s(xd.pszVal);
|
CString s(xd.pszVal);
|
||||||
s.Trim();
|
s.Trim();
|
||||||
|
|||||||
@@ -937,12 +937,12 @@ BOOL AecDbAssembleWell::CalValue(const CString &sExp,double& dRes) const
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
//替换
|
//替换
|
||||||
if (cVal.nVt == VT_I4)
|
if (cVal.nVt == AecXData::kTypeInt)
|
||||||
{
|
{
|
||||||
cal.SetVariableData(sKey, 1.0 * cVal.nVal);
|
cal.SetVariableData(sKey, 1.0 * cVal.nVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cVal.nVt == VT_R8)
|
if (cVal.nVt == AecXData::kTypeDouble)
|
||||||
{
|
{
|
||||||
cal.SetVariableData(sKey, cVal.dVal[0]);
|
cal.SetVariableData(sKey, cVal.dVal[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#include "CoreTools.h"
|
#include "CoreTools.h"
|
||||||
#include "HlrCutOption.h"
|
#include "HlrCutOption.h"
|
||||||
#include "aecdbewpipebase.h"
|
#include "aecdbewpipebase.h"
|
||||||
|
#include "AecDbEwFitting.h"
|
||||||
|
#include "AecDbClimbStair.h"
|
||||||
#include "compare_double.h"
|
#include "compare_double.h"
|
||||||
#include "simpleproperty.h"
|
#include "simpleproperty.h"
|
||||||
#include "hlrcommands.h"
|
#include "hlrcommands.h"
|
||||||
@@ -534,6 +536,133 @@ namespace
|
|||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 取得指定 id 对应实体用于与 HLR 结果圆弧比较的"直径"。目前处理两类来源:
|
||||||
|
// 弯头(eElbow / eReduceElbow):带法兰(连接类型 3 法兰管 / 5 法兰管线)时取法兰外径,
|
||||||
|
// 否则取弯头画法直径;
|
||||||
|
// 爬梯(AecDbClimbStair):取踏管直径。
|
||||||
|
// 其他实体返回 false(不处理)。
|
||||||
|
bool getSourceDiameter(const AcDbObjectId &id, double &dDiameter)
|
||||||
|
{
|
||||||
|
dDiameter = 0.0;
|
||||||
|
if (id == AcDbObjectId::kNull)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
AcDbEntityPointer ent(id, AcDb::kForRead);
|
||||||
|
if (ent.openStatus() != Acad::eOk)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
AcDbEntity *pEnt(ent);
|
||||||
|
|
||||||
|
// 爬梯:踏管直径
|
||||||
|
AecDbClimbStair *pStair(AecDbClimbStair::cast(pEnt));
|
||||||
|
if (pStair != NULL)
|
||||||
|
{
|
||||||
|
ClimbStair data;
|
||||||
|
memset(&data, 0, sizeof(ClimbStair));
|
||||||
|
pStair->GetClimbStairData(data);
|
||||||
|
dDiameter = data.dd;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 弯头
|
||||||
|
AecDbEwFitting *pFit(AecDbEwFitting::cast(pEnt));
|
||||||
|
if (pFit == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const EFittingType eType(pFit->GetFittingType());
|
||||||
|
if (eType != eElbow && eType != eReduceElbow)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
WPipe::PipeParam *pParam(pFit->GetPipeParam());
|
||||||
|
if (pParam == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const bool bFlange(pParam->m_nConnectType == 3 || pParam->m_nConnectType == 5);
|
||||||
|
dDiameter = bFlange ? pParam->m_dInterfaceD : pParam->m_dD;
|
||||||
|
|
||||||
|
delete pParam;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// result2 的键是"产生该批结果的实体指针",这类实体没有 id(是补充实体)。
|
||||||
|
// 补充实体由某个数据库实体产生,mpAdditional 记录了"数据库实体id -> 其产生的补充实体",
|
||||||
|
// 因此需反查该指针归属的数据库实体 id,再用该 id 判断类型。
|
||||||
|
// 找不到归属(例如构筑物融合后不在数据库中的实体)时返回 kNull。
|
||||||
|
AcDbObjectId fittingIdOfResultKey(AcDbEntity *pSrc, const IDMapEntities &mpAdditional)
|
||||||
|
{
|
||||||
|
if (pSrc == NULL)
|
||||||
|
return AcDbObjectId::kNull;
|
||||||
|
|
||||||
|
IDMapEntities::const_iterator it(mpAdditional.begin());
|
||||||
|
for (; it != mpAdditional.end(); ++it)
|
||||||
|
{
|
||||||
|
if (it->second.find(pSrc) != -1) // pSrc 是该 id 产生的补充实体
|
||||||
|
return it->first;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AcDbObjectId::kNull;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断 HLR 结果实体是否为需要删除的"退化圆弧":
|
||||||
|
// 实体是 AcDbArc、圆心角为 PI(HLR 计算圆心角溢出后的特征),
|
||||||
|
// 且其直径大于来源实体的直径(超出实体本身范围,属错误结果)。
|
||||||
|
bool isDegenerateSourceArc(AcDbEntity *pEnt, const double &dSourceDiameter)
|
||||||
|
{
|
||||||
|
AcDbArc *pArc(AcDbArc::cast(pEnt));
|
||||||
|
if (pArc == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!COMPARE_DOUBLE::equal(pArc->totalAngle(), PI, 1e-9))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (dSourceDiameter <= 1.e-6) // 取不到来源直径,无法比较,不删除
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return COMPARE_DOUBLE::up_zero(pArc->radius() * 2.0 - dSourceDiameter, 1e-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 删除 result1 / result2 中由弯头或爬梯经 HLR 计算产生的退化圆弧。
|
||||||
|
// result1 的键是数据库实体 id,直接取该 id 对应实体的直径;
|
||||||
|
// result2 的键是无 id 的补充实体指针,需经 mpAdditional 反查归属的数据库实体 id 再取直径。
|
||||||
|
void removeDegenerateArcs(IDMapEntities &result1
|
||||||
|
, EntMapEntities &result2
|
||||||
|
, const IDMapEntities &mpAdditional)
|
||||||
|
{
|
||||||
|
IDMapEntities::iterator it(result1.begin());
|
||||||
|
for (; it != result1.end(); ++it)
|
||||||
|
{
|
||||||
|
double dDiameter(0.0);
|
||||||
|
if (!getSourceDiameter(it->first, dDiameter))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int i(it->second.length() - 1); i >= 0; --i)
|
||||||
|
{
|
||||||
|
if (isDegenerateSourceArc(it->second[i], dDiameter))
|
||||||
|
{
|
||||||
|
delete it->second[i];
|
||||||
|
it->second.removeAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EntMapEntities::iterator it2(result2.begin());
|
||||||
|
for (; it2 != result2.end(); ++it2)
|
||||||
|
{
|
||||||
|
double dDiameter(0.0);
|
||||||
|
if (!getSourceDiameter(fittingIdOfResultKey(it2->first, mpAdditional), dDiameter))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int i(it2->second.length() - 1); i >= 0; --i)
|
||||||
|
{
|
||||||
|
if (isDegenerateSourceArc(it2->second[i], dDiameter))
|
||||||
|
{
|
||||||
|
delete it2->second[i];
|
||||||
|
it2->second.removeAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool zeroLength(AcDbCurve *pCrv, const double &tol)
|
bool zeroLength(AcDbCurve *pCrv, const double &tol)
|
||||||
{
|
{
|
||||||
double dPEnd(.0), dDist(.0);
|
double dPEnd(.0), dDist(.0);
|
||||||
@@ -1966,6 +2095,9 @@ void AecDbXCamera::hlrCalc(AcDbObjectIdArray &arIds
|
|||||||
|
|
||||||
HlrCalc(arIds, arAdditional_all, pVp.get(), control, result1, result2);
|
HlrCalc(arIds, arAdditional_all, pVp.get(), control, result1, result2);
|
||||||
|
|
||||||
|
// 删除由弯头或爬梯经 HLR 计算产生的退化圆弧(圆心角溢出为 PI)。
|
||||||
|
removeDegenerateArcs(result1, result2, mpAdditional);
|
||||||
|
|
||||||
if (result1.empty() && result2.empty())
|
if (result1.empty() && result2.empty())
|
||||||
{
|
{
|
||||||
// 如果实体的PreprocessForHlr函数内,设置了 HLR_CALC,从而影响实体的 Draw3d 函数的返回
|
// 如果实体的PreprocessForHlr函数内,设置了 HLR_CALC,从而影响实体的 Draw3d 函数的返回
|
||||||
|
|||||||
@@ -16649,6 +16649,7 @@ void AecDbEwFitting::ProcessHlrResult(const AcArray<AcDbEntity *> &ar
|
|||||||
output.append(pBlk);
|
output.append(pBlk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Clean3DBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
|
|||||||
@@ -1756,7 +1756,7 @@ Acad::ErrorStatus AecDbEwPipe::TransformHole(const AcGeMatrix3d& xform)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
|
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -1661,7 +1661,7 @@ void AecDbEwPipeBase::GetAssocHandleObjs(AcDbObjectIdArray& arIds)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!m_mapSpecXData.GetNext(it, sKey,cVal)) break;
|
if (!m_mapSpecXData.GetNext(it, sKey,cVal)) break;
|
||||||
if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR )//可能的实体句柄
|
if ( sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString )//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
@@ -1826,7 +1826,7 @@ Acad::ErrorStatus AecDbEwPipeBase::subTransformBy(const AcGeMatrix3d& xform)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
|
if (!m_mapSpecXData.GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ void HlrCutOption::ProcessHlrResult(const AcDbEntity *pE
|
|||||||
std::vector<CString> strs;
|
std::vector<CString> strs;
|
||||||
for (AecDbObjXDataMap::It it = testData.Begin(); it != testData.End(); ++it)
|
for (AecDbObjXDataMap::It it = testData.Begin(); it != testData.End(); ++it)
|
||||||
{
|
{
|
||||||
if (it->second.nVt == (VT_BYREF | VT_R8 + 5))
|
if (it->second.nVt == AecXData::kTypeBinary)
|
||||||
strs.push_back(it->first);
|
strs.push_back(it->first);
|
||||||
}
|
}
|
||||||
for (size_t i(0); i < strs.size(); ++i)
|
for (size_t i(0); i < strs.size(); ++i)
|
||||||
|
|||||||
@@ -875,12 +875,12 @@ BOOL AecDbPipeHanger::CLC(CString &sTxt)
|
|||||||
for (; it != end; )
|
for (; it != end; )
|
||||||
{
|
{
|
||||||
m_mapSpecXData.GetNext(it, sKey, xData);
|
m_mapSpecXData.GetNext(it, sKey, xData);
|
||||||
if (xData.nVt == VT_UI4 ||
|
if (xData.nVt == AecXData::kTypeSoftId ||
|
||||||
xData.nVt == VT_I4)
|
xData.nVt == AecXData::kTypeInt)
|
||||||
{
|
{
|
||||||
cal.SetVariableData(sKey, 1.0 * xData.nVal);
|
cal.SetVariableData(sKey, 1.0 * xData.nVal);
|
||||||
}
|
}
|
||||||
else if (xData.nVt == VT_R8)
|
else if (xData.nVt == AecXData::kTypeDouble)
|
||||||
{
|
{
|
||||||
cal.SetVariableData(sKey, xData.dVal[0]);
|
cal.SetVariableData(sKey, xData.dVal[0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2318,7 +2318,7 @@ void AecDbECableLine::RemoveHolePipe(AecDbECableTray* pWPipe)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -2888,7 +2888,7 @@ void AecDbDuctLine::RemoveHolePipe(AecDbHvacDuct* pWPipe)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -62,13 +62,13 @@ BOOL CDLGArribtEdit::OnInitDialog()
|
|||||||
{
|
{
|
||||||
iIndex = m_wndLstAttrib.InsertItem(0, sKey);
|
iIndex = m_wndLstAttrib.InsertItem(0, sKey);
|
||||||
|
|
||||||
if (cVal.nVt == VT_BSTR)
|
if (cVal.nVt == AecXData::kTypeString)
|
||||||
sKey.Format(_T("%s"), cVal.pszVal);
|
sKey.Format(_T("%s"), cVal.pszVal);
|
||||||
else if (cVal.nVt == VT_I4)
|
else if (cVal.nVt == AecXData::kTypeInt)
|
||||||
sKey.Format(_T("%d"), cVal.nVal);
|
sKey.Format(_T("%d"), cVal.nVal);
|
||||||
else if (cVal.nVt == VT_R8)
|
else if (cVal.nVt == AecXData::kTypeDouble)
|
||||||
sKey.Format(_T("%g"), cVal.dVal[0]);
|
sKey.Format(_T("%g"), cVal.dVal[0]);
|
||||||
else if (cVal.nVt == (VT_BYREF | VT_R8))
|
else if (cVal.nVt == AecXData::kTypePoint)
|
||||||
sKey.Format(_T("%g,%g,%g"), cVal.dVal[0], cVal.dVal[1], cVal.dVal[2]);
|
sKey.Format(_T("%g,%g,%g"), cVal.dVal[0], cVal.dVal[1], cVal.dVal[2]);
|
||||||
|
|
||||||
m_wndLstAttrib.SetItemText(iIndex, 1, sKey);
|
m_wndLstAttrib.SetItemText(iIndex, 1, sKey);
|
||||||
@@ -203,13 +203,13 @@ void CDLGArribtEdit::OnOK()
|
|||||||
sValue = m_wndLstAttrib.GetItemText(iPos, 1);
|
sValue = m_wndLstAttrib.GetItemText(iPos, 1);
|
||||||
iVt = m_wndLstAttrib.GetItemData(iPos);
|
iVt = m_wndLstAttrib.GetItemData(iPos);
|
||||||
|
|
||||||
if (iVt == VT_BSTR)
|
if (iVt == AecXData::kTypeString)
|
||||||
m_pmapXData->SetAt(sKey, sValue);
|
m_pmapXData->SetAt(sKey, sValue);
|
||||||
else if (iVt == VT_I4)
|
else if (iVt == AecXData::kTypeInt)
|
||||||
m_pmapXData->SetAt(sKey, (int)_ttol(sValue));
|
m_pmapXData->SetAt(sKey, (int)_ttol(sValue));
|
||||||
else if (iVt == VT_R8)
|
else if (iVt == AecXData::kTypeDouble)
|
||||||
m_pmapXData->SetAt(sKey, _tcstod(sValue, NULL));
|
m_pmapXData->SetAt(sKey, _tcstod(sValue, NULL));
|
||||||
else if (iVt == (VT_BYREF | VT_R8))
|
else if (iVt == AecXData::kTypePoint)
|
||||||
{
|
{
|
||||||
pt.x = pt.y = pt.z = 0.0;
|
pt.x = pt.y = pt.z = 0.0;
|
||||||
_stscanf(sValue, _T("%lf,%lf,%lf"), &(pt.x), &(pt.y), &(pt.z));
|
_stscanf(sValue, _T("%lf,%lf,%lf"), &(pt.x), &(pt.y), &(pt.z));
|
||||||
|
|||||||
@@ -4334,7 +4334,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -312,15 +312,16 @@ void CFlangeDlg::SetAdoDb(CUIISQLiteServer *pDb)
|
|||||||
|
|
||||||
void CFlangeDlg::GetEndF1(CString &sEndF)
|
void CFlangeDlg::GetEndF1(CString &sEndF)
|
||||||
{
|
{
|
||||||
|
//端面型式在 m_arFlangeVals 的下标 5(0公称直径 1法兰外径 2法兰高度 3法兰厚度 4法兰颈 5端面1 6端面2)
|
||||||
sEndF = _T("FF");
|
sEndF = _T("FF");
|
||||||
if (m_arFlangeVals.GetSize() > 0)
|
if (m_arFlangeVals.GetSize() > 5 && !m_arFlangeVals.GetAt(5).IsEmpty())
|
||||||
sEndF = m_arFlangeVals.GetAt(0);
|
sEndF = m_arFlangeVals.GetAt(5);
|
||||||
}
|
}
|
||||||
void CFlangeDlg::GetEndF2(CString &sEndF)
|
void CFlangeDlg::GetEndF2(CString &sEndF)
|
||||||
{
|
{
|
||||||
sEndF = _T("FF");
|
sEndF = _T("FF");
|
||||||
if (m_arFlangeVals.GetSize() > 1)
|
if (m_arFlangeVals.GetSize() > 6 && !m_arFlangeVals.GetAt(6).IsEmpty())
|
||||||
sEndF = m_arFlangeVals.GetAt(1);
|
sEndF = m_arFlangeVals.GetAt(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18033,6 +18033,103 @@ void DBL_AEC_DBEWFIT()
|
|||||||
AecDbEwFitting* pEw = AecDbEwFitting::cast(pEnt);
|
AecDbEwFitting* pEw = AecDbEwFitting::cast(pEnt);
|
||||||
if (pEw != NULL)
|
if (pEw != NULL)
|
||||||
{
|
{
|
||||||
|
//法兰:双击弹出法兰对话框,把选中的法兰/垫片数据应用到该法兰对象
|
||||||
|
if (pEw->GetFittingType() == eFlange)
|
||||||
|
{
|
||||||
|
CString dbPath = FilePath::GetSysDir();
|
||||||
|
dbPath += _T("\\Plumbing.db");
|
||||||
|
|
||||||
|
CUIISQLiteServer * pADOServer = new CUIISQLiteServer;
|
||||||
|
if (!pADOServer->InitADOServer(dbPath))
|
||||||
|
{
|
||||||
|
AfxMessageBox(_T("数据库驱动加载数据库Plumbing.db失败!"));
|
||||||
|
delete pADOServer;
|
||||||
|
pEnt->close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//取当前法兰参数作为对话框初值
|
||||||
|
const AecDbObjXDataMap* pMap = pEw->GetSpecialtyData(AcDb::kForRead);
|
||||||
|
|
||||||
|
double dDN = 0.0;
|
||||||
|
pMap->GetAt(PIPE_DN, dDN);
|
||||||
|
|
||||||
|
double dPre = 1.0;
|
||||||
|
pMap->GetAt(PIPE_PRESSURE, dPre);
|
||||||
|
|
||||||
|
CString sODNo, sPro, sLevel;
|
||||||
|
pMap->GetAt(PIPE_ODSN, sODNo);
|
||||||
|
pMap->GetAt(DOC_PROJECT, sPro);
|
||||||
|
pMap->GetAt(PIPE_LEVEL, sLevel);
|
||||||
|
|
||||||
|
if (!sLevel.IsEmpty() && sPro.IsEmpty())
|
||||||
|
{
|
||||||
|
AecDbObjXDataMap xMap;
|
||||||
|
KTModelLayoutXData::ReadModelXData(KT_PIPEINIT, xMap);
|
||||||
|
xMap.GetAt(DOC_PROJECT, sPro);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
CAcModuleResourceOverride rcTmp;
|
||||||
|
CFlangeDlg flgDlg;
|
||||||
|
flgDlg.SetAdoDb(pADOServer);
|
||||||
|
flgDlg.SetDN((int)dDN);
|
||||||
|
flgDlg.SetPressure(dPre);
|
||||||
|
flgDlg.SetLevel(sODNo, sPro, sLevel);
|
||||||
|
|
||||||
|
if (IDOK == flgDlg.DoModal())
|
||||||
|
{
|
||||||
|
//提取旧的接口
|
||||||
|
pEw->GetInterface(arOldInfs);
|
||||||
|
|
||||||
|
CStringArray arValuesF, arValuesG;
|
||||||
|
flgDlg.GetFlangeValues(arValuesF);
|
||||||
|
flgDlg.GetGasketValues(arValuesG);
|
||||||
|
|
||||||
|
//列: 0公称直径 1法兰外径 2法兰高度 3法兰厚度 4法兰颈 5端面
|
||||||
|
if (arValuesF.GetSize() >= 5)
|
||||||
|
{
|
||||||
|
double dWD = _ttof(arValuesF.GetAt(1)); //法兰盘外径
|
||||||
|
double dWh = _ttof(arValuesF.GetAt(3)); //法兰盘厚度
|
||||||
|
double dThk = _ttof(arValuesF.GetAt(3)); //法兰总厚
|
||||||
|
double dN = _ttof(arValuesF.GetAt(4)); //法兰颈
|
||||||
|
|
||||||
|
CString sEndF = _T("FF");
|
||||||
|
if (arValuesF.GetSize() > 5) sEndF = arValuesF.GetAt(5);
|
||||||
|
|
||||||
|
pEw->upgradeOpen();
|
||||||
|
|
||||||
|
AecDbObjXDataMap* pXDataMapSrc = pEw->GetSpecialtyData(AcDb::kForWrite);
|
||||||
|
|
||||||
|
pXDataMapSrc->SetAt(PIPE_WD, dWD);
|
||||||
|
pXDataMapSrc->SetAt(PIPE_WTHICK, dWh);
|
||||||
|
pXDataMapSrc->SetAt(PIPE_THICK, dThk);
|
||||||
|
pXDataMapSrc->SetAt(PIPE_N, dN);
|
||||||
|
pXDataMapSrc->SetAt(PIPE_FLANGF, sEndF);
|
||||||
|
|
||||||
|
if (arValuesG.GetSize() > 4)
|
||||||
|
{
|
||||||
|
pXDataMapSrc->SetAt(PIPE_GASKETM, arValuesG.GetAt(1));
|
||||||
|
pXDataMapSrc->SetAt(PIPE_PRESSURE, _ttof(arValuesG.GetAt(2)));
|
||||||
|
pXDataMapSrc->RemoveAt(PIPE_GASKET);
|
||||||
|
pXDataMapSrc->SetAt(PIPE_GASKET, _ttof(arValuesG.GetAt(3)));
|
||||||
|
pXDataMapSrc->SetAt(PIPE_GASKETDSC, arValuesG.GetAt(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
pEw->ReCreateDraw2d();
|
||||||
|
pEw->ReCreateDraw3d();
|
||||||
|
|
||||||
|
pEw->downgradeOpen();
|
||||||
|
|
||||||
|
pEw->GetInterface(arNewInfs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete pADOServer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
WPipe::PipeParam* pParam = NULL;
|
WPipe::PipeParam* pParam = NULL;
|
||||||
pParam = pEw->GetPipeParam();
|
pParam = pEw->GetPipeParam();
|
||||||
|
|
||||||
@@ -18094,6 +18191,7 @@ void DBL_AEC_DBEWFIT()
|
|||||||
pEw->GetInterface(arNewInfs);
|
pEw->GetInterface(arNewInfs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pEnt->close();
|
pEnt->close();
|
||||||
|
|
||||||
|
|||||||
@@ -4082,7 +4082,7 @@ void TDbPipeLine::RemoveHolePipe(AecDbEwPipe* pWPipe)
|
|||||||
for (; it != end;)
|
for (; it != end;)
|
||||||
{
|
{
|
||||||
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
if (!pXDatMap->GetNext(it, sKey, cVal)) break;
|
||||||
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == VT_BSTR)//可能的实体句柄
|
if (sKey.Find(_T("$H")) != -1 && cVal.nVt == AecXData::kTypeString)//可能的实体句柄
|
||||||
{
|
{
|
||||||
AcDbHandle handle(cVal.pszVal);
|
AcDbHandle handle(cVal.pszVal);
|
||||||
|
|
||||||
|
|||||||
@@ -752,7 +752,7 @@ void CGJFCDlg::CreateChildItem(AecDbObjXDataMap* pXData)
|
|||||||
for (; it != end; )
|
for (; it != end; )
|
||||||
{
|
{
|
||||||
if (!pXData->GetNext(it, sKey, cVal)) break;
|
if (!pXData->GetNext(it, sKey, cVal)) break;
|
||||||
if (cVal.nVt == VT_BSTR)
|
if (cVal.nVt == AecXData::kTypeString)
|
||||||
{
|
{
|
||||||
sHandle = cVal.pszVal;
|
sHandle = cVal.pszVal;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ void CGJFCNewDlg::OnBnClickedButton10()
|
|||||||
{
|
{
|
||||||
memset(&cVal,0,sizeof(AecXData));
|
memset(&cVal,0,sizeof(AecXData));
|
||||||
if (!xData.GetNext(it, sKey, cVal)) break;
|
if (!xData.GetNext(it, sKey, cVal)) break;
|
||||||
if (cVal.nVt == VT_BSTR)
|
if (cVal.nVt == AecXData::kTypeString)
|
||||||
{
|
{
|
||||||
sHandle = cVal.pszVal;
|
sHandle = cVal.pszVal;
|
||||||
}
|
}
|
||||||
@@ -456,7 +456,7 @@ void CGJFCNewDlg::OnBnClickedButton10()
|
|||||||
{
|
{
|
||||||
memset(&cVal,0,sizeof(AecXData));
|
memset(&cVal,0,sizeof(AecXData));
|
||||||
if (!xData.GetNext(it, sKey, cVal)) break;
|
if (!xData.GetNext(it, sKey, cVal)) break;
|
||||||
if (cVal.nVt == VT_BSTR)
|
if (cVal.nVt == AecXData::kTypeString)
|
||||||
{
|
{
|
||||||
sHandle = cVal.pszVal;
|
sHandle = cVal.pszVal;
|
||||||
}
|
}
|
||||||
@@ -984,7 +984,7 @@ void CGJFCNewDlg::CreateChildItem(AecDbObjXDataMap* pXData)
|
|||||||
if (!pXData->GetNext(it, sKey, cVal))
|
if (!pXData->GetNext(it, sKey, cVal))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (cVal.nVt == VT_BSTR)
|
if (cVal.nVt == AecXData::kTypeString)
|
||||||
{
|
{
|
||||||
sHandle = cVal.pszVal;
|
sHandle = cVal.pszVal;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "AecSubDef.h"
|
#include "AecSubDef.h"
|
||||||
#include "shJson.h"
|
#include "shJson.h"
|
||||||
#include "EarThwormDef.h"
|
#include "EarThwormDef.h"
|
||||||
|
#include "AecDbEntityCommon.h"
|
||||||
|
|
||||||
#pragma warning(disable: 4275 4251)
|
#pragma warning(disable: 4275 4251)
|
||||||
|
|
||||||
@@ -21,71 +22,15 @@ class AecDbObjXDataMap;
|
|||||||
|
|
||||||
class AcGiViewDraw;
|
class AcGiViewDraw;
|
||||||
class AcGiExplodeDraw;
|
class AcGiExplodeDraw;
|
||||||
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
|
class AECDLLIMPEXP AecDbCurveBase : public AcDbCurve, public AecDbEntityCommon
|
||||||
class AECDLLIMPEXP AecDbCurveBase : public AcDbCurve
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
template<typename T>
|
ACRX_DECLARE_MEMBERS(AecDbCurveBase);
|
||||||
BOOL GetAt(LPCTSTR pszKey, T &va) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->GetAt(pszKey, va);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, T1 va1, T2 va2) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->GetAt(pszKey, va1, va2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, TCHAR (&va)[N]) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
CString s;
|
|
||||||
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
|
||||||
|
|
||||||
_tcsncpy_s(va, N, s, N - 1);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, LPTSTR va) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
CString s;
|
|
||||||
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
|
||||||
|
|
||||||
_tcsncpy_s(va, N, s, N - 1);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
BOOL SetAt(LPCTSTR pszKey, T va)
|
|
||||||
{
|
|
||||||
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->SetAt(pszKey, va);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
BOOL SetAt(LPCTSTR pszKey, T1 va1, T2 va2)
|
|
||||||
{
|
|
||||||
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->SetAt(pszKey, va1, va2);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
virtual AcDbEntity *GetMe() { return this; }
|
||||||
ACRX_DECLARE_MEMBERS(AecDbCurveBase);
|
virtual const AcDbEntity *GetMe() const { return this; }
|
||||||
|
virtual bool IsThisMe(const AcDbEntity *pEnt) const { return AecDbCurveBase::cast(pEnt) != NULL; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AecDbCurveBase(void);
|
AecDbCurveBase(void);
|
||||||
@@ -113,17 +58,17 @@ public:
|
|||||||
virtual Acad::ErrorStatus setColorIndex(Adesk::UInt16 color,Adesk::Boolean doSubents = true);
|
virtual Acad::ErrorStatus setColorIndex(Adesk::UInt16 color,Adesk::Boolean doSubents = true);
|
||||||
|
|
||||||
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
|
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
|
||||||
AcDb::Intersect intType,
|
AcDb::Intersect intType,
|
||||||
AcGePoint3dArray& points,
|
AcGePoint3dArray& points,
|
||||||
INT_PTR thisGsMarker,
|
INT_PTR thisGsMarker,
|
||||||
INT_PTR otherGsMarker) const;
|
INT_PTR otherGsMarker) const;
|
||||||
|
|
||||||
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
|
virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent,
|
||||||
AcDb::Intersect intType,
|
AcDb::Intersect intType,
|
||||||
const AcGePlane& projPlane,
|
const AcGePlane& projPlane,
|
||||||
AcGePoint3dArray& points,
|
AcGePoint3dArray& points,
|
||||||
INT_PTR thisGsMarker,
|
INT_PTR thisGsMarker,
|
||||||
INT_PTR otherGsMarker) const;
|
INT_PTR otherGsMarker) const;
|
||||||
|
|
||||||
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue);
|
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue);
|
||||||
|
|
||||||
@@ -230,88 +175,26 @@ public:
|
|||||||
AcDbIdMapping& idMap,
|
AcDbIdMapping& idMap,
|
||||||
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual Acad::ErrorStatus CallAcDbWblockClone(AcRxObject* pOwnerObject,
|
||||||
|
AcDbObject*& pClonedObject,
|
||||||
|
AcDbIdMapping& idMap,
|
||||||
|
Adesk::Boolean isPrimary) const;
|
||||||
|
|
||||||
|
// 桥:回到具体实体自己的 subWorldDraw(子类可能重写,saveAs 的代理分支要用)。
|
||||||
|
// subWorldDraw 在 AcGiDrawable 里是 protected,本类取不到,由两个根转调。
|
||||||
|
virtual Adesk::Boolean CallWorldDraw(AcGiWorldDraw* pWd);
|
||||||
|
|
||||||
|
public:
|
||||||
virtual Acad::ErrorStatus setTransparency(const AcCmTransparency &trans,
|
virtual Acad::ErrorStatus setTransparency(const AcCmTransparency &trans,
|
||||||
Adesk::Boolean doSubents = true);
|
Adesk::Boolean doSubents = true);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//获取当前显示模式
|
|
||||||
int GetDrawDimCur() const;
|
|
||||||
|
|
||||||
//专业数据 和绘制设置
|
|
||||||
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite) = 0;
|
|
||||||
virtual const AecDbObjXDataMap* GetSpecialtyData() const = 0;
|
|
||||||
|
|
||||||
//获取二维视图显示的图形
|
|
||||||
virtual int GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const;
|
|
||||||
|
|
||||||
//获取三维显示图形
|
|
||||||
virtual int GetDraw3dables(AcDbVoidPtrArray& arEntPtrs,bool bWriteBimInfo = false ) const;
|
|
||||||
|
|
||||||
//剖切提取
|
|
||||||
virtual int GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const;
|
|
||||||
|
|
||||||
//剖切填充根据材质获取样式
|
|
||||||
bool GetSectionHatchPattern(CString& sPattern) const;
|
|
||||||
|
|
||||||
Acad::ErrorStatus ReCreateDraw2d();
|
|
||||||
Acad::ErrorStatus ReCreateDraw3d();
|
|
||||||
|
|
||||||
virtual double GetVolume(bool bIsBody = false) const;
|
|
||||||
|
|
||||||
virtual int ComparedTo(AecDbCurveBase* pCurOther) const;
|
virtual int ComparedTo(AecDbCurveBase* pCurOther) const;
|
||||||
|
|
||||||
virtual void SetActive(bool bActive){};
|
|
||||||
virtual bool IsActive() const{return false;}
|
|
||||||
virtual void NewGUID() {};
|
|
||||||
|
|
||||||
// 导出json
|
|
||||||
virtual SHJson::WValue& ToJson(bool bExprotGeo = true) const;
|
|
||||||
// 通过json创建
|
|
||||||
virtual bool ByJson(const SHJson::WValue &v);
|
|
||||||
|
|
||||||
// 得到实体唯一得名字,revit 通过这个字符串来判断是否有同样得实体
|
|
||||||
// 如果有,则在revit中可以生成一个族来替代这些同样得实体,以加快速度
|
|
||||||
virtual CString getUniqueName() const;
|
|
||||||
|
|
||||||
double GetArea() const;
|
double GetArea() const;
|
||||||
|
|
||||||
void Add3DBoolSubtract(AcDb3dSolid* pSolidBlackHole);
|
|
||||||
void Remove3DBoolSubtract();
|
|
||||||
|
|
||||||
virtual AcDb3dSolid* GetBlackHole() const;
|
|
||||||
void AddBlackHole(AcDbObjectId& idHole);
|
|
||||||
void RemoveBlackHole(AcDbObjectId& idHole);
|
|
||||||
void DrawBlackHole(AcDbEntity* pSolidEnt) const;
|
|
||||||
|
|
||||||
void UpdateDrableSpecData(LPCTSTR pszApp,LPCTSTR pszKey,CString& sVal);
|
|
||||||
|
|
||||||
virtual bool GetBimInfoTip(CString& sInfoTip) const;
|
|
||||||
|
|
||||||
// 为方便用户查询实体的属性,可以重载此函数,目前,此函数使用在“实体快速选择”功能上
|
|
||||||
virtual bool GetProperties(SimpleProperty::PropertySetByIndex &porpertys) const;
|
|
||||||
virtual bool SetProperties(SimpleProperty::PropertySetByName &porpertys);
|
|
||||||
|
|
||||||
//用户级别的数据调用消息
|
|
||||||
virtual bool SendUserData(struct resbuf *pRb);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//动态绘制状态记录值
|
|
||||||
ExplodeOrDrawType m_eExplodeOrDrawType;
|
|
||||||
|
|
||||||
//控制全局的所有实体的显示模式
|
|
||||||
static int GetDrawMode();
|
|
||||||
static void SetDrawMode(int nMode);
|
|
||||||
static void BackupColorIndex(AcDbEntity* pEnt);
|
|
||||||
static int SetBackupColorIndex(AcDbEntity* pEnt);
|
|
||||||
|
|
||||||
//获取炸碎2D/3d模式
|
|
||||||
int GetExplodeMode() const;
|
|
||||||
|
|
||||||
//获取显示维度 0--NONE; 1--2D; 2--3D; 3--2D&3D
|
|
||||||
int GetDrawDimOnType(int nDrawMode, int nDrawType) const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual Acad::ErrorStatus SetBaseCurve(const AcDbCurve* pDbCurve);
|
virtual Acad::ErrorStatus SetBaseCurve(const AcDbCurve* pDbCurve);
|
||||||
@@ -319,91 +202,7 @@ protected:
|
|||||||
//返回原生Curve,不可以删除
|
//返回原生Curve,不可以删除
|
||||||
virtual AcDbCurve* GetNativeCurve() const;
|
virtual AcDbCurve* GetNativeCurve() const;
|
||||||
|
|
||||||
//以下需要 AEC 派生
|
|
||||||
virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const;
|
|
||||||
|
|
||||||
virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const;
|
|
||||||
|
|
||||||
short m_nDrawDimCur;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
//清理图元的特定writeenable
|
|
||||||
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
|
|
||||||
|
|
||||||
//2023-6-26 增加单击夹点发送命令DBL_DXF
|
|
||||||
virtual bool GetPositionGrip(int nIndex, AecGripData*& pGrip) const;
|
|
||||||
bool SubAddHitEditGrip(AcDbGripDataPtrArray &grips) const;
|
|
||||||
bool HitOnGripEdit(const AcDbVoidPtrArray &gripAppData);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool Draw3DBuffers(AcGiDraw &dc)const;
|
// 曲线族特有:绘制时按宿主图层/颜色设置缓存实体(Common 里声明为 virtual)
|
||||||
bool Draw2DBuffers(AcGiDraw &dc)const;
|
virtual bool Draw2DBuffers(AcGiDraw &dc)const;
|
||||||
|
|
||||||
const AcDbVoidPtrArray& Get3DBuffer()const;
|
|
||||||
const AcDbVoidPtrArray& Get2DBuffer()const;
|
|
||||||
|
|
||||||
bool Has3DBuffer()const;
|
|
||||||
bool Has2DBuffer()const;
|
|
||||||
|
|
||||||
void Add3DBuffer(AcDbEntity *pEnt)const;
|
|
||||||
void Add2DBuffer(AcDbEntity *pEnt)const;
|
|
||||||
|
|
||||||
bool IsIn2DBuffer(AcDbEntity* pEnt) const;
|
|
||||||
bool IsIn3DBuffer(AcDbEntity* pEnt) const;
|
|
||||||
|
|
||||||
void Add3DBuffer(const AcDbVoidPtrArray &arr)const;
|
|
||||||
void Add2DBuffer(const AcDbVoidPtrArray &arr)const;
|
|
||||||
|
|
||||||
void Clean3DBuffer()const;
|
|
||||||
void Clean2DBuffer()const;
|
|
||||||
|
|
||||||
void Clean3DBufferNoDel()const;
|
|
||||||
void Clean2DBufferNoDel()const;
|
|
||||||
|
|
||||||
void BoolSubtractHide() const;
|
|
||||||
|
|
||||||
Acad::ErrorStatus subGet3dGeomExtents(AcDbExtents &extents) const;
|
|
||||||
|
|
||||||
/*
|
|
||||||
hlr计算,会默认调用实体的 Draw3d 函数,得到绘制的结果。
|
|
||||||
但是,对与有些实体,并不够用,还需要补充一些
|
|
||||||
比如:管线的中心线和梯度符号等等
|
|
||||||
*/
|
|
||||||
virtual void PreprocessForHlr(const AcGePoint3d &ptPlnO
|
|
||||||
, const AcGeVector3d &vtPlnN
|
|
||||||
, AcArray<AcDbEntity *> &ar) const;
|
|
||||||
/*
|
|
||||||
此函数只修改 ar内的实体的 图层、线型、颜色, 但线宽不处理
|
|
||||||
如有其他要求,重载
|
|
||||||
|
|
||||||
ar 是 hlr 通过调用实体的Draw3d函数得到的结果
|
|
||||||
|
|
||||||
preAr 中的 first(AcDbEntity*) 来自于 “PreprocessForHlr” 函数得到的实体指针
|
|
||||||
preAr 中的 second 来自于 first 经过 hlr 计算之后的结果
|
|
||||||
基类不处理 preAr
|
|
||||||
*/
|
|
||||||
virtual void ProcessHlrResult(const AcArray<AcDbEntity*> &ar
|
|
||||||
, const std::map<AcDbEntity*, AcArray<AcDbEntity*>> &preAr
|
|
||||||
, AcArray<AcDbEntity*> &output) const;
|
|
||||||
public:
|
|
||||||
template <class K> static BOOL CopyObject(const K &src, K &dest)
|
|
||||||
{
|
|
||||||
AcDbDeepCloneFiler filer;
|
|
||||||
BOOL bRet = FALSE;
|
|
||||||
if (src.dwgOutFields(&filer) == Acad::eOk)
|
|
||||||
{
|
|
||||||
filer.seek(0L, AcDb::kSeekFromStart);
|
|
||||||
bRet = (dest.dwgInFields(&filer) == Acad::eOk);
|
|
||||||
}
|
|
||||||
return bRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SplitStrintToArray(LPCTSTR pszDescr, CStringArray & arInfo, TCHAR tcSpace);
|
|
||||||
static AcDbPolyline* StringToPolyline(LPCTSTR pszPoint2ds);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// 以下为绘制缓存部分,分为2D和3D两部分
|
|
||||||
mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs_;//临时缓存 俯视图
|
|
||||||
mutable AcDbVoidPtrArray m_ar3DDrableBufPtrs_;//临时缓存
|
|
||||||
mutable SHJson::WValue m_json;
|
|
||||||
};
|
};
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "AecSubDef.h"
|
#include "AecSubDef.h"
|
||||||
#include "shJson.h"
|
#include "shJson.h"
|
||||||
#include "EarThwormDef.h"
|
#include "EarThwormDef.h"
|
||||||
|
#include "AecDbEntityCommon.h"
|
||||||
|
|
||||||
#if ARX > 25
|
#if ARX > 25
|
||||||
#include "AecDbObjXDataMap.h"
|
#include "AecDbObjXDataMap.h"
|
||||||
@@ -24,70 +25,16 @@ class AcGiViewDraw;
|
|||||||
class AcGiExplodeDraw;
|
class AcGiExplodeDraw;
|
||||||
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
|
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
|
||||||
|
|
||||||
class AECDLLIMPEXP AecDbEntityBase : public AcDbEntity
|
class AECDLLIMPEXP AecDbEntityBase : public AcDbEntity, public AecDbEntityCommon
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
template<typename T>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, T &va) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->GetAt(pszKey, va);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, T1 va1, T2 va2) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->GetAt(pszKey, va1, va2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, TCHAR(&va)[N]) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
CString s;
|
|
||||||
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
|
||||||
|
|
||||||
_tcsncpy_s(va, N, s, N - 1);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <int N>
|
|
||||||
BOOL GetAt(LPCTSTR pszKey, LPTSTR va) const
|
|
||||||
{
|
|
||||||
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
CString s;
|
|
||||||
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
|
||||||
|
|
||||||
_tcsncpy_s(va, N, s, N - 1);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
BOOL SetAt(LPCTSTR pszKey, T va)
|
|
||||||
{
|
|
||||||
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->SetAt(pszKey, va);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
BOOL SetAt(LPCTSTR pszKey, T1 va1, T2 va2)
|
|
||||||
{
|
|
||||||
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
|
||||||
if (!pMap) return FALSE;
|
|
||||||
return pMap->SetAt(pszKey, va1, va2);
|
|
||||||
}
|
|
||||||
public:
|
|
||||||
|
|
||||||
ACRX_DECLARE_MEMBERS(AecDbEntityBase);
|
ACRX_DECLARE_MEMBERS(AecDbEntityBase);
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual AcDbEntity *GetMe() { return this; }
|
||||||
|
virtual const AcDbEntity *GetMe() const { return this; }
|
||||||
|
virtual bool IsThisMe(const AcDbEntity *pEnt) const { return AecDbEntityBase::cast(pEnt) != NULL; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AecDbEntityBase(void);
|
AecDbEntityBase(void);
|
||||||
virtual ~AecDbEntityBase(void);
|
virtual ~AecDbEntityBase(void);
|
||||||
@@ -119,7 +66,8 @@ public:
|
|||||||
INT_PTR thisGsMarker,
|
INT_PTR thisGsMarker,
|
||||||
INT_PTR otherGsMarker) const;
|
INT_PTR otherGsMarker) const;
|
||||||
|
|
||||||
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity, Adesk::Boolean doSubents = Adesk::kTrue);
|
virtual Acad::ErrorStatus subSetPropertiesFrom( const AcDbEntity* pEntity
|
||||||
|
, Adesk::Boolean doSubents = Adesk::kTrue);
|
||||||
|
|
||||||
#if (ARX > 15)
|
#if (ARX > 15)
|
||||||
virtual Acad::ErrorStatus subGetOsnapPoints( AcDb::OsnapMode osnapMode,
|
virtual Acad::ErrorStatus subGetOsnapPoints( AcDb::OsnapMode osnapMode,
|
||||||
@@ -181,177 +129,23 @@ public:
|
|||||||
AcDbIdMapping& idMap,
|
AcDbIdMapping& idMap,
|
||||||
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual Acad::ErrorStatus CallAcDbWblockClone(AcRxObject* pOwnerObject,
|
||||||
|
AcDbObject*& pClonedObject,
|
||||||
|
AcDbIdMapping& idMap,
|
||||||
|
Adesk::Boolean isPrimary) const;
|
||||||
|
|
||||||
|
// 桥:回到具体实体自己的 subWorldDraw(子类可能重写,saveAs 的代理分支要用)。
|
||||||
|
// subWorldDraw 在 AcGiDrawable 里是 protected,本类取不到,由两个根转调。
|
||||||
|
virtual Adesk::Boolean CallWorldDraw(AcGiWorldDraw* pWd);
|
||||||
|
|
||||||
|
public:
|
||||||
virtual Acad::ErrorStatus setTransparency(const AcCmTransparency &trans, Adesk::Boolean doSubents = true);
|
virtual Acad::ErrorStatus setTransparency(const AcCmTransparency &trans, Adesk::Boolean doSubents = true);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//获取当前显示模式
|
|
||||||
int GetDrawDimCur() const;
|
|
||||||
|
|
||||||
//专业数据 和绘制设置
|
|
||||||
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite) = 0;
|
|
||||||
virtual const AecDbObjXDataMap* GetSpecialtyData() const = 0;
|
|
||||||
|
|
||||||
//获取二维视图显示的图形
|
|
||||||
virtual int GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const;
|
|
||||||
|
|
||||||
//获取三维显示图形
|
|
||||||
virtual int GetDraw3dables(AcDbVoidPtrArray& arEntPtrs,bool bWriteBimInfo = false ) const;
|
|
||||||
|
|
||||||
//剖切提取
|
|
||||||
virtual int GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const;
|
|
||||||
|
|
||||||
bool GetSectionHatchPattern(CString& sPattern) const;
|
|
||||||
|
|
||||||
Acad::ErrorStatus ReCreateDraw2d();
|
|
||||||
Acad::ErrorStatus ReCreateDraw3d();
|
|
||||||
|
|
||||||
//获取体积
|
//获取体积
|
||||||
virtual double GetVolume(bool bIsBody = false) const;
|
|
||||||
|
|
||||||
virtual int ComparedTo(AecDbEntityBase* pEntOther) const;
|
virtual int ComparedTo(AecDbEntityBase* pEntOther) const;
|
||||||
|
|
||||||
virtual void SetActive(bool bActive){};
|
virtual double GetArea() const;
|
||||||
virtual bool IsActive() const{return false;}
|
|
||||||
virtual void NewGUID() {}
|
|
||||||
|
|
||||||
// 导出json
|
|
||||||
virtual SHJson::WValue& ToJson(bool bExprotGeo = true) const;
|
|
||||||
// 通过json创建
|
|
||||||
virtual bool ByJson(const SHJson::WValue &v);
|
|
||||||
|
|
||||||
// 得到实体唯一得名字,revit 通过这个字符串来判断是否有同样得实体
|
|
||||||
// 如果有,则在revit中可以生成一个族来替代这些同样得实体,以加快速度
|
|
||||||
virtual CString getUniqueName() const;
|
|
||||||
|
|
||||||
double GetArea() const;
|
|
||||||
|
|
||||||
//...
|
|
||||||
void Add3DBoolSubtract(AcDb3dSolid* pSolidBlackHole);
|
|
||||||
void Remove3DBoolSubtract();
|
|
||||||
|
|
||||||
virtual AcDb3dSolid* GetBlackHole() const;
|
|
||||||
void AddBlackHole(AcDbObjectId& idHole);
|
|
||||||
void RemoveBlackHole(AcDbObjectId& idHole);
|
|
||||||
void DrawBlackHole(AcDbEntity* pSolidEnt) const;
|
|
||||||
|
|
||||||
void UpdateDrableSpecData(LPCTSTR pszApp,LPCTSTR pszKey,CString& sVal);
|
|
||||||
|
|
||||||
virtual bool GetBimInfoTip(CString& sInfoTip) const;
|
|
||||||
|
|
||||||
// 为方便用户查询实体的属性,可以重载此函数,目前,此函数使用在“实体快速选择”功能上
|
|
||||||
virtual bool GetProperties(SimpleProperty::PropertySetByIndex &porpertys) const;
|
|
||||||
virtual bool SetProperties(SimpleProperty::PropertySetByName &porpertys);
|
|
||||||
|
|
||||||
//用户级别的数据调用消息
|
|
||||||
virtual bool SendUserData(struct resbuf *pRb);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//动态绘制状态记录值
|
|
||||||
ExplodeOrDrawType m_eExplodeOrDrawType;
|
|
||||||
|
|
||||||
//控制全局的所有实体的显示模式
|
|
||||||
static int GetDrawMode();
|
|
||||||
static void SetDrawMode(int nMode);
|
|
||||||
static void BackupColorIndex(AcDbEntity* pEnt);
|
|
||||||
static int SetBackupColorIndex(AcDbEntity* pEnt);
|
|
||||||
|
|
||||||
//获取炸碎2D/3d模式
|
|
||||||
int GetExplodeMode() const;
|
|
||||||
|
|
||||||
//获取显示维度 0--NONE; 1--2D; 2--3D; 3--2D&3D
|
|
||||||
int GetDrawDimOnType(int nDrawMode, int nDrawType) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
//以下需要 AEC 派生
|
|
||||||
virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const;
|
|
||||||
|
|
||||||
virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const;
|
|
||||||
|
|
||||||
short m_nDrawDimCur;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
//清理图元的特定writeenable
|
|
||||||
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
|
|
||||||
|
|
||||||
//2023-6-26 增加单击夹点发送命令DBL_DXF
|
|
||||||
virtual bool GetPositionGrip(int nIndex, AecGripData *&pGrip) const;
|
|
||||||
bool SubAddHitEditGrip(AcDbGripDataPtrArray &grips) const;
|
|
||||||
bool HitOnGripEdit(const AcDbVoidPtrArray &gripAppData);
|
|
||||||
|
|
||||||
public:
|
|
||||||
bool Draw3DBuffers(AcGiDraw &dc)const;
|
|
||||||
bool Draw2DBuffers(AcGiDraw &dc)const;
|
|
||||||
|
|
||||||
const AcDbVoidPtrArray& Get3DBuffer()const;
|
|
||||||
const AcDbVoidPtrArray& Get2DBuffer()const;
|
|
||||||
|
|
||||||
bool Has3DBuffer()const;
|
|
||||||
bool Has2DBuffer()const;
|
|
||||||
|
|
||||||
void Add3DBuffer(AcDbEntity *pEnt)const;
|
|
||||||
void Add2DBuffer(AcDbEntity *pEnt)const;
|
|
||||||
|
|
||||||
bool IsIn2DBuffer(AcDbEntity* pEnt) const;
|
|
||||||
bool IsIn3DBuffer(AcDbEntity* pEnt) const;
|
|
||||||
|
|
||||||
void Add3DBuffer(const AcDbVoidPtrArray &arr)const;
|
|
||||||
void Add2DBuffer(const AcDbVoidPtrArray &arr)const;
|
|
||||||
|
|
||||||
void Clean3DBuffer()const;
|
|
||||||
void Clean2DBuffer()const;
|
|
||||||
|
|
||||||
void Clean3DBufferNoDel()const;
|
|
||||||
void Clean2DBufferNoDel()const;
|
|
||||||
|
|
||||||
void BoolSubtractHide() const;
|
|
||||||
|
|
||||||
Acad::ErrorStatus subGet3dGeomExtents(AcDbExtents &extents) const;
|
|
||||||
|
|
||||||
/*
|
|
||||||
hlr计算,会默认调用实体的 Draw3d 函数,得到绘制的结果。
|
|
||||||
但是,对与有些实体,并不够用,还需要补充一些
|
|
||||||
比如:管线的中心线和梯度符号等等
|
|
||||||
*/
|
|
||||||
virtual void PreprocessForHlr( const AcGePoint3d &ptPlnO
|
|
||||||
, const AcGeVector3d &vtPlnN
|
|
||||||
, AcArray<AcDbEntity*> &ar) const;
|
|
||||||
|
|
||||||
/*
|
|
||||||
此函数只修改 ar内的实体的 图层、线型、颜色, 但线宽不处理
|
|
||||||
如有其他要求,重载
|
|
||||||
|
|
||||||
ar 是 hlr 通过调用实体的Draw3d函数得到的结果
|
|
||||||
|
|
||||||
preAr 中的 first(AcDbEntity*) 来自于 “PreprocessForHlr” 函数得到的实体指针
|
|
||||||
preAr 中的 second 来自于 first 经过 hlr 计算之后的结果
|
|
||||||
基类不处理 preAr
|
|
||||||
*/
|
|
||||||
virtual void ProcessHlrResult(const AcArray<AcDbEntity*> &ar
|
|
||||||
, const std::map<AcDbEntity*, AcArray<AcDbEntity*>> &preAr
|
|
||||||
, AcArray<AcDbEntity*> &output ) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
template <class K> static BOOL CopyObject(const K &src, K &dest)
|
|
||||||
{
|
|
||||||
AcDbDeepCloneFiler filer;
|
|
||||||
BOOL bRet = FALSE;
|
|
||||||
if (src.dwgOutFields(&filer) == Acad::eOk)
|
|
||||||
{
|
|
||||||
filer.seek(0L, 0);
|
|
||||||
bRet = (dest.dwgInFields(&filer) == Acad::eOk);
|
|
||||||
}
|
|
||||||
return bRet;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SplitStrintToArray(LPCTSTR pszDescr, CStringArray & arInfo, TCHAR tcSpace);
|
|
||||||
static AcDbPolyline* StringToPolyline(LPCTSTR pszPoint2ds);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// 以下为绘制缓存部分,分为2D和3D两部分
|
|
||||||
mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs_;//临时缓存 俯视图
|
|
||||||
mutable AcDbVoidPtrArray m_ar3DDrableBufPtrs_;//临时缓存
|
|
||||||
mutable SHJson::WValue m_json;
|
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,342 @@
|
|||||||
|
#pragma once
|
||||||
|
// ============================================================================
|
||||||
|
// AecDbEntityCommon.h
|
||||||
|
//
|
||||||
|
// 自定义实体的公共基类。
|
||||||
|
//
|
||||||
|
// AecDbEntityBase : public AcDbEntity
|
||||||
|
// AecDbCurveBase : public AcDbCurve
|
||||||
|
//
|
||||||
|
// 两者是两条平行的根(AcDb 类不能虚继承),历史上是两份逐行复制的实现。
|
||||||
|
// 本类不继承任何 AcDb / ARX 类,只承载两条根中 AcDbEntity 虚函数那一层,
|
||||||
|
// 以及它们必须的依赖(显示缓存、显示模式、写使能、静态工具)。
|
||||||
|
//
|
||||||
|
// 约定:
|
||||||
|
// 1. 需要 AcDb 基类的实现时,直接 GetMe()->AcDbEntity::xxx(...) 限定调用,
|
||||||
|
// 不为「AcDbEntity:: 还是 AcDbCurve::」另立钩子。
|
||||||
|
// AcDbCurve 没有重写这些接口(dwgInFields / subList / saveAs / setTransparency /
|
||||||
|
// setColorIndex / subWblockClone … 都在 AcDbEntity),两者是同一个实现。
|
||||||
|
// 2. 两族行为有差异的函数,本类给默认实现并声明为 virtual,
|
||||||
|
// 由有差异的那一族 override。不用 bool 开关参数,也不合并行为。
|
||||||
|
// 3. 需要回到 AcDb 一侧操作时走 GetMe()。
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
#include "dbmain.h"
|
||||||
|
#include "AcGiDraw.h"
|
||||||
|
#include "AecSubDef.h"
|
||||||
|
#include "shJson.h"
|
||||||
|
#include "EarThwormDef.h"
|
||||||
|
|
||||||
|
#pragma warning(disable: 4275 4251)
|
||||||
|
|
||||||
|
// 与 AecDbEntityBase.h 相同的导出规则:AecRxBase 内部导出,其它模块导入。
|
||||||
|
// 用独立宏名,避免与 AECDLLIMPEXP 的定义顺序互相影响。
|
||||||
|
#ifdef AECRXBASE_EXPORT
|
||||||
|
#define AECCOMMON_DLLIMPEXP __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define AECCOMMON_DLLIMPEXP __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class AecDbObjXDataMap;
|
||||||
|
class AcGiViewDraw;
|
||||||
|
class AcGiExplodeDraw;
|
||||||
|
namespace SimpleProperty { struct PropertySetByIndex; struct PropertySetByName; }
|
||||||
|
|
||||||
|
#ifndef _ttof
|
||||||
|
#define _ttof(pszVal) _tcstod((pszVal), NULL)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class AECCOMMON_DLLIMPEXP AecDbEntityCommon
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AecDbEntityCommon(void);
|
||||||
|
virtual ~AecDbEntityCommon(void);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 世界绘制:原 AecDbEntityBase::subWorldDraw / AecDbCurveBase::subWorldDraw
|
||||||
|
// 逐行一致。subWorldDraw 是 AcGiDrawable 的虚函数,本类不在 AcDb 继承链上,
|
||||||
|
// 只能由两个根各自留一行转发。
|
||||||
|
virtual Adesk::Boolean base_WorldDraw(AcGiWorldDraw* pWd);
|
||||||
|
|
||||||
|
// 视口绘制:原两个根的 subViewportDraw 逐行一致,同样只能由两个根转发。
|
||||||
|
virtual void base_ViewportDraw(AcGiViewportDraw* pMode);
|
||||||
|
|
||||||
|
// 视口绘制标志 / 绘制属性:原两个根逐行一致。
|
||||||
|
// 这两个接口在 AcDb 一侧是 protected,本类取不到,由两个根先调基类、
|
||||||
|
// 把基类结果作为 nBaseFlags 传进来,这里只负责叠加自己的标志位。
|
||||||
|
virtual Adesk::UInt32 base_ViewportDrawLogicalFlags(Adesk::UInt32 nBaseFlags);
|
||||||
|
virtual Adesk::UInt32 base_SetAttributes(Adesk::UInt32 nBaseFlags);
|
||||||
|
|
||||||
|
// 炸开:原两个根的 subExplode 逐行一致。
|
||||||
|
virtual Acad::ErrorStatus base_Explode(AcDbVoidPtrArray& entitySet) const;
|
||||||
|
|
||||||
|
// 保存代理实体图元:原两个根的 saveAs 逐行一致。
|
||||||
|
// 代理分支要回到具体实体自己的 subWorldDraw(子类可能重写),走 CallWorldDraw。
|
||||||
|
virtual void base_SaveAs(AcGiWorldDraw* pWd, AcDb::SaveType saveType);
|
||||||
|
|
||||||
|
// 几何范围:原两个根的 subGetGeomExtents 逐行一致。
|
||||||
|
virtual Acad::ErrorStatus base_GetGeomExtents(AcDbExtents& extents) const;
|
||||||
|
|
||||||
|
// 对象捕捉点(第一个重载):原两个根逐行一致。
|
||||||
|
virtual Acad::ErrorStatus base_GetOsnapPoints(AcDb::OsnapMode osnapMode,
|
||||||
|
INT_PTR gsSelectionMark,
|
||||||
|
const AcGePoint3d& ptPick,
|
||||||
|
const AcGePoint3d& lastPoint,
|
||||||
|
const AcGeMatrix3d& viewXform,
|
||||||
|
AcGePoint3dArray& snapPoints,
|
||||||
|
AcDbIntArray& geomIds) const;
|
||||||
|
|
||||||
|
virtual Acad::ErrorStatus base_DeepClone( AcDbObject* pOwnerObject,
|
||||||
|
AcDbObject*& pClonedObject,
|
||||||
|
AcDbIdMapping& idMap,
|
||||||
|
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
||||||
|
|
||||||
|
virtual Acad::ErrorStatus base_WblockClone( AcRxObject* pOwnerObject,
|
||||||
|
AcDbObject*& pClonedObject,
|
||||||
|
AcDbIdMapping& idMap,
|
||||||
|
Adesk::Boolean isPrimary = Adesk::kTrue) const;
|
||||||
|
|
||||||
|
// 桥:转调 AcDb 一侧原生的 subWblockClone(fast wblock 时用它交回基类)。
|
||||||
|
// subWblockClone 在 AcDbObject 里是 protected,本类不在继承链上,
|
||||||
|
// 只能由两个根各自转调,限定 AcDbEntity:: / AcDbCurve::。
|
||||||
|
virtual Acad::ErrorStatus CallAcDbWblockClone(AcRxObject* pOwnerObject,
|
||||||
|
AcDbObject*& pClonedObject,
|
||||||
|
AcDbIdMapping& idMap,
|
||||||
|
Adesk::Boolean isPrimary) const = 0;
|
||||||
|
|
||||||
|
// 桥:回到具体实体自己的 subWorldDraw(子类可能重写,saveAs 的代理分支要用)。
|
||||||
|
// subWorldDraw 在 AcGiDrawable 里是 protected,本类不在继承链上取不到。
|
||||||
|
virtual Adesk::Boolean CallWorldDraw(AcGiWorldDraw* pWd) = 0;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// 桥:由 AecDbEntityBase / AecDbCurveBase 实现
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
public:
|
||||||
|
// 回到 AcDb 一侧。两个根的 AcDb 根都是第一个基类,实现为 return this;
|
||||||
|
virtual AcDbEntity* GetMe() = 0;
|
||||||
|
virtual const AcDbEntity* GetMe() const = 0;
|
||||||
|
virtual bool IsThisMe(const AcDbEntity *pEnt) const = 0;
|
||||||
|
|
||||||
|
// 专业数据容器(两个根原本就是纯虚接口)
|
||||||
|
virtual AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite) = 0;
|
||||||
|
virtual const AecDbObjXDataMap* GetSpecialtyData() const = 0;
|
||||||
|
|
||||||
|
//获取当前显示模式
|
||||||
|
int GetDrawDimCur() const;
|
||||||
|
|
||||||
|
|
||||||
|
// 得到实体唯一得名字,revit 通过这个字符串来判断是否有同样得实体
|
||||||
|
// 如果有,则在revit中可以生成一个族来替代这些同样得实体,以加快速度
|
||||||
|
virtual CString getUniqueName() const;
|
||||||
|
|
||||||
|
virtual void NewGUID() {}
|
||||||
|
|
||||||
|
virtual double GetArea() const {return .0;}
|
||||||
|
|
||||||
|
virtual void PreprocessForHlr( const AcGePoint3d &ptPlnO
|
||||||
|
, const AcGeVector3d &vtPlnN
|
||||||
|
, AcArray<AcDbEntity*> &ar) const;
|
||||||
|
|
||||||
|
/*
|
||||||
|
此函数只修改 ar内的实体的 图层、线型、颜色, 但线宽不处理
|
||||||
|
如有其他要求,重载
|
||||||
|
|
||||||
|
ar 是 hlr 通过调用实体的Draw3d函数得到的结果
|
||||||
|
|
||||||
|
preAr 中的 first(AcDbEntity*) 来自于 “PreprocessForHlr” 函数得到的实体指针
|
||||||
|
preAr 中的 second 来自于 first 经过 hlr 计算之后的结果
|
||||||
|
基类不处理 preAr
|
||||||
|
*/
|
||||||
|
virtual void ProcessHlrResult(const AcArray<AcDbEntity*> &ar
|
||||||
|
, const std::map<AcDbEntity*, AcArray<AcDbEntity*>> &preAr
|
||||||
|
, AcArray<AcDbEntity*> &output ) const;
|
||||||
|
|
||||||
|
virtual bool GetBimInfoTip(CString& sInfoTip) const;
|
||||||
|
|
||||||
|
// 为方便用户查询实体的属性,可以重载此函数,目前,此函数使用在“实体快速选择”功能上
|
||||||
|
virtual bool GetProperties(SimpleProperty::PropertySetByIndex &porpertys) const;
|
||||||
|
virtual bool SetProperties(SimpleProperty::PropertySetByName &porpertys);
|
||||||
|
|
||||||
|
// 导出json
|
||||||
|
virtual SHJson::WValue& ToJson(bool bExprotGeo = true) const;
|
||||||
|
// 通过json创建
|
||||||
|
virtual bool ByJson(const SHJson::WValue &v);
|
||||||
|
|
||||||
|
|
||||||
|
//获取体积
|
||||||
|
virtual double GetVolume(bool bIsBody = false) const;
|
||||||
|
|
||||||
|
virtual void SetActive(bool bActive) {};
|
||||||
|
|
||||||
|
virtual bool IsActive() const { return false; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 子类真正实现的绘制入口(两个根的默认实现都是 return eOk)
|
||||||
|
virtual Acad::ErrorStatus Draw2d(AcGiDraw& dc) const;
|
||||||
|
virtual Acad::ErrorStatus Draw3d(AcGiDraw& dc) const;
|
||||||
|
|
||||||
|
virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static int GetDrawMode();
|
||||||
|
static void SetDrawMode(int nMode);
|
||||||
|
static void BackupColorIndex(AcDbEntity* pEnt);
|
||||||
|
static int SetBackupColorIndex(AcDbEntity* pEnt);
|
||||||
|
|
||||||
|
//获取炸碎2D/3d模式
|
||||||
|
int GetExplodeMode() const;
|
||||||
|
|
||||||
|
//获取显示维度 0--NONE; 1--2D; 2--3D; 3--2D&3D
|
||||||
|
int GetDrawDimOnType(int nDrawMode, int nDrawType) const;
|
||||||
|
|
||||||
|
//2023-6-26 增加单击夹点发送命令DBL_DXF
|
||||||
|
virtual bool GetPositionGrip(int nIndex, AecGripData *&pGrip) const { return NULL; }
|
||||||
|
bool SubAddHitEditGrip(AcDbGripDataPtrArray &grips) const;
|
||||||
|
bool HitOnGripEdit(const AcDbVoidPtrArray &gripAppData);
|
||||||
|
|
||||||
|
public:
|
||||||
|
// 2d 缓存操作
|
||||||
|
virtual bool Draw2DBuffers(AcGiDraw &dc) const;
|
||||||
|
const AcDbVoidPtrArray& Get2DBuffer()const;
|
||||||
|
bool Has2DBuffer()const;
|
||||||
|
void Add2DBuffer(AcDbEntity *pEnt)const;
|
||||||
|
void Add2DBuffer(const AcDbVoidPtrArray &arr)const;
|
||||||
|
bool IsIn2DBuffer(AcDbEntity* pEnt) const;
|
||||||
|
void Clean2DBuffer()const;
|
||||||
|
void Clean2DBufferNoDel()const;
|
||||||
|
|
||||||
|
// 3d 缓存操作
|
||||||
|
bool Draw3DBuffers(AcGiDraw &dc) const;
|
||||||
|
const AcDbVoidPtrArray &Get3DBuffer()const;
|
||||||
|
bool Has3DBuffer()const;
|
||||||
|
void Add3DBuffer(AcDbEntity *pEnt)const;
|
||||||
|
void Add3DBuffer(const AcDbVoidPtrArray &arr)const;
|
||||||
|
bool IsIn3DBuffer(AcDbEntity *pEnt) const;
|
||||||
|
void Clean3DBuffer()const;
|
||||||
|
void Clean3DBufferNoDel()const;
|
||||||
|
|
||||||
|
Acad::ErrorStatus ReCreateDraw2d();
|
||||||
|
Acad::ErrorStatus ReCreateDraw3d();
|
||||||
|
|
||||||
|
//获取二维视图显示的图形
|
||||||
|
virtual int GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray &arEntPtrs) const;
|
||||||
|
|
||||||
|
//获取三维显示图形
|
||||||
|
virtual int GetDraw3dables(AcDbVoidPtrArray &arEntPtrs, bool bWriteBimInfo = false) const;
|
||||||
|
|
||||||
|
|
||||||
|
//用户级别的数据调用消息
|
||||||
|
virtual bool SendUserData(struct resbuf *pRb) { return false; }
|
||||||
|
|
||||||
|
virtual int GetSectionDraw(const AcGePoint3d &ptFr
|
||||||
|
, const AcGePoint3d &ptTo
|
||||||
|
, const AcGeVector3d &vtViewDir
|
||||||
|
, const AcGeVector3d &vtTo
|
||||||
|
, AcDbVoidPtrArray &arRegionPtrs) const { return 0; }
|
||||||
|
|
||||||
|
virtual AcDb3dSolid *GetBlackHole() const { return NULL; }
|
||||||
|
|
||||||
|
//剖切提取
|
||||||
|
bool GetSectionHatchPattern(CString& sPattern) const;
|
||||||
|
|
||||||
|
void BoolSubtractHide() const;
|
||||||
|
Acad::ErrorStatus subGet3dGeomExtents(AcDbExtents &extents) const;
|
||||||
|
|
||||||
|
void Add3DBoolSubtract(AcDb3dSolid* pSolidBlackHole);
|
||||||
|
void Remove3DBoolSubtract();
|
||||||
|
void AddBlackHole(AcDbObjectId& idHole);
|
||||||
|
void RemoveBlackHole(AcDbObjectId& idHole);
|
||||||
|
void DrawBlackHole(AcDbEntity* pSolidEnt) const;
|
||||||
|
|
||||||
|
void UpdateDrableSpecData(LPCTSTR pszApp,LPCTSTR pszKey,CString& sVal);
|
||||||
|
|
||||||
|
//按分隔符拆字符串(CoreLibrary / PipelineCmd 等多处按 AecDbEntityBase:: 限定调用)
|
||||||
|
static void SplitStrintToArray(LPCTSTR pszDescr, CStringArray & arInfo, TCHAR tcSpace);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// 绘制函数被调用的方式(WorldDraw / ViewportDraw / Explode)
|
||||||
|
// mutable:subExplode 是 const 函数,原实现靠 const_cast 写入
|
||||||
|
mutable ExplodeOrDrawType m_eExplodeOrDrawType;
|
||||||
|
|
||||||
|
// 最近一次实际绘制的是 2D / 3D(-1 表示尚未绘制)
|
||||||
|
short m_nDrawDimCur;
|
||||||
|
|
||||||
|
// 2D / 3D 显示缓存
|
||||||
|
mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs_;//临时缓存 俯视图
|
||||||
|
mutable AcDbVoidPtrArray m_ar3DDrableBufPtrs_;//临时缓存
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable SHJson::WValue m_json;
|
||||||
|
|
||||||
|
public:
|
||||||
|
template<typename T>
|
||||||
|
BOOL GetAt(LPCTSTR pszKey, T &va) const
|
||||||
|
{
|
||||||
|
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
return pMap->GetAt(pszKey, va);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
BOOL GetAt(LPCTSTR pszKey, T1 va1, T2 va2) const
|
||||||
|
{
|
||||||
|
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
return pMap->GetAt(pszKey, va1, va2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N>
|
||||||
|
BOOL GetAt(LPCTSTR pszKey, TCHAR(&va)[N]) const
|
||||||
|
{
|
||||||
|
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
CString s;
|
||||||
|
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
||||||
|
|
||||||
|
_tcsncpy_s(va, N, s, N - 1);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N>
|
||||||
|
BOOL GetAt(LPCTSTR pszKey, LPTSTR va) const
|
||||||
|
{
|
||||||
|
const AecDbObjXDataMap *pMap(GetSpecialtyData());
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
CString s;
|
||||||
|
if (pMap->GetAt(pszKey, s) == FALSE) return FALSE;
|
||||||
|
|
||||||
|
_tcsncpy_s(va, N, s, N - 1);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
BOOL SetAt(LPCTSTR pszKey, T va)
|
||||||
|
{
|
||||||
|
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
return pMap->SetAt(pszKey, va);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
BOOL SetAt(LPCTSTR pszKey, T1 va1, T2 va2)
|
||||||
|
{
|
||||||
|
AecDbObjXDataMap *pMap(GetSpecialtyData(AcDb::kForWrite));
|
||||||
|
if (!pMap) return FALSE;
|
||||||
|
return pMap->SetAt(pszKey, va1, va2);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class K> static BOOL CopyObject(const K &src, K &dest)
|
||||||
|
{
|
||||||
|
AcDbDeepCloneFiler filer;
|
||||||
|
BOOL bRet = FALSE;
|
||||||
|
if (src.dwgOutFields(&filer) == Acad::eOk)
|
||||||
|
{
|
||||||
|
filer.seek(0L, 0);
|
||||||
|
bRet = (dest.dwgInFields(&filer) == Acad::eOk);
|
||||||
|
}
|
||||||
|
return bRet;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include "dbfiler.h"
|
#include "dbfiler.h"
|
||||||
#include "shJson.h"
|
#include "shJson.h"
|
||||||
|
#include <wtypes.h> // VARENUM / VT_* ,供 AecXData::EType 使用
|
||||||
|
|
||||||
#ifdef AECRXBASE_EXPORT
|
#ifdef AECRXBASE_EXPORT
|
||||||
#define AECDLLIMPEXP __declspec(dllexport)
|
#define AECDLLIMPEXP __declspec(dllexport)
|
||||||
@@ -35,21 +36,29 @@
|
|||||||
typedef std::pair<CString, CString> SH_BIM_REC;
|
typedef std::pair<CString, CString> SH_BIM_REC;
|
||||||
typedef std::vector<SH_BIM_REC> SH_BIM_BLOCK;
|
typedef std::vector<SH_BIM_REC> SH_BIM_BLOCK;
|
||||||
|
|
||||||
typedef struct AecXData
|
// AecXData 会被其它模块(CoreLibrary / 各 Cmd)直接构造使用,必须随 AecRxBase 一起导出,
|
||||||
|
// 否则成员函数定义在 .cpp 里时其它模块会 LNK2019(unresolved external symbol)。
|
||||||
|
typedef struct AECDLLIMPEXP AecXData
|
||||||
{
|
{
|
||||||
/*
|
// 数据类型标签(nVt)。直接用 wtypes.h 的 VARENUM(VT_*) 组合来表达,直观且与
|
||||||
VT_I4 : int
|
// 原实现逐位一致;nVt 会写入 DWG/DXF/XData,改数值会破坏旧图兼容,务必保持不变。
|
||||||
VT_BSTR : psz
|
enum EType
|
||||||
VT_R8 : double
|
{
|
||||||
VT_BYREF | VT_R8
|
kTypeShort = VT_I2, // short
|
||||||
VT_BYREF | VT_R8 + 1 pt
|
kTypeInt = VT_I4, // int
|
||||||
VT_BYREF | VT_R8 + 2
|
kTypeDouble = VT_R8, // double
|
||||||
VT_BYREF | VT_R8 + 3 vect
|
kTypeString = VT_BSTR, // TCHAR* 字符串
|
||||||
VT_UI4 : id
|
kTypeSoftId = VT_UI4, // AcDbObjectId 软指针
|
||||||
VT_BYREF | VT_R8 + 4 : matrix3d
|
kTypeInt64 = VT_I8, // 历史遗留(仅读)
|
||||||
VT_BYREF | VT_R8 + 5 : binary data
|
kTypeHardId = VT_UI8, // AcDbObjectId 硬指针
|
||||||
|
kTypePoint = (VT_BYREF | VT_R8), // 点,不随实体变换
|
||||||
|
kTypePointWorld = (VT_BYREF | VT_R8) + 1, // 点,随实体变换
|
||||||
|
kTypeVector = (VT_BYREF | VT_R8) + 2, // 向量,不随实体变换
|
||||||
|
kTypeVectorWorld = (VT_BYREF | VT_R8) + 3, // 向量,随实体变换
|
||||||
|
kTypeMatrix = (VT_BYREF | VT_R8) + 4, // 矩阵(16个double,二进制块,128字节)
|
||||||
|
kTypeBinary = (VT_BYREF | VT_R8) + 5, // 二进制块
|
||||||
|
};
|
||||||
|
|
||||||
*/
|
|
||||||
int nVt;
|
int nVt;
|
||||||
LONG_PTR npszLen; //对应字符数据长度
|
LONG_PTR npszLen; //对应字符数据长度
|
||||||
|
|
||||||
@@ -61,23 +70,41 @@ typedef struct AecXData
|
|||||||
TCHAR* pszVal; // 字符数据
|
TCHAR* pszVal; // 字符数据
|
||||||
void* pData; // binary data
|
void* pData; // binary data
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 1. 默认构造函数,替代原有代码中散落的 memset(&xdata, 0, sizeof(xdata));
|
||||||
|
// 实现见 AecDbObjXDataMap.cpp(随本 DLL 导出,其它模块可直接构造)。
|
||||||
|
AecXData();
|
||||||
|
|
||||||
|
// 2. 核心清理函数
|
||||||
|
void Free();
|
||||||
|
|
||||||
|
// 3. 深拷贝:先释放自身已持有的资源,再从 src 深拷贝。
|
||||||
|
// 字符串/矩阵/二进制会重新分配内存,不与 src 共享缓冲;
|
||||||
|
// 支持类型变化(nVt 不同也照常覆盖)。this == &src 时直接返回。
|
||||||
|
bool CopyFrom(const AecXData &src);
|
||||||
|
|
||||||
}AECXDATA;
|
}AECXDATA;
|
||||||
|
|
||||||
class AECDLLIMPEXP AecDbObjXDataMap
|
class AECDLLIMPEXP AecDbObjXDataMap
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
static const int g_nVersion;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AecDbObjXDataMap();
|
AecDbObjXDataMap();
|
||||||
AecDbObjXDataMap(const AecDbObjXDataMap& datamap);
|
AecDbObjXDataMap(const AecDbObjXDataMap& datamap);
|
||||||
virtual ~AecDbObjXDataMap();
|
virtual ~AecDbObjXDataMap();
|
||||||
|
|
||||||
|
// 把 kTypeMatrix 的 16 个 double 二进制块格式化为逗号分隔文本(供显示/比较使用)
|
||||||
|
static CString MatrixToString(const AecXData& xdata);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOL SetAt(LPCTSTR pszKey,int nVal);
|
BOOL SetAt(LPCTSTR pszKey, const int &nVal);
|
||||||
BOOL SetAt(LPCTSTR pszKey, DWORD dw);
|
BOOL SetAt(LPCTSTR pszKey, const DWORD &dw);
|
||||||
|
|
||||||
BOOL SetAt(LPCTSTR pszKey, Adesk::Int16 nVal);
|
BOOL SetAt(LPCTSTR pszKey, const Adesk::Int16 &nVal);
|
||||||
|
|
||||||
BOOL SetAt(LPCTSTR pszKey,double dVal);
|
BOOL SetAt(LPCTSTR pszKey, const double &dVal);
|
||||||
|
|
||||||
BOOL SetAt(LPCTSTR pszKey,const AcGeDoubleArray& arVal);
|
BOOL SetAt(LPCTSTR pszKey,const AcGeDoubleArray& arVal);
|
||||||
BOOL SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransformBy = FALSE);
|
BOOL SetAt(LPCTSTR pszKey,const AcGeVector3d& vt,BOOL bTransformBy = FALSE);
|
||||||
@@ -95,6 +122,11 @@ public:
|
|||||||
BOOL SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform);
|
BOOL SetAt(LPCTSTR pszKey,const AcGeMatrix3d& xform);
|
||||||
|
|
||||||
BOOL SetAt(LPCTSTR pszKey,void* pData,int nSize);
|
BOOL SetAt(LPCTSTR pszKey,void* pData,int nSize);
|
||||||
|
|
||||||
|
BOOL SetAt(LPCTSTR pszKey, const AecDbObjXDataMap& xDataMap);
|
||||||
|
|
||||||
|
BOOL GetAt(LPCTSTR pszKey, AecDbObjXDataMap& xDataMap);
|
||||||
|
|
||||||
BOOL GetAt(LPCTSTR pszKey,void*& pData,int& nSize) const;
|
BOOL GetAt(LPCTSTR pszKey,void*& pData,int& nSize) const;
|
||||||
|
|
||||||
BOOL GetAt(LPCTSTR pszKey,int& nVal) const;
|
BOOL GetAt(LPCTSTR pszKey,int& nVal) const;
|
||||||
@@ -189,7 +221,8 @@ public:
|
|||||||
|
|
||||||
//prinf输出
|
//prinf输出
|
||||||
void List() const;
|
void List() const;
|
||||||
void List(CListCtrl *pList, int nImage) const;
|
// 输出到字符串数组:每个元素占两项(先 key,后 value),供界面按两列展示。
|
||||||
|
void List(std::vector<CString> &pList) const;
|
||||||
|
|
||||||
int ComparedTo(const AecDbObjXDataMap* pXDataMap) const;
|
int ComparedTo(const AecDbObjXDataMap* pXDataMap) const;
|
||||||
|
|
||||||
@@ -242,8 +275,13 @@ private:
|
|||||||
|
|
||||||
void SecondAsKey(CString& sTemp,AecXData& xData);
|
void SecondAsKey(CString& sTemp,AecXData& xData);
|
||||||
|
|
||||||
|
// 把 xdata 以 pszKey 存入(已存在则覆盖)。接管 xdata 的所有权(内部把源置空)。
|
||||||
|
void SetXData(LPCTSTR pszKey, AecXData &xdata);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable SHJson::WValue m_json;//临时,不序列化
|
mutable SHJson::WValue m_json;//临时,不序列化
|
||||||
std::map<CString,AecXData> m_xData;//序列化
|
std::map<CString,AecXData> m_xData;//序列化
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif //_AecDbObjXDataMap_H__
|
#endif //_AecDbObjXDataMap_H__
|
||||||
@@ -44,4 +44,5 @@ envi-code/
|
|||||||
|
|
||||||
## 仓库
|
## 仓库
|
||||||
|
|
||||||
- 远端:`ssh://gjm@47.93.46.28:1216/srv/git/new-start.git`(origin,主分支 `main`)。
|
- 远端:`ssh://git@39.107.55.179:222/gjm/envi-code.git`(origin,主分支 `main`)。
|
||||||
|
- 访问方式:SSH 222 端口。各机器私钥不同,需在本机 `~/.ssh/config` 指定自己的私钥,**不要把私钥文件名提交到仓库**。
|
||||||
@@ -30,5 +30,6 @@
|
|||||||
|
|
||||||
## Git
|
## Git
|
||||||
|
|
||||||
- 远端 `origin`:`ssh://gjm@47.93.46.28:1216/srv/git/new-start.git`,主分支 `main`。
|
- 远端 `origin`:`ssh://git@39.107.55.179:222/gjm/envi-code.git`,主分支 `main`。
|
||||||
- 提交信息使用中文描述。
|
- 提交信息使用中文描述。
|
||||||
|
- SSH 走 222 端口;**各机器私钥不同**,在本机 `~/.ssh/config` 里指定即可,不要把私钥文件名写进仓库。
|
||||||
Reference in new issue
Block a user