【教学类-67-02】20240716毛毛虫ABB排序

背景需求:

【教学类-67-01】20240715毛毛虫AB排序-CSDN博客文章浏览阅读584次,点赞16次,收藏6次。【教学类-67-01】20240715毛毛虫AB排序https://blog.csdn.net/reasonsummer/article/details/140443310

在AB排序基础上,继续制作ABB。

重点说明;

word模版

代码展示:

'''
名称:毛毛虫ABB排序
作者:星火讯飞、阿夏
实践:2024年7月16日
'''print('----1、制作毛毛虫图纸-------')
from PIL import Image, ImageDraw
from itertools import permutations
import os, random,mathpath = r'C:\Users\jg2yXRZ\OneDrive\桌面\毛毛虫'
path2 = path+r'\02毛毛虫ABB'# 创建一个空白画布
canvas_width = 900
canvas_height = 200
canvas = Image.new('RGB', (canvas_width, canvas_height), 'white')
draw = ImageDraw.Draw(canvas)colours = ["red", "orange", "yellow", "green", "cyan", "blue", "purple", "pink"]
# 8色# 使用itertools.permutations生成所有可能的排列
all_permutations = list(permutations(colours, 2))
print(all_permutations)# 创建一个新的列表,用于存储修改后的组合
new_combinations = []# 遍历原始组合列表
for combo in all_permutations:# 获取第一个和第二个元素first_element = combo[0]second_element = combo[1]# 创建新的元组,包含第一个元素、第二个元素(作为第三个元素)和第二个元素new_combo = (first_element, second_element, second_element)# 将新元组添加到新组合列表中new_combinations.append(new_combo)# 打印新组合列表
print(new_combinations)# 计算组合数
print(f"一共有 {len(new_combinations)} 种不重复的方法")for xx in range(len(all_permutations)):b = 20py = 20     #  偏移值w=6circle_spacing = (canvas_width - 3 * b) / 9# 创建一个新的空白画布canvas = Image.new('RGB', (canvas_width, canvas_height), 'white')draw = ImageDraw.Draw(canvas)# 绘制10个圆和线条for i in range(9):radius=10c = random.randint(10, 35)x = int(i * (circle_spacing) + b)  # 修改圆心位置,使圆的一半重叠,并加上左右上的间距,减去5像素以产生重叠效果# 第一个圆没有脚if i==0:            draw.line([(x +b +py+3, b+c+3), (50,10)], fill='black', width=w-3)  # 宽度乘以2,因为每磅等于2像素draw.ellipse((50-5,10-5,50+5,10+5), fill='white', outline='black', width=6)draw.line([(x + b+py+3, b+c+3), (100,10)], fill='black', width=w-3)  # 宽度乘以2,因为每磅等于2像素draw.ellipse((100-5,10-5,100+5,10+5), fill='white', outline='black', width=6)passelse:# 在每个圆的圆心位置向下画一条黑色3磅的线100磅长wdraw.line([(x + b+py, int(canvas_height/2)), (x + b+py, int(canvas_height/2) + py*4)], fill='black', width=w)  # 宽度乘以2,因为每磅等于2像素# 在每个圆的圆心位置向下画一条黑色3磅的线100磅长draw.line([(x + b+py*2, int(canvas_height/2)), (x + b+py*2, int(canvas_height/2) + py*4)], fill='black', width=w)  # 宽度乘以2,因为每磅等于2像素# 两个脚draw.ellipse((x + b+py-5-radius, int(canvas_height/2) + py*4-radius, x + b+py+radius-5, int(canvas_height/2) + py*4+radius), fill='white', outline='black', width=6)draw.ellipse((x + b+py*2-5-radius, int(canvas_height/2) + py*4-radius, x + b+py*2+radius-5, int(canvas_height/2) + py*4+radius), fill='white', outline='black', width=6)if i == 0 or i==3:color = str(all_permutations[xx][0])elif i == 1 or i==2:color = str(all_permutations[xx][1])else:color = 'white'# 在每个圆draw.ellipse((x, b + c, x + circle_spacing + b, circle_spacing + 2 * b + c), fill=color, outline='black', width=2)
# r2=random.randint(3, radius-3)#   添加第一个眼睛if i==0:     #白眼珠    draw.ellipse((x+py*2-radius*2-10, b+c+py*2-radius*2, x+py*2-10 +radius*2,  b+c+py*2+radius*2), fill='white', outline='black', width=2)draw.ellipse((x+py*4-radius*2-10, b+c+py*2-radius*2, x+py*4-10 +radius*2,  b+c+py*2+radius*2), fill='white', outline='black', width=2)#黑眼珠 draw.ellipse((x+py*2-r2-10, b+c+py*2-r2, x+py*2-10 +r2,  b+c+py*2+r2), fill='black', outline='black', width=2)draw.ellipse((x+py*4-r2-10, b+c+py*2-r2, x+py*4-10 +r2,  b+c+py*2+r2), fill='black', outline='black', width=2)# 嘴巴白for bb in ['+1+1','+1-1','-1+1','-1-1']:center_x, center_y, radius, start_angle, end_angle, width, color = x+py*2.5+int(bb[:2]), b+c+py*3.5+int(bb[2:4]), 30, 0, 180, 6, 'white'points = [(center_x + radius * math.cos(math.radians(angle)), center_y + radius * math.sin(math.radians(angle))) for angle in range(start_angle, end_angle + 1)]draw.line(points, fill=color, width=width)# 嘴巴黑center_x, center_y, radius, start_angle, end_angle, width, color = x+py*2.5, b+c+py*3.5, 30, 0, 180, 6, 'black'points = [(center_x + radius * math.cos(math.radians(angle)), center_y + radius * math.sin(math.radians(angle))) for angle in range(start_angle, end_angle + 1)]draw.line(points, fill=color, width=width)else:pass# 保存并显示图像w = path2 + r'\02毛毛虫ABB'os.makedirs(w, exist_ok=True)canvas.save(w + fr'\{xx:03d}.png')# 生成分开的圆圈
for xx in range(len(all_permutations)):b = 20py = 20     #  偏移值w=6circle_spacing = (canvas_width - 3 * b) / 9# 创建一个新的空白画布canvas = Image.new('RGB', (canvas_width, canvas_height), 'white')draw = ImageDraw.Draw(canvas)# 绘制10个圆和线条for i in range(6):radius=10    x = int(i * (circle_spacing+50) + b)  # 修改圆心位置,使圆的一半重叠,并加上左右上的间距,减去5像素以产生重叠效果# 添加圆形if i ==0  or i == 1 or i==3 or i==4:color = str(all_permutations[xx][1])elif i == 2 or i == 5 :color = str(all_permutations[xx][0])  # 在每个圆draw.ellipse((x, b , x + circle_spacing + b, circle_spacing + 2 * b ), fill=color, outline='black', width=2)# 保存并显示图像w2 = path2 + r'\02毛毛虫ABB圆圈'os.makedirs(w2, exist_ok=True)canvas.save(w2 + fr'\{xx:03d}.png')print('-----2、读取毛毛虫图纸合并成PDF,读取圆圈图纸合并成pdf-------')
# 第3步,读取图片写入docx,合并PDFimport os,time
from docx import Document
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from PyPDF2 import PdfMerger
from docx.shared import Cmn=1
for c in [path2 + r'\02毛毛虫ABB',path2 + r'\02毛毛虫ABB圆圈']:# 读取123文件夹中的所有图片地址new_folder = path2+r'\零时文件夹'os.makedirs(new_folder, exist_ok=True)image_files = [os.path.join(c, file) for file in os.listdir(c) if file.endswith('.png')]# 每8个图片一组进行处理grouped_files = [image_files[i:i+6] for i in range(0, len(image_files), 6)]print(grouped_files)# 处理每一组图片for group_index, group in enumerate(grouped_files):# 创建新的Word文档doc = Document(path+r'\毛毛虫模版.docx')print(group)# 遍历每个单元格,并插入图片for cell_index, image_file in enumerate(group):# 计算图片长宽(单位:厘米)# 插入图片到单元格table = doc.tables[0]cell = table.cell(int(cell_index / 1), cell_index % 1)# 只有1列,两个都是1cell_paragraph = cell.paragraphs[0]cell_paragraph.clear()run = cell_paragraph.add_run()run.add_picture(image_file, width=Cm(19.6), height=Cm(4.35))# 保存Word文档doc.save(os.path.join(new_folder, f'{group_index + 1:03d}.docx'))# 所有docx合并成PDF# 将10个docx转为PDFimport osfrom docx2pdf import convertfrom PyPDF2 import PdfFileMerger# from PyPDF4 import PdfMerger# output_folder = output_folderpdf_output_path = path2+fr'\{n}毛毛虫ABB({len(all_permutations)}个).pdf'# pdf_output_path = path+fr'\黑白三角1-10宫格随机每款{f*ys}图共{ys}张一黑一白黑点白边黑白.pdf'n+=1# 将所有DOCX文件转换为PDFfor docx_file in os.listdir(new_folder):if docx_file.endswith('.docx'):docx_path = os.path.join(new_folder, docx_file)convert(docx_path, docx_path.replace('.docx', '.pdf'))# 合并零时文件里所有PDF文件merger = PdfFileMerger()for pdf_file in os.listdir(new_folder):if pdf_file.endswith('.pdf'):pdf_path = os.path.join(new_folder, pdf_file)merger.append(pdf_path)time.sleep(2)# 保存合并后的PDF文件merger.write(pdf_output_path)merger.close()import shutil# 删除输出文件夹import timeshutil.rmtree(new_folder)# shutil.rmtree(w)# shutil.rmtree(w2)time.sleep(2)print('-----3、毛毛虫图纸和圆圈图纸合并-------')import os
import PyPDF2# 指定包含PDF文件的文件夹路径
# folder_path = '123'# 获取文件夹中所有的PDF文件
pdf_files = [f for f in os.listdir(path2) if f.endswith('.pdf')]# 创建一个新的PDF文件用于合并
merger = PyPDF2.PdfFileMerger()# 遍历文件夹中的每个PDF文件
for pdf_file in pdf_files:# 读取PDF文件with open(os.path.join(path2, pdf_file), 'rb') as file:merger.append(file)# 将合并后的PDF文件保存到新文件中
output_file = path+fr'\02毛毛虫ABB({len(all_permutations)}图 图纸和圆圈).pdf'
with open(os.path.join(path2,output_file), 'wb') as output:merger.write(output)# 删除原始PDF文件
for pdf_file in pdf_files:os.remove(os.path.join(path2, pdf_file))print("PDF文件已合并并删除原始文件。")

