質問: Windowsのデスクトップアプリで、電子回路エディタ機能を実装したいのですが、 良い方法が思いつきません。 使用している環境はVS-C#2015、またはQt5.4です。 電子回路エディタ機能をまとめたフレームワークなどご存じないでしょうか? または、こういった切り口で捉えたら良いというヒントでも結構ですので、 ご教示いただけると助かります。 [2016/03/31追記] ・実現したいことは大きく分けて2つあります。 1.テキストで表現された回路をGUIで表現し直す機能 2.GUIで表現された回路図をテキストに直す機能 「テキストで表現された回路」とは、下記のような形式で表現されています。 [構成] INPUT---R0---R1-+-R4---OUTPUT | R2 | R3 | GND [テキスト表現] S(P(S(R0,R1),S(R2,R3)),R4) テキスト表現では、S(p1,p2)と表記した場合p1とp2が直列であることを示します。 P(p1,p2)と表記した場合は、並列接続であることを示します。 それぞれのカッコの中の引数は必ず2つです。 1に関しては、従来の製品の入出力フォーマットがCUIで、テキスト回路表現のみサポートしているので、それに対応するために1の機能が必要です。 私が最初考えたのは、先頭から文字列を読みながら多分木に変換して、(x,y)の論理座標をそれぞれのノードに与え、そこからGUIに転写する方法でした。 先頭から多分木に変換することはできたのですが、X,Yの座標を与えるルーチンでつまづいて困っています。 例えば上の例だと、ノード名(x,y)と座標を示すとして、 R0(0,0) R1(1,0) R4(2,0) R2(1,1) R3(1,2) と座標を振りたいのですが、深さ優先で潜った時に縦の深さでYを 増やしていくルーチンがうまく行きません。 回路の形は、並列でつながっている素子に更に並列という構成も あるので、その場合を考えると再帰が組みにくくて悩んでいます。 2.に関しては、1で読み込んだ回路を編集する機能に当たります。 1,2ともに簡単に解決する方法を求めて、電子回路CADのフォーマットに テキスト回路を中間ファイルとして変換するのが簡単では?と考え、 電子回路CADのフレームワークを探していました。 自前実装の場合のGUIは、ユーザーが自由に素子の位置を移動させるのではなく、 多分木への追加・削除・移動を指定するウィンドウからCUIチックに行うことを 考えています。 例えば、R1,R2にR3を直列に追加する、といったような操作を提供します。 上記のような処理を行いたいのですが、もっと良い方法があるのではないかと 考えなおしているところで、何かヒントを得られたら、、と質問をさせていただきました。 [2016/03/31] -> 回路AAの並列接続点がずれていたため修正 [2016/04/04] 直接的な解決にはまだ至っていませんが、要求仕様が技術的に高いというアドバイスを頂けたので解決済みとさせていただきます。
回答: これは大変難しいものに挑戦していますね。以下、感覚的な話も含んでいるので申し訳ないのですが、ヒントになればと思い回答しておきます。 ### 1. テキストで表現された回路をGUIで表現し直す機能 自力で処理しようとすると、並列する箇所が連続して複数出てくる回路を単純に展開しようとしても、どうしても衝突が起こるでしょうから、平面展開した時にそれまでの部品と互いに重なっていないかどうか?衝突判定と配置の調整処理が(部品の増減毎に)必要になりそうですね。 マス目にブロックを置いていく感覚で整合性が取れている箇所をグループとして扱い、配置を調整するようなロジックになりそうな気がしますが、私はここに対しての明確な答えは持っていません。単純に難しいということだけは理解できます。 また、配線に関しても気を使わないといけないのでしょうか?配線同士が交差してもよいのか?部品の下をくぐってもよいのかどうか?といった判定や、縦横以外の角度を持った線として処理するのであれば、線分の交差判定なんかも必要になるかもしれませんね。(この辺は見下ろし型のシューティングゲームなんかの衝突判定が具体的な参考例として使えるでしょうか?) おそらく、最小単位の部品にしても、縦横の大きさや接点の箇所をこだわりたくなるでしょうし、回路のバージョンアップ的な部品の増減を行った時に既存の部品の配置には影響を出さないで欲しい。なんて要望もありそうです。あと、部品によっては3点以上の接点を持つ事や、循環するような構造を持つ回路もあると思うのですが、これらを全て自動で実現するためには頭の痛くなる細かい課題がまだまだ出てきそうですね。 悩んでいる部分を解決しているソフトが世の中にあったとして、ノウハウの塊になるでしょうから、企業が作っている場合はなかなか公開される事は少ない気がします。テキスト表現の公式のフォーマット名がその界隈で有名なのであれば、そのフォーマットをキーワードとして世界中で探してみると、補助的なライブラリやらツールなど参考にできるものが利用者の側から公開されているかもしれません。 あと、見方を変えると、この手の効率の良い自動配置や調整方法は、ソフトウェア工学など学問の研究対象として挑まれている研究者が居るかもしれません。もし、こういった研究対象の分類とか名称とかが解れば、その方面の論文から参考にできる考え方や、実際に使えるアルゴリズムそのものを探してみるのも手でしょう。もし、これを見ていてキーワードを知っている方が居られましたら補足の回答なりをしていただけると幸いです。 ### 2. GUIで表現された回路図をテキストに直す機能 内部データの扱いをテキスト表現を基準にした形にしていれば、単純に変換だけの話となるため、テキスト化自体は簡単だと思います。ただし、1 と 2 の相互変換をした場合に、自動配置のアルゴリズムにも左右されるとは思うのですが、確実に可逆になることを保証したいのであれば、補助的な(配置や配線の補正)情報が必要になるのではないでしょうか? 独自フォーマットを作るのが手堅いでしょうが、互換性を重視するならば、テキスト表現に(コメントが書けるのであれば)コメントとして補助情報を埋め込んだり、別途補助情報だけを出力可能にするなどの策を用意すべきかもしれません。 何にしても内部で回路を表現するデータ構造そのものが重要になるのは間違いないでしょう。 以上、ご参考になれば幸いです。