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

1308 lines
34 KiB
C++

#include "stdafx.h"
#include "HlrCutOptionDlg.h"
#include "CoreTools.h"
#include "hlrcutoption.h"
#include "KTSetting.h"
#include "COMPARE_DOUBLE.h"
#include <set>
#include "UIHistory.h"
#include "AecDbJoggedCamera.h"
#include "quickmodifydlg.h"
namespace
{
void getEntitiesExtents(AcDbObjectIdArray &ar, AcDbExtents &all)
{
AcGePoint3d ptmax, ptmin;
AcDbExtents ext;
for (int i(0); i < ar.length(); ++i)
{
AcDbEntityPointer ent(ar[i], AcDb::kForRead);
if (ent.openStatus() != Acad::eOk) continue;
if (ent->getGeomExtents(ext) != Acad::eOk) continue;
ptmax = ext.maxPoint();
ptmin = ext.minPoint();
if (ptmax.x < ptmin.x
|| ptmax.y < ptmin.y
|| ptmax.z < ptmin.z) continue;
all.addExt(ext);
}
}
bool selectPoint(ads_real *pPrevPt, LPCTSTR pszPrompts, AcGePoint3d &pt)
{
ads_point adspt;
if (acedGetPoint(pPrevPt, pszPrompts, adspt) != RTNORM) return false;
pt = asPnt3d(adspt);
CoreTools::UCS2WCS(pt, pt);
return true;
}
AcGePoint3d getClosestPoint(const AcGePoint3d &ptOn, const AcGeVector3d &vt, const AcGePoint3d &ptOut)
{
return AecDbJoggedCamera::getClosestPoint(ptOn, vt, ptOut);
}
bool getStartPoint(AcGePoint3d &ptStart, AecDbJoggedCamera *pJogged)
{
if (!pJogged) return false;
int count = pJogged->getCameraCount();
if (count == 0) return true;
const AecDbJoggedCamera::Camera *pCam = pJogged->getCamera(count - 1);
if (!pCam) return true;
CString sPrompts;
AcGePoint3d ptClosed;
AcGeVector3d vt(pCam->getJoggedDir());
sPrompts.Format(_T("\n输入第%d个剖切线的起点:"), count + 1);
while (true)
{
// 取点失败,直接离开
if (!selectPoint(asDblArray(pCam->m_ptEnd), sPrompts, ptStart))
return false;
if (!pJogged->judgeSegmentCanInsert(ptStart, ptStart + vt * 100, ptClosed))
{
acutPrintf(_T("\n剖切线的起点不能和已有的剖切线区域重叠,请重新拾取!"));
continue;
}
return true;
}
return false;
}
bool getEndPoint(AcGePoint3d &ptEnd, const AcGePoint3d &ptStart, AecDbJoggedCamera *pJogged)
{
if (!pJogged) return false;
int count = pJogged->getCameraCount();
if (count == 0) return true;
const AecDbJoggedCamera::Camera *pCam = pJogged->getCamera(count - 1);
if (!pCam) return true;
CString sPrompts;
AcGePoint3d ptClosed;
AcGeVector3d vt(pCam->getJoggedDir());
sPrompts.Format(_T("\n输入第%d个剖切线的终点:"), count + 1);
while (true)
{
// 取点失败,直接离开
if (!selectPoint(asDblArray(ptStart), sPrompts, ptEnd))
return false;
if (!pJogged->judgeSegmentCanInsert(ptStart, ptEnd, ptClosed))
{
acutPrintf(_T("\n剖切线的终点必须在上个剖切线终点和当前剖切线起点的延长线上,请重新拾取!"));
continue;
}
ptEnd = ptClosed;
return true;
}
return false;
}
}
#pragma region CCameraDlg
CCameraDlg::CCameraDlg(CWnd *pParent)
: CDialog(IDD_CAMERA_DLG, pParent)
, m_dHorizTop(.25)
, m_dHorizBottom(.25)
{
GET_CACHE(CCameraDlg
, %f%f
, &m_dHorizTop
, &m_dHorizBottom);
}
CCameraDlg::~CCameraDlg() { }
void CCameraDlg::DoDataExchange(CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
if (!pDX->m_bSaveAndValidate)
{
if (!CoreTools::IsMetersUnit())
{
m_dHorizTop = (int)m_dHorizTop;
m_dHorizBottom = (int)m_dHorizBottom;
}
else
{
CString ss;
ss.Format(_T("%.3f"), m_dHorizTop);
m_dHorizTop = TypeConvert::s2d(ss);
ss.Format(_T("%.3f"), m_dHorizBottom);
m_dHorizBottom = TypeConvert::s2d(ss);
}
}
DDX_Text(pDX, IDC_EDT_HORIZ_TOP, m_dHorizTop);
DDX_Text(pDX, IDC_EDT_HORIZ_BOTTOM, m_dHorizBottom);
}
BOOL CCameraDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void CCameraDlg::OnBnClickedOk()
{
if (!UpdateData(TRUE))
return;
if (COMPARE_DOUBLE::equal(m_dHorizBottom, m_dHorizTop, .001))
{
AfxMessageBox(_T("上下标高不能相等!"));
return;
}
SET_CACHE(CCameraDlg
, %f%f
, m_dHorizTop
, m_dHorizBottom);
OnOK();
}
IMPLEMENT_DYNAMIC(CCameraDlg, CDialog)
BEGIN_MESSAGE_MAP(CCameraDlg, CDialog)
ON_BN_CLICKED(IDOK, &CCameraDlg::OnBnClickedOk)
END_MESSAGE_MAP()
void CCameraDlg::cctv()
{
ads_point adsPtFirst;
if (acedGetPoint(NULL, _T("\n选择第一个点:"), adsPtFirst) != RTNORM) return;
XCameraJig_V jig;
jig.m_ptStart = asPnt3d(adsPtFirst);
CoreTools::UCS2WCS(jig.m_ptStart, jig.m_ptStart);
jig.m_ptStart.z = .0;
jig.m_nStep = 0;
AcEdJig::DragStatus stat = jig.DoIt();
if (stat != AcEdJig::kNormal) return;
jig.m_nStep = 1;
stat = jig.DoIt();
if (stat != AcEdJig::kNormal) return;
jig.m_nStep = 2;
stat = jig.DoIt();
if (stat != AcEdJig::kNormal) return;
AcGePoint3d ptEye(jig.m_ptEye), ptOutput(jig.m_ptOutput);
AcGeVector3d vtEye(jig.m_vtEye);
AecDbXCamera *pCam = new AecDbXCamera();
pCam->SetUsageMode(AecDbXCamera::eVerti);
pCam->SetEyeDirect(vtEye);
pCam->SetEyePoint(ptEye);
pCam->SetWidth(jig.m_ptStart.distanceTo(jig.m_ptEnd));
pCam->SetOutputPoint(ptOutput);
pCam->setLayer(KTSetting::InitLayer(_T("LAY_CAMERA")));
// 在计算之前,取得实体的标高范围
double dMax, dMin;
pCam->calcRangeOfElev(dMax, dMin);
CAcModuleResourceOverride myResources;
CCameraDlg dlg;
dlg.m_dHorizTop = dMax;
dlg.m_dHorizBottom = dMin;
if (dlg.DoModal() != IDOK)
{
DELETE_PTR(pCam);
return;
}
pCam->SetHorizTop(dlg.m_dHorizTop);
pCam->SetHorizBottom(dlg.m_dHorizBottom);
CoreTools::AddToModelSpace(pCam, false);
pCam->refresh(true);
pCam->close();
}
void CCameraDlg::ccth()
{
ads_point adsPtFirst;
if (acedGetPoint(NULL, _T("\n选择切面范围的第一个点:"), adsPtFirst) != RTNORM) return;
XCameraJig_H jig;
jig.m_ptLT = asPnt3d(adsPtFirst);
CoreTools::UCS2WCS(jig.m_ptLT, jig.m_ptLT);
jig.m_ptLT.z = .0;
jig.m_nStep = 0;
AcEdJig::DragStatus stat = jig.DoIt();
if (stat != AcEdJig::kNormal) return;
jig.m_nStep = 1;
stat = jig.DoIt();
if (stat != AcEdJig::kNormal) return;
struct resbuf *selArea = acutBuildList(RTPOINT, jig.m_ptLT
, RTPOINT, jig.m_ptRT
, RTPOINT, jig.m_ptRB
, RTPOINT, jig.m_ptLB
, RTPOINT, jig.m_ptLT
, 0);
AcDbObjectIdArray arIds;
AecDbXCamera::collectEnities(AecDbXCamera::getSelectTypeResbuf(), selArea, arIds);
acutRelRb(selArea);
double dMaxZ(.0), dMinZ(.0);
AcDbExtents ext;
getEntitiesExtents(arIds, ext);
if (!arIds.isEmpty())
{
dMaxZ = ext.maxPoint().z;
dMinZ = ext.minPoint().z;
}
AecDbXCamera *pCam = new AecDbXCamera();
pCam->SetUsageMode(AecDbXCamera::eHoriz);
pCam->SetOutputPoint(jig.m_ptOutput);
pCam->SetWidth(jig.m_ptLT.distanceTo(jig.m_ptRT));
pCam->SetHeight(jig.m_ptLT.distanceTo(jig.m_ptLB));
pCam->setLayer(KTSetting::InitLayer(_T("LAY_CAMERA")));
pCam->calcRangeOfElev(dMaxZ, dMinZ);
CAcModuleResourceOverride myResources;
CCameraDlg dlg;
dlg.m_dHorizTop = dMaxZ;
dlg.m_dHorizBottom = dMinZ;
if (dlg.DoModal() != IDOK)
{
DELETE_PTR(pCam);
return;
}
pCam->SetEyeDirect(-AcGeVector3d::kZAxis * (dlg.m_dHorizTop - dlg.m_dHorizBottom));
pCam->SetHorizTop(dlg.m_dHorizTop);
pCam->SetHorizBottom(dlg.m_dHorizBottom);
AcGePoint3d ptEye(jig.m_ptEye);
ptEye.z = dlg.m_dHorizTop;
pCam->SetEyePoint(ptEye);
CoreTools::AddToModelSpace(pCam, false);
pCam->refresh(true);
pCam->close();
}
void CCameraDlg::dbl()
{
extern bool GetDoubleClickEnt(LPCTSTR pszCmd, AcDbObjectId& id);
AcDbObjectId id;
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_XCAMERA"), id);
if (!bIsOk || !id.isValid()) return;
AcDbObjectPointer<AecDbXCamera> ent(id, AcDb::kForWrite);
if (ent.openStatus() != Acad::eOk) return;
CAcModuleResourceOverride myResources;
CCameraDlg dlg;
dlg.m_dHorizTop = ent->GetHorizTop();
dlg.m_dHorizBottom = ent->GetHorizBottom();
if (ent->GetUsageMode() == AecDbXCamera::eHoriz)
{
if (dlg.DoModal() == IDOK)
{
AcGePoint3d ptEye(ent->GetEyePoint());
AcGeVector3d vtEye(ent->GetEyeDirect());
ent->SetHorizTop(dlg.m_dHorizTop);
ptEye.z = dlg.m_dHorizTop;
ent->SetEyePoint(ptEye);
ent->SetHorizBottom(dlg.m_dHorizBottom);
vtEye = -AcGeVector3d::kZAxis * (ent->GetHorizTop() - ent->GetHorizBottom());
ent->SetEyeDirect(vtEye);
ent->refresh(true);
}
}
else if (ent->GetUsageMode() == AecDbXCamera::eVerti)
{
if (dlg.DoModal() == IDOK)
{
ent->SetHorizTop(dlg.m_dHorizTop);
ent->SetHorizBottom(dlg.m_dHorizBottom);
ent->refresh(true);
}
}
else
{
if (AfxMessageBox(_T("是否刷新结果?"), MB_YESNO) != IDYES) return;
ent->refresh(true);
}
}
void CCameraDlg::resetAecDraw3d()
{
struct resbuf *pRb = acutBuildList( RTDXF0, _T("AEC_DBWEQUIPMENT,AEC_DBOPENING"), 0);
ads_name ss, ent;
int nRes = acedSSGet(NULL, NULL, NULL, pRb, ss);
acutRelRb(pRb);
if (nRes != RTNORM) return;
Adesk::Int32 lLen = 0;
acedSSLength(ss, &lLen);
AcDbObjectId id;
for (int i = 0; i < lLen; i++)
{
acedSSName(ss, i, ent);
acdbGetObjectId(id, ent);
if (!id.isValid()) continue;
AcDbEntityPointer ent(id, AcDb::kForWrite);
AecDbEntityBase *pBase(AecDbEntityBase::cast(ent));
if (!pBase) continue;
AecDbObjXDataMap *pXData = pBase->GetSpecialtyData(AcDb::kForWrite);
if (!pXData) continue;
pXData->SetAt(HLR_CALC, FALSE);
}
acedSSFree(ss);
}
void CCameraDlg::jogged_dbl()
{
extern bool GetDoubleClickEnt(LPCTSTR pszCmd, AcDbObjectId& id);
AcDbObjectId id;
bool bIsOk = GetDoubleClickEnt(_T("DBL_AEC_JOGGEDCAMERA"), id);
if (!bIsOk || !id.isValid()) return;
AcDbObjectPointer<AecDbJoggedCamera> ent(id, AcDb::kForWrite);
if (ent.openStatus() != Acad::eOk) return;
if (AfxMessageBox(_T("是否刷新结果?"), MB_YESNO) != IDYES) return;
ent->refresh();
}
void CCameraDlg::joggedCamera()
{
AecDbJoggedCamera *pJoggedCam = new AecDbJoggedCamera();
if (!pJoggedCam) return;
AcDbObjectId id = CoreTools::AddToModelSpace(pJoggedCam);
int loop(0);
while (loop < 30)
{
AcDbObjectPointer<AecDbJoggedCamera> jogged(id, AcDb::kForWrite);
if (jogged.openStatus() != Acad::eOk) break;
CJoggedCameraJig jig(pJoggedCam);
AcEdJig::DragStatus stat = jig.DoIt();
if (stat == AcEdJig::kNull || stat == AcEdJig::kCancel)
break;
jogged->addCamera(jig.m_ptStart, jig.m_ptEnd, jig.m_vtEye);
++loop;
jogged->close();
}
AcDbObjectPointer<AecDbJoggedCamera> jogged(id, AcDb::kForWrite);
if (jogged.openStatus() != Acad::eOk) return;
// 没有剖切线,清理
if (jogged->getCameraCount() == 0)
{
jogged->erase();
return;
}
ads_point pt;
acedGetPoint(NULL, _T("\n选择生成剖切结果的位置:"), pt);
AcGePoint3d ptOutput(asPnt3d(pt));
CoreTools::UCS2WCS(ptOutput, ptOutput);
jogged->setOutputPoint(ptOutput);
jogged->close();
AcDbObjectIdArray ar;
ar.append(id);
CQuickModifyDlg::start(ar);
}
void CCameraDlg::joggedCamera1()
{
AcDbObjectId id, subid;
AcGeVector3d vtDir;
AcGePoint3d pt1, pt2;
AcDbLine *pLine(NULL);
if (!selectPoint(NULL, _T("\n选择第1条剖切线的起点:"), pt1)) return;
if (!selectPoint(asDblArray(pt1), _T("\n选择第1条剖切线的终点:"), pt2)) return;
vtDir = pt2 - pt1;
vtDir.rotateBy(PI * .5, AcGeVector3d::kZAxis);
AecDbJoggedCamera *pJoggedCam = new AecDbJoggedCamera();
if (!pJoggedCam) return;
if (!pJoggedCam->addCamera(pt1, pt2, vtDir))
{
acutPrintf(_T("\n插入折线剖切失败!"));
DELETE_PTR(pJoggedCam);
return;
}
id = CoreTools::AddToModelSpace(pJoggedCam);
AcGePoint3d ptS, ptE, ptLast;
AcGeVector3d vtLine(pt2 - pt1);
int loop(0);
while (loop < 30)
{
AcDbObjectPointer<AecDbJoggedCamera> jogged(id, AcDb::kForWrite);
if (jogged.openStatus() != Acad::eOk) continue;
ptLast = jogged->getLastPoint();
if (!getStartPoint(ptS, jogged)) break;
AcDbLine *pLine = new AcDbLine(ptS, ptLast);
pLine->setColorIndex(9);
subid = CoreTools::AddToModelSpace(pLine, true);
if (!getEndPoint(ptE, ptS, jogged))
{
AcDbEntityPointer entLine(subid, AcDb::kForWrite);
if (entLine.openStatus() == Acad::eOk)
entLine->erase();
break;
}
jogged->addCamera(ptS, ptE, vtDir);
jogged->close();
AcDbEntityPointer entLine(subid, AcDb::kForWrite);
if (entLine.openStatus() == Acad::eOk)
entLine->erase();
++loop;
}
// 如果没有折线
AcDbObjectPointer<AecDbJoggedCamera> jogged(id, AcDb::kForWrite);
if (jogged.openStatus() != Acad::eOk)
{
AfxMessageBox(_T("生成剖切线出错!"));
return;
}
pt1 = CoreTools::MidPt(ptE, ptS);
CString sPrompts(_T("\n选取一个点,来确定剖切方向和范围:"));
if (!selectPoint(asDblArray(pt1), sPrompts, pt2))
acutPrintf(_T("\n采用默认剖切方向和范围."));
// 获得标高
CCameraDlg dlg;
dlg.m_dHorizTop = 3000.;
dlg.m_dHorizBottom = -3000.;
dlg.DoModal();
if (COMPARE_DOUBLE::equal(dlg.m_dHorizTop, dlg.m_dHorizBottom))
{
dlg.m_dHorizTop = 3000.;
dlg.m_dHorizBottom = -3000.;
}
// 一个循环,设置范围,方向,高度
for (int i(0); i < jogged->getCameraCount(); ++i)
{
jogged->setCameraWidth(i, pt2);
jogged->setCameraHeight(i, dlg.m_dHorizTop, dlg.m_dHorizBottom);
}
// 结果对齐点
pt2 = AcGePoint3d::kOrigin;
if (!selectPoint(asDblArray(pt1), _T("\n选取结果对齐点<默认为原点>:"), pt2))
acutPrintf(_T("\n设置结果对齐点在原点."));
jogged->setOutputPoint(pt2);
jogged->close();
}
namespace
{
// 辅助函数:使用射线法判断一个点是否在闭合曲线上
bool IsPointInsideBoundary(AcDbCurve *pBoundary, const AcGePoint3d &testPt)
{
if (pBoundary == NULL)
{
return false;
}
// 1. 优先判定:点是否在边界曲线上
AcGePoint3d closestPt;
if (pBoundary->getClosestPointTo(testPt, closestPt) == Acad::eOk)
{
// 如果测试点到边界最近点的距离小于容差,认为点在边界上
if (testPt.distanceTo(closestPt) < 1e-6)
{
return true; // 视为在内部,予以保留
}
}
// 2. 获取边界的外包围盒,用于快速排除并构建射线长度
AcDbExtents extents;
if (pBoundary->getGeomExtents(extents) != Acad::eOk)
{
return false;
}
// 粗略判断:如果点在外包围盒之外,肯定在外部
if (testPt.x < extents.minPoint().x || testPt.x > extents.maxPoint().x ||
testPt.y < extents.minPoint().y || testPt.y > extents.maxPoint().y)
{
return false;
}
// 3. 构造一条射线,从测试点射向包围盒外的一个极远点
// 使用非标准角度的向量,尽量避免穿过顶点或与边重合
AcGeVector3d rayDir(1.0, 0.314159, 0.0);
double dist = extents.maxPoint().distanceTo(extents.minPoint()) * 2.0;
AcGePoint3d farPt = testPt + rayDir * dist;
AcDbLine rayLine(testPt, farPt);
AcGePoint3dArray intPts;
// 4. 求交
if (pBoundary->intersectWith(&rayLine, AcDb::kOnBothOperands, intPts) != Acad::eOk)
{
return false;
}
// 5. 过滤重复交点 (容差处理,防止同一个交点被重复计算)
int validIntersectionCount = 0;
for (int i = 0; i < intPts.length(); ++i)
{
bool isDuplicate = false;
for (int j = 0; j < i; ++j)
{
if (intPts[i].distanceTo(intPts[j]) < 1e-6)
{
isDuplicate = true;
break;
}
}
if (!isDuplicate)
{
validIntersectionCount++;
}
}
// 6. 射线法核心:交点个数为奇数则在内部,偶数则在外部
return (validIntersectionCount % 2) != 0;
}
void ClipCurvesByBoundary(AcDbObjectId boundaryId, const AcDbObjectIdArray &targetCurveIds)
{
AcDbObjectPointer<AcDbCurve> pBoundary(boundaryId, AcDb::kForRead);
if (pBoundary.openStatus() != Acad::eOk)
{
return;
}
for (int i = 0; i < targetCurveIds.length(); ++i)
{
AcDbObjectPointer<AcDbCurve> pTargetCurve(targetCurveIds[i], AcDb::kForWrite);
if (pTargetCurve.openStatus() != Acad::eOk)
{
continue;
}
AcGePoint3dArray intPts;
// 1. 获取目标曲线与边界的所有交点
if (pTargetCurve->intersectWith(pBoundary.object(), AcDb::kOnBothOperands, intPts) == Acad::eOk && intPts.length() > 0)
{
AcGeDoubleArray splitParams;
std::vector<double> vecParams;
// 2. 将交点转换为曲线上的参数
for (int j = 0; j < intPts.length(); ++j)
{
double param = 0.0;
AcGePoint3d projPt;
if (pTargetCurve->getClosestPointTo(intPts[j], projPt) == Acad::eOk)
{
if (pTargetCurve->getParamAtPoint(projPt, param) == Acad::eOk)
{
vecParams.push_back(param);
}
}
}
// 3. 对参数进行排序和去重
if (!vecParams.empty())
{
std::sort(vecParams.begin(), vecParams.end());
vecParams.erase(std::unique(vecParams.begin(), vecParams.end()), vecParams.end());
for (size_t k = 0; k < vecParams.size(); ++k)
{
splitParams.append(vecParams[k]);
}
// 4. 打断曲线
AcDbVoidPtrArray curveFragments;
if (pTargetCurve->getSplitCurves(splitParams, curveFragments) == Acad::eOk)
{
// 遍历打断后的碎片
for (int f = 0; f < curveFragments.length(); ++f)
{
AcDbCurve *pFragment = static_cast<AcDbCurve *>(curveFragments[f]);
if (pFragment != NULL)
{
double startParam = 0.0;
double endParam = 0.0;
pFragment->getStartParam(startParam);
pFragment->getEndParam(endParam);
double midParam = (startParam + endParam) / 2.0;
AcGePoint3d midPt;
if (pFragment->getPointAtParam(midParam, midPt) == Acad::eOk)
{
// 恢复正确的逻辑:框内保留,框外剔除
if (IsPointInsideBoundary(pBoundary.object(), midPt))
{
// 内部保留:加入模型空间
CoreTools::AddToModelSpace(pFragment);
}
else
{
// 外部剔除:直接在内存销毁
delete pFragment;
}
}
else
{
delete pFragment;
}
}
}
// 删除打断前的原始线条
pTargetCurve->erase(true);
}
}
}
else
{
// 【核心修复点】:
// 如果与边界完全没有交点(不管它是在红框外面十万八千里,还是在红框正中间)
// 我们什么都不做!
// 智能指针 pTargetCurve 会在离开作用域时自动 close(),实体原样安全保留。
}
}
}
}
void CCameraDlg::cfix()
{
// 1. 选择裁剪边界 (使用 acedEntSel,因为通常边界只选一个)
ads_name boundaryEnt;
ads_point pt;
int res = acedEntSel(_T("\n请选择作为裁剪边界的闭合多段线: "), boundaryEnt, pt);
if (res != RTNORM)
{
acutPrintf(_T("\n未选择边界,命令取消。"));
return;
}
AcDbObjectId boundaryId;
if (acdbGetObjectId(boundaryId, boundaryEnt) != Acad::eOk)
{
return;
}
// 简单校验一下选中的边界是不是一条曲线 (AcDbCurve)
{
AcDbObjectPointer<AcDbCurve> pBoundary(boundaryId, AcDb::kForRead);
if (pBoundary.openStatus() != Acad::eOk)
{
acutPrintf(_T("\n错误:所选边界不是有效的曲线实体!"));
return;
}
// 可选:你甚至可以在这里检查 pBoundary->isClosed() 确保它是闭合的
}
// 2. 批量选择需要被裁剪的目标曲线 (使用 acedSSGet 配合 DXF 过滤)
acutPrintf(_T("\n请框选需要被裁剪的曲线 (将自动过滤非曲线实体): "));
// 构建过滤器:0 代表图元类型,后面的字符串涵盖了绝大多数 AcDbCurve 派生类
// "*POLYLINE" 是通配符,能同时匹配 LWPOLYLINE(轻量多段线) 和 POLYLINE(二维/三维多段线)
struct resbuf *pFilter = acutBuildList(0, _T("LINE,ARC,CIRCLE,ELLIPSE,SPLINE,*POLYLINE"), 0);
ads_name ssName;
// 第一个参数 NULL 表示允许用户进行常规框选/点选
res = acedSSGet(NULL, NULL, NULL, pFilter, ssName);
// 过滤器用完必须立刻释放,避免内存泄漏
acutRelRb(pFilter);
if (res != RTNORM)
{
acutPrintf(_T("\n未选中任何有效的曲线,命令结束。"));
return;
}
// 3. 解析选择集,提取 ObjectId
Adesk::Int32 length = 0;
acedSSLength(ssName, &length);
AcDbObjectIdArray targetCurveIds;
for (long i = 0; i < length; ++i)
{
ads_name en;
if (acedSSName(ssName, i, en) == RTNORM)
{
AcDbObjectId objId;
if (acdbGetObjectId(objId, en) == Acad::eOk)
{
// 确保不要把边界本身也作为被裁剪的目标传进去
if (objId != boundaryId)
{
targetCurveIds.append(objId);
}
}
}
}
// 释放选择集内存
acedSSFree(ssName);
// 4. 调用核心裁剪算法
if (targetCurveIds.length() > 0)
{
acutPrintf(_T("\n成功提取了 %d 条曲线,开始执行裁剪算法..."), targetCurveIds.length());
// 调用之前写好的算法
ClipCurvesByBoundary(boundaryId, targetCurveIds);
acutPrintf(_T("\n裁剪完成!"));
}
else
{
acutPrintf(_T("\n未找到符合条件的裁剪目标。"));
}
}
void CCameraDlg::test_static()
{
//struct resbuf *pRb= acutBuildList(
// -4, _T("<or")
// , -4, _T("<and"), RTDXF0, _T("LINE"), 8, _T("Dote"), -4, _T("and>")
// , -4, _T("<and"), RTDXF0, _T("INSERT"), 8, _T("AXISTXT"), 2, _T("_AXISO"), -4, _T("and>")
// , -4, _T("<and"), RTDXF0, _T("DIMENSION"), 8, _T("AXISTXT"), -4, _T("and>")
// , -4, _T("or>")
// , 0);
}
#pragma endregion
#pragma region HlrCutOptionDlg
#define SET_BY_OPT_VALUE(func, name)\
m_bSet##func####name = HlrCutOption::getHlr##func##_##name(m_n##func####name)
#define SET_OPT_VALUE(func, name)\
if (m_bSet##func####name) \
HlrCutOption::setHlr##func##_##name(m_n##func####name);\
else \
HlrCutOption::removeHlr##func##_##name()
#define SET_BY_OPT_CHECK(func, name)\
m_bSet##func####name = HlrCutOption::getHlr##func##_##name()
#define SET_OPT_CHECK(func, name)\
HlrCutOption::setHlr##func##_##name(m_bSet##func####name);\
IMPLEMENT_DYNAMIC(HlrCutOptionDlg, CDialog)
HlrCutOptionDlg::HlrCutOptionDlg(CWnd *pParent)
: CDialog(IDD_HLR_OPTION_DLG, pParent)
, m_bSetBLKSTAIR(TRUE)
, m_bSetBLKFITTING(TRUE)
, m_bSetBLKOPEN(TRUE)
, m_bSetBLKEQU(TRUE)
, m_bSetBLKPARAEQU(TRUE)
, m_bSetBLKYGDT(TRUE)
, m_bSetSTYLE2DOPEN(TRUE)
, m_bSetSTYLE2DVALVE(TRUE)
, m_bSetSTYLE2DHOLE(TRUE)
, m_bSetLWWall(FALSE)
, m_bSetLWBeam(FALSE)
, m_bSetLWSlab(FALSE)
, m_bSetLWColumn(TRUE)
, m_bSetZXSameDir(FALSE)
, m_bSetZXParallel(FALSE)
, m_bSetLWPipeSys(FALSE)
, m_bSetLWElecSys(FALSE)
, m_bSetLWHvacSys(FALSE)
//, m_bSetMERGEEnvelope(TRUE)
, m_bSetLWEnvCut(TRUE)
, m_bSetMERGEWall(TRUE)
, m_bSetMERGEBeam(TRUE)
, m_bSetMERGESlab(TRUE)
, m_bSetMERGEColumn(FALSE)
, m_bSetLWEnvelope(FALSE)
, m_bSetLYEnvelope(FALSE)
, m_bSetLTEnvelope(FALSE)
, m_bSetCLEnvelope(FALSE)
, m_nLWWall(.5)
, m_nLWBeam(.5)
, m_nLWSlab(.5)
, m_nLWColumn(.5)
, m_nLWPipeSys(.5)
, m_nLWElecSys(.5)
, m_nLWHvacSys(.5)
, m_nLWEnvelope(.5)
, m_nLWEnvCut(5)
, m_nLYEnvelope(AcDbObjectId::kNull)
, m_nLTEnvelope(AcDbObjectId::kNull)
, m_nCLEnvelope(256)
{
HlrCutOption::init();
// 构筑物线宽
SET_BY_OPT_VALUE(LW, Wall);
SET_BY_OPT_VALUE(LW, Beam);
SET_BY_OPT_VALUE(LW, Slab);
SET_BY_OPT_VALUE(LW, Column);
SET_BY_OPT_VALUE(LW, PipeSys);
SET_BY_OPT_VALUE(LW, ElecSys);
SET_BY_OPT_VALUE(LW, HvacSys);
SET_BY_OPT_VALUE(LW, EnvCut);
SET_BY_OPT_CHECK(BLK, OPEN);
SET_BY_OPT_CHECK(BLK, FITTING);
SET_BY_OPT_CHECK(BLK, EQU);
SET_BY_OPT_CHECK(BLK, PARAEQU);
SET_BY_OPT_CHECK(BLK, YGDT);
SET_BY_OPT_CHECK(BLK, STAIR);
SET_BY_OPT_CHECK(STYLE2D, OPEN);
SET_BY_OPT_CHECK(STYLE2D, VALVE);
SET_BY_OPT_CHECK(STYLE2D, HOLE);
//SET_BY_OPT_CHECK(MERGE, Envelope);
// 构筑物融合
SET_BY_OPT_CHECK(MERGE, Wall);
SET_BY_OPT_CHECK(MERGE, Beam);
SET_BY_OPT_CHECK(MERGE, Slab);
SET_BY_OPT_CHECK(MERGE, Column);
// 构筑物融合后使用的属性
SET_BY_OPT_VALUE(LW, Envelope);
SET_BY_OPT_VALUE(LY, Envelope);
SET_BY_OPT_VALUE(LT, Envelope);
SET_BY_OPT_VALUE(CL, Envelope);
// 折线剖切
SET_BY_OPT_CHECK(ZX, SameDir);
SET_BY_OPT_CHECK(ZX, Parallel);
}
HlrCutOptionDlg::~HlrCutOptionDlg() { }
void HlrCutOptionDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDT_WALL, m_edtWall);
DDX_Control(pDX, IDC_EDT_BEAM, m_edtBeam);
DDX_Control(pDX, IDC_EDT_SLAB, m_edtSlab);
DDX_Control(pDX, IDC_EDT_COLUMN, m_edtColumn);
DDX_Control(pDX, IDC_EDT_PIPE, m_edtPipe);
DDX_Control(pDX, IDC_EDT_PIPE_FIT, m_edtPipeFit);
DDX_Control(pDX, IDC_EDT_EC, m_edtEc);
DDX_Control(pDX, IDC_EDT_EC_FIT, m_edtEcFit);
DDX_Control(pDX, IDC_EDT_HVAC, m_edtHvac);
DDX_Control(pDX, IDC_EDT_HVAC_FIT, m_edtHvacFit);
DDX_Control(pDX, IDC_EDT_ENVCUT, m_edtEnvCut);
DDX_Control(pDX, IDC_CHK_WALL, m_chkWall);
DDX_Control(pDX, IDC_CHK_BEAM, m_chkBeam);
DDX_Control(pDX, IDC_CHK_SLAB, m_chkSlab);
DDX_Control(pDX, IDC_CHK_COLUMN, m_chkColumn);
DDX_Control(pDX, IDC_CHK_ENVE_WEIGTH, m_chkEnvelopeLW);
DDX_Control(pDX, IDC_CHK_ENVE_LINETYPE, m_chkEnvelopeLT);
DDX_Control(pDX, IDC_CHK_ENVE_LAYER, m_chkEnvelopeLY);
DDX_Control(pDX, IDC_CHK_ENVE_COLOR, m_chkEnvelopeCL);
DDX_Control(pDX, IDC_EDT_ENVE_WEIGTH, m_edtEnvelopeLW);
DDX_Control(pDX, IDC_CMB_ENVE_LINETYPE, m_cmbEnvelopeLT);
DDX_Control(pDX, IDC_CMB_ENVE_LAYER, m_cmbEnvelopeLY);
DDX_Control(pDX, IDC_BTN_ENVE_COLOR, m_btnEnvelopeCL);
DDX_Check(pDX, IDC_CHK_WALL, m_bSetLWWall);
DDX_Check(pDX, IDC_CHK_BEAM, m_bSetLWBeam);
DDX_Check(pDX, IDC_CHK_SLAB, m_bSetLWSlab);
DDX_Check(pDX, IDC_CHK_COLUMN, m_bSetLWColumn);
DDX_Check(pDX, IDC_CHK_ENVCUT, m_bSetLWEnvCut);
DDX_Check(pDX, IDC_CHK_PIPE, m_bSetLWPipeSys);
DDX_Check(pDX, IDC_CHK_EC, m_bSetLWElecSys);
DDX_Check(pDX, IDC_CHK_HVAC, m_bSetLWHvacSys);
DDX_Check(pDX, IDC_CHK_BLK_YGDT, m_bSetBLKYGDT);
DDX_Check(pDX, IDC_CHK_BLK_EQU, m_bSetBLKEQU);
DDX_Check(pDX, IDC_CHK_BLK_PARAEQU, m_bSetBLKPARAEQU);
DDX_Check(pDX, IDC_CHK_BLK_OPEN, m_bSetBLKOPEN);
DDX_Check(pDX, IDC_CHK_BLK_FITTING, m_bSetBLKFITTING);
DDX_Check(pDX, IDC_CHK_BLK_STAIR, m_bSetBLKSTAIR);
DDX_Check(pDX, IDC_CHK_2D_VALVE, m_bSetSTYLE2DVALVE);
DDX_Check(pDX, IDC_CHK_2D_OPEN, m_bSetSTYLE2DOPEN);
DDX_Check(pDX, IDC_CHK_2D_HOLE, m_bSetSTYLE2DHOLE);
//DDX_Check(pDX, IDC_CHK_ENVELOPE_MERGE, m_bSetMERGEEnvelope);
DDX_Check(pDX, IDC_CHK_MERGE_WALL, m_bSetMERGEWall);
DDX_Check(pDX, IDC_CHK_MERGE_BEAM, m_bSetMERGEBeam);
DDX_Check(pDX, IDC_CHK_MERGE_SLAB, m_bSetMERGESlab);
DDX_Check(pDX, IDC_CHK_MERGE_COLUMN, m_bSetMERGEColumn);
DDX_Check(pDX, IDC_CHK_ENVE_WEIGTH, m_bSetLWEnvelope);
DDX_Check(pDX, IDC_CHK_ENVE_LAYER, m_bSetLYEnvelope);
DDX_Check(pDX, IDC_CHK_ENVE_LINETYPE, m_bSetLTEnvelope);
DDX_Check(pDX, IDC_CHK_ENVE_COLOR, m_bSetCLEnvelope);
DDX_Check(pDX, IDC_CHK_ZX_SAME_DIR, m_bSetZXSameDir);
DDX_Check(pDX, IDC_CHK_ZX_PARALLEL, m_bSetZXParallel);
DDX_Text(pDX, IDC_EDT_WALL, m_nLWWall);
DDX_Text(pDX, IDC_EDT_BEAM, m_nLWBeam);
DDX_Text(pDX, IDC_EDT_SLAB, m_nLWSlab);
DDX_Text(pDX, IDC_EDT_COLUMN, m_nLWColumn);
DDX_Text(pDX, IDC_EDT_PIPE, m_nLWPipeSys);
DDX_Text(pDX, IDC_EDT_HVAC, m_nLWHvacSys);
DDX_Text(pDX, IDC_EDT_EC, m_nLWElecSys);
DDX_Text(pDX, IDC_EDT_ENVCUT, m_nLWEnvCut);
DDX_Text(pDX, IDC_EDT_ENVE_WEIGTH, m_nLWEnvelope);
DDV_MinMaxDouble(pDX, m_nLWWall, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWBeam, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWSlab, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWColumn, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWEnvCut, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWPipeSys, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWHvacSys, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWElecSys, .01, 100);
DDV_MinMaxDouble(pDX, m_nLWEnvelope, .01, 100);
}
BOOL HlrCutOptionDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
OnBnClickedEnvelopeMerage();
OnBnClickedChk();
initCombobox();
return TRUE;
}
#define getSymbolRecords(symboltable, type)\
{\
TCHAR *name(NULL);\
int nCurIdx(-1);\
AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();\
if (pDb)\
{\
AcDb##symboltable##TablePointer table(pDb, AcDb::kForRead);\
AcDb##symboltable##TableIterator *pIter;\
table->newIterator(pIter);\
AcDbObjectId id;\
int idx(-1);\
for (int i(0); !pIter->done(); pIter->step(), ++i)\
{\
pIter->getRecordId(id);\
AcDb##symboltable##TableRecordPointer rec(id, AcDb::kForRead);\
rec->getName(name);\
idx = m_cmbEnvelope##type.AddString(name);\
m_cmbEnvelope##type.SetItemData(idx, id.asOldId());\
acutDelString(name);\
if (m_n##type##Envelope == id)\
nCurIdx = idx;\
}\
delete pIter;\
}\
if (m_cmbEnvelope##type.GetCount() != 0)\
m_cmbEnvelope##type.SetCurSel(nCurIdx == -1 ? 0 : nCurIdx);\
}
void HlrCutOptionDlg::initCombobox()
{
getSymbolRecords(Layer, LY);
getSymbolRecords(Linetype, LT);
}
BEGIN_MESSAGE_MAP(HlrCutOptionDlg, CDialog)
ON_BN_CLICKED(IDOK, &HlrCutOptionDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_CHK_WALL, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_BEAM, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_SLAB, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_COLUMN, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_ENVCUT, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_PIPE, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_PIPE_FIT, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_EC, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_EC_FIT, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_HVAC, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_HVAC_FIT, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_ENVE_WEIGTH, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_ENVE_LAYER, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_ENVE_LINETYPE, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_ENVE_COLOR, &HlrCutOptionDlg::OnBnClickedChk)
ON_BN_CLICKED(IDC_CHK_MERGE_WALL, &HlrCutOptionDlg::OnBnClickedEnvelopeMerage)
ON_BN_CLICKED(IDC_CHK_MERGE_BEAM, &HlrCutOptionDlg::OnBnClickedEnvelopeMerage)
ON_BN_CLICKED(IDC_CHK_MERGE_SLAB, &HlrCutOptionDlg::OnBnClickedEnvelopeMerage)
ON_BN_CLICKED(IDC_CHK_MERGE_COLUMN, &HlrCutOptionDlg::OnBnClickedEnvelopeMerage)
ON_BN_CLICKED(IDC_BTN_ENV_COLOR, &HlrCutOptionDlg::OnBnClickedEnvelopeColor)
ON_WM_CTLCOLOR()
ON_CBN_SELCHANGE(IDC_CMB_ENVE_LAYER, &HlrCutOptionDlg::OnComboBoxSelChangeLayer)
ON_CBN_SELCHANGE(IDC_CMB_ENVE_LINETYPE, &HlrCutOptionDlg::OnComboBoxSelChangeLinetype)
END_MESSAGE_MAP()
void HlrCutOptionDlg::OnBnClickedOk()
{
if (!UpdateData(TRUE))
return;
SET_OPT_VALUE(LW, Wall);
SET_OPT_VALUE(LW, Beam);
SET_OPT_VALUE(LW, Slab);
SET_OPT_VALUE(LW, Column);
// 2025.10.29 管道+配件+阀门 变为统一线宽
SET_OPT_VALUE(LW, PipeSys);
SET_OPT_VALUE(LW, ElecSys);
SET_OPT_VALUE(LW, HvacSys);
SET_OPT_VALUE(LW, EnvCut);
SET_OPT_CHECK(BLK, OPEN);
SET_OPT_CHECK(BLK, FITTING);
SET_OPT_CHECK(BLK, EQU);
SET_OPT_CHECK(BLK, PARAEQU);
SET_OPT_CHECK(BLK, YGDT);
SET_OPT_CHECK(BLK, STAIR);
SET_OPT_CHECK(STYLE2D, OPEN);
SET_OPT_CHECK(STYLE2D, VALVE);
SET_OPT_CHECK(STYLE2D, HOLE);
//SET_OPT_CHECK(MERGE, Envelope);
SET_OPT_CHECK(MERGE, Wall);
SET_OPT_CHECK(MERGE, Beam);
SET_OPT_CHECK(MERGE, Slab);
SET_OPT_CHECK(MERGE, Column);
SET_OPT_VALUE(LW, Envelope);
SET_OPT_VALUE(LT, Envelope);
SET_OPT_VALUE(LY, Envelope);
SET_OPT_VALUE(CL, Envelope);
SET_OPT_CHECK(ZX, SameDir);
SET_OPT_CHECK(ZX, Parallel);
CDialog::OnOK();
}
bool HlrCutOptionDlg::isMerageEnvelope()
{
int count(0);
if (m_bSetMERGEWall)
++count;
if (m_bSetMERGEBeam)
++count;
if (m_bSetMERGESlab)
++count;
if (m_bSetMERGEColumn)
++count;
return count >= 2;
}
void HlrCutOptionDlg::OnBnClickedChk()
{
UpdateData(TRUE);
bool bMerge(isMerageEnvelope());
// 不融合,只要线宽设置的check被选上,线宽edit就可用
if (!bMerge)
{
m_edtWall.EnableWindow(m_bSetLWWall);
m_edtBeam.EnableWindow(m_bSetLWBeam);
m_edtSlab.EnableWindow(m_bSetLWSlab);
m_edtColumn.EnableWindow(m_bSetLWColumn);
}
// 融合情况下,哪种类型 !没有! 参与融合,哪种类型的线宽check被选上,线宽edit就可用
else
{
if (!m_bSetMERGEWall)
{
m_edtWall.EnableWindow(m_bSetLWWall);
m_chkWall.EnableWindow(TRUE);
}
else
{
m_edtWall.EnableWindow(FALSE);
m_chkWall.EnableWindow(FALSE);
}
if (!m_bSetMERGEBeam)
{
m_edtBeam.EnableWindow(m_bSetLWBeam);
m_chkBeam.EnableWindow(TRUE);
}
else
{
m_edtBeam.EnableWindow(FALSE);
m_chkBeam.EnableWindow(FALSE);
}
if (!m_bSetMERGESlab)
{
m_edtSlab.EnableWindow(m_bSetLWSlab);
m_chkSlab.EnableWindow(TRUE);
}
else
{
m_edtSlab.EnableWindow(FALSE);
m_chkSlab.EnableWindow(FALSE);
}
if (!m_bSetMERGEColumn)
{
m_edtColumn.EnableWindow(m_bSetLWColumn);
m_chkColumn.EnableWindow(TRUE);
}
else
{
m_edtColumn.EnableWindow(FALSE);
m_chkColumn.EnableWindow(FALSE);
}
}
//m_edtWall.EnableWindow(bMerge ? FALSE : m_bSetLWWall);
//m_edtBeam.EnableWindow(bMerge ? FALSE : m_bSetLWBeam);
//m_edtSlab.EnableWindow(bMerge ? FALSE : m_bSetLWSlab);
//m_edtColumn.EnableWindow(bMerge ? FALSE : m_bSetLWColumn);
m_edtEnvCut.EnableWindow(m_bSetLWEnvCut);
m_edtPipe.EnableWindow(m_bSetLWPipeSys);
m_edtEc.EnableWindow(m_bSetLWElecSys);
m_edtHvac.EnableWindow(m_bSetLWHvacSys);
m_edtEnvelopeLW.EnableWindow(!bMerge ? FALSE : m_bSetLWEnvelope);
m_cmbEnvelopeLT.EnableWindow(!bMerge ? FALSE : m_bSetLTEnvelope);
m_cmbEnvelopeLY.EnableWindow(!bMerge ? FALSE : m_bSetLYEnvelope);
m_btnEnvelopeCL.EnableWindow(!bMerge ? FALSE : m_bSetCLEnvelope);
}
void HlrCutOptionDlg::OnBnClickedEnvelopeMerage()
{
UpdateData(TRUE);
bool bMerge(isMerageEnvelope());
if (bMerge)
{
m_chkWall.EnableWindow(!m_bSetMERGEWall);
m_chkBeam.EnableWindow(!m_bSetMERGEBeam);
m_chkSlab.EnableWindow(!m_bSetMERGESlab);
m_chkColumn.EnableWindow(!m_bSetMERGEColumn);
}
else
{
m_chkWall.EnableWindow(TRUE);
m_chkBeam.EnableWindow(TRUE);
m_chkSlab.EnableWindow(TRUE);
m_chkColumn.EnableWindow(TRUE);
}
m_chkEnvelopeLW.EnableWindow(bMerge);
m_chkEnvelopeLT.EnableWindow(bMerge);
m_chkEnvelopeLY.EnableWindow(bMerge);
m_chkEnvelopeCL.EnableWindow(bMerge);
m_edtEnvelopeLW.EnableWindow(!bMerge ? FALSE : m_bSetLWEnvelope);
m_cmbEnvelopeLT.EnableWindow(!bMerge ? FALSE : m_bSetLTEnvelope);
m_cmbEnvelopeLY.EnableWindow(!bMerge ? FALSE : m_bSetLYEnvelope);
m_btnEnvelopeCL.EnableWindow(!bMerge ? FALSE : m_bSetCLEnvelope);
}
void HlrCutOptionDlg::OnBnClickedEnvelopeColor()
{
if (acedSetColorDialog(m_nCLEnvelope, Adesk::kTrue, 0) != Adesk::kTrue) return;
m_btnEnvelopeCL.RedrawWindow();
}
HBRUSH HlrCutOptionDlg::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (nCtlColor == CTLCOLOR_BTN)
{
if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_BTN_ENVE_COLOR)
{
CRect rc;
pWnd->GetClientRect(rc);
pDC->FillSolidRect(rc, acedGetRGB(m_nCLEnvelope));
}
}
return hbr;
}
void HlrCutOptionDlg::OnComboBoxSelChangeLayer()
{
int idx = m_cmbEnvelopeLY.GetCurSel();
if (idx == -1) return;
Adesk::IntDbId dbid = m_cmbEnvelopeLY.GetItemData(idx);
m_nLYEnvelope.setFromOldId(dbid);
}
void HlrCutOptionDlg::OnComboBoxSelChangeLinetype()
{
int idx = m_cmbEnvelopeLT.GetCurSel();
if (idx == -1) return;
Adesk::IntDbId dbid = m_cmbEnvelopeLT.GetItemData(idx);
m_nLTEnvelope.setFromOldId(dbid);
}
void HlrCutOptionDlg::hlrOption()
{
CAcModuleResourceOverride myResources;
HlrCutOptionDlg dlg;
dlg.DoModal();
}
#pragma endregion