【PPTist】网格线、对齐线、标尺
前言:本篇文章介绍辅助我们摆放元素位置的几个功能
一、网格线功能
网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开

显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊

不行,我要把它改成对齐的!
猜测目前的网格线设置的是固定值。
然后咱们先全局搜索一下“网格线”,发现了这里的定义
src/store/main.ts
gridLineSize: number // 网格线尺寸(0表示不显示网格线)
网格线这个组件是 src/views/Editor/Canvas/GridLines.vue,其中就两个方法,一个计算网格线颜色的,避免网格线颜色和底色太接近看不清;另一个是计算网格路径的。网格线使用过 path 标签渲染出来的,我们来看一下网格路径的计算方法
const { canvasScale, gridLineSize } = storeToRefs(useMainStore())
// 网格路径
const path = computed(() => {const maxX = VIEWPORT_SIZEconst maxY = VIEWPORT_SIZE * viewportRatio.valuelet p = ''for (let i = 0; i <= Math.floor(maxY / gridLineSize.value); i++) {p += `M0 ${i * gridLineSize.value} L${maxX} ${i * gridLineSize.value} `}for (let i = 0; i <= Math.floor(maxX / gridLineSize.value); i++) {p += `M${i * gridLineSize.value} 0 L${i * gridLineSize.value} ${maxY} `}return p
})
以及页面中的这个网格线组件:

可以看到里面的线条数据,只有一个不是整数,所以 562.5 应该就是最后一行的纵坐标,不过最后一行应该也是50的倍数,所以应该是下边框上还有一条线
话说好像不能让底部对齐,因为网格得是正方形,好吧,那我还是忍忍吧。
然后还有一个相关的组件 src/views/Editor/Canvas/index.vue,里面有右键菜单。可以看到,设置网格线尺寸的方法是 mainStore.setGridLineSize(50)
这个方法在 src/store/main.ts
setGridLineSize(size: number) {this.gridLineSize = size
},
二、对齐线
对齐线就是这个

对齐线的定义在这里 src/views/Editor/Canvas/AlignmentLine.vue
控制对齐线的显示的属性有四个:
type: 'vertical' | 'horizontal' 控制方向
left 和 top 控制位置
sizeStyle ,如果是竖向就有 height 值,如果是横向就有 width 值表示长度。
然后我们来看一下这个组件的父组件在哪里,以及是怎么从父组件获取 props 的
是在 src/views/Editor/Canvas/index.vue 文件中
其中的 .viewport-wrapper 是覆盖整个编辑区域的框框

其中的对齐线是通过 v-for 渲染的数组
<AlignmentLine v-for="(line, index) in alignmentLines" :key="index" :type="line.type" :axis="line.axis" :length="line.length":canvasScale="canvasScale"
/>
数据 alignmentLines 的修改依赖于两个方法
const { dragElement } = useDragElement(elementList, alignmentLines, canvasScale)
const { scaleElement, scaleMultiElement } = useScaleElement(elementList, alignmentLines, canvasScale)
看方法名就是拖拽和缩放元素的时候会更新
这个写法比较少见,没有通过一个方法返回 alignmentLines 更新后的值,而是在方法里面直接修改了 alignmentLines。
然后我们会发现代码的组织性真的很好,这些钩子函数在另外的文件中维护,并且方法名很明确。
总而言之言而总之,这个方法好复杂,各种计算的。
简单看一下数据。

还有多条的情况

三、标尺
标尺就是这个

主要跟缩放行为有关,中间顶部 500 的位置和左侧 300 的位置是固定的。

还有如果选中一个元素的话,标尺的对应坐标会高亮

它的父组件跟上面的对齐线的父组件是同一个
src/views/Editor/Canvas/index.vue
<Ruler :viewportStyles="viewportStyles" :elementList="elementList" v-if="showRuler" />
showRuler 通过右键菜单控制标尺的开关。
const { dragViewport, viewportStyles } = useViewportSize(canvasRef)
const elementList = ref<PPTElement[]>([])
const setLocalElementList = () => {elementList.value = currentSlide.value ? JSON.parse(JSON.stringify(currentSlide.value.elements)) : []
}
watchEffect(setLocalElementList)
// 开关标尺
const toggleRuler = () => {mainStore.setRulerState(!showRuler.value)
}
标尺组件在这里 src/views/Editor/Canvas/Ruler.vue
根元素下有两个元素,一个是 .h,表示顶部的标尺; 一个是 .v,表示左侧的标尺
先看下动态添加的类名是啥意思:class="{ 'hide': markerSize < 36, 'omit': markerSize < 72 }"
const markerSize = computed(() => {return props.viewportStyles.width * canvasScale.value / 10
})
就是缩放值小于72的时候,中间的这个小齿齿会隐藏

缩放值小于 36 的时候,数字会隐藏

