Schemdraw小白从入门到放弃---原理工具书

文章目录

  • 版本
  • 最简单的例子
  • 一、总体思路
  • 二、元件
    • 2.1 color
      • 习题
    • 2.2 label
    • 2.3 length
  • 三、元件的连接
    • 3.1 延续性
      • 习题
    • 3.2 方向
      • 习题
    • 3.3 接线点
      • 习题
      • 3.3.1 默认激活anchor与沉默anchor
      • 3.3.2 切换鼠标焦点机制
        • 3.3.2.1 at函数规定元件的start接在哪个anchor上
        • 3.3.2.2 to函数规定元件的end接线在哪里
        • anchor函数规定当前元件用那个anchor与其他元件对接
          • 习题
  • 四、自定义元件
  • 五、附加介绍:制作GiF
  • 六、升华习题
  • 习题答案

SchemDraw是一款非常优秀简单高效的python的电路图软件,猜测其设计者是一位优秀的电子信息工程师,他从传统的纸上画图入手,抽象出很多手绘图的习惯,将至迁移到编程中,所以学习成本超低,适合小白入手到大神。

python是一门很简单的编程语言,如果您有java或者c语言基础,那么学习成本超级低。

学习就是学且练习,一篇好的文章,应该简单明了的说明思路及大量的习题,而真正的做题方式是做一题理解更深一层。很多习题是笔者自己出的,才疏学浅度,多多扶正,另外,很多是开发题目,言之成理即可,不要在乎答案。

schemdraw包含了作者大量心血,我试图用最简单的逻辑去阐明作者设计初衷,降低各位学习成本,所以与原教程有明显不一样的编排,不喜勿喷。我自己的理解:设计者将纸上作图的方法完全照抄到了编程绘图上,所以纸上怎么画图就怎么编写程序。看完本教程,忘记我的言语,留着您的理解,记住几个常用函数,展开您的想象,随意发挥。

版本

SchemDraw的最佳python版本是3.8.0+,最新版本是0.14,可以在jupyter中使用此软件。

最简单的例子

import schemdraw
import schemdraw.element as elewith schemdraw.Drawing():elm.Resistor()elm.Capacitor().down()elm.Diode().color('red').left()elm.SourceV().label("3V").up()

在这里插入图片描述

一、总体思路

  1. 在设计者看来,电路图是由电路元件按照一定顺序连接而成。
  2. 元件:具备一定的属性最常见的是label、color、length等等。
  3. 布局:大部分电路图很简单,是一堆元件依次连接形成的,在绘制过程中,您都是在前一个元件的端点上绘制下一个,只需要在绘制的过程中把握好方向就行了。当然复杂电路上,有可能需要在某个之前很早画好的元件上画下一个元件,这就涉及改鼠标焦点,设计者也预留了方法。

接下来,本文先介绍电子元件及其一些简单属性和方法,再介绍电子元件的连接及其一些比较深入的属性和方法。

二、元件

Schemdraw的元件,在schemdraw.element包下,需要用到哪些元件您看其介绍就好。下面讲他们的一些属性介绍。

2.1 color

with schemdraw.Drawing() as draw:# 1. color函数链式调用elm.Capacitor().color('#A0F')# 2. 初始化元素elm.Diode(color="red")

在这里插入图片描述

习题

2.1.1 color函数支持6位的RGB数值吗?

2.2 label

label除了显示正常文字,也支持latex语法,loc属性注明其位置;同时,也支持label链式连续调用,以满足多处注释的需求。

with schemdraw.Drawing() as draw:elm.Capacitor().label("$3uf$", loc="bottom").\label("left", loc='left').\label("right", loc='right').\label("top", loc='top')

在这里插入图片描述

2.3 length

元件都有默认长度,一般为3,您也可以尝试改变一下。别问我3的单位是啥,我也不知道,这是设计者自己设定的,它仅仅是电子元器件间长度的绝对数值,应该不是物理意义上的绝对数值。

with schemdraw.Drawing() as draw:d = elm.Diode(color='red', label='3')with schemdraw.Drawing() as draw:d = elm.Diode(label='2').length(2)with schemdraw.Drawing() as draw:d = elm.Diode(label='2.5').length(2.5)with schemdraw.Drawing() as draw:d = elm.Diode(label='5').length(5)

