両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン |
javascript:circuitjs [2023/10/30 06:06] – ともやん | javascript:circuitjs [2024/08/05 16:19] (現在) – [付録] ともやん |
---|
本家: [[https://github.com/pfalstad/circuitjs1|]] [[gtr>https://github.com/pfalstad/circuitjs1|翻訳]] Paul's git\\ | 本家: [[https://github.com/pfalstad/circuitjs1|]] [[gtr>https://github.com/pfalstad/circuitjs1|翻訳]] Paul's git\\ |
forked: [[https://github.com/sharpie7/circuitjs1|]] [[gtr>https://github.com/sharpie7/circuitjs1|翻訳]] Iain's git\\ | forked: [[https://github.com/sharpie7/circuitjs1|]] [[gtr>https://github.com/sharpie7/circuitjs1|翻訳]] Iain's git\\ |
[[https://www.falstad.com/circuit/|]] [[gtr>https://www.falstad.com/circuit/|翻訳]] Paul's Page: Version 2.8.0js\\ | [[https://www.falstad.com/circuit/|]] [[gtr>https://www.falstad.com/circuit/|翻訳]] Paul's Page: Version 2.9.0js([[https://git>pfalstad/circuitjs1/pull/71|日本語化 PR #71]])\\ |
[[https://lushprojects.com/circuitjs/|]] [[gtr>https://lushprojects.com/circuitjs/|翻訳]] Iain's Page: Version 2.4.2js\\ | [[https://lushprojects.com/circuitjs/|]] [[gtr>https://lushprojects.com/circuitjs/|翻訳]] Iain's Page: Version 2.4.2js\\ |
| ソースコード: [[git>pfalstad/circuitjs1|GitHub - pfalstad/circuitjs1: Electronic Circuit Simulator in the Browser]] [[gtr>https://github.com/pfalstad/circuitjs1|翻訳]]\\ |
| |
CircuitJS1はブラウザ上で動作する電子回路シミュレータです。これは元々 Paul Falstad によって Java アプレットとして作成されました。\\ | CircuitJS1はブラウザ上で動作する電子回路シミュレータです。これは元々 Paul Falstad によって Java アプレットとして作成されました。\\ |
これは、GWT を使用してブラウザで実行できるように Iain Sharp によって調整されました。\\ | これは、GWT を使用してブラウザで実行できるように Iain Sharp によって調整されました。\\ |
[[https://github.com/pfalstad/circuitjs1|pfalstad/circuitjs1: Electronic Circuit Simulator in the Browser]] より\\ | [[https://github.com/pfalstad/circuitjs1|pfalstad/circuitjs1: Electronic Circuit Simulator in the Browser]] より\\ |
| |
| 類似サービス: [[https://everycircuit.com/|EveryCircuit: Animated interactive circuit simulator]]\\ |
| |
===== 使い方 ===== | ===== 使い方 ===== |
フルスクリーン: [[https://www.falstad.com/circuit/circuitjs.html?startCircuit=joule-thief.txt|]]\\ | フルスクリーン: [[https://www.falstad.com/circuit/circuitjs.html?startCircuit=joule-thief.txt|]]\\ |
<html> | <WRAP circuitjs><html> |
<style> | <iframe src="https://www.falstad.com/circuit/circuitjs.html?hideMenu=true&running=false&startCircuit=joule-thief.txt" loading="lazy"></iframe> |
.circuitjs { | </html></WRAP> |
margin: 0 0 -16px; | |
position: relative; | |
z-index: 0; | |
} | |
.circuitjs iframe { | |
border: none; | |
width: 610px; | |
height: 300px; | |
} | |
.wrap_circuit_description { | |
position: relative; | |
z-index: 1; | |
} | |
/*.dokuwiki div.wrap_color_mincode_long { | |
height: 100px; | |
overflow: scroll; | |
} | |
.dokuwiki div.wrap_color_mincode_long pre { | |
height: unset; | |
overflow-y: unset; | |
}*/ | |
</style> | |
<div class="circuitjs"> | |
<iframe src="https://www.falstad.com/circuit/circuitjs.html?hideMenu=true&running=false&startCircuit=joule-thief.txt" loading="lazy"></iframe> | |
</div> | |
<script> | |
/*const iframe = document.getElementsByClassName("circuitjs")[0].getElementsByTagName("iframe")[0]; | |
iframe.contentWindow.document.getElementsByClassName("topButton").click();*/ | |
</script> | |
</html> | |
| |
===== 回路一覧 ===== | ===== 回路一覧 ===== |
| [[.circuitjs:circuits|Circuits]]\\ |
[[https://github.com/pfalstad/circuitjs1/blob/c192b71e325624e56d7ed9db71456b48d2e48871/src/com/lushprojects/circuitjs1/public/setuplist.txt|]]\\ | [[https://github.com/pfalstad/circuitjs1/blob/c192b71e325624e56d7ed9db71456b48d2e48871/src/com/lushprojects/circuitjs1/public/setuplist.txt|]]\\ |
src/com/lushprojects/circuitjs1/public/setuplist.txt\\ | src/com/lushprojects/circuitjs1/public/setuplist.txt\\ |
</pre></html></WRAP> | </pre></html></WRAP> |
</WRAP> | </WRAP> |
| |
| ===== URL パラメータ ===== |
| |
| ==== ctz ==== |
| [[git>pfalstad/circuitjs1/blob/d07cf50b5f4eaeb93948030629b870fa84f1f54c/src/com/lushprojects/circuitjs1/client/CirSim.java#L359|]]\\ |
| <html> |
| <script src="https://cdn.jsdelivr.net/npm/lz-string/libs/lz-string.min.js"></script> |
| <script> |
| window.addEventListener("load", (event) => { |
| let preComp = document.getElementById("compressed"); |
| let preDecomp = document.getElementById("decompressed"); |
| |
| let strDecompressed = LZString.decompressFromEncodedURIComponent(preComp.innerText); |
| preDecomp.innerText = strDecompressed; |
| |
| let ifrCircuitjs = document.getElementById("ifr_circuitjs"); |
| ifrCircuitjs.src = "https://www.falstad.com/circuit/circuitjs.html?hideMenu=true&running=false&ctz=" + preComp.innerText; |
| }); |
| </script> |
| </html> |
| |
| <WRAP color_term> |
| <WRAP color_mincode><code javascript> |
| <script src="https://cdn.jsdelivr.net/npm/lz-string/libs/lz-string.min.js"></script> |
| <script> |
| window.addEventListener("load", (event) => { |
| let preComp = document.getElementById("compressed"); |
| let preDecomp = document.getElementById("decompressed"); |
| |
| let strDecompressed = LZString.decompressFromEncodedURIComponent(preComp.innerText); |
| preDecomp.innerText = strDecompressed; |
| |
| let ifrCircuitjs = document.getElementById("ifr_circuitjs"); |
| ifrCircuitjs.src = "https://www.falstad.com/circuit/circuitjs.html?hideMenu=true&running=false&ctz=" + preComp.innerText; |
| }); |
| </script> |
| </code></WRAP> |
| </WRAP> |
| |
| <WRAP color_term> |
| <WRAP color_mincode><html><pre id="compressed"> |
| CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxEIiQUhAQFMBaMMAKABcQAWQrkbNHTAp+g2hBgI8eDJC5h8aPJBRSo0QppIJhCSlywJsINLQAm9AGYBDAK4AbdqzAY+A2phHZCefj-DI8OqIIABK9ADOAJYR7NYAdgDG9KzYstxghKK0PG6CElCsAO7ZJhgi8lmeJqwATqVcvu7gXHw5spDFpdXNYK2FJc2NQhW+nfU6oyMtbSZozoQikzPTKFweIBY2DuyM9vRmUEcSsGxptMtrF8L8cgG0nSXL2N7TlQPTuHyE+LdtrAAHCi-L7A3zvYwPQEZLJDTIw-hHR6lbxNQTvZFwrLvDFdHHw5a4p43d4-cHw5FKbhonJjLpYky-XEAN0Z5Kqv2EYyO6zoSPUCHp-gZzUpTN8VK5NSBZJWstBkI+yz6305-WRhN8suGnRl4rBK0VnQAHnQiPwjHQXhbsS0QABRVimhBrEzEYxGEQoYi2vogADCTu4GCQuGxeDckGI3DtACFWAB7I4CCjcKPRmCLJAwOBZ46sIA |
| </pre></html></WRAP> |
| <WRAP color_mincode_hlong><html><pre id="decompressed"> |
| </pre></html></WRAP> |
| </WRAP> |
| |
| <WRAP circuitjs><html> |
| <iframe id="ifr_circuitjs" src="https://www.falstad.com/circuit/circuitjs.html?hideMenu=true&running=false" loading="lazy"></iframe> |
| </html></WRAP> |
| |
| === JSFiddle === |
| <WRAP jsfiddle><html> |
| <iframe width="100%" height="665" src="//jsfiddle.net/tomoyan596/u5efyg28/embedded/result,js,html,css/dark/" allowfullscreen="allowfullscreen" allowpaymentrequest frameborder="0"></iframe> |
| </html></WRAP> |
| |
| ===== JS インタフェース ===== |
| ソースコード: [[git>pfalstad/circuitjs1/blob/master/war/jsinterface.html|]]\\ |
| <WRAP circuitjs><html> |
| <iframe id="circuitFrame" width=800 height=550 src="/circuit/circuitjs.html?hideMenu=true&running=false&startCircuit=jsinterface.txt"></iframe> |
| <p>JavaScript インターフェースの例</p> |
| <p> |
| iframe で実行されているシミュレーターと連携する JavaScript コードを作成できます。 |
| シミュレータ コードは同じ Web サイト上でホストされています (同じ起源を持っています)。 あなたのコードは回路のリストを取得できます |
| 要素を取得し、各要素に関する情報 (各ノードの電圧や 2 端子要素の電流など) を取得します。 |
| 外部電圧ノードの電圧を設定します。 |
| </p> |
| <p> |
| <button onclick="sim.setSimRunning(true)">スタート</button> |
| <button onclick="sim.setSimRunning(false)">ストップ</button> |
| <button onclick="sim.setMaxTimeStep(sim.getMaxTimeStep()*2)">ダブル タイムステップ</button> |
| <button onclick="sim.setMaxTimeStep(sim.getMaxTimeStep()/2)">半分のタイムステップ</button> |
| </p> |
| <p> |
| extsin frequency: |
| <input id="freq" value="10" /> |
| <br> |
| extsin amplitude: |
| <input id="ampl" value="10" /> |
| </p> |
| <div id="info"></div> |
| |
| <script> |
| |
| // get iframe the simulator is running in. Must have same origin as this file! |
| var iframe = document.getElementById("circuitFrame"); |
| |
| var sim; |
| var freq, ampl; |
| var elmList = []; |
| |
| function round(x) { |
| return Math.round(x*1000)/1000; |
| } |
| |
| // called when simulator updates its display |
| function didUpdate(sim) { |
| var info = document.getElementById("info"); |
| info.innerHTML = "time = " + round(sim.getTime()) + "<br>running = " + sim.isRunning(); |
| |
| // get voltage of labeled node "vsense" |
| var vsense = sim.getNodeVoltage("vsense"); |
| info.innerHTML += "<br>V(vsense) = " + round(vsense); |
| |
| freq = parseFloat(document.getElementById("freq").value); |
| ampl = parseFloat(document.getElementById("ampl").value); |
| |
| var bstr = ""; |
| var bval = 0; |
| var i; |
| for (i = 7; i >= 0; i--) { |
| var v = sim.getNodeVoltage("D" + i); |
| if (v > 2.5) { |
| bstr += "1"; |
| bval = 2*bval+1; |
| } else { |
| bstr += "0"; |
| bval = 2*bval; |
| } |
| } |
| info.innerHTML += "<br>counter value = <tt>" + bstr + "</tt> = " + bval; |
| |
| var rcount = 0; |
| |
| // go through list of elements |
| for (const elm of elmList) { |
| if (elm.getType() == "ResistorElm") { |
| // show info about each resistor |
| rcount++; |
| info.innerHTML += "<br>resistor " + rcount + " voltage diff = " + round(elm.getVoltageDiff()); |
| info.innerHTML += "<br>resistor " + rcount + " current = " + round(elm.getCurrent() * 1000) + " mA"; |
| } else if (elm.getType() == "LabeledNodeElm") { |
| // show voltage of each labeled node |
| info.innerHTML += "<br>V(" + elm.getLabelName() + ") = " + round(elm.getVoltage(0)); |
| } |
| } |
| } |
| |
| // called when simulator analyzes a circuit (when a circuit is loaded or edited) |
| function didAnalyze(sim) { |
| console.log("analyzed circuit"); |
| |
| // get the list of elements |
| elmList = sim.getElements(); |
| |
| // log some info about each one |
| for (const elm of elmList) { |
| console.log("elm " + elm.getType() + ", " + elm.getPostCount() + " posts"); |
| console.log("elm info: " + elm.getInfo()); |
| } |
| } |
| |
| // called every timestep |
| function didStep(sim) { |
| var t = sim.getTime(); |
| var q = ampl*Math.sin(freq*Math.PI*2*t); |
| |
| // set voltage of external voltage "extsin" |
| sim.setExtVoltage("extsin", ampl*Math.sin(freq*Math.PI*2*t)); |
| } |
| |
| // callback called when simulation is done initializing |
| function simLoaded() { |
| // get simulator object |
| sim = iframe.contentWindow.CircuitJS1; |
| |
| // set up callbacks on update and timestep |
| sim.onupdate = didUpdate; |
| sim.ontimestep = didStep; |
| sim.onanalyze = didAnalyze; |
| } |
| |
| // set up callback |
| iframe.contentWindow.oncircuitjsloaded = simLoaded; |
| |
| </script> |
| </html></WRAP> |
| |
| ===== 参考文献 ===== |
| |
| ==== 付録 ==== |
| [[tw>tomoyan596sp/status/1817734605568610336|CircuitJSのJSインタフェースは、通常プログラムを同一サイトに配置しないと、iframeのリソースをJSで弄くり回すとブラウザがCORSのエラーを吐いて🤮動作しない😥 CORSの問題をどう回避はするのか❓😅 Apacheの.htaccessにRewriteルールを書いて、リバースプロキシで本家をサイトに埋め込む...😅]]\\ |
| |
| ==== 退避場 ==== |
| [[https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAUgoqoQFMBaMMAKAGcQGAWPK7wrpy7YUQsISjgQAMwCGAGzZ0W2QniEDO2BKP6CG2PIIhUAKgAVxKtVtVadtiQaNSz5wtfUM0X7bp9aLiYgFlyenGBc+n4RUYHGkhbY4Qy89rppzgluKCwA5kK+Dga62HZUkCwASpwIcQw6XggYTgiEFZJcVNjQ2JIV0AgsAO6O6VpoWjaVowaQ0TZz+lziUCmYpcUb8a4h5kOzXJoGxVG+0yNCIlNeZzdrHNyr3ni3zygoglQQcorKjzE9Fp5mIJB1fkpLiddEdlplYWtDvDjggwDDNDNamiNPo2nwVmCoXjQbV2pwPl8oV0+IDqcDKbMyhJnoZjITDu9PqS+BTEeT8OMmMRShdZmAWvcmBKnuzYtFimjzupMUwUEqItiDBdHuKnASImqcf0ZApIY94Sz0V9JBDlGLNfrUvjVirFUaSkaVdcgfiMZdfYIeCTKgC7C9fGHed8TX92LVDUKrRFhZIfqb-vGvMwk0xsdHbXGZeA9c8g-n04WmcWxtxlVIC481VmU94uYnUzGzeTXhr-G3sx2C4yw7hopGe17Jq39E3k6IVUHoSBFzEF4uB0WnXyt0uPUtt97RxEnEevZG2yIeVyz05eVqvFGoXeN2AWwOVcdXxkeQKVbP2+Gx4VFCX5Ad2WZkpiK4OCuIIqnU+jiHwCFztuoG5rooEulCn5vk4oELt6bpZJwaTwWSTD1MS07bnSAEIu2hGYQmwiYXEC6fg6655kSFGRMsRHsVCrKkTSQSyrBgbNvOVJwKh97kteLBoOQAFIfJoHGMpkCqdBMK+C4WkqVimEUTwfDqYI2AAOTaap-4bv+aRWbZxmbvCi7ORQdnkhgmz+F04yCEMbl0YCqhFKIgh4D57bPOpqzRVSzwWnqyqxcSzwICmiUgDFHLMq0ZLYcZi76qly4gDZsURYKtUkYIGCFiyIKSYOFb1ZkAQ7p80ZuMwzX4Sm64puWsZuZktKRZVuQTRZLFZoagizTpongb263GJUABOhTIS2qK6MS3zwDttRUQmh3cqmp35CZnDtE0mrZfOB7FI9kofQumQvUIxBOF9wlTvVR4KX+fmCts+6ui29W6vcHH6B93CLoDsxXQwyNcP9D2-rFDG0jjJRUIIACWAB2pMAC5WG5Va7iDkxk5TVMeG5UPhSCxOVRT1Mhat3gCruvUTCTIC81TYRufxgrw9zzPU8kbkY9RGPYxICs02zAthach5MyAAAOwzbRlF1NNK6uVcbpu7dw3q-UCDSQcg8D4yiZnHFbmseHbIkNC2jrHa7cAsH7YaO-VwdgLdoVZWZpY45r-OqVHFH1d74ss1LAuXtd3PcEnWeK2H60B6UU7R7ddtWw0LEex0MduzXi6NCSzuN9XQhyXX6odzdzeCm3BdV27BRO1jKKjWs4+OljWXT5U4-1cjUeL3dBer5X6+HKjQusbUo3JQD+892j3d8KvLjl29uirxHR+MlOq9c+f+6Y0L-6-fB5t-a0hoLiJsPO4vdaKtxYj3NuC5IEJkBFAlIusYQ9xEsEcwAB1Ko+UNqbg3LVJikoD5Fh-ohA6CYCK8W+EVCyPFZgOQog5IStCeyUTHE4HGN5Cg1nYcJEcXMOZwRAm+IRAVgK0LaPSeSIsFwtWWO8Ccx8JHcGQQI9mEN+7eDUZnCWuQ7Yixvhoo6Lsm6hz9lzYeUNR6h3HlDZGFid6+Tvp-cRH90piJPg+QKN8vRmNgcUeBc1ZaajzprHR51ELPTIXmcAFDsEoQwmsXR-YWzdQItE2hQt0KZMfg4xRKBnGnlLqApgFEMbqW+ESeo6killJYAAe2oNcEmkBiDqBQIMKA0BgiiCQH0CwuR6lWVel0FpIA2lIBgF0yqvTzDJHqX0Rpy5mmtPaRMyQoh5l7DCPUmOVUhlLNGSszpazkBVT2EMep6y9kjLGR0yZ6y9geG2bszo+ybmrKoKICA0yrBAA|ドアミラー😅(書きかけ)]]\\ |
| |