文章目录
- 序
- 版本
- 最简单的例子
- 一、总体思路
- 二、元件
- 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 ele
with schemdraw.Drawing():
elm.Resistor()
elm.Capacitor().down()
elm.Diode().color('red').left()
elm.SourceV().label("3V").up()
一、总体思路
- 在设计者看来,电路图是由电路元件按照一定顺序连接而成。
- 元件:具备一定的属性最常见的是label、color、length等等。
- 布局:大部分电路图很简单,是一堆元件依次连接形成的链,在绘制过程中,您都是在前一个元件的端点上绘制下一个,只需要在绘制的过程中把握好方向就行了。当然复杂电路上,有可能需要在某个之前很早画好的元件上画下一个元件,这就涉及改鼠标焦点,设计者也预留了方法。
接下来,本文先介绍电子元件及其一些简单属性和方法,再介绍电子元件的连接及其一些比较深入的属性和方法。
二、元件
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 会覆盖,如下图,而且可以看到,作者是多么相信我们呀!