在这里插入图片描述

三、元件的连接

回想一下,我们在纸上画图的过程,不难发现:您一般都是在上一个元件的末尾,开始画下一个元件的,尤其是简单串联电路上,肯定遵守这个法则。有时,您的元件需要拐弯,也就是改变了画笔的方向,而且下一个元件也延续在这个方向上画。最后,您也时常会画好一个子部分后,在另外一个元件的某个接线点上继续画原件。在上面过程中,提到设计者最核心的三个设计点:接线点、方向和延续性
下面进行讲解。

3.1 延续性

延续性,在其底层实现是:设计者将类似鼠标焦点的东西,每次都迁移到最新的元件的其他接线点上,如下代码:起初,存在一个鼠标焦点,用户定义了一个二极管对象后,二极管一端接到这个鼠标焦点上,然后二极管另一端就变成新的鼠标焦点接上后续定义的电容,再转移鼠标焦点,接新的电阻对象…,依次画元件变更新的鼠标焦点,完成此幅电路图。

with schemdraw.Drawing() as draw:# 在上一个元件的尾部画下一个元件# 方向保持不变# 第一组 三个元件elm.Diode()elm.Capacitor()elm.Resistor()# 第二组 两个元件elm.Diode(color="red").up()elm.Capacitor(color="red")# 第三组 三个元件elm.Diode(color="blue").left()elm.Capacitor(color="blue")elm.Resistor(color="blue")

在这里插入图片描述
在上述很容易看到方向和鼠标焦点的延续性。另外设计者,这样子隐式地规定了各元件间连接搭配,既符合我们日常画图顺序,又省去大量代码描述元件的连线,实在优秀。

习题

3.3.1 还有哪些功能上,可能存在这种延续性???您可以在看完文章后,再来回答这个问题。

3.2 方向

方向,就是你在纸上画这个元件时的走向,也就是元件起点到结束点的走向。有两种实现,一种是利用elm的up,left,right,down,另一种是用偏转角度函数theta来表示,theta是希腊字母 θ \theta θ的读音,在数学上用来表示角度。

wwith schemdraw.Drawing() as draw:elm.Diode().label("默认方向是向右画")elm.Capacitor().down().label("向下画")elm.Resistor(color="red").theta(60).label("60度画", loc='bottom')elm.Resistor(color="blue").theta(300).label("300度")

在这里插入图片描述

习题

3.2.1 为什么是up,down两个单词来表示,而不是top,bottom?

3.2.2 如下代码,会画出什么有意思的?

with schemdraw.Drawing() as draw:elm.Diode().label("默认方向是向右画")elm.Capacitor().down().label("向下画")elm.Diode(color="red").up().label("向上画", loc='bottom')

3.2.3 请问theta函数的0度时,元件走向如何?90度呢?180度?270度?360度?如下代码,请猜一下如何画?

with schemdraw.Drawing():elm.Resistor().theta(0)

3.3 接线点

接线点,就是元件的电线接入点,设计者给它取名为anchor。在schemdraw中,元件分为两种:一种是有五个anchors,一般分别叫做start,end,center, istart, iend,大多数都属于这种,如二极管、电阻、电容,其中三极管这类的,含有一些有名的anchors;一种是只有一个anchors,比如接地符号。

with schemdraw.Drawing():# 电阻R1 具有五个接线anchor名字分别为start,end,center,istart,iend。 # 其中start和end是电线接入点,center也是一个接入点,但是电阻,电容这类元件没啥用。# 使用label函数中的loc将sec三个字符分别显示到对应的点上。R1 = elm.Resistor().label("s", loc='start').label("e", loc="end").label("c", loc="center")# istart,iend是电阻元器件本身的起始位置,一般用不到# 现在给您展示下,生成一个接地符号,挂在R1的istart位置上。g1 = elm.Ground().at(R1.istart).color("red")