其中的高亮是这个元素
<div class="range" v-if="elementListRange":style="{left: elementListRange.minX * canvasScale + 'px',width: (elementListRange.maxX - elementListRange.minX) * canvasScale + 'px',}"
></div>
const { canvasScale, activeElementIdList } = storeToRefs(useMainStore())
watchEffect(() => {const els = props.elementList.filter(el => activeElementIdList.value.includes(el.id))if (!els.length) return elementListRange.value = nullelementListRange.value = getElementListRange(els)
})
activeElementIdList 是公用的数据,通过 src/store/main.ts 中的下面的方法修改
// 设置选中元素列表
setActiveElementIdList(activeElementIdList: string[]) {if (activeElementIdList.length === 1) this.handleElementId = activeElementIdList[0]else this.handleElementId = ''this.activeElementIdList = activeElementIdList
},
然后各种地方都可能会用到,包括组合元素、鼠标选中、切换页面(清空)等等。
计算元素的范围 getElementListRange 也是一个公用的方法,在这个文件中 src/utils/element.ts,大致就是找选中的元素的所有的位置,取最边缘的位置,作为包含所有的选中元素的范围。
相关文章:
【PPTist】网格线、对齐线、标尺
前言:本篇文章介绍辅助我们摆放元素位置的几个功能 一、网格线功能 网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开 显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊 不…...
Leetcode3218. 切蛋糕的最小总开销 I
题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数组: horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。verticalCut 的大小为 n - 1 …...
ECCV-2024 | 指令不够用、大模型来生成!BEVInstructor:基于BEV感知和大模型的视觉语言导航指令生成
作者:Sheng Fan, Rui Liu, Wenguan Wang, and Yi Yang 单位:浙江大学 原文链接:Navigation Instruction Generation with BEV Perception and Large Language Models (https://link.springer.com/chapter/10.1007/978-3-031-726…...
【UE5.3.2 】引擎中安装RiderLink插件
Rider会提示你安装这个插件选择在引擎中安装 Running AutomationTool... Using bundled DotNet SDK version: 6.0.302 Starting AutomationTool... Parsing command line: BuildPlugin -Unversioned -Plugin=C:\Users\zhangbin\AppData\Local\...
【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)
一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod , CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高,缺省时使用组件自身内容的宽高,比如充满父布…...
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它支持数万台支持标准的网…...
4.银河麒麟V10(ARM) 离线安装 MySQL
1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…...
Redis四种模式在Spring Boot框架下的配置
1. 单机模式 application.properties 配置: spring.redis.host127.0.0.1 spring.redis.port6379 spring.redis.passwordyourpasswordspring.redis.host: 该配置指定 Redis 服务器的主机地址。在单机模式下,通常是本地 Redis 实例(127.0.0.1…...
Golang的性能监控指标
Golang的性能监控指标 一、介绍 是一种高性能的编程语言,因其并发模型和内建的性能监控工具而备受开发者青睐。在实际开发中,我们需要了解一些重要的性能监控指标,以便及时发现和解决性能问题。本文将介绍Golang中常用的性能监控指标…...
基于GAN和DenseNett组合的调制信号分类网络(源码)
(需要源码请私信或评论) 生成对抗网络(GAN)原理 生成对抗网络(GAN)是一种革命性的深度学习模型,在无监督学习领域取得了显著进展。其核心思想基于 二人零和博弈 ,通过生成模型和判别模型的相互竞争实现高质量的数据合成。GAN由Ian Goodfellow等人于2014年首次提出,随后在图…...
uniapp 项目基础搭建(vue2)
一 .创建项目 创建项目可以通过工具创建,也可以通过脚手架下载 1.通过工具创建 2.通过脚手架下载 安装脚手架 npm install -g vue/cli 下载项目模板 vue create -p dcloudio/uni-preset-vue 项目名称 二. 下载相关依赖 1. 项目默认是没有package.json文件的&…...
中关村科金外呼机器人智能沟通破解营销难题
当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…...
【Linux】处理用户输入
一、基本介绍 1、如何传递参数 向shell脚本传递数据的最基本方法就是通过命令行参数。如下,这条命令会向test.sh脚本传递10和20这两个参数。 ./test.sh 10 20 2、如何读取参数 bash shell会将所有的命令行参数都指派给称作位置参数(positional parame…...
flask后端开发(1):第一个Flask项目
目录 一、Helloworddebug、host、port的配置 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 一、Helloword 一般是会创建两个文件夹和app.py app.py from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello…...
Highcharts 饼图:数据可视化利器
Highcharts 饼图:数据可视化利器 引言 在数据可视化的领域中,饼图作为一种经典且直观的图表类型,被广泛应用于各种行业和场景中。Highcharts,作为一个功能强大且易于使用的JavaScript图表库,为我们提供了创建交互式和…...
黑马商城项目—服务注册、服务发现
服务注册 我们把item-service注册到Nacos,步骤如下: 1.引入依赖 在item-service的pom.xml中添加依赖: 2.配置Nacos 在item-service的application.yml中添加nacos地址配置: 3.配置服务实例 为了测试一个服务多个实例的情况,我…...
【ES6复习笔记】Map(14)
概念 Map 是 JavaScript 中的一种数据结构,它允许你存储键值对,并且可以通过键来访问对应的值。在本教程中,我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。…...
15-makefile
一、Makefile的概述 1.认识make make 是一个命令,是个可执行程序,用来解析 Makefile 文件的命令;linux 环境下,这个命令存放在 /usr/bin/ 目录下;当用户输入 make 指令时,系统会自动寻找 makefile、Makef…...
yii2 手动添加 phpoffice\phpexcel
1.下载地址:https://github.com/PHPOffice/PHPExcel 2.解压并修改文件名为phpexcel 在yii项目的vendor目录下创建一个文件夹命名为phpoffice 把phpexcel目录放到phpoffic文件夹下 查看vendor\phpoffice\phpexcel目录下会看到这些文件 3.到vendor\composer目录下…...
使用 AI 辅助开发一个开源 IP 信息查询工具:一
本文将分享如何借助当下流行的 AI 工具,一步步完成一个开源项目的开发。 写在前面 在写代码时,总是会遇到一些有趣的机缘巧合。前几天,我在翻看自己之前的开源项目时,又看到了 DDNS 相关的讨论。虽然在 2021 年我写过两篇相对详细的教程&am…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
