Python で回路図を描画する 【HTML & SVG】

Python

特殊なライブラリなどを使わず、電気回路の回路図を描画する 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 ) 




 

タイトルとURLをコピーしました