因为ABB也是抽取两个颜色,所以不重复数量还是56图。

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

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

相关文章

微信小程序:模板语法

模板语法 微信小程序有自己单独的一套模板语法。 WXML 结构 WXML 数据写法和Vue相似&#xff0c;数据通过 {{}} 包裹。 <text>{{ msg }}</text>WXSS 样式 WXSS 具有 CSS 大部分的特性&#xff0c;小程序在 WXSS 也做了一些扩充和修改。 rpx 单位 rpx 将屏幕等分为 …

【Django+Vue3 线上教育平台项目实战】登录功能模块之短信登录与钉钉三方登录

文章目录 前言一、几个关键概念1.HTTP无状态性2.Session机制3.Token认证4.JWT 二、通过手机号验证码登录1.前端短信登录界面2.发送短信接口与短信登录接口3.Vue 设置interceptors拦截器4. 服务端验证采用自定义中间件方式实现5. 操作流程及效果图如下&#xff1a; 三、通过第三…

记录些MySQL题集(9)

MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析 一、MySQL中的死锁现象 所谓的并发事务&#xff0c;本质上就是MySQL内部多条工作线程并行执行的情况&#xff0c;也正由于MySQL是多线程应用&#xff0c;所以需要具备完善的锁机制来避免线程不安全问题的问题产生&#…

