DXFViewer进行中2 -> 直线 解析+渲染 ✅已完成

DXFViewer进行中 : ->封装OpenGL -> 解析DXF直线-CSDN博客https://blog.csdn.net/qq_25547755/article/details/147723906

   上篇博文

解析dxf直线635条

1. DXFViewer.h

#pragma once
#include "Application.h"
#include <stdio.h>
#include <iostream>
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/string_cast.hpp>
#include "../Entity/Line.h" 
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <Windows.h>class DXFViewer :public Application
{ public:	  std::string UTF8ToGB(const char* str){std::string result;WCHAR* strSrc;LPSTR szRes;//获得临时变量的大小int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);strSrc = new WCHAR[i + 1];MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);//获得临时变量的大小i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);szRes = new CHAR[i + 1];WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);result = szRes;delete[]strSrc;delete[]szRes;return result;}// 去除前后空格std::string trim(const std::string& str) {auto first = str.find_first_not_of(" \t\r\n");auto last = str.find_last_not_of(" \t\r\n");return (first == std::string::npos) ? "" : str.substr(first, last - first + 1);}// 读取组码-值对bool ReadCodes(std::ifstream& file, std::string& code, std::string& value) {if (!std::getline(file, code)) return false;if (!std::getline(file, value)) return false;std::string strCode = UTF8ToGB(code.c_str()).c_str();std::string strValue = UTF8ToGB(value.c_str()).c_str();code = trim(strCode);value = trim(strValue);return true;}   glm::vec3 GetColorByLayer(const std::string& layer){static std::map<std::string, glm::vec3> layerColors = {{ "0",     {1.0f, 1.0f, 1.0f} },{ "WALL",  {1.0f, 0.0f, 0.0f} },{ "DOOR",  {0.0f, 1.0f, 0.0f} },{ "WINDOW",{0.0f, 0.5f, 1.0f} }};auto it = layerColors.find(layer);return (it != layerColors.end()) ? it->second : glm::vec3(1.0); // 默认为白色}/// <summary>/// 读取直线/// </summary> void ReadLine(const std::string& filename){std::ifstream file(filename, std::ios::binary);if (!file.is_open()) {std::cerr << "无法打开文件: " << filename << std::endl;return;}std::string code, value;std::string currentLayer;std::map<std::string, std::string> lineEntity;const std::map<std::string, std::string> codeToKey = {{ "10", "StartX" }, { "20", "StartY" }, { "30", "StartZ" },{ "11", "EndX"   }, { "21", "EndY"   }, { "31", "EndZ"   }};while (ReadCodes(file, code, value)) {// 记录当前图层(可用于后续颜色处理)if (code == "100" && value == "AcDbEntity") {while (ReadCodes(file, code, value)) {if (code == "8") {currentLayer = value;break;}}}// 解析 AcDbLineif (code == "100" && value == "AcDbLine") {lineEntity.clear();while (ReadCodes(file, code, value)) {auto it = codeToKey.find(code);if (it != codeToKey.end()) {lineEntity[it->second] = value;}if (lineEntity.size() == 6) {// 读取完毕后再解析 + 添加直线glm::vec3 start(std::stof(lineEntity["StartX"]),std::stof(lineEntity["StartY"]),std::stof(lineEntity["StartZ"]));glm::vec3 end(std::stof(lineEntity["EndX"]),std::stof(lineEntity["EndY"]),std::stof(lineEntity["EndZ"]));glm::vec3 color = GetColorByLayer(currentLayer); // 可选m_line.AddLine(start, end, color);break;}}}}file.close();}virtual void  Startup(){   std::string filename = R"(C:\Users\ml\Desktop\Drawing1.dxf)";// 解析文件ReadLine(filename);printf("读取了直线 %d 条\r\n",(m_line.GetSize()/2));m_line.Init();}; virtual void  Render(){		  m_line.Render(m_camera);}; virtual void  Shutdown(){printf("Shutdown\r\n");};private:Line  m_line;
};

2. Line.h

#pragma once
#include "Entity.h"
#include "glm/glm.hpp"
#include "../Shader/Shader_P3_C3.h"
#include "../Core/OrthoCamera.h"
#include <vector>class Line  
{
public:Line(){m_vao = -1;m_vbo = -1;};~Line(){glDeleteVertexArrays(1, &m_vao);glDeleteBuffers(1, &m_vbo);};virtual void Init()  // 数据准备{// 1.准备Shaderm_shader.Initialize();// Shader应用绑定顶点缓冲区数据glGenVertexArrays(1, &m_vao);glBindVertexArray(m_vao);// 创建显存并向顶点缓冲填充数据glGenBuffers(1, &m_vbo);glBindBuffer(GL_ARRAY_BUFFER, m_vbo);glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(Vertex), m_vertices.data(), GL_STATIC_DRAW);glVertexAttribPointer(m_shader.m_position, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);glEnableVertexAttribArray(m_shader.m_position);glVertexAttribPointer(m_shader.m_color, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(m_shader.m_color);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);} void AddLine(glm::vec3 start, glm::vec3 end, glm::vec3 color) {m_vertices.push_back({ start.x, start.y, start.z, color.r, color.g, color.b });m_vertices.push_back({ end.x, end.y, end.z, color.r, color.g, color.b });}virtual void Render(const OrthoCamera& camera) // 绘制{ m_shader.Begin();glBindVertexArray(m_vao);glUniformMatrix4fv(m_shader.m_mvp, 1, GL_FALSE, (const GLfloat*)&camera.GetViewProjectionMatrix());glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(m_vertices.size()));m_shader.End();}typedef struct Vertex{float x, y, z;float r, g, b;} Vertex;unsigned int GetSize(){return m_vertices.size();}private:GLuint         m_vao;GLuint         m_vbo;Shader_P3_C3   m_shader;std::vector<Vertex> m_vertices;	 };

3.Shader_P3_C3.h

#pragma once
#include "Shader.h"
class Shader_P3_C3:public Shader
{public:Shader_P3_C3(){m_mvp      = -1;m_position = -1;m_color    = -1;};~Shader_P3_C3(){};virtual bool  Initialize(){const char* vs = R"(#version 330uniform mat4 MVP;in vec3 vPos;in vec3 vCol;out vec3 color;void main(){gl_Position = MVP * vec4(vPos, 1.0);color = vCol;})";const char* ps = R"(#version 330in vec3 color;out vec4 fragment;void main(){fragment = vec4(color, 1.0); })";bool    res = CreateShader(vs, ps);if (res){m_mvp      = glGetUniformLocation(m_shaderId, "MVP");m_position = glGetAttribLocation(m_shaderId,  "vPos");m_color    = glGetAttribLocation(m_shaderId,  "vCol");;}	return true;}public:int m_mvp;int m_position;int m_color;
};

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

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

相关文章

[pdf,epub]292页《分析模式》漫谈合集01-59提供下载

《分析模式》漫谈合集01-59的pdf、epub文件提供下载&#xff0c;地址&#xff1a; umlchina.com/url/ap.html&#xff0c;或查看本账号的CSDN资源。 已排版成适合手机阅读&#xff0c;pdf的排版更好一些。

VTK 系统架构

VTK (Visualization Toolkit) 是一个功能强大的开源可视化系统,其架构设计体现了面向对象和管道处理的思想。以下是 VTK 系统的主要架构组成: 1. 核心架构层次 1.1 数据模型层 (Data Model) vtkDataObject: 所有数据对象的基类 vtkDataSet: 几何/拓扑数据的基类 (如 vtkPol…

移动应用开发:自定义 View 处理大量数据的性能与交互优化方案

实现 1 万条数据下流畅滑动与灵敏交互的完美平衡。 一、数据渲染优化&#xff1a;从 1 万条到丝滑体验 &#xff08;一&#xff09;视图复用机制 视图复用是提升大量数据渲染性能的关键策略。以一个简单的自定义列表视图为例&#xff0c;我们可以构建如下的复用池管理机制&a…

aws(学习笔记第四十一课) image-content-search

文章目录 aws(学习笔记第四十一课) image-content-search学习内容&#xff1a;1. 整体架构1.1 代码链接1.2 关键架构流程1.3 upload图像文件的动作1.4 search图像文件的动作 2. 代码解析2.1 yml文件配置详细设定2.1.1 yml文件2.1.2 yml文件文件解析 2.2 创建s3 bucket2.3 创建A…

基于Python+MongoDB猫眼电影 Top100 数据爬取与存储

前言&#xff1a;从猫眼电影排行榜页面&#xff08;TOP100榜 - 猫眼电影 - 一网打尽好电影 &#xff09;爬取 Top100 电影的电影名称、图片地址、主演、上映时间和评分等关键信息&#xff0c;并将这些信息存储到本地 MongoDB 数据库中&#xff0c;&#x1f517; 相关链接Xpath&…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.5 事务与锁机制(ACID特性/事务控制语句)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL 事务与锁机制深度解析:ACID 特性与事务控制全流程2.5 事务与锁机制2.5.1 ACID 特性与实现原理2.5.1.1 ACID 核心概念2.5.1.2 MVCC(多版本并发控制)与WAL(预写式日志)协同效应2.5.2 事务…

荣耀A8互动娱乐组件部署实录(终章:后台配置系统与整体架构总结)

作者:被配置文件的“开关参数”折磨过无数次的运维兼后端工 一、后台系统架构概述 荣耀A8组件后台采用 PHP 构建,配合 MySQL 数据库与 Redis 缓存系统,整体结构遵循简化版的 MVC 模式。后台主要实现以下核心功能: 系统参数调控与配置热更新 用户管理(封号、授权、角色) …

Transformer 与 LSTM 在时序回归中的实践与优化

&#x1f9e0; 深度学习混合模型&#xff1a;Transformer 与 LSTM 在时序回归中的实践与优化 在处理多特征输入、多目标输出的时序回归任务时&#xff0c;结合 Transformer 和 LSTM 的混合模型已成为一种有效的解决方案。Transformer 擅长捕捉长距离依赖关系&#xff0c;而 LS…

QT —— 信号和槽(带参数的信号和槽函数)

QT —— 信号和槽&#xff08;带参数的信号和槽函数&#xff09; 带参的信号和槽函数信号参数个数和槽函数参数个数1. 参数匹配规则2. 实际代码示例✅ 合法连接&#xff08;槽参数 ≤ 信号参数&#xff09;❌ 非法连接&#xff08;槽参数 > 信号参数&#xff09; 3. 特殊处理…

设计模式简述(十七)备忘录模式

备忘录模式 描述组件使用 描述 备忘录模式用于将对象的状态进行保存为备忘录&#xff0c;以便在需要时可以从备忘录会对象状态&#xff1b;其核心点在于备忘录对象及其管理者是独立于原有对象之外的。 常用于需要回退、撤销功能的场景。 组件 原有对象&#xff08;包含自身…

标签语句分析

return userList.stream().filter(user -> {String tagsStr user.getTags(); 使用 Stream API 来过滤 userList 中的用户 解析 tagsStr 并根据标签进行过滤 假设 tagsStr 是一个 JSON 格式的字符串&#xff0c;存储了一个标签集合。你希望过滤出包含所有指定标签的用户。…

【应用密码学】实验四 公钥密码1——数学基础

一、实验要求与目的 学习快速模幂运算、扩展欧几里得、中国剩余定理的算法思想以及代码实现。 二、实验内容与步骤记录&#xff08;只记录关键步骤与结果&#xff0c;可截图&#xff0c;但注意排版与图片大小&#xff09; 1.快速模幂运算的设计思路 快速模幂运算的核心思想…

WebSocket与Socket、TCP、HTTP的关系及区别

1.什么是WebSocket及原理 WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生&#xff0c;解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题&#xff0c;实现里多路复用&#xff0c;是全双工、双向、单套…

基于C++的IOT网关和平台4:github项目ctGateway交互协议

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 系…

【PPT制作利器】DeepSeek + Kimi生成一个初始的PPT文件

如何基于DeepSeek Kimi进行PPT制作 步骤&#xff1a; Step1&#xff1a;基于DeepSeek生成文本&#xff0c;提问 Step2基于生成的文本&#xff0c;用Kimi中PPT助手一键生成PPT 进行PPT渲染-自动渲染 可选择更改模版 生成PPT在桌面 介绍的比较详细&#xff0c;就是这个PPT模版…

拷贝多个Excel单元格区域为图片并粘贴到Word

Excel工作表Sheet1中有两个报表&#xff0c;相应单元格区域分别定义名称为Report1和Report2&#xff0c;如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…

Spring是如何传播事务的?什么是事务传播行为

Spring是如何传播事务的&#xff1f; Spring框架通过声明式事务管理来传播事务&#xff0c;主要依赖于AOP&#xff08;面向切面编程&#xff09;和事务拦截器来实现。Spring的事务传播机制是基于Java Transaction API (JTA) 或者本地资源管理器&#xff08;如Hibernate、JDBC等…

Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享

Python-pandas-操作Excel文件(读取数据/写入数据) 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…

PHP分页显示数据,在phpMyadmin中添加数据

<?php $conmysqli_connect(localhost,root,,stu); mysqli_query($con,"set names utf8"); //设置字符集为utf8 $sql"select * from teacher"; $resultmysqli_query($con,$sql); $countmysqli_num_rows($result); //记录总条数$count。 $pagesize10;//每…

智能参谋部系统架构和业务场景功能实现

将以一个基于微服务和云原生理念、深度集成人工智能组件、强调实时性与韧性的系统架构为基础,详细阐述如何落地“智能参谋部”的各项能力。这不是一个简单的软件堆叠,而是一个有机整合了数据、知识、模型、流程与人员的复杂体系。 系统愿景:“智能参谋部”——基于AI赋能的…