Graphics——基于.NET 的 CAD 图形预览技术研究与实现——CAD c#二次开发
一、Graphics
类的本质与作用
Graphics
是 .NET 框架中 System.Drawing
命名空间下的核心类,用于在二维画布(如 Bitmap
图像)上绘制图形、文本或图像。它相当于 “绘图工具”,提供了一系列方法(如 DrawLine
、FillEllipse
、DrawString
等),可以操作画笔(Pen
)、画刷(Brush
)、字体(Font
)等对象,将几何图形、文本或图像渲染到指定的画布上。
二、能否用 Graphics
绘制模型空间中的图形?
可以,但需要分两步走:先从 CAD 模型空间中提取几何数据,再将数据转换为 Graphics
能识别的图形对象。
步骤 1:从模型空间提取几何数据
在 CAD 开发中(如 AutoCAD、基于 Teigha 库的 DWG 处理),模型空间(Model Space)存储了图纸的核心几何对象(如线段、圆、多边形、文本等)。要绘制这些图形,需先通过 CAD 库的 API 提取这些几何实体。
例如,使用 Database
对象访问模型空间的块定义(BlockDefinition
),遍历其中的实体(Entity
):
// 开启数据库事务
using (Transaction tr = db.TransactionManager.StartTransaction())
{// 获取块表(BlockTable)BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);// 获取模型空间的块表记录(BlockTableRecord)BlockTableRecord modelSpace = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);// 遍历模型空间中的所有实体foreach (ObjectId entityId in modelSpace){try{// 打开实体对象Entity entity = (Entity)tr.GetObject(entityId, OpenMode.ForRead);// 根据实体类型进行不同处理if (entity is Line line){// 处理线段 - 获取起点和终点坐标Point3d startPoint = line.StartPoint;Point3d endPoint = line.EndPoint;// 其他线段处理逻辑...}else if (entity is Circle circle){// 处理圆形 - 获取圆心和半径Point3d center = circle.Center;double radius = circle.Radius;// 其他圆形处理逻辑...}else if (entity is Arc arc){// 处理圆弧 - 获取圆心、半径、起始角度和结束角度Point3d center = arc.Center;double radius = arc.Radius;double startAngle = arc.StartAngle;double endAngle = arc.EndAngle;// 其他圆弧处理逻辑...}else if (entity is Polyline polyline){// 处理多段线 - 遍历顶点for (int i = 0; i < polyline.CoordinateCount; i++){Point2d vertex = polyline.GetPoint2dAt(i);// 其他顶点处理逻辑...}}else if (entity is BlockReference blockRef){// 处理块引用 - 获取块名和插入点string blockName = blockRef.Name;Point3d insertionPoint = blockRef.Position;// 其他块引用处理逻辑...}// 可以继续添加其他实体类型的处理...}catch (System.Exception ex){// 处理实体读取异常Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n读取实体时出错: " + ex.Message);}}// 提交事务tr.Commit();
}
步骤 2:将几何数据转换为 Graphics
可绘制的图形
Graphics
只能识别二维平面中的坐标(基于画布的像素坐标系),而 CAD 模型空间的坐标可能非常大(如以毫米为单位的工程坐标),因此需要坐标变换(缩放、平移、旋转等),将 CAD 坐标映射到缩略图的画布坐标(如 200x200 像素)。
示例:用 Graphics
绘制模型空间中的线段
假设模型空间中有一条线段(起点 (100, 200)
,终点 (500, 800)
),需要将其缩放到 200x200 的缩略图中:
private Bitmap DrawModelSpaceToThumbnail(Database db)
{// 1. 创建 200x200 的缩略图画布Bitmap thumbnail = new Bitmap(200, 200);using (Graphics g = Graphics.FromImage(thumbnail)){g.SmoothingMode = SmoothingMode.AntiAlias; // 抗锯齿g.Clear(Color.White); // 背景色// 2. 获取模型空间的实体(示例简化逻辑)var modelSpaceEntities = GetModelSpaceEntities(db); // 3. 计算坐标变换参数(关键!)// 假设模型空间的最大范围是 (0,0) 到 (1000, 1000),缩略图尺寸 200x200double scale = 200.0 / 1000.0; // 缩放比例(模型空间单位 → 像素)float offsetX = 0; // 平移偏移(可根据需要调整)float offsetY = 0;// 4. 绘制每个实体foreach (Entity entity in modelSpaceEntities){switch (entity){case Line line:// 将 CAD 坐标转换为缩略图坐标PointF start = new PointF((float)(line.StartPoint.X * scale) + offsetX,(float)(line.StartPoint.Y * scale) + offsetY);PointF end = new PointF((float)(line.EndPoint.X * scale) + offsetX,(float)(line.EndPoint.Y * scale) + offsetY);// 用 Graphics 绘制线段g.DrawLine(Pens.Blue, start, end);break;case Circle circle:// 转换圆心和半径PointF center = new PointF((float)(circle.Center.X * scale) + offsetX,(float)(circle.Center.Y * scale) + offsetY);float radius = (float)(circle.Radius * scale);// 绘制圆形g.DrawEllipse(Pens.Red, center.X - radius, center.Y - radius, 2 * radius, 2 * radius);break;// 其他实体类型(如 Polyline、Arc 等)类似处理...}}}return thumbnail;
}// 辅助方法:获取模型空间中的实体(需根据实际 CAD 库调整)
private List<Entity> GetModelSpaceEntities(Database db)
{List<Entity> entities = new List<Entity>();using (BlockTable blockTable = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead))using (BlockTableRecord modelSpace = (BlockTableRecord)blockTable[BlockTableRecord.ModelSpace].Open(OpenMode.ForRead)){foreach (ObjectId entityId in modelSpace){if (entityId.IsErased) continue;entities.Add((Entity)entityId.Open(OpenMode.ForRead));}}return entities;
}
关键注意事项
- 坐标变换:CAD 模型空间的坐标通常很大(如以米 / 毫米为单位),需要根据缩略图尺寸计算缩放比例(
scale = 缩略图宽度 / 模型空间宽度
),确保图形适配到小画布。 - 实体类型支持:需针对不同 CAD 实体(
Line
、Circle
、Polyline
、Text
等)编写对应的绘制逻辑,Graphics
提供了DrawLine
、DrawEllipse
、DrawString
等方法覆盖常见类型。 - 性能优化:若模型空间包含大量实体,建议过滤掉小尺寸或不可见的实体(如隐藏层、极细线条),避免缩略图过于复杂。
总结
Graphics
是 .NET 中用于二维绘图的核心工具,结合 CAD 库提取模型空间的几何数据后,可以通过坐标变换将模型空间的图形绘制到缩略图中。实际开发中需根据 CAD 库的具体 API(如 AutoCAD 的 ObjectARX
、Teigha 的 Rx
库)调整实体获取和坐标转换逻辑。
相关文章:
Graphics——基于.NET 的 CAD 图形预览技术研究与实现——CAD c#二次开发
一、Graphics 类的本质与作用 Graphics 是 .NET 框架中 System.Drawing 命名空间下的核心类,用于在二维画布(如 Bitmap 图像)上绘制图形、文本或图像。它相当于 “绘图工具”,提供了一系列方法(如 DrawLine、FillElli…...
ElasticSearch 8.x 快速上手并了解核心概念
目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中,文档document就是一行记录(json),而这些记录存在于索引库(index)中, 索引名称必须是…...
AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理(如谱减法、维纳滤波)基于深度学习的动态建模(DNN/CNN/Transformer)噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…...

04-Web后端基础(基础知识)
而像HTML、CSS、JS 以及图片、音频、视频等这些资源,我们都称为静态资源。 所谓静态资源,就是指在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。 那与静态资源对应的还有一类资源,就是动态资源。那所谓动态资源&…...

Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?
引言:为什么选择Spring Cloud? 作为全球开发者首选的微服务框架,Spring Cloud凭借其开箱即用的组件、与Spring Boot的无缝集成,以及活跃的社区生态,成为企业级微服务架构的基石。但在实际项目中,如何从众多…...

手写简单的tomcat
首先,Tomcat是一个软件,所有的项目都能在Tomcat上加载运行,Tomcat最核心的就是Servlet集合,本身就是HashMap。Tomcat需要支持Servlet,所以有servlet底层的资源:HttpServlet抽象类、HttpRequest和HttpRespon…...

高等数学-积分
一、不定积分 定理:如果函数f(x)在区间I上连续,那么f(x)在区间I上一定有原函数,即一定存在区间I上的可导函数F(x),使得F(x)f(x) ,x∈I 简单地说:连续函数必有原函数。 极限lim*0->x {[∫*0^x sin(t^2)…...

IOS平台Unity3D AOT全局模块结构分析
分析背景 由于IOS平台中不允许执行动态代码,Unity 4.6之前的版本在IOS平台中采用了AOT的处理方式,提前将C#代码静态编译为机器识别的二进制机器码。Unity引擎4.6之前的版本中IOS框架采用了Mono的AOT机制实现静态编译和处理,本文针对全局AOT模…...
Vue 3.0中自定义指令
自定义指令是增强 Vue 组件的重要手段。常见的内置指令有: v-if、v-show、v-model、v-bind、v-on等。 本文将详细讲解如何创建和使用自定义指令,关注以下几个关键点: 1. 指令的钩子函数:类似于生命周期钩子函数。 2. 指令钩子函…...
在 语义分割 和 图像分类 任务中,image、label 和 output 的形状会有所不同。
1. 图像分类 (Image Classification) 图像分类 任务是将整个图像分类为一个类别。通常,output 是对整个图像的类别的预测,而 label 是该图像的真实类别。 1.1 image 的形状 image 是输入图像数据,通常是一个四维张量: 形状&…...
C++面试4-sizeof解析
C++sizeof关键字的深度解析 一、本质认知:编译器的尺度 1. 编译期操作符的基因 int arr[5]; cout << sizeof(arr); // 输出20(假设int为4字节)非运行时特性:在编译阶段完成计算,不会生成任何机器指令表达式不求值:sizeof(++i)不会改变i的值类型感知:对类型名使…...

CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式
近日,权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访,双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出,跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…...
uniapp如何设置uni.request可变请求ip地址
文章目录 简介方法一:直接在请求URL中嵌入变量方法二:使用全局变量方法三:使用环境变量方法四:服务端配置方法五:使用配置文件(如config.js):总结 简介 在uni-app中,uni.request 用…...

文件操作和IO-3 文件内容的读写
文件内容的读写——数据流 流是操作系统提供的概念,Java对操作系统的流进行了封装。 数据流就像水流,生生不息,绵延不断。 水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接…...
架构的设计
搭建架构的最低前提 1.设计清晰: 需求文档: 有哪些界面 每个界面提够了哪些功能 这些功能是怎样操作的 会有哪些反馈 2.技术: 写架构的同学:这次项目设计的技术 都要有料及(用到的技术有哪些特点 有哪些缺点&…...

SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 1.0 SpringAI 概述 目前大模型应用开发最常见的框架就是 LangChain,然而 LangChain 是基于 Python 语言,虽然有 LangChain4j,但是对于大量使…...

编程速递-RAD Studio 12.3 Athens五月补丁:May Patch Available
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要 今天 (2025 年 5 月 19 日)Embarcadero 发布了 RAD Studio、Delphi 和 CBuilder 12.3 Athens(雅典)的第二个补丁。 RA…...
Vue3实现轮播表(表格滚动)
在这之前,写过一篇Vue2实现该效果的博文:vue-seamless-scroll(一个简单的基于vue.js的无缝滚动) 有兴趣也可以去看下,这篇是用vue3实现,其实很简单,目的是方便后面用到直接复制既可以了。 安装: <...
Python爬虫(33)Python爬虫高阶:动态页面破解与验证码OCR识别全流程实战
目录 一、技术背景与行业痛点二、核心技术与实现路径2.1 动态页面处理方案对比2.2 Selenium深度集成实践2.3 OCR验证码破解方案1. 预处理阶段:2. 识别阶段:3. 后处理阶段 三、典型应用场景解析3.1 电商价格监控系统1. 技术架构2. 实现效果 3.2 社交媒体舆…...

Matlab学习合集
1.变量 2.常见的数学函数 3. 向量 向量的创建: 直接创建:针对于数量少的情况 冒号法 函数创建:...

基于labview的声音采集与存储分析系统
基于LabVIEW的声音信号采集与存储分析系统开发实战:从原理到代码实现 (内含源码)基于labview的声音采集与处理系统 点击跳转工坊 点击跳转视频 引言 在音频技术与工业监测领域,声音信号的实时采集与分析是一项基础且关键的任务。…...

【项目记录】部门增删改及日志技术
1 删除部门 1.1 需求 删除部门数据。在点击 "删除" 按钮,会根据ID删除部门数据。 了解了需求之后,我们再看看接口文档中,关于删除部门的接口的描述,然后根据接口文档进行服务端接口的开发。 1.2 接口描述 1.2.1 基…...

TDengine 更多安全策略
简介 上一节我们介绍了 TDengine 安全部署配置建议,除了传统的这些配置外,TDengine 还有其他的安全策略,例如 IP 白名单、审计日志、数据加密等,这些都是 TDengine Enterprise 特有功能,其中白名单功能在 3.2.0.0 版本…...

电子制造企业智能制造升级:MES系统应用深度解析
在全球电子信息产业深度变革的2025年,我国电子信息制造业正经历着增长与转型的双重考验。据权威数据显示,2025年一季度行业增加值同比增长11.5%,但智能手机等消费电子产量同比下降1.1%,市场竞争白热化趋势显著。叠加关税政策调整、…...

Java使用Collections集合工具类
1、Collections 集合工具类 Java 中的 Collections 是一个非常有用的工具类,它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中,主要包含对集合进行操作的方法,比如排序、搜索、线程安全化等。 Java集合工具类的使用&#x…...
磁盘空间不足,迁移Docker 数据目录
停止 Docker 服务。 sudo systemctl stop docker 将现有的 Docker 数据移动到新位置(例如 /home/docker-data)。 sudo mv /var/lib/docker /home/docker-data 在原位置创建一个指向新位置的符号链接。 sudo ln -s /home/docker-data /var/lib/dock…...

python打卡day33
知识点回顾: PyTorch和cuda的安装查看显卡信息的命令行命令(cmd中使用)cuda的检查简单神经网络的流程 数据预处理(归一化、转换成张量)模型的定义 继承nn.Module类定义每一个层定义前向传播流程 定义损失函数和优化器定…...
目标检测新突破:用MSBlock打造更强YOLOv8
文章目录 YOLOv8的现状与挑战YOLO-MS的MSBlock简介MSBlock的工作原理MSBlock的优势利用MSBlock改进YOLOv8替换YOLOv8主干网络中的部分模块代码实现:替换CSP模块为MSBlock在YOLOv8的颈部(Neck)中插入MSBlock代码实现:在颈部区域插入MSBlock实验结果与分析实验设置性能对比性…...

同城上门预约服务系统案例分享,上门服务到家系统都有什么功能?这个功能,很重要!
你以为上门按摩这类平台只要做好接单派单就万事大吉了?大错特错!市面上90%的系统只会吹嘘基础功能,却对最关键的财税问题避而不谈。很多创业者直到被税务稽查才发现,自己每年都在白白多交几倍的冤枉税!举个例子&#x…...
docker面试题(5)
Docker安全么 Docker 利用了 Linux 内核中很多安全特性来保证不同容器之间的隔离,并且通过签名机制来对镜像进行 验证。大量生产环境的部署证明,Docker 虽然隔离性无法与虚拟机相比,但仍然具有极高的安全性。 如何清理后台停止的容器 可以使用…...