在这里插入图片描述
在下面您可以看出,如何查看一个元素的有多少个anchor,及其具体的名字,而anchor是元件的一个重要属性,是一个个二维坐标点,是设计者预留给使用者的绘图接口,属于较为高级的内容。
在这里插入图片描述
一般而言,常用型元器件中,电容电阻二极管电源,它们最常用的anchor是start和end,大家也没有管用叫法,所以统一叫做start和end。
但是对于三极管这种的话,每个anchor是有各自不同的命名的如下:
在这里插入图片描述

习题

3.3.1 运行如下代码,为啥没有东西?

import schemdraw.elements as elm
R1 = elm.Diode()
print(R1.anchors)

3.3.2 您觉得anchor功能有哪些设计亮点?

3.3.1 默认激活anchor与沉默anchor

绘图时,设计者规定,电路图中所有anchor中,有且只有一个默认激活anchor,也就是鼠标焦点,其它均为沉默anchor。

3.3.2 切换鼠标焦点机制

设计者有一套自动的鼠标焦点切换管理机制,一般情况下,当您画了一个元件后,鼠标焦点默认在您当前的元件的默认结束接线点,也就是延续性。

3.3.2.1 at函数规定元件的start接在哪个anchor上

只是碰到一些复杂电路时,需要将鼠标焦点切换到其他元件的某接线点上。推荐您使用at函数如下:

with schemdraw.Drawing():r1 = elm.Diode().label("第一个元件")elm.Capacitor().label("第二个元件")# 使用at函数,at函数为当前元件指定其开始点即start anchor接在某元件的某anchor上。elm.Resistor(color="red").up().at(r1.start).label("第三个元件", loc='bottom')

在这里插入图片描述

3.3.2.2 to函数规定元件的end接线在哪里
with schemdraw.Drawing():R1 = elm.Resistor().label("R1")C2 = elm.Capacitor().down().label("C2")D3 = elm.Diode().color('red').left().label("D3")R2 = elm.Resistor().at(R1.start).to(C2.end).label("R2")elm.Dot(color="blue")

在这里插入图片描述

anchor函数规定当前元件用那个anchor与其他元件对接
with schemdraw.Drawing():R1 = elm.Resistor().label("R1")C2 = elm.Capacitor().down().label("C2")D3 = elm.Diode().color('red').left().label("D3")jit1 = elm.BjtNpn().label("bji1")elm.Dot(color="blue")jit2 = elm.BjtNpn().anchor("collector").at(R1.start).label("bji2")

在这里插入图片描述

习题

二极管适合用anchor函数吗?

四、自定义元件

五、附加介绍:制作GiF

六、升华习题

6.1 请问您觉得设计者的编程方法是否别扭?这种别扭带来的好处是什么?

6.2 请问您是否觉得schemdraw是否在编程上是相对高效的?体现在哪里?

6.3 请问本文第一个例子中,schemdraw是怎么将之自动封口成为一个四方形的?

习题答案

仅供参考,开放题目!

3.1.1 其他都不会具备延续性了,因为纸上画图也是这样的,只有这两处具备不变性。颜色,大小,等等都会变的,或者是可以全局设置的。

3.2.1 因为up,down是说向上向下画,top和bottom表示一张图中的上下位置。

3.2.2 会覆盖,如下图,而且可以看到,作者是多么相信我们呀!
在这里插入图片描述

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

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

相关文章

重磅!一起做个淘宝的简易布局!(超详细)

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 因为之前的学习内容,今天,我们可以来综合运用一下标签和 CSS 样式,做一个简易的淘宝网页大体布局了,如图。 咱们今天要做成这样子! 里面…

4.1 RK3399项目开发实录-案例开发之MIPI 摄像头开发(wulianjishu666)

嵌入式从零到项目开发全套例程资料 链接:https://pan.baidu.com/s/1ksCQN__jD8ZrJhw8sWzhwQ?pwdvvfz 3.2. MIPI 摄像头 带有 MIPI CSI 接口的 RK3399 板子都添加了双 MIPI 摄像头 OV13850 的支持,应用中也添加了摄像头的例子。下面介绍一下相关配置。…

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环,一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度:123....nn(1n)/2 所以…

2024 ccfcsp认证打卡 2023 09 02 坐标变换(其二)

202309-2 坐标变换(其二) 题解1题解2区别第一种算法(使用ArrayList存储操作序列):数据结构:操作序列处理: 第二种算法(使用两个数组存储累积结果):数据结构&a…

Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