手机如何伪装ip网络地址

伪装IP地址是指通过技术手段修改网络设备的IP地址&#xff0c;使其看起来像是来自另一个网络位置。这种技术通常用于隐藏真实的网络活动&#xff0c;以保护隐私。那么&#xff0c;手机如何伪装IP网络地址&#xff1f; 要在手机上伪装IP地址&#xff0c;‌可以通过下载和安装手机…

Spring事件监听机制详解

Spring事件监听机制详解 在现代软件开发中&#xff0c;解耦和灵活性是两个非常重要的设计原则。Spring 框架通过事件驱动的编程模型&#xff0c;实现了组件之间的松耦合。本文将介绍Spring事件监听机制的原理&#xff0c;并通过示例展示如何实现这一机制。 什么是Spring事件监…

数据资产通证化,堪比20年前的房地产?

大数据产业创新服务媒体 ——聚焦数据 改变商业 想象一下&#xff0c;一个简单的点击&#xff0c;一次不经意的搜索&#xff0c;一段简短的对话&#xff0c;它们在数字世界里留下了什么&#xff1f;是的&#xff0c;是数据。这些看似微不足道的数字碎片&#xff0c;汇聚成海&a…

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【中项】系统集成项目管理工程师-第一模块:IT技术和管理-1.1信息与信息化-1.1.2信息系统基础

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&#xff0c;目前涵盖了计算机软件、计算机网络、计算机应…

