質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C#

    7444questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    3606questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    147questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C#またはQtで電子回路エディタ機能を実装したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,166

butt5192

score 9

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]
直接的な解決にはまだ至っていませんが、要求仕様が技術的に高いというアドバイスを頂けたので解決済みとさせていただきます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ps13zier

    2016/03/30 19:39

    電子回路エディタといっても色々要素を含むと思うのですが、どういった部分の実現方法に悩まれているのでしょうか?差し障りがなければ、具体的に問題を抱えている箇所を示すことで、欲しい情報が得られるかもしれませんよ?

    キャンセル

回答 2

checkベストアンサー

+2

これは大変難しいものに挑戦していますね。以下、感覚的な話も含んでいるので申し訳ないのですが、ヒントになればと思い回答しておきます。

1. テキストで表現された回路をGUIで表現し直す機能

自力で処理しようとすると、並列する箇所が連続して複数出てくる回路を単純に展開しようとしても、どうしても衝突が起こるでしょうから、平面展開した時にそれまでの部品と互いに重なっていないかどうか?衝突判定と配置の調整処理が(部品の増減毎に)必要になりそうですね。

マス目にブロックを置いていく感覚で整合性が取れている箇所をグループとして扱い、配置を調整するようなロジックになりそうな気がしますが、私はここに対しての明確な答えは持っていません。単純に難しいということだけは理解できます。

また、配線に関しても気を使わないといけないのでしょうか?配線同士が交差してもよいのか?部品の下をくぐってもよいのかどうか?といった判定や、縦横以外の角度を持った線として処理するのであれば、線分の交差判定なんかも必要になるかもしれませんね。(この辺は見下ろし型のシューティングゲームなんかの衝突判定が具体的な参考例として使えるでしょうか?)

おそらく、最小単位の部品にしても、縦横の大きさや接点の箇所をこだわりたくなるでしょうし、回路のバージョンアップ的な部品の増減を行った時に既存の部品の配置には影響を出さないで欲しい。なんて要望もありそうです。あと、部品によっては3点以上の接点を持つ事や、循環するような構造を持つ回路もあると思うのですが、これらを全て自動で実現するためには頭の痛くなる細かい課題がまだまだ出てきそうですね。

悩んでいる部分を解決しているソフトが世の中にあったとして、ノウハウの塊になるでしょうから、企業が作っている場合はなかなか公開される事は少ない気がします。テキスト表現の公式のフォーマット名がその界隈で有名なのであれば、そのフォーマットをキーワードとして世界中で探してみると、補助的なライブラリやらツールなど参考にできるものが利用者の側から公開されているかもしれません。

あと、見方を変えると、この手の効率の良い自動配置や調整方法は、ソフトウェア工学など学問の研究対象として挑まれている研究者が居るかもしれません。もし、こういった研究対象の分類とか名称とかが解れば、その方面の論文から参考にできる考え方や、実際に使えるアルゴリズムそのものを探してみるのも手でしょう。もし、これを見ていてキーワードを知っている方が居られましたら補足の回答なりをしていただけると幸いです。

2. GUIで表現された回路図をテキストに直す機能

内部データの扱いをテキスト表現を基準にした形にしていれば、単純に変換だけの話となるため、テキスト化自体は簡単だと思います。ただし、1 と 2 の相互変換をした場合に、自動配置のアルゴリズムにも左右されるとは思うのですが、確実に可逆になることを保証したいのであれば、補助的な(配置や配線の補正)情報が必要になるのではないでしょうか?

独自フォーマットを作るのが手堅いでしょうが、互換性を重視するならば、テキスト表現に(コメントが書けるのであれば)コメントとして補助情報を埋め込んだり、別途補助情報だけを出力可能にするなどの策を用意すべきかもしれません。

何にしても内部で回路を表現するデータ構造そのものが重要になるのは間違いないでしょう。

以上、ご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/01 09:39

    ps13zier様
    的確なご指摘、アドバイスありがとうございます。

    なるほど、テキストから回路図に変換するアルゴリズムの難易度は、客観的に見ても難しかったのですね。私の能力が足りてないのかと思っていました。
    CUI->リスト構造&座標管理->GUI描画という流れが難易度的に高いということも理解しました。重ならない経路探索みたいなアルゴリズムになるかと思います。

    いっそまるっきり下位互換を切り捨てて、純粋な回路エディタを実装し、既存回路を書きなおしXMLで構造を吐き出す形にしたほうが早く開発が終わるかも、、と考え始めています。
    実はこの機能、アプリケーションの一部で、アプリの肝は回路解析になるのですが、なかなかそこを開発できなくてやきもきです。精進します。

    ご回答ありがとうございました。

    キャンセル

+1

こんにちは。

フレームワークは把握していませんが、ちょっと探してみたら、オープンソースの回路図エディタがありました。

水魚堂の回路図エディタ

2条項BSDライセンスと言うことなので、ご自身のソフトへの組み込みも許諾されているようです。

もし、フレームワークがあればその方が良いと思いますので、見つからなかった時の参考に。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/30 16:03

    Chironian様
    早速のご回答ありがとうございます。
    BSchのご紹介ありがとうございます。
    最終手段はソースを読んで回路編集部分の最適化をしつつ自分の環境へ実装し直すしかないかなと思っているのですが、いろんな実装案を試しては捨て試しては捨てしています。
    多分木のデータ構造で回路を扱えば割りと簡単そうと思っていたのですが、並列接続部に更に並列接続部がある場合を考え出すと、無限回廊を歩いている気分です。

    一縷の望みを掛けて、引き続きフレームワークを探してみます。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C#

    7444questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C++

    3606questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    147questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。