特殊なライブラリなどを使わず、電気回路の回路図を描画する Python のプログラムについてまとめておきます。
電子部品の部品名と座標をテキストで書いておくと、ベクター画像(HTML 形式、および、SVG形式)で回路図を出力します。
Python で作成した回路図のジェネレータです。Python が動く環境があれば、特殊なライブラリなどがなくても、実質、オープンソースのフリーソフトとして図形描画ができます。
以下の環境で動作確認をしています。
環境: Windows パソコン、Python 3、Microsoft Edge (+ Anaconda)
背景 ~ メモ書き感覚で、回路図を作成したい!
Raspberry Pi などで電子回路を検討していると、メモ書きの感覚で、できるだけ簡単に回路図を描きたくなることがあります。
このとき、回路図を Microsoft Office などの汎用ソフトで描こうとすると、なかなかうまく描けず、とても煩雑です。
とはいえ、便利そうなツールをネットで探すと、有料だったりインストールが煩雑だったりします。習得やライセンス管理も手間がかかりそうです。また、作った回路データが独自フォーマットだったりすると、参照、配布、公開の際も、とても不便です。
理想をいえば、GUI の操作(=ツールの習得、ドラッグ&ドロップ)すら不要で、単純にテキストファイルさえ作っておけば回路図が生成できるようにしたいところです。何という怠惰なのだろうか。。
ということで、テキストで抵抗や電源などのデバイス名と端子の座標を書き出しておくと、回路図を描画するプログラムについてまとめ、公開しておきます。
回路データとなるテキストファイルを準備しておけば、回路図を生成できます。
以前、Python で SVG 形式で描画する方法についてまとめています(関連リンク参照)。今回は、その応用です。出力をベクター画像としていますので、拡大しても画像の崩れが最小となるようにしています。
デバイスの作図は、最近の電子回路に関する JIS 規格に近づけるようにしました。とはいえ、書籍や大学の資料などを見ると、電気抵抗など新旧の記載が混在しているのが現状のようですので、よく使われているものについては、一部、対応しています。
また、著作権の問題を解消するため、他のサイトや文献、数値データのコピーなどはせず、あらたに、図形・シンボル、プログラムを作成しています。
Python のスクリプトについては、部品の追加をする可能性がありますので、アップデートは随時、行うことにします。現在のところ、冒頭の画像に示したデバイス程度は描画できています。
メモ書きの感覚でテキストファイルを作っておけば、高校や大学の初段階で習う程度の回路図は作成できると思います。
設定方法
① パソコンにフォルダを作成してください。
例: “c:\user\circuit_diagram”
② ①のフォルダの中に、”circuit_diagram.py” というファイル名で、テキストファイルを作成してください。
このテキストファイルに、下記のサンプルスクリプトをコピー&ペーストして保存してください。
③ さらに、①のフォルダの中に、”circuit1″ というフォルダを作ってください。この中にテキストファイルで回路データを追加していきます。
使い方
④ ③のフォルダ “circuit1” 内にテキストファイルを作成し、回路データを記載してください。
回路データは、下記のサンプルを参照してください。
⑤ Python のスクリプト(②)を実行してください。
例:コンソールで python c:\user\circuit_diagram\circuit_diagram.py を実行
→ テキストファイルごとに、③のフォルダ内に回路図(HTMLファイル)が生成されます。
★ まずは、下記のサンプルをひととおりテキストファイルに保存し、回路図を作成してみてください。要領がわかるかと思います。
うまく動いたら
★ うまく動いたら、回路データ(テキストファイル)を追加し、サンプルをアレンジしてみてください。
回路データ(テキストファイル)の作成方法
★ circuit1 フォルダ内に入れたテキストファイル1つが、1つの回路データ(HTML、SVG ファイルの一式)に対応します。テキストファイルが2つあれば、それぞれの回路データに対応した2セットの画像を出力します。
★ 座標系は、モニターの画面座標にならい、水平右向きを +X、垂直下向きを +Y に取ります。
★ 回路データ(テキストファイル)内では、1行が1つの部品に対応しています。各行は、半角カンマ “,” で区切り、部品名、座標、等を記載します。
つまり、部品名と、描画する座標等をテキストで書いておくと、その指定された座標に部品に対応したシンボルを描画します。
部品名が定義されていないものであった場合は、読み飛ばします。
具体例
★ たとえば、電気抵抗 R1 を水平方向に (x1, y1) = (100, 200)、(x2, y2) = (300, 200) の位置に描画する場合は、以下のように記載(打点)します。
resistor1, 100, 200, 300, 200, R1
もしこの電気抵抗 R1 に、さらに部品を接続していく場合は、行を追加して、たとえば、点 (x2, y2) からスタートして、部品を追加していきます。
★ 現在のところ、斜め向きの描画は非対応です。原則、部品は横向き、あるいは、縦向きに記載してください。
★ 電気抵抗 resistor1 と同様に、配線は line1、コンデンサは capacitor1、コイルは coil1 等としています。これらの部品は足が2本あるので、2点の座標を指定するとその場所に、各回路の部品を描画します。
各行で、座標などのパラメータは、半角英数字、かつ、半角カンマ区切りで記載します。また、パラメータの個数は部品ごとに異なり、固定です。
パラメータが不足するとエラーとなり(え)ますので、サンプルの記載に従ってください。たとえば、電気抵抗で文字 “R1” を書く必要がない場合は、カンマは残したままとして、空欄としてください。
★ また、2つの点の間隔は、部品のスペース程度を空けて打点してください。2つの点の間隔が狭いと正しい描画ができません。具体的には、パーツリストの事例を参照してください。
★ 電池 source1 やダイオード diode1 など、打点(配線方向)に対して対称でない部品は、原則、電流の流れに沿って打点します。したがって、2つの点 (x1, y1) と (x2, y2) を入れ替えると、部品の向きを逆にすることができます。
★ トランジスタ transistor1, 2 は配線が3本あるので3点を指定します。
具体的には、まず、transistor1, 2 の末尾の数値でデバイスの種別(NPN/PNP)を選択します。
つぎに、電流が流れる垂直/水平方向に2点(x1, y1)、(x2, y2) を打点します(エミッタとコレクタに対応)。そして、入力信号となるベース (x3, y3) を最後に打点します。
打点する3点の位置関係はサンプルの打点の並びを参照してください。1直線上に3点が並んでいたり、1点がありえない位置に打点されていると、正しい描画ができません。
★ その他、基本図形として、線 line1、ドット dot1、四角形 rectangle1、円 circle1 等も描画できます。
したがって、線や円を使って、電子部品ではない図形の描画も可能です。
★ 2本の配線の交点について、ドットを描画する場合は、dot1 でも指定できますし、line1 を line3, 4 などに変更しても作画できます。
★ 描画が可能な部品を、下記のパーツリスト(サンプル1、2)にまとめています。使いたい部品をコピーすれば部品を表示できますので、その後、座標を微調整して活用してください。
★ line1、line2 のように末尾に番号をつけているのは、部品の種別を定義するためです。今後の拡張性を担保するためでもあります。数値を変更することで、部品の種別(線種など)を変更できるよう意図しています。
その他
・ HTML で出力するようにしていますが、SVG 形式での出力も可能です。
SVG 形式で出力する場合は、Python のスクリプトの末尾のあたりでコメントアウトしている部分を外してください。拡張子を *.svg として出力できるようにしてあります。
・ また、Microsoft Edge などのブラウザの機能を使って PDF 形式で印刷を実行すると、HTML ファイルを PDF ファイル化できます。
ベクトルでの描画となる SVG 形式を使っていますので、データ量が小さく、拡大しても画像の崩れの少ないファイルを作成できます。
まとめ
回路図を生成する Python のプログラムについてまとめました。
これで、テキストのメモ書き感覚で簡単に回路図の作成もできるようになりました。
ベクター画像で出力していますので拡大しても崩れず、回路図などの図形描画であれば自由自在に扱えると思います。ちょっとプログラムが長くなりすぎました。。
なお、Python で HTML や SVG 図形(ベクター画像)を出力する方法については、下記の関連リンクにまとめています。もし関心があるようでしたら、参照してみてください。
関連リンク
・ Python で HTML ファイルを出力する
・ Python で自由曲線を描く 【HTML & SVG】
・ LED を ON/OFF する 【Raspberry Pi & Python】
↑ こちらのページに、今回のスクリプトで生成した LED の回路図を貼っています。
・ HTML で図形を出力する 【Python】
回路データのサンプル
サンプル1:パーツリスト1 (01_parts_list1.txt)
source1 , 100, 150, 200, 150, V1=5V
source2 , 300, 150, 400, 150, V2
source3 , 500, 100, 500, 200, 3.3V
source4 , 600, 100, 600, 200, +5V
source5 , 700, 100, 700, 200, -5V
ground1 , 800, 100, 800, 200, GND
ground2 , 900, 100, 900, 200, GND
ground3 ,1000, 100,1000, 200, GND
switch1 , 100, 350, 200, 350, SW1
bulb1 , 300, 350, 400, 350, bulb
motor1 , 500, 350, 600, 350, motor
voltmeter1 , 700, 350, 800, 350, voltmeter
amperometer1, 900, 350,1000, 350, amperometer
resistor1 , 100, 550, 200, 550, R1=10kΩ
resistor2 , 300, 550, 400, 550, R1
resistor3 , 500, 550, 600, 550, R1=300Ω
capacitor1 , 700, 550, 800, 550, C1=0.1μF
coil1 , 900, 550,1000, 550, L1=1μH
diode1 , 100, 750, 200, 750, D1
led1 , 300, 750, 400, 750, LED1
photo_diode1, 500, 750, 600, 750, PD1
transistor1 , 800, 700, 800, 800, 700, 750, Tr1
transistor2 , 900, 800, 900, 700,1000, 750, Tr1
サンプル2:パーツリスト2 (02_parts_list2.txt)
line1 , 100, 100, 200, 100
line2 , 100, 200, 200, 200
line3 , 300, 100, 400, 100
line4 , 300, 200, 400, 200
line5 , 500, 100, 500, 200
line6 , 600, 100, 600, 200
dot1 , 700, 100
text1 , 700, 200, TEXT
arrow1 , 800, 200, 800, 100, 5V
arrow2 , 900, 100, 900, 200, 5V
rectangle1 , 100, 300, 200, 400
rectangle2 , 300, 300, 400, 400
circle1 , 550, 350, 50
line1_rectangle, 700, 300, 700, 400, PIN18
label1 , 100, 500, 250, 500, GPIO 26
label1 , 100, 550, 250, 550, GND
label1 , 500, 500, 350, 500, GPIO 26
label1 , 500, 550, 350, 550, GND
darlington1 , 200, 600, 200, 800, 100, 700, Tr1
darlington2 , 400, 800, 400, 600, 500, 700, Tr1
stepper1 , 700, 600, 800, 700, stepping motor
サンプル3:電池と抵抗の回路 (03_fig1_resistor1.txt)
source1 , 100, 300, 100, 100, V1=5V
ground1 , 100, 300, 100, 350, GND
line1 , 100, 100, 400, 100
resistor1 , 400, 100, 400, 300, 10kΩ
line3 , 100, 300, 400, 300
text1 , 250, 420, Fig. 1
サンプル4:RLC回路1 (04_fig2_RLC1.txt)
line1 , 200, 400, 200, 100
line1 , 200, 100, 300, 100
resistor1 , 300, 100, 400, 100, R1
coil1 , 400, 100, 600, 100, L1
capacitor1 , 600, 100, 700, 100, C1
line1 , 700, 100, 800, 100
line1 , 800, 100, 800, 400
source2 , 200, 400, 800, 400, V1
text1 , 500, 550, Fig. 2
サンプル5:RLC回路2 (05_fig3_RLC2.txt)
line5 , 100, 100, 120, 100
line5 , 100, 300, 400, 300
coil1 , 120, 100, 400, 100, L
resistor1 , 400, 100, 400, 300, R
capacitor1 , 600, 100, 600, 300, C
arrow1 , 100, 270, 100, 130, E ω
line3 , 400, 100, 600, 100
line3 , 400, 300, 600, 300
text1 , 350, 400, Fig. 3
サンプル6:LEDの回路1 (06_fig4_led2.txt)
source1 , 200, 400, 200, 100, V1=5V
ground1 , 200, 400, 200, 450, GND
line1 , 200, 100, 700, 100
led1 , 700, 100, 700, 400, LED1
line3 , 200, 400, 700, 400
text1 , 450, 550, Fig. 4
サンプル7:LEDの回路2 (07_fig5_led2.txt)
label1 , 100, 100, 300, 100, (40) GPIO 21
line1 , 300, 100, 400, 100
resistor1 , 400, 100, 400, 300, 330Ω
led1 , 400, 300, 400, 350, LED4
ground1 , 400, 350, 400, 430, GND
text1 , 300, 550, Fig. 5
サンプルコード (circuit_diagram.py)
# circuit_diagram.py version 0.02
# https://irohaplat.com 23 Feb. 2022
import os
import glob
def read1( file1 ):
with open( file1, 'r', encoding='utf-8' ) as f1:
str1 = f1.read()
return str1
def get_a1( file1 ):
a1 = read1( file1 ).strip().split( "\n" )
for i1 in range( len( a1 ) ):
a1[i1] = a1[i1].split( "," )
return a1
def write1( file1, str1 ):
with open( file1, 'w', encoding='utf-8' ) as f1:
f1.write( str1 )
return 0
def generate_html1( str1 ):
str2 = '''
<html lang="ja">
<body>
{str3}
</body>
</html>
'''.format( str3=str1 )
return str2
def generate_svg1( str1 ):
str2 = '''
<svg version="1.1" id="page1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2048 1536" width="1536" height="1024" style="background:#ffffff" >
{str3}
</svg>
'''.format( str3=str1 )
return str2
def svg_defs1():
str1 = '''
<defs>
<marker id="arrow1" viewBox="0 0 10 10" refX="7" refY="3" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
<path d="M 0 0 L 10 3 L 0 6 z" fill="#000000"/>
</marker>
<marker id="arrow2" viewBox="0 0 10 10" refX="3" refY="3" markerUnits="strokeWidth" markerWidth="8" markerHeight="8" orient="auto">
<path d="M 0 3 L 10 0 L 10 6 z" fill="#000000"/>
</marker>
</defs>
'''
return str1
def xy1_pn( x1, y1, x2, y2 ):
if x1 < x2: px1 = 1 elif x1 > x2:
px1 = -1
else:
px1 = 0
if y1 < y2: py1 = 1 elif y1 > y2:
py1 = -1
else:
py1 = 0
return px1, py1
def xy2_pn( x1, y1, x2, y2 ):
if x1 <= x2:
px1 = 1
else:
px1 = -1
if y1 <= y2: py1 = 1 else: py1 = -1 return px1, py1 def xy1_average( x1, y1, x2, y2 ): x3 = float( ( x1 + x2 )/2 ) y3 = float( ( y1 + y2 )/2 ) return x3, y3 def xy1_middle( x1, y1, x2, y2 ): if x1 != x2: x3 = x2 y3 = y1 else: x3 = x1 y3 = y2 return x3, y3 def svg_text1( x1, y1, str1, centering1 = "center" ): str2 = str1.strip() if centering1 == "center": x2 = x1 -5 - 5*len( str2 ) elif centering1 == "left": x2 = x1 +30 elif centering1 == "right": x2 = x1 -40 -9*len( str2 ) else: x2 = x1 y2 = y1 + 8 str3 = ' <text x="' + str( x2 ) + '" y="' + str( y2 ) + '" font-family="meiryo" font-size="20" > ' + str2 + '</text> ' + "\n" return str3 def svg_line1( x1, y1, x2, y2, n1 = 2, str1 = "", fill1 = "#000000" ): str2 = "M " + str( x1 ) + " " + str( y1 ) + " " + str( x2 ) + " " + str( y2 ) str3 = ' <path d="' + str2 + '" stroke="' + fill1 + '" stroke-width="' + str(n1) + '" ' + str1 + ' /> " ' + "\n" return str3 def svg_arrw1( x1, y1, x2, y2 ): if x2 - x1 - 5 > 0:
px1 = 1
elif x1 - x2 - 5 > 0:
px1 = -1
else:
px1 = 0
if y2 - y1 - 5 > 0:
py1 = 1
elif y1 - y2 - 5 > 0:
py1 = -1
else:
py1 = 0
str1 = svg_line1( x1, y1, x2-5*px1, y2-5*py1, 2, 'marker-end="url(#arrow1)"' )
return str1
def svg_arrw2( x1, y1, x2, y2 ):
if x2 - x1 - 5 > 0:
px1 = 1
elif x1 - x2 - 5 > 0:
px1 = -1
else:
px1 = 0
if y2 - y1 - 5 > 0:
py1 = 1
elif y1 - y2 - 5 > 0:
py1 = -1
else:
py1 = 0
str1 = svg_line1( x1+5*px1, y1+5*py1, x2-5*px1, y2-5*py1, 2, 'marker-end="url(#arrow1)" marker-start="url(#arrow2)"' )
return str1
def svg_triangle1( x1, y1, x2, y2, x3, y3 ):
str1 = "M " + str( x1 ) + " " + str( y1 ) + " L "
str1 = str1 + str( x2 ) + " " + str( y2 ) + " "
str1 = str1 + str( x3 ) + " " + str( y3 ) + " Z "
str2 = ' <path d="' + str1 + '" stroke="#000000" fill="none" stroke-width="2" /> " ' + "\n"
return str2
def svg_rectangle1( x1, y1, x2, y2, fill1 = "none", str1 = "" ):
str2 = "M " + str( x1 ) + " " + str( y1 ) + " L "
str2 = str2 + str( x2 ) + " " + str( y1 ) + " "
str2 = str2 + str( x2 ) + " " + str( y2 ) + " "
str2 = str2 + str( x1 ) + " " + str( y2 ) + " Z "
str3 = ' <path d="' + str2 + '" stroke="#000000" fill="' + fill1 + '" stroke-width="2" ' + str1 + ' /> " ' + "\n"
return str3
def svg_label1( x1, y1, x2, y2, H1 ):
px1, py1 = xy2_pn( x1, y1, x2, y2 )
fill1 = "none"
str1 = "M " + str( x2 ) + " " + str( y2 ) + " L "
str1 = str1 + str( x2-H1*px1 ) + " " + str( y2+H1 ) + " "
str1 = str1 + str( x1 ) + " " + str( y2+H1 ) + " "
str1 = str1 + str( x1 ) + " " + str( y2-H1 ) + " "
str1 = str1 + str( x2-H1*px1 ) + " " + str( y2-H1 ) + " "
str1 = str1 + " Z "
str2 = ' <path d="' + str1 + '" stroke="#000000" fill="' + fill1 + '" stroke-width="2" /> " ' + "\n"
return str2
def svg_zigzag1( x1, y1, x2, y2, delX1, delY1 ):
str1 = "M " + str( x1 ) + " " + str( y1 ) + " L "
if x1 != x2:
str1 = str1 + str( x1 + 1*delX1 ) + " " + str( y1-delY1 ) + " "
str1 = str1 + str( x1 + 3*delX1 ) + " " + str( y1+delY1 ) + " "
str1 = str1 + str( x1 + 5*delX1 ) + " " + str( y1-delY1 ) + " "
str1 = str1 + str( x1 + 7*delX1 ) + " " + str( y1+delY1 ) + " "
str1 = str1 + str( x1 + 9*delX1 ) + " " + str( y1-delY1 ) + " "
str1 = str1 + str( x1 +11*delX1 ) + " " + str( y1+delY1 ) + " "
else:
str1 = str1 + str( x1-delX1 ) + " " + str( y1+ 1*delY1 ) + " "
str1 = str1 + str( x1+delX1 ) + " " + str( y1+ 3*delY1 ) + " "
str1 = str1 + str( x1-delX1 ) + " " + str( y1+ 5*delY1 ) + " "
str1 = str1 + str( x1+delX1 ) + " " + str( y1+ 7*delY1 ) + " "
str1 = str1 + str( x1-delX1 ) + " " + str( y1+ 9*delY1 ) + " "
str1 = str1 + str( x1+delX1 ) + " " + str( y1+11*delY1 ) + " "
str1 = str1 + str( x2 ) + " " + str( y2 ) + " "
str1 = ' <path d="' + str1 + '" stroke="#000000" fill="none" stroke-width="2" /> " ' + "\n"
return str1
def svg_hemicircle1( x1, y1, x2, y2, r1, r2, n1 = 1, fill1 = "none", stroke1 = 'stroke="#000000" stroke-width="2"' ):
str1 = str( x1 ) + " " + str( y1 )
str2 = " A " + str( r1 ) + " " + str( r2 ) + " 0 0 " + str( n1 ) + " "
str3 = str( x2 ) + " " + str( y2 )
str4 = ' <path d="M ' + str1 + str2 + str3 + '" fill="' + fill1 + '" ' + stroke1 + ' /> " ' + "\n"
return str4
def svg_hemicircles1( x1, y1, x2, y2, r1, r2, n1 = 1, fill1 = "none" ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
del_x1 = ( x2 - x1 )/4
del_y1 = ( y2 - y1 )/4
str1 = svg_hemicircle1( x3-2*del_x1, y3-2*del_y1, x3-1*del_x1, y3-1*del_y1, r1, r2, n1, fill1 )
str2 = svg_hemicircle1( x3-1*del_x1, y3-1*del_y1, x3 , y3 , r1, r2, n1, fill1 )
str3 = svg_hemicircle1( x3 , y3 , x3+1*del_x1, y3+1*del_y1, r1, r2, n1, fill1 )
str4 = svg_hemicircle1( x3+1*del_x1, y3+1*del_y1, x3+2*del_x1, y3+2*del_y1, r1, r2, n1, fill1 )
str5 = str1 + str2 + str3 + str4
return str5
def svg_circle1( x1, y1, r1, fill1 = "none" ):
rx1 = r1
ry1 = r1
if fill1 == "none" or fill1 == "#000000" :
str1 = svg_hemicircle1( x1, y1-ry1, x1, y1+ry1, rx1, ry1, 1, fill1 )
str2 = svg_hemicircle1( x1, y1+ry1, x1, y1-ry1, rx1, ry1, 1, fill1 )
else:
str1 = svg_hemicircle1( x1, y1-ry1, x1, y1+ry1, rx1, ry1, 1, fill1, "" )
str2 = svg_hemicircle1( x1, y1+ry1, x1, y1-ry1, rx1, ry1, 1, fill1, "" )
str3 = str1 + str2
return str3
def svg_rectangle1_round( x1, y1, x2, y2, r1, fill1 ):
str1 = ' <rect X="' + str( x1 ) + '" Y="' + str( y1 ) + '" rx="' + str( r1 ) + '" ry="' + str( r1 ) + '" width= "' + str( x2 - x1 ) + '" height="' + str( y2 - y1 ) + '" fill="' + fill1 + '" /> " ' + "\n"
return str1
def line1( x1, y1, x2, y2, fill1="#000000" ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
if fill1 == "#000000":
str1 = svg_line1( x1-1*px1, y1-1*py1, x2+1*px1, y2+1*py1 )
else:
str1 = svg_line1( x1-1*px1, y1-1*py1, x2+1*px1, y2+1*py1, 6, "", fill1 )
return str1
def line2( x1, y1, x2, y2 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
str1 = svg_line1( x1-1*px1, y1-1*py1, x2+1*px1, y2+1*py1, 2, 'stroke-dasharray="10,4"' )
return str1
def line3( x1, y1, x2, y2 ):
return line1_closed( x1, y1, x2, y2, 0 )
def line4( x1, y1, x2, y2 ):
return line1_closed( x1, y1, x2, y2, 1 )
def line5( x1, y1, x2, y2 ):
return line1_open( x1, y1, x2, y2, 0 )
def line6( x1, y1, x2, y2 ):
return line1_open( x1, y1, x2, y2, 1 )
def line1_open( x1, y1, x2, y2, n1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
n2 = float( n1 )
if n2 == 0:
str1 = svg_circle1( x1, y1, 5 )
if x1 == x2:
str2 = svg_line1( x1, y1+5*py1, x2, y2 )
elif y1 == y2:
str2 = svg_line1( x1+5*px1, y1, x2, y2 )
elif (y1 - y2)**2 > 2*(x1 - x2)**2:
str2 = svg_line1( x1+1*px1, y1+4*py1, x2, y2 )
elif (x1 - x2)**2 > 2*(y1 - y2)**2:
str2 = svg_line1( x1+4*px1, y1+1*py1, x2, y2 )
else:
str2 = svg_line1( x1+3*px1, y1+3*py1, x2, y2 )
str4 = str1 + str2 + "\n"
else:
str1 = svg_circle1( x1, y1, 5 )
str3 = svg_circle1( x2, y2, 5 )
if x1 == x2:
str2 = svg_line1( x1, y1+5*py1, x2, y2-5*py1 )
elif y1 == y2:
str2 = svg_line1( x1+5*px1, y1, x2-5*px1, y2 )
elif (y1 - y2)**2 > 2*(x1 - x2)**2:
str2 = svg_line1( x1+1*px1, y1+4*py1, x2-1*px1, y2-4*py1 )
elif (x1 - x2)**2 > 2*(y1 - y2)**2:
str2 = svg_line1( x1+4*px1, y1+1*py1, x2-4*px1, y2-1*py1 )
else:
str2 = svg_line1( x1+3*px1, y1+3*py1, x2-3*px1, y2-3*py1 )
str4 = str1 + str2 + str3 + "\n"
return str4
def line1_closed( x1, y1, x2, y2, n1 ):
n2 = float( n1 )
if n2 == 0:
str1 = svg_circle1( x1, y1, 5, "#000000" )
str2 = svg_line1( x1, y1, x2, y2 )
str4 = str1 + str2 + "\n"
else:
str1 = svg_circle1( x1, y1, 5, "#000000" )
str2 = svg_line1( x1, y1, x2, y2 )
str3 = svg_circle1( x2, y2, 5, "#000000" )
str4 = str1 + str2 + str3 + "\n"
return str4
def line1_rectangle( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
str2 = svg_rectangle1( x1-5, y1-5, x1+5, y1+5 )
if x1 != x2:
str3 = svg_line1( x1+5*px1, y1, x2, y2 )
str4 = svg_text1( x1, y1-25 , str1 )
else:
str3 = svg_line1( x1, y1+5*py1, x2, y2 )
str4 = svg_text1( x1, y1-25*py1 , str1 )
str5 = str2 + str3 + str4 + "\n"
return str5
def rectangle1( x1, y1, x2, y2 ):
str1 = svg_rectangle1( x1, y1, x2, y2 )
return str1
def rectangle2( x1, y1, x2, y2 ):
str1 = svg_rectangle1( x1, y1, x2, y2, "none", 'stroke-dasharray="10,4"' )
return str1
def rectangle1_round( x1, y1, x2, y2, r1, fill1 ):
str1 = svg_rectangle1_round( x1, y1, x2, y2, r1, fill1 )
return str1
def circle1( x1, y1, r1, fill1 = "none" ):
str1 = svg_circle1( x1, y1, r1, fill1 )
return str1
def dot1( x1, y1 ):
str1 = svg_circle1( x1, y1, 5, "#000000" )
return str1
def text1( x1, y1, str1 ):
str2 = svg_text1( x1, y1, str1 )
return str2
def label1( x1, y1, x2, y2, str1 ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
if y1 == y2:
H1 = 20
else:
H1 = abs( y2 - y1 )
str2 = svg_label1( x1, y1, x2, y2, H1 )
if x1 < x2:
str3 = svg_text1( x1, y2, str1, "left" )
else:
str3 = svg_text1( x1, y2, str1, "right" )
str4 = str2 + str3 + "\n"
return str4
def arrow1( x1, y1, x2, y2, str1 ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_arrw1( x1, y1, x2, y2 )
str3 = svg_text1( x3, y1-25 , str1 )
else:
str2 = svg_arrw1( x1, y1, x2, y2 )
str3 = svg_text1( x1+30, y3, str1 )
str4 = str2 + str3 + "\n"
return str4
def arrow2( x1, y1, x2, y2, str1 ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_arrw2( x1, y1, x2, y2 )
str3 = svg_text1( x3, y1-25 , str1 )
else:
str2 = svg_arrw2( x1, y1, x2, y2 )
str3 = svg_text1( x1+30, y3, str1 )
str4 = str2 + str3 + "\n"
return str4
def ground1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
str2 = svg_line1( x1-1*px1, y1, x2+1*px1, y1 )
str3 = svg_line1( x2 , y1, x2 , y2-15 )
str4 = svg_triangle1( x2-10, y2-15, x2+10, y2-15, x2, y2 )
str5 = svg_text1( x2, y2+35, str1 )
str6 = str2 + str3 + str4 + str5 + "\n"
return str6
def ground2( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
str2 = svg_line1( x1-1*px1, y1 , x2+1*px1, y1 )
str3 = svg_line1( x2 , y1 , x2 , y2-11 )
str4 = svg_line1( x2-15 , y2-11, x2+15 , y2-11 )
str5 = svg_line1( x2-10 , y2-5 , x2+10 , y2-5 )
str6 = svg_line1( x2-5 , y2 , x2+5 , y2 )
str7 = svg_text1( x2, y2+35, str1 )
str8 = str2 + str3 + str4 + str5 + str6 + str7 + "\n"
return str8
def ground3( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
str2 = svg_line1( x1-1*px1, y1 , x2+1*px1, y1 )
str3 = svg_line1( x2 , y1 , x2 , y2-12 )
str4 = svg_line1( x2-15 , y2-12, x2+15 , y2-12 )
str5 = svg_line1( x2 , y2-12, x2- 4 , y2+1 )
str6 = svg_line1( x2+ 7 , y2-12, x2+ 3 , y2+1 )
str7 = svg_line1( x2- 7 , y2-12, x2-11 , y2+1 )
str8 = svg_text1( x2, y2+35, str1 )
str9 = str2 + str3 + str4 + str5 + str6 + str7 + str8 + "\n"
return str9
def source1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1 , y1 , x3-8*px1, y1 )
str3 = svg_line1( x3-8*px1, y1-11, x3-8*px1, y1+11 )
str4 = svg_line1( x3+8*px1, y1-23, x3+8*px1, y1+23 )
str5 = svg_line1( x3+8*px1, y1 , x2+1*px1, y1 )
str6 = svg_line1( x2 , y1 , x2 , y2 )
str7 = svg_text1( x3, y1+50, str1 )
str8 = str2 + str3 + str4 + str5 + str6 + str7 + "\n"
else:
str2 = svg_line1( x1 , y1 , x1 , y3-8*py1 )
str3 = svg_line1( x1-11, y3-8*py1, x1+11, y3-8*py1 )
str4 = svg_line1( x1-23, y3+8*py1, x1+23, y3+8*py1 )
str5 = svg_line1( x1 , y3+8*py1, x1 , y2+1*py1 )
str6 = svg_line1( x1 , y2 , x2 , y2 )
str7 = svg_text1( x1+10, y3, str1, "left" )
str8 = str2 + str3 + str4 + str5 + str6 + str7 + "\n"
return str8
def source2( x1, y1, x2, y2, str1 ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2 and y1 != y2:
y3 = y1
str2 = circle_lines1( x1, y1, x2, y2, "", str1 )
r1 = 7
str3 = svg_hemicircle1( x3-2*r1+1, y3, x3 , y3, r1, r1, 1, "none" )
str4 = svg_hemicircle1( x3 , y3, x3+2*r1-1, y3, r1, r1, 0, "none" )
str5 = str2 + str3 + str4 + "\n"
return str5
def circle_line1( x1, y1, x2, y2, str1 ):
px1, py1 = xy2_pn( x1, y1, x2, y2 )
str2 = svg_circle1( x1 , y1 , 10, "none" )
str3 = ""
str4 = ""
if y1 != y2:
str3 = svg_line1( x1, y1+10*py1, x1, y2+1*py1 )
str4 = svg_line1( x1, y2, x2, y2 )
elif x1 != x2:
str3 = svg_line1( x1+10*px1, y2, x2, y2 )
str5 = svg_text1( x1 , y1-32*py1, str1 )
str6 = str2 + str3 + str4 + str5 + "\n"
return str6
def source3( x1, y1, x2, y2, str1 ):
str2 = circle_line1( x1, y1, x2, y2, str1 )
str3 = svg_line1( x1-30 , y1 , x1+30 , y1 )
str4 = svg_line1( x1 , y1 , x1 , y1+10 )
str5 = str2 + str3 + str4 + "\n"
return str5
def source4( x1, y1, x2, y2, str1 ):
str2 = circle_line1( x1, y1, x2, y2, str1 )
str3 = svg_line1( x1-5 , y1 , x1+5 , y1 )
str4 = svg_line1( x1 , y1-5 , x1 , y1+5 )
str5 = str2 + str3 + str4 + "\n"
return str5
def source5( x1, y1, x2, y2, str1 ):
str2 = circle_line1( x1, y1, x2, y2, str1 )
str3 = svg_line1( x1-5, y1, x1+5, y1 )
str4 = str2 + str3 + "\n"
return str4
def switch1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1 , y1 , x3-31*px1 , y1 )
str3 = line1_open( x3-26*px1 , y1 , x3+20*px1 , y1-24*px1, 0 )
str4 = svg_line1( x3+26*px1 , y1 , x2 , y2 )
str5 = svg_text1( x3, y3+45-10*px1, str1 )
str6 = str2 + str3 + str4 + str5 + "\n"
else:
str2 = svg_line1( x1 , y1 , x1 , y3-31*py1 )
str3 = line1_open( x1 , y3-26*py1 , x1-24*py1 , y3+20*py1, 0 )
str4 = svg_line1( x1 , y3+26*py1 , x2 , y2 )
str5 = svg_text1( x3+45-13*py1, y3, str1 )
str6 = str2 + str3 + str4 + str5 + "\n"
return str6
def capacitor1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1-1*px1, y1 , x3-6*px1, y1 )
str3 = svg_line1( x3-6*px1, y1-15, x3-6*px1, y1+15 )
str4 = svg_line1( x3+6*px1, y1-15, x3+6*px1, y1+15 )
str5 = svg_line1( x3+6*px1, y1 , x2+1*px1, y1 )
str6 = svg_line1( x2 , y1 , x2 , y2 )
str7 = svg_text1( x3, y1+45, str1 )
str8 = str2 + str3 + str4 + str5 + str6 + str7 + "\n"
else:
str2 = svg_line1( x1 , y1-1*py1, x1 , y3-6*py1 )
str3 = svg_line1( x1-15, y3-6*py1, x1+15, y3-6*py1 )
str4 = svg_line1( x1-15, y3+6*py1, x1+15, y3+6*py1 )
str5 = svg_line1( x1 , y3+6*py1, x1 , y2+1*py1 )
str6 = svg_line1( x1 , y2 , x2 , y2 )
str7 = svg_text1( x1+5 , y3, str1, "left" )
str8 = str2 + str3 + str4 + str5 + str6 + str7 + "\n"
return str8
def resistor1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1 -1*px1, y1 , x3-30*px1, y1 )
str3 = svg_rectangle1( x3-30*px1, y1-13, x3+30*px1, y1+13 )
str4 = svg_line1( x3+30*px1, y1 , x2+ 1*px1, y1 )
str5 = svg_line1( x2 , y1 , x2 , y2 )
str6 = svg_text1( x3, y1+45, str1 )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
else:
str2 = svg_line1( x1 , y1 -1*py1, x1 , y3-30*py1 )
str3 = svg_rectangle1( x1-13, y3-30*py1, x1+13, y3+30*py1 )
str4 = svg_line1( x1 , y3+30*py1, x1 , y2+ 1*py1 )
str5 = svg_line1( x1 , y2 , x2 , y2 )
str6 = svg_text1( x1+ 5, y3, str1, "left" )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def resistor2( x1, y1, x2, y2, str1 ):
x3, y3 = xy1_average( x1, y1, x2, y2 )
str1 = resistor1( x1, y1, x2, y2, str1 )
if x1 != x2:
str2 = svg_arrw1( x3-25, y1+25, x3+35, y1-35 )
else:
str2 = svg_arrw1( x1-25, y3+25, x1+35, y3-35 )
str3 = str1 + str2 + "\n"
return str3
def resistor3( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1- 1*px1, y1, x3-23*px1, y1 )
str3 = svg_zigzag1( x3-24*px1, y1, x3+24*px1, y1, 4*px1, 8 )
str4 = svg_line1( x3+23*px1, y1, x2+ 1*px1, y1 )
str5 = svg_line1( x2 , y1, x2 , y2 )
str6 = svg_text1( x3, y1+45, str1 )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
else:
str2 = svg_line1( x1, y1- 1*py1, x1, y3-23*py1 )
str3 = svg_zigzag1( x1, y3-24*py1, x1, y3+24*py1, 8, 4*py1 )
str4 = svg_line1( x1, y3+23*py1, x1, y2+ 1*py1 )
str5 = svg_line1( x1, y2 , x2, y2 )
str6 = svg_text1( x1+5, y3, str1, "left" )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def coil1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1- 1*px1, y1, x3-39*px1, y1 )
str3 = svg_hemicircles1( x3-40*px1, y1, x3+40*px1, y1, 10, 13 )
str4 = svg_line1( x3+39*px1, y1, x2+ 1*px1, y1 )
str5 = svg_line1( x2 , y1, x2 , y2 )
str6 = svg_text1( x3, y1+45*px1, str1 )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
else:
str2 = svg_line1( x1, y1- 1*py1, x1, y3-39*py1 )
str3 = svg_hemicircles1( x1, y3-40*py1, x1, y3+40*py1, 13, 10 )
str4 = svg_line1( x1, y3+39*py1, x1, y2 +1*py1 )
str5 = svg_line1( x1, y2 , x2, y2 )
str6 = svg_text1( x1+8*py1, y3, str1, "left" )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def coil2( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
str1 = coil1( x1, y1, x2, y2, str1 )
if x1 != x2:
str2 = svg_circle1( x3+43*px1, y1-18*px1, 3, "#000000" )
else:
str2 = svg_circle1( x1+18*py1, y3+43*py1, 3, "#000000" )
str3 = str1 + str2 + "\n"
return str3
def coil3( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
str1 = coil1( x1, y1, x2, y2, str1 )
if x1 != x2:
str2 = svg_circle1( x3-43*px1, y1-18*px1, 3, "#000000" )
else:
str2 = svg_circle1( x1+18*py1, y3-43*py1, 3, "#000000" )
str3 = str1 + str2 + "\n"
return str3
def coil4( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1- 1*px1, y1, x3-49*px1, y1 )
str3 = svg_hemicircles1( x3-50*px1, y1, x3+50*px1, y1, 10, 13 )
str4 = svg_line1( x3+49*px1, y1, x2+ 1*px1, y1 )
str5 = svg_line1( x2 , y1, x2 , y2 )
str6 = svg_text1( x3, y1+45*px1, str1 )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
else:
str2 = svg_line1( x1, y1- 1*py1, x1, y3-49*py1 )
str3 = svg_hemicircles1( x1, y3-50*py1, x1, y3+50*py1, 13, 10 )
str4 = svg_line1( x1, y3+49*py1, x1, y2 +1*py1 )
str5 = svg_line1( x1, y2 , x2, y2 )
str6 = svg_text1( x1+8*py1, y3, str1, "left" )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def stepper1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
str2 = svg_circle1( x2, y1, 35 )
str3 = svg_text1( x2, y1, "M" )
str4 = svg_hemicircles1( x2-70 , y1-50*py1, x2-70 , y1 , 7, 5 )
str5 = svg_hemicircles1( x2-70 , y1 , x2-70 , y1+50*py1, 7, 5 )
str6 = svg_hemicircles1( x2-50*px1, y1+70 , x2 , y1+70 , 5, 7 )
str7 = svg_hemicircles1( x2 , y1+70 , x2+50*px1, y1+70 , 5, 7 )
str8 = svg_line1( x1 , y1 , x2-70, y1 )
str9 = svg_line1( x1 , y1-50, x2-70, y1-50 )
str10= svg_line1( x1 , y1+50, x2-70, y1+50 )
str11= svg_line1( x2 , y2 , x2 , y1+70 )
str12= svg_line1( x2-50, y2 , x2-50, y1+70 )
str13= svg_line1( x2+50, y2 , x2+50, y1+70 )
str14= str2 + str3 + str4 + str5 + str6 + str7 +str8 + str9 + str10 + str11 + str12 + str13 + "\n"
return str14
def diode1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
if x1 != x2:
str2 = svg_line1( x1 -1*px1 , y1 , x2 +1*px1, y1 )
str3 = svg_triangle1( x3-10*px1, y1-12, x3-10*px1, y1+12, x3+10*px1, y1 )
str4 = svg_line1( x3+10*px1, y1-13 , x3+10*px1, y1+13 )
str5 = svg_line1( x2 , y1 , x2 , y2 )
str6 = svg_text1( x3, y1+50, str1 )
str7= str2 + str3 + str4 + str5 + str6 + "\n"
else:
str2 = svg_line1( x1 , y1- 1*py1, x1 , y2+ 1*py1 )
str3 = svg_triangle1( x1-12, y3-10*py1, x1+12, y3-10*py1, x1, y3+10*py1 )
str4 = svg_line1( x1-13, y3+10*py1, x1+13, y3+10*py1 )
str5 = svg_line1( x1 , y2 , x2 , y2 )
str6 = svg_text1( x1+50, y3, str1 )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def led1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
str2 = diode1( x1, y1, x2, y2, str1 )
if x1 != x2:
str3 = svg_arrw1( x3-8, y1-20, x3-8+20*px1, y1-40 )
str4 = svg_arrw1( x3+8, y1-20, x3+8+20*px1, y1-40 )
str5 = str3 + str4 + str2
else:
str3 = svg_arrw1( x1-20, y3-8, x1-40, y3-8+20*py1 )
str4 = svg_arrw1( x1-20, y3+8, x1-40, y3+8+20*py1 )
str5 = str3 + str4 + str2
return str5
def photo_diode1( x1, y1, x2, y2, str1 ):
px1, py1 = xy1_pn( x1, y1, x2, y2 )
x3, y3 = xy1_average( x1, y1, x2, y2 )
str2 = diode1( x1, y1, x2, y2, str1 )
if x1 != x2:
str3 = svg_arrw1( x3-8+20*px1, y1-40, x3-8, y1-20 )
str4 = svg_arrw1( x3+8+20*px1, y1-40, x3+8, y1-20 )
str5 = str3 + str4 + str2
else:
str3 = svg_arrw1( x1-40, y3-8+20*py1, x1-20, y3-8 )
str4 = svg_arrw1( x1-40, y3+8+20*py1, x1-20, y3+8 )
str5 = str3 + str4 + str2
return str5
def transistor1( x1, y1, x2, y2, x3, y3, str1 ):
px1, py1 = xy1_pn( x1, y1, x3, y3 )
if x1 != x2:
str2 = svg_line1( x1- 1*px1 , y1 , x3-24*px1, y1 )
str3 = svg_line1( x3-25*px1 , y1 , x3- 7*px1, y1+18*py1 )
str4 = svg_arrw1( x3+ 7*px1 , y1+18*py1 , x3+26*px1, y2- 1*py1 )
str5 = svg_line1( x3-17*px1 , y1+18*py1 , x3+17*px1, y1+18*py1, 3, "" )
str6 = svg_line1( x3+24*px1 , y2 , x2+ 1*px1, y2 )
str7 = svg_line1( x3 , y1+18*py1 , x3 , y3 )
str8 = svg_text1( x3+10 , y1+45*py1, str1, "left" )
str9 = str2 + str3 + str4 + str5 + str6 + str7 + str8 + "\n"
else:
str2 = svg_line1( x1 , y1- 1*py1 , x1 , y3-24*py1 )
str3 = svg_line1( x1 , y3-25*py1 , x1+18*px1, y3- 7*py1 )
str4 = svg_arrw1( x1+18*px1 , y3+ 7*py1 , x2- 1*px1, y3+26*py1 )
str5 = svg_line1( x1+18*px1 , y3-17*py1 , x1+18*px1, y3+17*py1, 3, "" )
str6 = svg_line1( x2 , y3+24*py1 , x2 , y2+ 1*py1 )
str7 = svg_line1( x1+18*px1 , y3 , x3 , y3 )
str8 = svg_text1( x1+ 5+ 10*px1 , y3+30 , str1, "left" )
str9 = str2 + str3 + str4 + str5 + str6 + str7 + str8 + "\n"
return str9
def transistor2( x1, y1, x2, y2, x3, y3, str1 ):
px1, py1 = xy1_pn( x1, y1, x3, y3 )
if x1 != x2:
str2 = svg_line1( x1- 1*px1 , y1 , x3-24*px1, y1 )
str3 = svg_arrw1( x3-25*px1 , y1 , x3- 7*px1, y1+18*py1 )
str4 = svg_line1( x3+ 7*px1 , y1+18*py1 , x3+25*px1, y1 )
str5 = svg_line1( x3-17*px1 , y1+18*py1 , x3+17*px1, y1+18*py1, 3, "" )
str6 = svg_line1( x3+24*px1 , y2 , x2+ 1*px1, y2 )
str7 = svg_line1( x3 , y1+18*py1 , x3 , y3 )
str8 = svg_text1( x3+10 , y1+45*py1, str1, "left" )
str9 = str2 + str3 + str4 + str5 + str6 + str7 + str8 + "\n"
else:
str2 = svg_line1( x1 , y1- 1*py1 , x1 , y3-24*py1 )
str3 = svg_arrw1( x1 , y3-25*py1 , x2+18*px1, y3- 7*py1 )
str4 = svg_line1( x1+18*px1 , y3+ 7*py1 , x2 , y3+25*py1 )
str5 = svg_line1( x1+18*px1 , y3-17*py1 , x1+18*px1, y3+17*py1, 3, "" )
str6 = svg_line1( x2 , y3+24*py1 , x2 , y2+ 1*py1 )
str7 = svg_line1( x1+18*px1 , y3 , x3 , y3 )
str8 = svg_text1( x1+ 5+ 10*px1 , y3+30 , str1, "left" )
str9 = str2 + str3 + str4 + str5 + str6 + str7 + str8 + "\n"
return str9
def darlington1( x1, y1, x2, y2, x3, y3, str1 ):
px1, py1 = xy1_pn( x1, y1, x3, y3 )
if x1 != x2:
x4 = x3 - 25*px1
y4 = y1 + 30*py1
x5 = x3 + 25*px1
y5 = y4
str2 = transistor1( x4, y4, x5, y5, x3, y3, "" )
str3 = transistor1( x1, y1, x2, y2, x5, y5, "" )
str4 = line3( x4, y1, x4, y4 )
str5 = rectangle2( x3-60*px1, y1-25*py1, x3+75*px1, y1+70*py1 )
if px1 < 0:
str6 = svg_text1( x3, y1+90*py1, str1, "right" )
else:
str6 = svg_text1( x3, y1+90*py1, str1, "left" )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
else:
x4 = x1 + 30*px1
y4 = y3 - 25*py1
x5 = x4
y5 = y3 + 25*py1
str2 = transistor1( x4, y4, x5, y5, x3, y3, "" )
str3 = transistor1( x1, y1, x2, y2, x5, y5, "" )
str4 = line3( x1, y4, x4, y4 )
str5 = rectangle2( x1-25*px1, y3-65*py1, x1+70*px1, y3+70*py1 )
if px1 < 0:
str6 = svg_text1( x1+50*px1, y3+55*py1, str1, "right" )
else:
str6 = svg_text1( x1+50*px1, y3+55*py1, str1, "left" )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
return str7
def darlington2( x1, y1, x2, y2, x3, y3, str1 ):
px1, py1 = xy1_pn( x1, y1, x3, y3 )
if x1 != x2:
x4 = x3 - 25*px1
y4 = y1 + 30*py1
x5 = x3 + 25*px1
y5 = y4
str2 = transistor2( x4, y4, x5, y5, x3, y3, "" )
str3 = transistor2( x1, y1, x2, y2, x4, y4, "" )
str4 = line3( x5, y1, x5, y5 )
str5 = rectangle2( x3-60*px1, y1-25*py1, x3+75*px1, y1+70*py1 )
if px1 < 0:
str6 = svg_text1( x3, y1+90*py1, str1, "right" )
else:
str6 = svg_text1( x3, y1+90*py1, str1, "left" )
str7 = str2 + str3 + str4 + str5 + str6 + "\n"
else:
x4 = x1 + 30*px1
y4 = y3 - 25*py1
x5 = x4
y5 = y3 + 25*py1
str2 = transistor2( x4, y4, x5, y5, x3, y3, "" )
str3 = transistor2( x1, y1, x2, y2, x4, y4, "" )
str4 = line3( x1, y5, x5, y5 )
str5 = rectangle2( x1-25*px1, y3-65*py1, x1+70*px1, y3+70*py1 )
if px1 < 0: str6 = svg_text1( x1+50*px1, y3-55*py1, str1, "right" ) else: str6 = svg_text1( x1+50*px1, y3-55*py1, str1, "left" ) str7 = str2 + str3 + str4 + str5 + str6 + "\n" return str7 def circle_lines1( x1, y1, x2, y2, str1, str2 ): px1, py1 = xy1_pn( x1, y1, x2, y2 ) x3, y3 = xy1_average( x1, y1, x2, y2 ) if x1 != x2: str3 = svg_line1( x1-1*px1 , y1 , x3-20*px1, y1 ) str4 = svg_circle1( x3 , y1 , 20 , "none" ) str5 = svg_line1( x3+20*px1, y1 , x2+1*px1 , y1 ) str6 = svg_line1( x2 , y1 , x2 , y2 ) str7 = svg_text1( x3+2 , y1 , str1.strip() ) str8 = svg_text1( x3 , y1+45 , str2 ) str9 = str3 + str4 + str5 + str6 + str7 + str8 + "\n" else: str3 = svg_line1( x1 , y1- 1*py1, x1 , y3-20*py1 ) str4 = svg_circle1( x1 , y3 , 20 , "none" ) str5 = svg_line1( x1 , y3+20*py1, x1 , y2+1*py1 ) str6 = svg_line1( x1 , y2 , x2 , y2 ) str7 = svg_text1( x1+2 , y3 , str1.strip() ) str8 = svg_text1( x1+10 , y3 , str2, "left" ) str9 = str3 + str4 + str5 + str6 + str7 + str8 + "\n" return str9 def bulb1( x1, y1, x2, y2, str1 ): x3, y3 = xy1_average( x1, y1, x2, y2 ) str2 = circle_lines1( x1, y1, x2, y2, "", str1 ) str3 = svg_line1( x3-14, y3-14, x3+14, y3+14 ) str4 = svg_line1( x3+14, y3-14, x3-14, y3+14 ) str5 = str2 + str3 + str4 + "\n" return str5 def motor1( x1, y1, x2, y2, str1 ): str1 = circle_lines1( x1, y1, x2, y2, "M", str1 ) return str1 def voltmeter1( x1, y1, x2, y2, str1 ): str1 = circle_lines1( x1, y1, x2, y2, "V", str1 ) return str1 def amperometer1( x1, y1, x2, y2, str1 ): str1 = circle_lines1( x1, y1, x2, y2, "A", str1 ) return str1 def generate_elements1( a1 ): str1 = a1[0].strip() str2 = "" if str1 == "line1": if len( a1 ) > 5:
str2 = line1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
else:
str2 = line1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line2":
str2 = line2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line3":
str2 = line3( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line4":
str2 = line4( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line5":
str2 = line5( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line6":
str2 = line6( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "line1_rectangle":
str2 = line1_rectangle( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "arrow1":
str2 = arrow1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "arrow2":
str2 = arrow2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "rectangle1":
str2 = rectangle1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "rectangle2":
str2 = rectangle2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ) )
elif str1 == "text1":
str2 = text1( float( a1[1] ), float( a1[2] ), a1[3] )
elif str1 == "label1":
str2 = label1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "dot1":
str2 = dot1( float( a1[1] ), float( a1[2] ) )
elif str1 == "ground1":
str2 = ground1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "ground2":
str2 = ground2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "ground3":
str2 = ground3( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "source1":
str2 = source1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "source2":
str2 = source2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "source3":
str2 = source3( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "source4":
str2 = source4( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "source5":
str2 = source5( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "switch1":
str2 = switch1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "resistor1":
str2 = resistor1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "resistor2":
str2 = resistor2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "resistor3":
str2 = resistor3( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "capacitor1":
str2 = capacitor1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "coil1":
str2 = coil1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "coil2":
str2 = coil2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "coil3":
str2 = coil3( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "coil4":
str2 = coil4( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "diode1":
str2 = diode1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "led1":
str2 = led1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "photo_diode1":
str2 = photo_diode1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "transistor1":
str2 = transistor1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), float( a1[5] ), float( a1[6] ), a1[7] )
elif str1 == "transistor2":
str2 = transistor2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), float( a1[5] ), float( a1[6] ), a1[7] )
elif str1 == "darlington1":
str2 = darlington1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), float( a1[5] ), float( a1[6] ), a1[7] )
elif str1 == "darlington2":
str2 = darlington2( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), float( a1[5] ), float( a1[6] ), a1[7] )
elif str1 == "bulb1":
str2 = bulb1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "voltmeter1":
str2 = voltmeter1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "amperometer1":
str2 = amperometer1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "motor1":
str2 = motor1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "stepper1":
str2 = stepper1( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), a1[5] )
elif str1 == "rectangle1_round":
str2 = rectangle1_round( float( a1[1] ), float( a1[2] ), float( a1[3] ), float( a1[4] ), float( a1[5] ), a1[6] )
elif str1 == "circle1":
if len( a1 ) > 4:
str2 = circle1( float( a1[1] ), float( a1[2] ), float( a1[3] ), a1[4] )
else:
str2 = circle1( float( a1[1] ), float( a1[2] ), float( a1[3] ) )
elif str1 != "":
print( a1 )
return str2
path1 = os.path.dirname(__file__) + "/"
a1 = glob.glob( path1 + "circuit1/*.txt" )
for i1 in range( len( a1 ) ):
str1 = svg_defs1()
file1 = a1[i1]
a2 = get_a1( file1 )
for i2 in range( len( a2 ) ):
str1 = str1 + generate_elements1( a2[i2] )
str2 = generate_svg1( str1 )
# file2 = file1.replace( ".txt", ".svg" )
# write1( file2, str2 )
str3 = generate_html1( str2 )
file2 = file1.replace( ".txt", ".html" )
write1( file2, str3 )