お世話になります.
WPFアプリで2DCADを作っています.
当然大量の2D図形(線分,円弧,スプライン等)を扱い,マウスでの操作が基本になるのですが,
どのようなフレームワーク?で作るのが良いでしょうか.
ひとつはDXライブラリもありかなと思ったのですが,C#からのアクセスがあまりやりやすくない?みたいですし,
WPFにあるCanvas上で描くのもやってみたのですがうまく行かず・・・(表示までは問題なかったが,マウスで掴んだり,コントロールポイントを表示したりというのがやりづらかった.また,線分と円弧,その他の図形によって基底クラスが違ったり・・・)
どのような体系でやるのが良いかアドバイスいただけますでしょうか.
現状2Dができればまったく問題ないのですが,将来的にもしかしたら2.5D,または3Dに手を出したいとも思っております.
(Dxライブラリはちょっとだけいじったことがあります.)
条件として,できればWPFの範囲で作りたいと思っているのですが,,,
手としては,BrowserControlでHtml5なんてのもアリなんでしょうか(笑)
よろしくお願いいたします.
Html,Cssの基礎知識はあります.(静的なサイトを作れる程度)
Javascriptは簡単なのをいじったことがあります
DXlibはCで扱ったことがあります.(遊んでみた程度)
本格的な図形操作を伴うプログラミングは初めてです.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
配置するオブジェクト(2D図形)の数や解像度にもよりますが、Canvasは仮想化をサポートしておらず、決してパフォーマンスが良いとは思いません。
WPFの表現力とBindingの威力は大変強力で、とても魅力的なフレームワークではありますが、事前に十分検証を行い、パフォーマンスには常に留意したほうが良いです。
参考までに。。
投稿2017/06/13 07:50
編集2017/06/13 08:14総合スコア797
0
WPF自体がフレームワーク(震え声
直接、Canvasに「線分と円弧,その他の図形」を書くのではなく、UserControlを挟むといいんじゃないかと。
3Dをやりたいなら、今時はUnityじゃないですかね。使ったことないけど。
「BrowserControlでHtml5なんてのもアリなんでしょうか」ありえない。それなら、JSでElectronをアプリを作るのを目指したほうがマシ。
パフォーマンス云々なら、Win2Dとかもありますね。UWPになりますが。ゲームが作れるクオリティだとか。
http://microsoft.github.io/Win2D/html/Introduction.htm
投稿2017/06/13 06:57
編集2017/06/13 09:46総合スコア1986
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
一度回答しているのですが、
WPFの範囲でもある程度は作成可能と思います。
WPFにあるCanvas上で描くのもやってみたのですがうまく行かず・・・(表示までは問題なかったが,マウスで掴んだり,コントロールポイントを表示したりというのがやりづらかった.また,線分と円弧,その他の図形によって基底クラスが違ったり・・・)
パーツ用のクラスは自分で都合の良い継承関係で作成します。
これば、MVVMのモデルとなります。
描画(UI)はItemsControl等を利用してDataTemplateでの表示が可能です。
必要に応じて、VMを挟むなり好きで良いですが、このDataTemplateの時点で、
円や矩形等の描画用クラスを使ったり、Pathを使うことで描画用クラス自体の派生関係は気にしなくても良くなります。
また、3Dにする場合も3D用のDataTemplateを用意するだけで差し替え可能です。
このように、WPFではモデルとUI部分を強力に分離して扱いやすくする機能が標準で用意されており、フレームワークとして問題ないのではないでしょうか?
コード例
色々端折っていますが、参考までに。
<Window x:Class="TestShape.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TestShape" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" > <Window.Resources> <DataTemplate DataType="{x:Type local:ShapeModel}"> <Rectangle Width="100" Height="50" Fill="Red"/> </DataTemplate> <DataTemplate DataType="{x:Type local:EllipseModel}"> <!-- <Ellipse Width="40" Height="40" Fill="Blue"/> --> <Path Stroke="Black" StrokeThickness="1"> <Path.Data> <EllipseGeometry RadiusX="20" RadiusY="20" /> </Path.Data> </Path> </DataTemplate> </Window.Resources> <ItemsControl ItemsSource="{Binding Shapes}"> <ItemsControl.ItemContainerStyle> <Style> <Setter Property="Canvas.Left" Value="{Binding X}" /> <Setter Property="Canvas.Top" Value="{Binding Y}" /> </Style> </ItemsControl.ItemContainerStyle> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas Background="AliceBlue"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </Window>
XAML側(MainWindow.xaml)。Modelに合わせてDataTemplateを定義しています。
Pathは、Rectangle や Ellipse より、更に低レベルな描画用です。
namespace TestShape { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Shapes.Add(new ShapeModel() { X = 100, Y = 50 }); this.Shapes.Add(new EllipseModel() { X = 50, Y = 100 }); this.DataContext = this; } public ObservableCollection<ShapeModel> Shapes { get; } = new ObservableCollection<ShapeModel>(); } }
MainWindow.xaml.cs 側。
とりあえず、コンストラクタでモデルを突っ込んでいます。
namespace TestShape { /// <summary> /// TODO 通知可能なクラスにする /// </summary> public class ShapeModel { public int X { get; set; } public int Y { get; set; } } public class EllipseModel: ShapeModel { } }
モデル側。都合の良い用に継承構造等を用意できます。
実際にバインディングする場合、通知可能な構造が必要です。
場合によってはVMを挟む等するが良いと思います。
マウスクリックによる操作や、D&D等は、WPF Thumb リサイズ
等でググれば例もあると思います。
すぐにコード書けなかったのでDataTemplateの実例までとします。
投稿2017/06/13 06:55
編集2017/06/14 23:57総合スコア385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/13 09:21
2017/06/14 04:45