Dart语法问答到实践

语法问答 Dart语法输出调试信息的方法叫&#xff1f; print Dart语言里定义抽象类的关键字是&#xff1f; abstract Dart语言里String转Int的方法是&#xff1f; int.parse Dart语言的数据类型String是首字母大写&#xff0c;而int是首字母小写&#xff1f; 受c/c和java的影响&…

Office动态水印终于来了

在信息安全日益重要的今天&#xff0c;保护敏感信息变得尤为关键。目前&#xff0c;动态水印甚至是盲水印技术已经在各种企业软件中广泛应用&#xff0c;常见的钉钉和企业微信等都已经支持此类技术&#xff0c;用户查看消息时画面会显示对应用户的姓名和工号等&#xff0c;而作…

小程序-视图与逻辑

一、页面导航 声明式导航 编程式导航 导航传参 1.声明式导航传参 2.编程式导航传参 3.在onload中接收导航参数 二、页面事件 下拉刷新 上拉触底 三、生命周期 分类 生命周期函数分类 1.应用的生命周期函数 2.页面的生命周期函数 四、WXS脚本 基础语法 wxs的特点 五、案…

Matlab学习笔记01 - 基本数据类型

Matlab学习笔记01 - 基本数据类型 1、数据类型转换2、矩阵2.1 访问单个矩阵元素2.2 访问多个矩阵元素2.3 矩阵转置 3、字符与字符串4、数值与字符串5、元胞数组 1、数据类型转换 十进制转十六进制字符串‘FF’ >> hex2dec(3ff)ans 1023十进制转十六进制字符串 >>…

几何相关计算

目录 一、 判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、坐标系 一、 判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相交&#xff0c;其他同理。 struct Po…

GaussDB数据库使用gs_loader导入数据

1、创建用户并授予使用权限 CREATE USER gsloader WTH PASSWORD Gsloader14; GRANT ALL ON FUNCTlON copy_error_log_create() TO gsloader; GRANT ALL ON SCHEMA public To gsloader; SELECT copy_error_log_create(); SELECT copy_summary_create(); GRANT ALL FRIVILEGES ON…

阐述软件23种设计模式背后的图论和代数结构基础

软件设计模式是一套被广泛认可的解决特定设计问题的解决方案,它们在软件开发中被重复使用。虽然设计模式本身并不直接依赖于图论或代数结构,但这些数学概念为理解和实现某些设计模式提供了理论基础。以下是一些设计模式以及它们可能与图论和代数结构相关的方面: 1. **策略模…

华为OD 机试真题 - 分割均衡字符串(Python)

题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的’X"和’Y’两种字符。 输入描述 均衡串:XXYYXY 字符串的长度[2,10000]。给定的字符…

keepalive简单配置

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构&#xff0c;只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 组播地址 224.0.0.18&#xff0c;根据组播地址进行通信&#xff0c;主备之间发送…

10.1 标注、注记图层和注记整体说明

文章目录 前言标注、注记图层和注记QGis中的标注QGis中的注释(Annotation)图层QGis中的注记 总结 前言 介绍标注、注记图层和注记说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 标注、注记图层和注记 有时地图需要使用一些文字信息说明其中的地理要素或其…

OSX MongoDB 安装与配置指南

OSX MongoDB 安装与配置指南 MongoDB 是一款流行的开源 NoSQL 数据库,广泛用于数据存储、索引和实时分析。本指南将详细介绍在 macOS(OSX)操作系统上安装和配置 MongoDB 的步骤。 1. 安装 MongoDB 1.1 使用 Homebrew 安装 Homebrew 是 macOS 上的包管理器,可以简化软件…

如何落地实际场景,解决跨境传输共性需求?免费白皮书可下载

在全球化的背景下&#xff0c;海外市场对于数据驱动的产品和服务的需求不断增加&#xff0c;各行业数据跨境传输也日趋频繁&#xff0c;在这种前景下&#xff0c;越来越多的企业寻求更深度的跨国业务及合作&#xff0c;因此&#xff0c;企业数据跨境流动也成为了势不可挡的趋势…