python 打印卷尺
python 打印卷尺
起因
想量一量?围,于是想买一个卷尺.要到?宝上买东西,就得看评论了,可是又有人说那家的卷尺有味道.于是就想自己自己做一个了.打印机其实是个挺好的工具,虽然不是3d打印机,但是2d的打印机打印2d的卷尺其实已经够用了.
经过
思路基本上就是,通过代码将直尺绘制在位图或矢量图上,之后通过图片或者pdf文档的方式打印出来,绘制的时候要注意尺寸比例.
出于编程复杂度方面的考量选择了位图并且直接打印图片的方式.
结果代码如下:
'''
The code generates an image ruler according to the configuration.
Then a printer is used to convert the image to a useable ruler.
''''''
Paper mm inches
A3 297 x 420 mm 11.7 x 16.5 inches
A4 210 x 297 mm 8.3 x 11.7 inches
A5 148.5 x 210 mm 5.8 x 8.3 inches
A6 105 x 148.5 mm 4.1 x 5.8 inches
'''paper_sizes={'A3': (297,420),'A4': (210,297),'A5': (148.5,210),'A6': (105,148.5)
}from PIL import Image,ImageDraw,ImageFont
import sys
import math
import json# parse argumentswith open('config.json') as f:config=json.load(f)paper_w,paper_h=paper_sizes[config['paper_type']]k=config['precision']
ruler_w=config['ruler_w']
ruler_l=config['ruler_h']
ruler_start=config['ruler_start']
overlap_l=config['overlap_l']
scale_l=[3,2,1]
margin_top=10
margin_bot=10font=ImageFont.truetype(config['font_file'],k*4)
# font=ImageFont.truetype(r'C:\Windows\Fonts\consola.ttf',k*5)# checking and calculatingseg_l=paper_h-margin_top-margin_bot
# seg_l+n_seg*(seg_l-overlap_l)
n_seg=math.ceil((ruler_l-seg_l)/(seg_l-overlap_l))+1
seg_w=ruler_w
seg_margin=paper_w//n_seg-seg_w
if seg_margin<=0:print('Not enough space on paper!',file=sys.stderr)im=Image.new('RGB',(paper_w*k,paper_h*k),(255,255,255))
draw=ImageDraw.Draw(im)for i in range(n_seg):lux,luy=(seg_w+seg_margin)*i+seg_margin/2,margin_top# draw horizontal linedraw.line((lux*k,0*k,lux*k,(im.height-margin_bot)*k),fill=(0,0,0))draw.line(((lux+seg_w)*k,0*k,(lux+seg_w)*k,(im.height-margin_bot)*k),fill=(0,0,0))seg_l=paper_h-margin_top-margin_botseg_s=i*(seg_l-overlap_l)if seg_s+overlap_l>=ruler_l:breakfor j in range(seg_l):if seg_s+j>ruler_l:breakif (seg_s+j)%10==0:sl=scale_l[0]# draw numbers=str((seg_s+j)//10)size=font.getsize(s)draw.text(((lux+seg_w/2)*k-size[0]/2,(luy+j)*k-size[1]/2),s,fill=(0,0,0),font=font)elif (seg_s+j)%5==0:sl=scale_l[1]else:sl=scale_l[2]# draw scalesdraw.line((lux*k,(luy+j)*k,(lux+sl)*k,(luy+j)*k),fill=(0,0,0))draw.line(((lux+seg_w)*k,(luy+j)*k,(lux+seg_w-sl)*k,(luy+j)*k),fill=(0,0,0))# draw paper borderdraw.line((0*k+1,0*k+1,paper_w*k-1,0*k+1),fill=(0,0,0))
draw.line((paper_w*k-1,0*k+1,paper_w*k-1,paper_h*k-1),fill=(0,0,0))
draw.line((paper_w*k-1,paper_h*k-1,0*k+1,paper_h*k-1),fill=(0,0,0))
draw.line((0*k+1,paper_h*k-1,0*k+1,0*k+1),fill=(0,0,0))# TODO: draw ruler start and end lineim.save('ruler.png')
{"paper_type": "A4","precision": 10,"ruler_w": 15,"ruler_h": 2000,"overlap_l": 10,"font_file": "C:\\Windows\\Fonts\\consola.TTF","ruler_start": 0,"scale_l": [3,2,1]
}
show: ruler.pngruler.pngruler.png: ruler_gen.pypython ruler_gen.pyclean:del ruler.png
当然是可以通过配置文件修改参数了,其实也就是使用PIL
画了几条线而已,之后再添加一些数字.不过我觉得还挺好看,自己测试的时候是没问题的.其它的尺寸和参数也没有特别测试过.
结果
结果就是打印完之后还需要自己用裁纸刀才下来,如果需要保证耐用性,可以用胶带把它包裹起来(好累!).还有一个问题就是两次打印出来的结果刻度线的清晰程度不一样,不知道是不是我第二次没有打印原图的原因.
python 打印卷尺相关推荐
- python打印换行符_Python换行符以及如何在不使用换行符的情况下进行Python打印
python打印换行符 Welcome! The new line character in Python is used to mark the end of a line and the begi ...
- python 打印所有汉字
python 打印所有汉字 for ch in range(0x4e00, 0x9fa6):print(chr(ch))
- python打印小数
python打印数字,不以科学计数法输出: 下面的代码只对numpy数据有效,对print单个值无效. import numpy as npimport timenp.set_printoptions ...
- python乘法口诀编程-中年大叔学编程-用Python打印个九九乘法表
原标题:中年大叔学编程-用Python打印个九九乘法表 前面简单的介绍了一些基础常用的语法,那么这一篇,我们就来实践一番,写两个小程序,感受一下传说中coding的感觉. Python打印九九乘法表 ...
- python打印乘法表口诀-用Python打印九九乘法表正三角和倒三角。
网上看到一道作业,用Python打印九九乘法表正三角和倒三角. 正三角输出: for i in range(1,10): for j in range(1,i+1): if(i==j): print( ...
- Python打印格式化与字符串
关于Python打印格式化与字符串,比较全面的总结,希望对大家有帮助~ # -*- coding: cp936 -*- ''' 打印格式 '''print "a" print &q ...
- python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例
前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int ...
- python 打印文件名_在Python中打印文件名,关闭状态和文件模式
python 打印文件名 Prerequisite: Opening, closing a file/open(), close() functions in Python 先决条件: 在Python ...
- python 打印列表元素_Python程序以不同方式打印列表元素
python 打印列表元素 In this program – we are going to learn how can we print all list elements, print spec ...
最新文章
- 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?...
- Flash和滚动字幕
- 用VB实现带图片的XP风格的按钮控件
- java 协议开发_用Java的NIO开发网络协议
- AcWing 1750. 救生员(差分+暴力枚举)
- 2.软件架构设计:大型网站技术架构与业务架构融合之道 --- 架构的道与术
- IP协议和IPX协议的区别
- php 服务端埋点,客户端埋点方案总结
- siri中文语音助理_针对“语音助手”类产品,浅谈对话式交互设计
- 发票信息批量提取到 excel 软件 2.3
- 故宫景点功课4:太和殿院落下
- idea 创建一个springboot 项目(hello world)
- 论文阅读23 - Mixture Density Networks(MDN)混合密度网络理论分析
- 开源一个电子胸牌项目,很棒!
- 巴比特 | 元宇宙每日必读:传腾讯成立XR部门,元宇宙板块再次上涨,多家券商发报告关注虚拟人的投资机会...
- 生日悖论(python)
- c盘oracle文件夹,C盘的用户文件夹转移到其他分区
- 如何下载完整的ie6sp1
- 电脑音量,电脑声音最大了还是小如何解决_电脑声音开到最大还是很小怎么办...
- [HLS] dataflow
热门文章
- CSS横向滚动条自定义样式
- css超出部分隐藏,鼠标放上去展示全部?
- Sql Server实用操作小技巧总结(转)
- 去掉VS中ipch文件和.sdf文件的解决方法
- G20伦敦峰会公告全文
- 人力资源管理如何为企业增值
- 代码之外周刊第 21 期 - 20191124
- 解决appium-desktop 定位元素页提示:Could not obtain source: {cause:{sessionId:6367bdd3-0a2a-4ab0......的问题
- 第二课计算机ppt,学信息技术课件 第2课 认识计算机课件.ppt
- OpenCV C++ 图像对比度和亮度