お世話になっております.
現在,C#(WPF)を使ってDXFファイル(2DCADのファイル形式)のパースをするプログラムを作っています.
2DCADですから線分や円弧等が非常に大量に(数百~数万)登場します.
今は,これらすべての図形に対して一つ一つオブジェクトとみなしてインスタンスを作っているのですが,一つ一つのオブジェクト自体は非常に軽量です(線分なら,始点と終点,色,線分の種類,レイヤー程度の情報しかないため)
このような用途は構造体のほうが適しているのではと思い質問させていただきました
しかし,構造体にすると継承ができません.
例えば,色や線の種類(実線,破線,点線等)はすべての図形が共通に持つ情報ですし,基底クラスにこれら共通部分を定義してしまうのがいいのかな?とも思っている次第です.
抽象的な質問ではありますが,アドバイスいただけたらと思います.
コーディング途中ですが,読み込んだDXFを最終的に一つの大きなオブジェクトとするので,そのひな型を下に示します.(一部抜粋)
正直このようなひな型の作り方が正しいのかどうかもわかりません....
以前,XMLSerializerを使ったことがあるので,その時に作ったひな型と同じように作っています.
しかし,例えばひな型の中に,変数だけではなくクラスを一緒に作っていますが,それが良いかもわかりません.
何か引っかかるものを感じましたらアドバイスいただけると助かります.
よろしくお願いいたします.
C#
1 2 /// <summary> 3 /// DXFをパースするときのひな型 4 /// </summary> 5 public class DxfFormat { 6 public enum SectionIdList {HEADER, TABLES, BLOCKS, ENTITIES, CLASS}; 7 8 public HeaderClass Header = new HeaderClass(); 9 public class HeaderClass { 10 public enum VersionList { AC1003, AC1006, AC1009, AC1012, AC1014, OTHER }; 11 public VersionList Version = VersionList.OTHER; 12 13 public enum MeasurementList{ INCH, METER } 14 public MeasurementList Measurement = MeasurementList.INCH; 15 16 public Point3D Limmin = new Point3D(); //図面の最小値 17 public Point3D Linmax = new Point3D(); //図面の最大値 18 public int DIMSCALE; //寸法の尺度 19 public int PEXTMIN; //ペーパー空間のオブジェクトの最小値 20 public int PEXTMAX; //ペーパー空間のオブジェクトの最大値 21 public string Dwgcodepage; //図面のコードページ日本語はR13Jまで "dos932"、R14から"ANSI_932"です。 22 } 23 24 public TableClass Table = new TableClass(); 25 public class TableClass { 26 /// <summary> 27 /// LineType 28 /// </summary> 29 public class LineType { 30 public string Name; 31 public string Description; 32 public double PatternLong; //1パターン当たりの長さ 33 public int numOfDashes; //その線はどのような線から構成されるかの個数 GroupCode = 73 34 public List<double> Dashes = new List<double>(); 35 } 36 public List<LineType> LineTypeList = new List<LineType>(); 37 public int numOfLines; 38 39 /// <summary> 40 /// Layer 41 /// </summary> 42 public class LayerType { 43 public string Name; 44 public int Color; 45 } 46 public List<LayerType> LayerTypeList = new List<LayerType>(); 47 public int numOfLayers; 48 } 49 50 //このリストに図形を全部放り込んでいく. 51 public List<EntityBaseClass> Entities = new List<EntityBaseClass>(); 52 53 /// <summary> 54 /// Entityの基底クラス. 55 /// </summary> 56 public class EntityBaseClass { 57 public string LayerName; 58 } 59 60 public class EntityLineClass : EntityBaseClass { 61 public Point Start = new Point(); 62 public Point End = new Point(); 63 public string LineType; 64 } 65 66 public class EntityArcClass : EntityBaseClass { 67 public Point Center = new Point(); 68 public double Radius; 69 public double StartDegree; 70 public double EndDegree; 71 } 72 73 public class EntityCircleClass : EntityBaseClass { 74 public Point Center = new Point(); 75 public double Radius; 76 } 77 } 78 } 79
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。