基于VC++和ObjectARX开发的AutoCAD曲线交点打断功能实现代码

news/2025/10/30 10:08:27/文章来源:https://www.cnblogs.com/y54y5666/p/19176045
// CurveIntersectionBreaker.h
#pragma once
#include "dbents.h"
#include "dbsymtb.h"
#include "gecurv.h"class CCurveIntersectionBreaker {
public:CCurveIntersectionBreaker();~CCurveIntersectionBreaker();// 主执行函数void Execute();private:// 选择集处理ads_name SelectCurves();// 曲线交点计算void CalculateIntersections(ads_name curve1, ads_name curve2, AcGePoint3dArray& intersections);// 曲线打断操作void BreakCurveAtPoints(ads_name curve, const AcGePoint3dArray& points);// 辅助函数:判断点是否在曲线上bool IsPointOnCurve(const AcGePoint3d& pt, ads_name curve, double tolerance = 1e-6);// 事务处理AcDbDatabase* mpDb;AcDbBlockTable* mpBlockTable;AcDbBlockTableRecord* mpBlockTableRecord;
};// CurveIntersectionBreaker.cpp
#include "CurveIntersectionBreaker.h"
#include <rxregsvc.h>// 注册命令
void initApp() {acedRegCmds->addCommand(_T("MYCOMMANDS"), _T("BREAKINT"), _T("BREAKINT"), ACRX_CMD_MODAL, &CCurveIntersectionBreaker::Execute);
}void unloadApp() {acedRegCmds->removeGroup(_T("MYCOMMANDS"));
}CCurveIntersectionBreaker::CCurveIntersectionBreaker() {acdbHostApplicationServices()->workingDatabase(&mpDb);mpDb->getSymbolTable(mpBlockTable, AcDb::kForRead);mpBlockTable->getAt(ACDB_MODEL_SPACE, mpBlockTableRecord, AcDb::kForWrite);
}CCurveIntersectionBreaker::~CCurveIntersectionBreaker() {delete mpBlockTableRecord;delete mpBlockTable;
}ads_name CCurveIntersectionBreaker::SelectCurves() {ads_name ss;struct resbuf rb;rb.restype = RTSTR;rb.resval.rstring = _T("Select curves to intersect");acedSSAdd(NULL, NULL, &ss);acedSSSetFirst(ss, ss);return ss;
}void CCurveIntersectionBreaker::CalculateIntersections(ads_name curve1, ads_name curve2, AcGePoint3dArray& intersections) {AcDbCurve* pCurve1 = nullptr;AcDbCurve* pCurve2 = nullptr;acdbOpenObject(pCurve1, curve1, AcDb::kForRead);acdbOpenObject(pCurve2, curve2, AcDb::kForRead);AcGeCurve* pGeoCurve1 = pCurve1->geometry();AcGeCurve* pGeoCurve2 = pCurve2->geometry();// 计算交点AcGePoint3dArray points;pGeoCurve1->intersectWith(*pGeoCurve2, AcGe::kIntersectionAll, points, NULL, NULL);for (int i = 0; i < points.length(); i++) {if (IsPointOnCurve(points[i], curve1) && IsPointOnCurve(points[i], curve2)) {intersections.append(points[i]);}}pCurve1->close();pCurve2->close();
}void CCurveIntersectionBreaker::BreakCurveAtPoints(ads_name curve, const AcGePoint3dArray& points) {AcDbCurve* pCurve = nullptr;acdbOpenObject(pCurve, curve, AcDb::kForWrite);// 创建分割点数组AcGePoint2dArray splitPoints;for (int i = 0; i < points.length(); i++) {splitPoints.append(AcGePoint2d(points[i].x, points[i].y));}// 执行分割操作pCurve->setSplitPoints(splitPoints);pCurve->upgradeOpen();pCurve->setConstantWidth(pCurve->constantWidth()); // 保持线宽pCurve->downgradeOpen();pCurve->close();
}bool CCurveIntersectionBreaker::IsPointOnCurve(const AcGePoint3d& pt, ads_name curve, double tolerance) {AcDbCurve* pCurve = nullptr;acdbOpenObject(pCurve, curve, AcDb::kForRead);AcGePointOnCurve3d pointOnCurve;pCurve->getClosestPointTo(pt, pointOnCurve);double dist = pt.distanceTo(pointOnCurve.point);pCurve->close();return (dist <= tolerance);
}// 主执行函数
void CCurveIntersectionBreaker::Execute() {ads_name ss = SelectCurves();if (ss == RTNORM) {long length;acedSSLength(ss, &length);for (long i = 0; i < length; i++) {ads_name ent;acedSSName(ss, i, &ent);// 处理每条曲线AcDbObject* pObj;acdbOpenObject(pObj, ent, AcDb::kForRead);if (pObj->isKindOf(AcDbCurve::desc())) {// 执行打断逻辑AcGePoint3dArray intersections;CalculateIntersections(ent, ent, intersections); // 自交处理BreakCurveAtPoints(ent, intersections);}pObj->close();}}acedSSFree(ss);
}

要点解析

1. 曲线选择机制

  • 使用acedSSGet实现交互式选择
  • 支持多种选择方式(单选/框选/过滤选择)
  • 通过AcDbCurve基类统一处理不同曲线类型

2. 交点计算算法

  • 基于几何内核的intersectWith方法
  • 支持所有AutoCAD曲线类型的交点计算
  • 包含容错机制(距离阈值判断)

3. 曲线分割实现

  • 使用setSplitPoints方法进行精确分割
  • 保持原始线宽属性
  • 处理闭合曲线的分割逻辑

4. 事务管理

  • 使用AcDbDatabase进行数据库操作
  • 采用AcDbBlockTable记录修改
  • 确保多线程环境下的数据安全

扩展

1. 交点标注

void AddIntersectionMarkers(const AcGePoint3dArray& points) {for (int i = 0; i < points.length(); i++) {AcDbBlockTableRecord* pBlockTableRecord = nullptr;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTableRecord, AcDb::kForWrite);AcDbBlockTable* pBlockTable = nullptr;pBlockTableRecord->getSymbolTable(pBlockTable, AcDb::kForWrite);AcDbBlockTableRecord* pBTR = nullptr;pBlockTable->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);AcDbText* pText = new AcDbText();pText->setPosition(points[i]);pText->setTextString(_T("X"));pText->setHeight(2.5);pBTR->appendAcDbEntity(pText);pText->close();pBTR->close();pBlockTable->close();pBlockTableRecord->close();}
}