问题 使用公司的私有源,执行 npm i 的时候突然报错了: 解决 执行命令 npm config list找到 .npmrc 去掉对应的这一行即可,或者使用 nrm 工具执行 nrm del xxx 删掉私有源,然后在添加私有源也可。可以参考我这篇:使…

(一)基于IDEA的JAVA基础8

使用多重if选择结构 多个if条件进行判断: 语法: if(条件1){ 执行语句1; }else if(条件2){ 执行语句2; }else if(条件3){ 执行语句3; }else if (条件4)…… 流程图: 我们来写个好玩的,对暗号: public class Test01 { …

五分钟快速搭建个人游戏网站(1Panel)

五分钟快速搭建个人游戏网站(1Panel) 环境要求:主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统); 如果是Windows OS的可以通过WSL来实现安装。 1 介绍 1Panel 是一个基于 Web 的 L…

结构体讲解

目录 一.结构体类型的声明 (1)结构体的声明 (2)结构体的创建和初始化 (3)匿名结构体 (4)结构体的自引用 二.结构体内存对齐 (1)对齐规则 (2)为什么存在内存对齐? (3)结构体传参 三.结构体实现位段 (1)什么是位段 (2)位段的内存分配 (3)位段的跨平…

电脑桌面便签,怎么在电脑桌面上设置便签

在数字化时代,电脑已成为我们日常生活不可或缺的一部分。在我们使用电脑进行各种工作和学习的过程中,经常会遇到需要记录临时信息或提醒自己的情况。这时,设置便签在电脑桌面上就成为了一种非常便捷的方法。那么有一个问题,电脑桌…

2.8、下拉刷新与上拉加载

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。 实现思路 以下拉刷新为例,其实现主要分成三步: 监听手指按下事件,记录…

每天学点儿python(1)---print,input和注释

print函数 print语法格式 print(*objects, sep , end\n, filesys.stdout) sep参数默认为 一个空格 end(输出末尾)参数默认为 回车换行 file默认为 标准输出(一般指屏幕) 所以,如果想输出各个字段不用空格隔开&a…

vue3+threejs新手从零开发卡牌游戏(七):创建卡组

在开始前先优化下之前的代码: 在之前hand/p1.vue中为了定位 utils文件夹下新建common.ts,将一些公用方法提取出来放在这里: 在game/Cards.ts中,我们调整下卡牌的厚度,由原来的0.02改为0.005,原因是之前的…

【Ucore操作系统】4. 地址空间

文章目录 【 0. 引言 】背景本章任务 【 1. C 中的动态内存分配 】1.1 C语言的内存分配1.2 kalloc 中的动态内存分配 【 2. 地址空间 】2.1 虚拟地址和地址空间2.1.1 地址虚拟化出现之前2.1.2 加一层抽象加强内存管理2.1.3 增加硬件加速虚实地址转换 2.2 分段内存管理2.2.1 等量…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com 转发本文请备注原文链接,本文内容整理日期:2024-03-21 csdn 博客名称:五维空间-影子,欢迎关注…

javaSwing扫雷游戏

一、介绍 1.1 背景 在1964年 有一个叫“方 块”的游戏,这是扫雷最原始的版本。后来,这个游戏被改成了另一种游戏,叫做“Rlogic”。在这个游戏中,玩家扮演了一名军队的军人,接受了一项艰难的任务:为指挥中…

家政服务管理平台设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,…

【c++】类和对象(三)构造函数和析构函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们带来类和对象重要的部分,构造函数和析构函数 目录 1.类的6个默认成员函数2.构造函数2.1构造函数其他特性 3.构析函数3.1特性:…

sql——对于行列转换相关的操作

目录 一、lead、lag 函数 二、wm_concat 函数 三、pivot 函数 四、判断函数 遇到需要进行行列转换的数据处理需求,以 oracle 自带的表作为例子复习一下: 一、lead、lag 函数 需要行列转换的表: select deptno,count(empno) emp_num from…

【工具】DataX 数据同步工具

简介 DataX 是阿里云 DataWorks数据集成 的开源版本,在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databe…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统,帮助商…