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 打印卷尺相关推荐

  1. python打印换行符_Python换行符以及如何在不使用换行符的情况下进行Python打印

    python打印换行符 Welcome! The new line character in Python is used to mark the end of a line and the begi ...

  2. python 打印所有汉字

    python 打印所有汉字 for ch in range(0x4e00, 0x9fa6):print(chr(ch))

  3. python打印小数

    python打印数字,不以科学计数法输出: 下面的代码只对numpy数据有效,对print单个值无效. import numpy as npimport timenp.set_printoptions ...

  4. python乘法口诀编程-中年大叔学编程-用Python打印个九九乘法表

    原标题:中年大叔学编程-用Python打印个九九乘法表 前面简单的介绍了一些基础常用的语法,那么这一篇,我们就来实践一番,写两个小程序,感受一下传说中coding的感觉. Python打印九九乘法表 ...

  5. python打印乘法表口诀-用Python打印九九乘法表正三角和倒三角。

    网上看到一道作业,用Python打印九九乘法表正三角和倒三角. 正三角输出: for i in range(1,10): for j in range(1,i+1): if(i==j): print( ...

  6. Python打印格式化与字符串

    关于Python打印格式化与字符串,比较全面的总结,希望对大家有帮助~ # -*- coding: cp936 -*- ''' 打印格式 '''print "a" print &q ...

  7. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例

    前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int ...

  8. python 打印文件名_在Python中打印文件名,关闭状态和文件模式

    python 打印文件名 Prerequisite: Opening, closing a file/open(), close() functions in Python 先决条件: 在Python ...

  9. python 打印列表元素_Python程序以不同方式打印列表元素

    python 打印列表元素 In this program – we are going to learn how can we print all list elements, print spec ...

最新文章

  1. 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?...
  2. Flash和滚动字幕
  3. 用VB实现带图片的XP风格的按钮控件
  4. java 协议开发_用Java的NIO开发网络协议
  5. AcWing 1750. 救生员(差分+暴力枚举)
  6. 2.软件架构设计:大型网站技术架构与业务架构融合之道 --- 架构的道与术
  7. IP协议和IPX协议的区别
  8. php 服务端埋点,客户端埋点方案总结
  9. siri中文语音助理_针对“语音助手”类产品,浅谈对话式交互设计
  10. 发票信息批量提取到 excel 软件 2.3
  11. 故宫景点功课4:太和殿院落下
  12. idea 创建一个springboot 项目(hello world)
  13. 论文阅读23 - Mixture Density Networks(MDN)混合密度网络理论分析
  14. 开源一个电子胸牌项目,很棒!
  15. 巴比特 | 元宇宙每日必读:传腾讯成立XR部门,元宇宙板块再次上涨,多家券商发报告关注虚拟人的投资机会...
  16. 生日悖论(python)
  17. c盘oracle文件夹,C盘的用户文件夹转移到其他分区
  18. 如何下载完整的ie6sp1
  19. 电脑音量,电脑声音最大了还是小如何解决_电脑声音开到最大还是很小怎么办...
  20. [HLS] dataflow

热门文章

  1. CSS横向滚动条自定义样式
  2. css超出部分隐藏,鼠标放上去展示全部?
  3. Sql Server实用操作小技巧总结(转)
  4. 去掉VS中ipch文件和.sdf文件的解决方法
  5. G20伦敦峰会公告全文
  6. 人力资源管理如何为企业增值
  7. 代码之外周刊第 21 期 - 20191124
  8. 解决appium-desktop 定位元素页提示:Could not obtain source: {cause:{sessionId:6367bdd3-0a2a-4ab0......的问题
  9. 第二课计算机ppt,学信息技术课件 第2课 认识计算机课件.ppt
  10. OpenCV C++ 图像对比度和亮度