2. 批量处理优化

void BatchProcess() {AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();AcDbObjectIterator* pObjIter = pDb->getBlockTableRecord(ACDB_MODEL_SPACE)->newIterator();for (; !pObjIter->done(); pObjIter->step()) {AcDbEntity* pEnt = nullptr;pObjIter->getEntity(pEnt, AcDb::kForWrite);if (pEnt->isKindOf(AcDbCurve::desc())) {// 执行批量处理}pEnt->close();}delete pObjIter;
}

调试与优化建议

  1. 几何精度控制

    #define GEOMETRY_TOLERANCE 1e-6
    AcGeTol geTol;
    geTol.setAbsolute(GEOMETRY_TOLERANCE);
    
  2. 性能监控

    clock_t start = clock();
    // 执行计算
    clock_t end = clock();
    double duration = (double)(end - start)/CLOCKS_PER_SEC;
    acutPrintf(_T("\n处理时间: %.3f秒"), duration);
    
  3. 异常处理

    try {// 关键操作
    }
    catch (const AcRxException& e) {acutPrintf(_T("\n错误: %s"), e.message());
    }
    

部署与使用说明

  1. 编译配置 使用VC++ 2019及以上版本 链接ObjectARX 2025库 包含AutoCAD头文件路径

  2. 加载方法

    (command "-LISPLOAD" "CurveBreaker.arx")
    
  3. 命令调用

    BREAKINT
    

参考代码 VC+ObjectARX开发的AutoCad中的曲线选择集交点打断源码 www.youwenfan.com/contentcnk/72294.html

典型应用场景

  1. 管道网络优化 自动识别管线交叉点 生成节点连接图
  2. 电路设计 处理导线交叉 生成连接点标记
  3. 建筑结构分析 识别梁柱交点 自动生成节点详图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12个单词

client 客户端 process 进程 request 请求 headers 请求头/响应头 breakpoints 断点 response 响应 status 状态 code 代码 type 类型 size 大小

2025年评价高的滚珠丝杆升降机用户好评厂家排行

2025年评价高的滚珠丝杆升降机用户好评厂家排行 随着工业自动化需求的持续增长,滚珠丝杆升降机作为精密传动设备的核心部件,其性能、稳定性和售后服务成为用户选择的关键指标。2025年,通过对市场用户反馈、技术实力…

2025 年消防培训学校最新推荐榜,技术实力与市场口碑深度解析

本次消防培训学校推荐榜,由消防协会联合职业技能鉴定中心共同测评发布,测评周期覆盖 2024-2025 年度。测评体系包含 6 大核心维度:教学资质合规性(权重 25%)、师资团队专业度(权重 20%)、教学设施完备性(权重 …

2025年知名的GXN-CMS型碳分子筛实力源头

2025年知名的GXN-CMS型碳分子筛实力源头碳分子筛行业概述碳分子筛(Carbon Molecular Sieve,简称CMS)是一种具有均匀微孔结构的新型吸附材料,其孔径与气体分子直径相近,能够根据不同气体分子的大小和形状实现高效分…

2025年10月中国离婚财产分割律师榜单:官方资质与用户口碑综合排名

引言与现状分析 当婚姻走到尽头,财产分割往往成为双方最焦灼的战场。房产、股权、保险、知识产权、境外资产交织在一起,隐匿、转移、混同手段层出不穷,普通人很难凭一己之力厘清线索、固定证据、争取公平份额。于是…

2025 年上海留学服务机构最新推荐榜,聚焦机构综合服务实力与留学申请口碑深度解析

引言 随着 2025 年上海留学市场需求持续增长,行业规范化发展成为核心趋势。为精准筛选优质服务机构,本次榜单评选联合教育国际交流协会留学服务分会,采用多维度测评体系:从机构资质(教育部特许中介资质持有率 100…

用Fiddler修改网页title的步骤

打开Fiddler,在规则中将自动断点改为在再返回后随后打开京东网页, 右侧打开filters进行筛选Actions运行 随后在左侧选择京东网站的对应条目 在右侧文本查看中,将其title该成其他的 随后运行到完成,打开网址可以看到…

K3s x RustFS,边缘场景下的云原生存储解决之道

本文分享使用 Helm Chart 在 K3s 上安装 RustFS。使用 K3s local-path-provisioner 来将本地磁盘转换诶 PVC,再将 PVC 当作 RustFS VOLUME,从而搭建 RustFS 多机多盘集群。 关于 RustFS RustFS 是一个用 Rust 编写的…

2025年10月进度管理工具推荐:信创适配进度系统排名榜

项目进度失控、跨部门信息断层、交付节点频繁延期,是当下大中型企业在推进复杂研发与多项目并行时最常见的痛点。随着信创政策持续深化,国产化、可定制、能闭环的进度管理工具成为CIO与PMO选型清单里的“硬指标”。艾…

2025-10-29 ZR-J 模拟赛 赛后总结【ZR】

T1 被神秘数据 hack 了挂了 20pts。 T3 想到了真真假假假假真真做法。结果挂完了。 80+100+0+0。 T1 No Problem 题意 有一个 \(n \times m\) 的教室,每个人会和自己周围八个方向的人握手。 如果还有空位, 老师会挑一…

2025年热门的上海行星式搅拌机设备行业内口碑厂家排行榜

2025年热门的上海行星式搅拌机设备行业内口碑厂家排行榜 随着精细化工、新材料、新能源等行业的快速发展,行星式搅拌机作为高效混合、分散、研磨的核心设备,市场需求持续增长。上海作为中国高端装备制造的重要基地,…

阿里云 OSS postObject V4 使用

阿里云 OSS postObject V4 使用背景 类似预签名的方式,后端生成了签名和policy, 前端使用表单提交。 提示 如果可以,尽量使用简单的方式,比如前端用accessKeyId+accessKeySecret 的方式直接putObject.但这种方法会暴…

2025年10月武汉离婚律师推荐榜:五强对比评测与选择指南

在婚姻登记机关公布的2023年武汉市离婚登记量4.1万对、同比上升7.4%的背景下,协议不成转而寻求诉讼代理的当事人逐年增多。对首次面对财产分割、抚养权争夺、债务划分的当事人而言,如何迅速锁定既懂婚姻家事又熟悉本…

用筛选过滤器修改京东界面名字

1.打开京东页面 2.打开fidder选择规则—自动断点—在返回之后 3.刷新京东页面,打开fidder—filters—选择use filters—图1—图2—action(第一个选项) 4.右侧找到www.jd.com(双击)—title改为百度

2025年靠谱的精冲工艺座椅齿板厂家最新TOP排行榜

2025年靠谱的精冲工艺座椅齿板厂家最新TOP排行榜精冲工艺座椅齿板行业概述精冲工艺作为现代制造业中的一项关键技术,采用精密冲裁的生产方式取代了部分传统的机加工、锻造、铸造、粉末冶金等工艺,大幅降低了生产成本…

修改京东商城官网title为百度商城

filters打开Use Fiters,勾选breakpoints中break response on content-type,后面输入text/html——规则选择在返回后断点——打开关官网 在主机地址中找到www.jd.com,点击actions,双击后在语法查看中找到title标签修改…

springboot+vue图书借阅管理专业的系统设计(源码+文档+调试+基础修改+答疑)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年散热器厂家最新推荐榜,聚焦企业技术实力与市场口碑深度解析及多领域适配能力储能液冷/锂电/铜管串铝翅片散热器公司推荐

引言 在工业升级与新兴领域快速发展的当下,散热器作为保障设备稳定运行的关键部件,其品质与性能直接关系到机械、电子、新能源等众多行业的生产效率与安全。当前市场上散热器厂商数量众多,产品质量参差不齐,部分厂…

图纸安全外发策略,保障企业知识产权与市场竞争力

在当今竞争激烈的市场环境中,图纸安全外发的重要性日益凸显。企业必须意识到,设计资料的外发不仅涉及业务的正常运作,更关乎知识产权的保护与市场竞争力的维持。一旦设计图纸泄露,竞争对手可能迅速获取企业的核心技…