uniapp颜色选择器

https://github.com/mehaotian/t-color-picker/
优化点:
1.添加点击事件支持。
2.open时使用外部设置的颜色属性。
3.默认rgba模式,并且支持手动输入rgb。

本人优化后的代码如下:

<template><view v-show="show" class="t-wrapper" @touchmove.stop.prevent="moveHandle"><view class="t-mask" :class="{active:active}" @click.stop="close"></view><view class="t-box" :class="{active:active}"><view class="t-header"><view class="t-header-button" @click.stop="close">取消</view><view class="t-header-button" @click.stop="confirm">确认</view></view><view class="t-color__box" :style="{ background: 'rgb(' + bgcolor.r + ',' + bgcolor.g + ',' + bgcolor.b + ')'}"><view class="t-background boxs" @click="clickColor($event, 0)" @touchstart="touchstart($event, 0)" @touchmove="touchmove($event, 0)" @touchend="touchend($event, 0)"><view class="t-color-mask"></view><view class="t-pointer" :style="{ top: site[0].top - 8 + 'px', left: site[0].left - 8 + 'px' }"></view></view></view><view class="t-control__box"><view class="t-control__color"><view class="t-control__color-content" :style="{ background: 'rgba(' + rgba.r + ',' + rgba.g + ',' + rgba.b + ',' + rgba.a + ')' }"></view></view><view class="t-control-box__item"><view class="t-controller boxs" @click="clickColor($event, 1)" @touchstart="touchstart($event, 1)" @touchmove="touchmove($event, 1)" @touchend="touchend($event, 1)"><view class="t-hue"><view class="t-circle" :style="{ left: site[1].left - 12 + 'px' }"></view></view></view><view class="t-controller boxs"  @click="clickColor($event, 2)" @touchstart="touchstart($event, 2)" @touchmove="touchmove($event, 2)" @touchend="touchend($event, 2)"><view class="t-transparency"><view class="t-circle" :style="{ left: site[2].left - 12 + 'px' }"></view></view></view></view></view><view class="t-result__box"><view v-if="mode" class="t-result__item"><view class="t-result__box-input">{{hex}}</view><view class="t-result__box-text">HEX</view></view><template v-else><view class="t-result__item"><view class="t-result__box-input"><input @change="checkNumberValue($event, 1)" @blur="checkNumberValue($event, 1)" type="number" min="0" max="255" v-model="rgba.r"></view><view class="t-result__box-text">R</view></view><view class="t-result__item"><view class="t-result__box-input"><input @change="checkNumberValue($event, 2)" @blur="checkNumberValue($event, 2)" type="number" min="0" max="255" v-model="rgba.g"></view><view class="t-result__box-text">G</view></view><view class="t-result__item"><view class="t-result__box-input"><input @change="checkNumberValue($event, 3)" @blur="checkNumberValue($event, 3)" type="number" min="0" max="255" v-model="rgba.b"></view><view class="t-result__box-text">B</view></view><view class="t-result__item"><view class="t-result__box-input">{{rgba.a}}</view><view class="t-result__box-text">A</view></view></template><view class="t-result__item t-select" @click="select"><view class="t-result__box-input"><view>切换</view><view>模式</view></view></view></view><view class="t-alternative"><view class="t-alternative__item" v-for="(item,index) in colorList" :key="index"><view class="t-alternative__item-content" :style="{ background: 'rgba(' + item.r + ',' + item.g + ',' + item.b + ',' + item.a + ')' }"@click="selectColor(item)"></view></view></view></view></view>
</template><script>export default {props: {color: {type: Object,default () {return {r: 0,g: 0,b: 0,a: 1}}},spareColor: {type: Array,default () {return []}}},data() {return {show: false,active: false,// rgba 颜色rgba: {r: 0,g: 0,b: 0,a: 1},// hsb 颜色hsb: {h: 0,s: 0,b: 0},site: [{top: 0,left: 0}, {left: 0}, {left: 0}],index: 0,bgcolor: {r: 255,g: 0,b: 0,a: 1},hex: '#000000',mode: false,colorList: [{r: 244,g: 67,b: 54,a: 1}, {r: 233,g: 30,b: 99,a: 1}, {r: 156,g: 39,b: 176,a: 1}, {r: 103,g: 58,b: 183,a: 1}, {r: 63,g: 81,b: 181,a: 1}, {r: 33,g: 150,b: 243,a: 1}, {r: 3,g: 169,b: 244,a: 1}, {r: 0,g: 188,b: 212,a: 1}, {r: 0,g: 150,b: 136,a: 1}, {r: 76,g: 175,b: 80,a: 1}, {r: 139,g: 195,b: 74,a: 1}, {r: 205,g: 220,b: 57,a: 1}, {r: 255,g: 235,b: 59,a: 1}, {r: 255,g: 193,b: 7,a: 1}, {r: 255,g: 152,b: 0,a: 1}, {r: 255,g: 87,b: 34,a: 1}, {r: 121,g: 85,b: 72,a: 1}, {r: 158,g: 158,b: 158,a: 1}, {r: 0,g: 0,b: 0,a: 0.5}, {r: 0,g: 0,b: 0,a: 0}, ]};},created() {this.rgba = this.color;if (this.spareColor.length !== 0) {this.colorList = this.spareColor;}},methods: {/*** 初始化*/init() {// hsb 颜色this.hsb = this.rgbToHex(this.rgba);// this.setColor();this.setValue(this.rgba);},moveHandle() {},open() {this.rgba = this.color;this.show = true;this.$nextTick(() => {this.init();setTimeout(() => {this.active = true;setTimeout(() => {this.getSelectorQuery();}, 350)}, 50)})},close() {this.active = false;this.$nextTick(() => {setTimeout(() => {this.show = false;}, 500)})},confirm() {this.close();this.$emit('confirm', {rgba: this.rgba,hex: this.hex})},// 选择模式select() {this.mode = !this.mode},// 常用颜色选择selectColor(item) {this.setColorBySelect(item)},touchstart(e, index) {const {pageX,pageY} = e.touches[0];this.pageX = pageX;this.pageY = pageY;this.setPosition(pageX, pageY, index);},touchmove(e, index) {const {pageX,pageY} = e.touches[0];this.moveX = pageX;this.moveY = pageY;this.setPosition(pageX, pageY, index);},touchend(e, index) {},clickColor(e, index) {console.log("click>>>");console.log(e);const pageX = e.detail.x;const pageY = e.detail.y;this.moveX = pageX;this.moveY = pageY;this.setPosition(pageX, pageY, index);},/*** 设置位置*/setPosition(x, y, index) {this.index = index;const {top,left,width,height} = this.position[index];// 设置最大最小值this.site[index].left = Math.max(0, Math.min(parseInt(x - left), width));if (index === 0) {this.site[index].top = Math.max(0, Math.min(parseInt(y - top), height));// 设置颜色this.hsb.s = parseInt((100 * this.site[index].left) / width);this.hsb.b = parseInt(100 - (100 * this.site[index].top) / height);this.setColor();this.setValue(this.rgba);} else {this.setControl(index, this.site[index].left);}},/*** 设置 rgb 颜色*/setColor() {const rgb = this.HSBToRGB(this.hsb);this.rgba.r = rgb.r;this.rgba.g = rgb.g;this.rgba.b = rgb.b;},/*** 设置二进制颜色* @param {Object} rgb*/setValue(rgb) {this.hex = '#' + this.rgbToHex(rgb);},setControl(index, x) {const {top,left,width,height} = this.position[index];if (index === 1) {this.hsb.h = parseInt((360 * x) / width);this.bgcolor = this.HSBToRGB({h: this.hsb.h,s: 100,b: 100});this.setColor()} else {this.rgba.a = (x / width).toFixed(1);}this.setValue(this.rgba);},/*** rgb 转 二进制 hex* @param {Object} rgb*/rgbToHex(rgb) {let hex = [rgb.r.toString(16), rgb.g.toString(16), rgb.b.toString(16)];hex.map(function(str, i) {if (str.length == 1) {hex[i] = '0' + str;}});return hex.join('');},setColorBySelect(getrgb) {const {r,g,b,a} = getrgb;let rgb = {}rgb = {r: r ? parseInt(r) : 0,g: g ? parseInt(g) : 0,b: b ? parseInt(b) : 0,a: a ? a : 0,};this.rgba = rgb;this.hsb = this.rgbToHsb(rgb);this.changeViewByHsb();},changeViewByHsb() {const [a, b, c] = this.position;this.site[0].left = parseInt(this.hsb.s * a.width / 100);this.site[0].top = parseInt((100 - this.hsb.b) * a.height / 100);this.setColor(this.hsb.h);this.setValue(this.rgba);this.bgcolor = this.HSBToRGB({h: this.hsb.h,s: 100,b: 100});this.site[1].left = this.hsb.h / 360 * b.width;this.site[2].left = this.rgba.a * c.width;},/*** hsb 转 rgb* @param {Object} 颜色模式  H(hues)表示色相,S(saturation)表示饱和度,B(brightness)表示亮度*/HSBToRGB(hsb) {let rgb = {};let h = Math.round(hsb.h);let s = Math.round((hsb.s * 255) / 100);let v = Math.round((hsb.b * 255) / 100);if (s == 0) {rgb.r = rgb.g = rgb.b = v;} else {let t1 = v;let t2 = ((255 - s) * v) / 255;let t3 = ((t1 - t2) * (h % 60)) / 60;if (h == 360) h = 0;if (h < 60) {rgb.r = t1;rgb.b = t2;rgb.g = t2 + t3;} else if (h < 120) {rgb.g = t1;rgb.b = t2;rgb.r = t1 - t3;} else if (h < 180) {rgb.g = t1;rgb.r = t2;rgb.b = t2 + t3;} else if (h < 240) {rgb.b = t1;rgb.r = t2;rgb.g = t1 - t3;} else if (h < 300) {rgb.b = t1;rgb.g = t2;rgb.r = t2 + t3;} else if (h < 360) {rgb.r = t1;rgb.g = t2;rgb.b = t1 - t3;} else {rgb.r = 0;rgb.g = 0;rgb.b = 0;}}return {r: Math.round(rgb.r),g: Math.round(rgb.g),b: Math.round(rgb.b)};},rgbToHsb(rgb) {let hsb = {h: 0,s: 0,b: 0};let min = Math.min(rgb.r, rgb.g, rgb.b);let max = Math.max(rgb.r, rgb.g, rgb.b);let delta = max - min;hsb.b = max;hsb.s = max != 0 ? 255 * delta / max : 0;if (hsb.s != 0) {if (rgb.r == max) hsb.h = (rgb.g - rgb.b) / delta;else if (rgb.g == max) hsb.h = 2 + (rgb.b - rgb.r) / delta;else hsb.h = 4 + (rgb.r - rgb.g) / delta;} else hsb.h = -1;hsb.h *= 60;if (hsb.h < 0) hsb.h = 0;hsb.s *= 100 / 255;hsb.b *= 100 / 255;return hsb;},getSelectorQuery() {const views = uni.createSelectorQuery().in(this);views.selectAll('.boxs').boundingClientRect(data => {if (!data || data.length === 0) {setTimeout(() => this.getSelectorQuery(), 20)return}this.position = data;// this.site[0].top = data[0].height;// this.site[0].left = 0;// this.site[1].left = data[1].width;// this.site[2].left = data[2].width;this.setColorBySelect(this.rgba);}).exec();},checkNumberValue(e,type){console.log(e)if(e.detail.value>255){if(type==1){this.rgba.r=255;}else if(type==2){this.rgba.g=255;}else if(type==3){this.rgba.b=255;}}if(e.detail.value<0){if(type==1){this.rgba.r=0;}else if(type==2){this.rgba.g=0;}else if(type==3){this.rgba.b=0;}}}},watch: {spareColor(newVal) {this.colorList = newVal;}}};
</script><style>.t-wrapper {position: fixed;top: 0;bottom: 0;left: 0;width: 100%;box-sizing: border-box;z-index: 9999;}.t-box {width: 100%;position: absolute;bottom: 0;padding: 30upx 0;padding-top: 0;background: #fff;transition: all 0.3s;transform: translateY(100%);}.t-box.active {transform: translateY(0%);}.t-header {display: flex;justify-content: space-between;width: 100%;height: 100upx;border-bottom: 1px #eee solid;box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);background: #fff;}.t-header-button {display: flex;align-items: center;width: 150upx;height: 100upx;font-size: 30upx;color: #666;padding-left: 20upx;}.t-header-button:last-child {justify-content: flex-end;padding-right: 20upx;}.t-mask {position: absolute;top: 0;left: 0;right: 0;bottom: 0;background: rgba(0, 0, 0, 0.6);z-index: -1;transition: all 0.3s;opacity: 0;}.t-mask.active {opacity: 1;}.t-color__box {position: relative;height: 400upx;background: rgb(255, 0, 0);overflow: hidden;box-sizing: border-box;margin: 0 20upx;margin-top: 20upx;box-sizing: border-box;}.t-background {position: absolute;top: 0;left: 0;right: 0;bottom: 0;background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0));}.t-color-mask {position: absolute;top: 0;left: 0;right: 0;bottom: 0;width: 100%;height: 400upx;background: linear-gradient(to top, #000, rgba(0, 0, 0, 0));}.t-pointer {position: absolute;bottom: -8px;left: -8px;z-index: 2;width: 15px;height: 15px;border: 1px #fff solid;border-radius: 50%;}.t-show-color {width: 100upx;height: 50upx;}.t-control__box {margin-top: 50upx;width: 100%;display: flex;padding-left: 20upx;box-sizing: border-box;}.t-control__color {flex-shrink: 0;width: 100upx;height: 100upx;border-radius: 50%;background-color: #fff;background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);background-size: 36upx 36upx;background-position: 0 0, 18upx 18upx;border: 1px #eee solid;overflow: hidden;}.t-control__color-content {width: 100%;height: 100%;}.t-control-box__item {display: flex;flex-direction: column;justify-content: space-between;width: 100%;padding: 0 30upx;}.t-controller {position: relative;width: 100%;height: 16px;background-color: #fff;background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);background-size: 32upx 32upx;background-position: 0 0, 16upx 16upx;}.t-hue {width: 100%;height: 100%;background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);}.t-transparency {width: 100%;height: 100%;background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgb(0, 0, 0));}.t-circle {position: absolute;/* right: -10px; */top: -2px;width: 20px;height: 20px;box-sizing: border-box;border-radius: 50%;background: #fff;box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.1);}.t-result__box {margin-top: 20upx;padding: 10upx;width: 100%;display: flex;box-sizing: border-box;}.t-result__item {display: flex;flex-direction: column;align-items: center;justify-content: center;padding: 10upx;width: 100%;box-sizing: border-box;}.t-result__box-input {padding: 10upx 0;width: 100%;font-size: 28upx;box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1);color: #999;text-align: center;background: #fff;}.t-result__box-text {margin-top: 10upx;font-size: 28upx;line-height: 2;}.t-select {flex-shrink: 0;width: 150upx;padding: 0 30upx;}.t-select .t-result__box-input {border-radius: 10upx;border: none;color: #999;box-shadow: 1px 1px 2px 1px rgba(0, 0, 0, 0.1);background: #fff;}.t-select .t-result__box-input:active {box-shadow: 0px 0px 1px 0px rgba(0, 0, 0, 0.1);}.t-alternative {display: flex;flex-wrap: wrap;/* justify-content: space-between; */width: 100%;padding-right: 10upx;box-sizing: border-box;}.t-alternative__item {margin-left: 12upx;margin-top: 10upx;width: 50upx;height: 50upx;border-radius: 10upx;background-color: #fff;background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee),linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);background-size: 36upx 36upx;background-position: 0 0, 18upx 18upx;border: 1px #eee solid;overflow: hidden;}.t-alternative__item-content {width: 50upx;height: 50upx;background: rgba(255, 0, 0, 0.5);}.t-alternative__item:active {transition: all 0.3s;transform: scale(1.1);}
</style>

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

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

相关文章

Codeforces Round 957 (Div. 3)

A题&#xff1a;Only Pluses 思路&#xff1a; 数据范围小&#xff0c;直接暴力枚举。 code&#xff1a; inline void solve() {int a, b, c; cin >> a >> b >> c;int ans 0;for (int i a; i < a 5; i ) {for (int j b; j < b 5; j ) {for …

qt udp 协议 详解

1.qt udp 协议链接举例 在Qt框架中&#xff0c;使用UDP协议进行通信主要依赖于QUdpSocket类。以下是一个基于Qt的UDP通信示例&#xff0c;包括UDP套接字的创建、绑定端口、发送和接收数据报的步骤。 1. 创建UDP套接字 首先&#xff0c;需要创建一个QUdpSocket对象。这通常在…

BM42:混合搜索的新基准 - Qdrant

在过去的 40 年里&#xff0c;BM25 一直是搜索引擎的标准。它是一种简单但功能强大的算法&#xff0c;已被许多搜索引擎使用&#xff0c;包括 Google、Bing 和 Yahoo。 虽然看起来向量搜索的出现会削弱其影响力&#xff0c;但效果并不明显。目前最先进的检索方法试图将 BM25 与…

python库(11):Box库简化字典和对象之间的转换

1Box库简介 Box是一个Python库&#xff0c;它提供了一种将数据封装在字典和列表中的方式&#xff0c;同时提供了一些额外的功能&#xff0c;比如数据验证、默认值设置等。这使得Box库非常适合用于配置管理、数据传输对象&#xff08;DTO&#xff09;的创建&#xff0c;以及任何…

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…

替换:show-overflow-tooltip=“true“ ,使用插槽tooltip,达到内容可复制

原生的show-overflow-tooltip“true” 不能满足条件&#xff0c;使用插槽自定义编辑&#xff1b; 旧code <el-table-column prop"reason" label"原因" align"center" :show-overflow-tooltip"true" /> <el-table-column pro…

如何预防网站数据泄露

如何预防网站数据泄露?在数字化浪潮中&#xff0c;网站不仅是企业展示形象与服务的窗口&#xff0c;更是数据存储与传输的枢纽。随着网络攻击技术的日益复杂&#xff0c;网站数据泄露的风险也随之攀升。一旦敏感数据如客户信息、财务记录等被不法分子窃取&#xff0c;企业将面…

压缩文件的解析方式

Java中我们用ZipInputStream和ZipOutputStream来完成对zip文件和rar文件的读写 I /O流&#xff1a; Input:输入&#xff0c;通过“输入流”进行文件的读取操作 output:输出&#xff0c;通过“输出流”进行文件的写入操作 一、将压缩包解压缩 1.解压缩.zip格式文件&#xf…

微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

NoSQL 之Redis集群模式

一&#xff1a;Redis集群方式 Redis有三种模式&#xff1a;分别是主从复制、哨兵模式、Cluster 1&#xff1a;主从模式: 主从复制是高可用Redis的基础&#xff0c;哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的…

netscaler LDAP+RADIUS传统的双因素认证方式(之一)

如果使用传统的双因素认证方式&#xff0c;可以通过在Citrix ADC (NetScaler) 13.1上配置Gateway Virtual Server来实现LDAP和RADIUS的双因素认证。当前配置方式&#xff0c;采用Cateway vServer两个Basic Authtication Policy方式实现&#xff0c;以下是详细步骤&#xff1a; …

【码题集】习题

目录 史莱姆融合 松鼠接松果 新月轩就餐 史莱姆融合 根据题意就是一道集合合并的题&#xff0c;所以要用并查集&#xff0c;不过最后我们要输出整个序列&#xff0c;所以要在合并的时候维护一个链表&#xff0c;以便最终合并成一个大集合的时候&#xff0c;输出整个链表就是…

针对不支持AJAX异步查询的虚拟空间做跨站点查询

最近在做一个ASPACCESS的企业小站&#xff0c;因为有中文、英文版分开不同空间不同域名的需求。原构想用AJAX做异步查询相关质保数据&#xff0c;但上线了才发现新网的虚拟空间不支持AJAX异步&#xff0c;咨询客服后也没有效的方法。后来想到&#xff1a;远程JS应该是每天的&am…

Kotlin Misk Web框架

Kotlin Misk Web框架 1 添加依赖1.1 build.gradle.kts1.2 settings.gradle.kts1.3 gradle.properties 2 请求接口3 程序模块4 主服务类5 测试结果 Misk 是由 Square 公司开发的一个开源的多语言服务器框架&#xff0c;主要用于构建微服务。它主要使用 Kotlin 语言&#xff0c;但…

UGC与AI引领的下一个10年,丝芭传媒已经准备好

丝芭传媒最近传来的消息&#xff0c;都跟技术相关。 基于自研AI大模型“Paro&#xff08;心乐舞河&#xff09;”的AIGPT及AIGC生成工具APP“鹦鹉人”开启用户内测。2023年3月技术测试的图形化智能社交基座“美踏元宇宙”&#xff0c;也将开放首轮用户内测。 此外&#xff0c…

Vue 3中 watch 和 watchEffect的区别?

​ 在 Vue 3 中&#xff0c;响应式系统允许我们声明性的绑定数据和 DOM&#xff0c;当数据变化时&#xff0c;DOM 也会自动更新。为了实现这一点&#xff0c;Vue 提供了特殊的 API&#xff0c;其中包括 reactive 和 ref&#xff0c;用于分别创建响应式对象和响应式基本类型值。…

【linux】log 保存和过滤

log 保存 ./run.sh 2>&1 | tee -a /home/name/log.txt log 过滤 import os import re# Expanded regular expression to match a wider range of error patterns error_patterns re.compile(# r(error|exception|traceback|fail|failed|fatal|critical|warn|warning…

notes for datawhale 2th summer camp NLP task1

//I wrote this note in obsidian and copied it here. The strange format in this note is due to lack of obsidian plugins. tags: AI-studyML status: done 目标&#xff1a;跑通baseline&#xff0c;体验NLP模型解决问题的流程&#xff0c;基本了解赛题要求&#xff0c;…

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…

高效图纸管理:彩虹图纸管理软件助您一臂之力

高效图纸管理&#xff1a;彩虹图纸管理软件助您一臂之力 在制造业的激烈竞争中&#xff0c;高效图纸管理是企业提升竞争力和降低成本的关键。然而&#xff0c;传统的图纸管理方式往往存在效率低下、信息混乱等问题。此时&#xff0c;彩虹图纸管理软件凭借其卓越的性能和丰富的功…