Compare commits

..
28 Commits
Author SHA1 Message Date
gjm 006b251370 Merge pull request '修复AecDbEwFitting剖切问题' (#17) from company-desktop-computer/feature/company-ai-dev into main
Reviewed-on: #17
2026-10-19 10:35:04 +08:00
company-desktop-computer 2f8b639cea 修复AecDbEwFitting剖切问题
修复AecDbEwFitting剖切后三维重绘不显示法兰问题
2026-10-19 10:34:27 +08:00
gjm 5650ea28b8 Merge pull request '重构pcfiso' (#16) from company-desktop-computer/feature/company-ai-dev into main
Reviewed-on: #16
2026-10-19 09:27:00 +08:00
company-desktop-computer 59dcfe9e25 重构pcfiso 2026-10-19 09:26:09 +08:00
gjm 4e73873163 Merge pull request '重构底层' (#15) from home-lenovo-legion-r9000/feature/ai-dev-home into main
Reviewed-on: #15
Reviewed-by: gjm <littleoldpan@163.com>
2026-10-19 09:20:17 +08:00
gjm c84bc78869 重构底层
重构AecDbEntityBase,AecDbCurveBase
2026-10-19 09:19:05 +08:00
gjm 806726c11b Merge pull request 'fix: HLR 退化圆弧按来源实体直径判断,并支持爬梯' (#12) from home-lenovo-legion-r9000/fix/aecdbcamera-fitting-degenerate-arc into main
Reviewed-on: #12
2026-10-16 23:22:22 +08:00
gjm bbb899c0a0 fix: HLR 退化圆弧按来源实体直径判断,并支持爬梯
在删除圆心角为 PI 的退化圆弧时,增加直径比较:
- 弯头(eElbow / eReduceElbow):带法兰(连接类型 3/5)取法兰外径 m_dInterfaceD,
  否则取画法直径 m_dD;
- 爬梯(AecDbClimbStair):取踏管直径 ClimbStair::dd。
仅当圆弧直径大于来源实体直径时才删除。

getElbowDiameter 改为 getSourceDiameter,removeFittingDegenerateArcs
改为 removeDegenerateArcs(已不止管件)。
2026-10-16 23:20:57 +08:00
gjm 775b3c181c Merge pull request 'fix: HLR 结果中删除 AecDbEwFitting 产生的退化圆弧' (#11) from home-lenovo-legion-r9000/fix/aecdbcamera-fitting-degenerate-arc into main
Reviewed-on: #11
2026-10-16 21:34:50 +08:00
gjm c0c04952dc fix: HLR 结果中删除 AecDbEwFitting 产生的退化圆弧
原 isDegenerateArc 以 弧长/半径 比值判断退化圆弧,且无法区分结果来源。
改为按来源实体类型判断:
- result1 的键是数据库实体 id,直接判断该 id 是否为 AecDbEwFitting;
- result2 的键是无 id 的补充实体指针,先经 mpAdditional
  (数据库实体id -> 其产生的补充实体) 反查归属的数据库实体 id,再判断。

删除规则:结果实体是 AcDbArc 且圆心角为 PI 时删除。
2026-10-16 21:34:08 +08:00
gjm c41e7edf44 Merge pull request 'docs: 更正远端地址为 envi-code 仓库,补充 SSH 私钥本机配置说明' (#10) from home-lenovo-legion-r9000/docs/fix-remote-url into main
Reviewed-on: #10
2026-10-16 19:44:45 +08:00
gjm 35a412f6f5 docs: 更正远端地址为 envi-code 仓库,补充 SSH 私钥本机配置说明
- 远端由 ssh://gjm@47.93.46.28:1216/srv/git/new-start.git
  更正为 ssh://git@39.107.55.179:222/gjm/envi-code.git
- 补充说明:远端走 SSH 222 端口,各机器私钥不同,
  需在本机 ~/.ssh/config 指定;私钥文件名不入库
2026-10-16 19:39:29 +08:00
gjm c4569ecac3 Merge pull request 'fix(HLR): 清理剖切结果中的退化圆弧,避免圆心角溢出生成反向大圆弧' (#9) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #9
2026-10-16 13:12:43 +08:00
company-desktop-computer a1c7d39dc6 fix(HLR): 清理剖切结果中的退化圆弧,避免圆心角溢出生成反向大圆弧
AecDbXCamera::hlrCalc 在 HLR 计算后新增 isDegenerateArc 判定:结果为 AcDbArc 且 弧长/半径 < 1e-6 时视为退化圆弧(圆心角极小),从 result1/result2 中删除,防止数值溢出把"很小一段"翻转成"反向的大圆弧"。
2026-10-16 13:11:21 +08:00
gjm fdfb6e5bbb Merge pull request 'chore: 忽略 *.aps,并修正 JSTZDlg 矩阵列显示' (#8) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #8
2026-10-13 15:33:07 +08:00
company-desktop-computer 1db5368592 chore: 忽略 *.aps,并修正 JSTZDlg 矩阵列显示
- .gitignore 增加 *.aps(EarthWorm.aps 等 VS 资源编译产物)。
- JSTZDlg::ShowToCompareList 的矩阵分支改用 AecDbObjXDataMap::MatrixToString(),
  不再直接把 pszVal 当字符串打印(矩阵现以二进制块保存)。
2026-10-13 15:32:29 +08:00
gjm 4961b696ff Merge pull request '重构: AecDbObjXDataMap 解耦 UI,并统一 SetAt/数组实现' (#7) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #7
2026-10-13 15:29:26 +08:00
company-desktop-computer 199abb989c 重构: AecDbObjXDataMap 解耦 UI,并统一 SetAt/数组实现
- AecXData 的 ctor/Free/CopyFrom 由头部 inline 移入 .cpp,结构体加
  AECDLLIMPEXP 导出,修复其它模块构造 AecXData 时的 LNK2019。
- 抽出私有 SetXData(pszKey, xdata) 助手,替换各 SetAt 中重复的
  find/Free+覆盖/insert 逻辑,并接管 xdata 所有权。
- 数组二进制块统一为 [kArrayMagic][元素类型][元素个数][数据...],元素类型
  复用 AecXData::EType;新增元素类型无需再加魔数或类型标签。
- 矩阵/数组魔数集中到 .cpp 顶部常量,便于维护。
- List(CListCtrl*, int) 改为 List(std::vector<CString>&):去掉 MFC 控件与
  nImage 依赖,每个元素输出 key/value 两项;CCKSXDlg::ListXDataMap 相应改为
  构造 vector 后填充两列列表。
2026-10-13 15:28:19 +08:00
gjm 7f2f37f005 Merge pull request '重构: AecXData 类型标签改用枚举 AecXData::EType' (#6) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #6
2026-10-13 10:01:14 +08:00
company-desktop-computer 0467086e65 重构: AecXData 类型标签改用枚举 AecXData::EType
- 在 AecXData 内新增 enum EType,取值直接采用 wtypes.h 的 VARENUM(VT_*),
  与原实现逐位一致(nVt 会序列化进 DWG/DXF/XData,数值必须保持不变)。
- 各模块共 303 处 nVt 判断由裸 VT_* 改为 AecXData::kTypeXxx,涉及 18 个文件;
  仅调试打印用的字符串字面量保持原样。
- AecDbObjXDataMap.h 增加 #include <wtypes.h>(EType 引用 VT_*)。
2026-10-13 09:55:42 +08:00
gjm 63ed4744fb Merge pull request 'fix(FlangeDlg): 修正 GetEndF1/GetEndF2 端面取值下标' (#5) from company-desktop-computer/company-ai-dev into main
Reviewed-on: #5
2026-10-09 14:12:16 +08:00
company-desktop-computer 9d9077a03e fix(FlangeDlg): 修正 GetEndF1/GetEndF2 端面取值下标
- CFlangeDlg::GetEndF1/GetEndF2 原先取 m_arFlangeVals 下标 0/1(公称直径/法兰外径),
  端面型式实际在下标 5/6,导致 PIPE_FLANGF 被写成 DN 字符串
- 改为下标 5/6,且为空时回退 "FF"
2026-10-09 14:09:23 +08:00
gjm 8628fcc7e0 Merge pull request 'test: 验证 company-desktop-computer 账号的 PR 作者' (#4) from company-desktop-computer/pr-test-company into main
Reviewed-on: #4
2026-10-09 10:48:18 +08:00
gjm b7b9827994 test: 验证 company-desktop-computer 账号的 PR 作者 2026-10-09 10:46:59 +08:00
gjm b96cb1bed2 Merge pull request '法兰双击改用法兰对话框:AecDbEwFitting 法兰双击弹出 CFlangeDlg 并回写法兰/垫片数据' (#3) from home-lenovo-legion-r9000/company-ai-dev into main
Reviewed-on: #3
2026-10-09 10:33:03 +08:00
gjm d107cfd47f 法兰双击改用法兰对话框:AecDbEwFitting 法兰双击弹出 CFlangeDlg 并回写法兰/垫片数据
- DBL_AEC_DBEWFIT:GetFittingType()==eFlange 时改用 CFlangeDlg(其余管件仍用 CGJSXDlg)
- 对话框初值取自实体专业数据(DN/压力/等级/项目/外径系列)
- 确定后回写 PIPE_WD/PIPE_WTHICK/PIPE_THICK/PIPE_N/PIPE_FLANGF 及垫片数据并重绘
- 沿用接口位移后收缩相邻管段逻辑
2026-10-09 10:31:04 +08:00
gjm 84f255ff22 Merge pull request 'fix(.gitignore): 修正 ZRX 目录大小写,避免在大小写敏感环境误提交 SDK' (#2) from home-lenovo-legion-r9000/company-ai-dev into main
Reviewed-on: #2
2026-10-09 09:36:55 +08:00
gjm a94ecf8d40 fix(.gitignore): 修正 ZRX 目录大小写,避免在大小写敏感环境误提交 SDK 2026-10-09 09:33:24 +08:00
33 changed files with 3755 additions and 5618 deletions

No files matched your search

+12 -1
View File
@@ -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
View File
@@ -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"
+13 -3
View File
@@ -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]);
} }
} }
+13 -13
View File
@@ -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;
+4 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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;
} }
+3 -3
View File
@@ -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;
} }
+28 -229
View File
@@ -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;
}; };
+21 -227
View File
@@ -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;
}; };
+342
View File
@@ -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;
}
};
+56 -18
View File
@@ -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__
+2 -1
View File
@@ -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` 指定自己的私钥,**不要把私钥文件名提交到仓库**。
+2 -1
View File
@@ -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` 里指定即可,不要把私钥文件名写进仓库。