--- Title: ベクタパス作成ツール 5.5 Author: yamasyuh68 Web: https://mimemo.io/m/q9ON1lXzjaGLrAD --- 190722 # 雑感 ## パスの挿入について - 挿入は普通線分の中点に行うから、対象となるベジェ線分を選択したいけど方法がわからない ポイントは座標がはっきりしてるけど、ベジェは線分上にマウスがあるかどうかをはっきり判定しずらい で、線分では無くポイントを選択させてその前に挿入するロジックとしたが、いずれ直したいなあ - 挿入する座標の計算だが、最初直線で計算したらちょっとかっこわるかったのでベジェで計算することにした 画像処理ソフトで勉強してあったので計算式はそっくり持ってきた ベジェはx,y座標を求めるのは難しいが、線分の中点とか1/4とかはtをいじるだけなの比較的簡単 - **しかし** 既存のベジェの上に綺麗に三点は乗らないことがわかった ポイント自体は計算通りベジェ上にあるんだが、ポイント追加でベジェの形状自体が変わってしまうので結果として乗らない 説明が難しいがやってみたらわかる - 三点追加と合わせて、さらに外側のコントロールポイントもベジェの上にのせれば良いのか!? ## データの保存 - 基本はQtのオブジェクトとして保存してるが、中身は座標値だけの簡単なバイナリだ pickle でリストとして保存したときと大きく変わらない リストならテキストで書き出すことも可能で、この方が汎用性はありそうだ 多分一番良いのはsvgに変換して読み書きすることだと思うが、svgは色情報も入ってるようなのでちょっと違うか? まあテキストリストで書き出せさえすればどうとでもなるんだけど - それより、プレビューが無いと読み込みがわかりづらい 今は一時的にwidgetのgrab画像も別ファイルとして書き出すようにしてみたが、本当は保存ファイルに埋め込みたい QTもpickleもパスデータと画像データの両方を一つのファイルに埋め込むことは簡単なはず しかしその場合はデータファイルの画像を抜き出してサムネイルするソフトが必要だよね データ読み込み時にサムネイルを表示してそこから選択するダイアログボックスだね まあいずれはだなあ ## リストかオブジェクトか - 今回は一旦パスオブジェクトベースに書き換えたのでその路線を踏襲したが、リストベースの最初のプログラムとメモリ使用の比較をしてみたら、リストベースの方が小さかった 既存のパスを再利用するより、新しいパスを常に作成し続けた方が良いのか??? - そもそもパスオブジェクトって公式のドキュメントでも単なるコンテナってことになってる 座標情報を格納してるだけってことだよね 描画自体はpainterオブジェクトの仕事だから、曲線の座標計算もやってないと思う - ポイントの削除挿入がオブジェクトでは出来ないので、私は一旦リストに書き出してから手で削除挿入してオブジェクトを最初から作り直した。こんなことをするくらいなら最初からリストベースにした方がよさそう **ただ最初の方法に戻るのがちょっと悔しい** - パスオブジェクトのメソッドを見ると、他のパスとの差分作成や結合などの演算、包含判定などが出来る このためのコンテナって事かな あと描画のため、painterデバイスに渡すための箱ってことですよね 編集するときはオブジェクトを使わないで自分でリストベースでいじった方が良いってことかな **削除や挿入が無いということはそういうことか!!!!!(゚Д゚)** ## その他 - 今回ポイント挿入の際、計算した座標をリストに挿入するのに少し悩んだ insertでいいんだろうけど、三点挿入する、挿入の順番はお尻から?? 三点のリストをそのままさらっと一度で挿入できないのかなと思って調べたらありました スライス表記で簡単にできるんだね さすがはpythonだ! ## ToDO - ベジェ線分の選択 - 挿入ポイントの両側のCPの移動 - リストベースへの変更 --- --> [PyQt でベクターオブジェクト作成ツールを作る #](https://mimemo.io/m/3Rx1XoR367le95E)