2 <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
6 <title>Planned features</title>
7 <subtitle>A very rough roadmap of ADG features implementation</subtitle>
9 <para>The following list is roughly in implementation order. All the improvements
10 must be reflected in the demo programs, where applicable.</para>
12 <simplesect id="TODO.0.4.0">
13 <title>Road to adg-0.4.0</title>
15 <itemizedlist mark="circle">
16 <listitem override="disc">Split mathematic stuff in its own library. It will be called CPML,
17 that is Cairo Path Manipulation Library.</listitem>
18 <listitem override="disc">Avoid wrapping of cairo APIs in AdgPath.</listitem>
19 <listitem override="disc">Implement AdgToyText, a basic text entity using the cairo "toy" text API.</listitem>
20 <listitem override="disc">Implement AdgTranslatable, a shared interface for entities that
21 can be translated.</listitem>
22 <listitem override="disc">Implement AdgRotable, a shared interface for entities that can be rotated.</listitem>
27 <simplesect id="TODO.0.5.0">
28 <title>Road to adg-0.5.0</title>
30 <itemizedlist mark="circle">
31 <listitem override="disc">Develop a basic demo CPML program to visually check the results.</listitem>
32 <listitem override="disc">Provide CPML APIs for accessing cairo paths and browse their segments
33 (a contiguous line segment).</listitem>
34 <listitem override="disc">Provide CPML APIs for accessing segments and browse their primitives
35 (a single line / curve / close path).</listitem>
36 <listitem override="disc">CPML APIs to offset cairo paths: specifically, a decent
37 approximation for single Bézier curves must be implemented.</listitem>
38 <listitem override="disc">Implement APIs to get intersection points between different primitives.</listitem>
39 <listitem override="disc">Provide an abstract API (cpml_segment_intersection?) to compute the
40 intersection points between two segments. To be evaluated the way to
41 return the results (maybe using an argument to specify the maximum
42 number of intersections to return).</listitem>
43 <listitem override="disc">Generate documentation for CPML.</listitem>
44 <listitem override="disc">Merge ldim and adg-demo into a single demo program, basing the user
45 interface on GtkBuilder.</listitem>
46 <listitem override="disc">Implement AdgModel as a bare empty class. Move the actual stuff in
47 AdgTitleBlock.</listitem>
48 <listitem override="disc">Rename AdgPath to AdgStroke, being the latter a stroke representation
49 of a single AdgPath.</listitem>
50 <listitem override="disc">Implement AdgPath as an AdgModel derived class of a conceptual path.
51 Any AdgPath instance could be referenced by one or more entities.</listitem>
52 <listitem override="disc">Add arcs in CPML to transparently support, whenever possible, the
53 conversion between arcs and Bézier curves.</listitem>
54 <listitem override="disc">Add to AdgPath the basic functionality to build a path: basically a
55 bunch of methods emulating the cairo path API but without the need of
56 a yet instantiated cairo context.</listitem>
57 <listitem override="disc">Add support for the CPML arc feature in AdgPath.</listitem>
58 <listitem override="disc">Update the demo using the newly implemented AdgPath to deeply test the
59 model/entity interaction.</listitem>
60 <listitem override="disc">Add a chamfer operation to AdgPath.</listitem>
61 <listitem override="disc">Add a fillet operation to AdgPath.</listitem>
62 <listitem override="disc">Change the matrix entity API, using a cleaner approach.</listitem>
63 <listitem override="disc">Move AdgTranslatable and AdgRotable directly inside AdgEntity.</listitem>
64 <listitem override="disc">Ensure there are no bitfield flags, as they are not binding friendly.</listitem>
65 <listitem override="disc">Change building scripts to get the GTK+ dependency optional.</listitem>
66 <listitem override="disc">Add AdgWidget, a GtkDrawingArea that can accept an AdgCanvas.</listitem>
67 <listitem override="disc">Optimize the implemented entities applying the 0.4 ADG infractrusture
68 and enable caching where applicable.</listitem>
69 <listitem override="disc">Use AdgToyText to draw dimenstion quote where applicable.</listitem>
70 <listitem override="disc">Add a "beyond" property to AdgDimStyle to be used when extending the
71 baseline beyond the extension lines. If not specified, it must default
72 to 3 x arrow size.</listitem>
73 <listitem override="disc">Add a three-state enum to adg-enums.h: ADG_THREE_STATE_OFF,
74 ADG_THREE_STATE_ON and ADG_THREE_STATE_UNKNOWN.</listitem>
75 <listitem override="disc">Add the three-state "outside" property to allow forcing an outside quote.
76 In the default state, the outside must be decided by the space between
77 the extension lines: if greather than 3 x arrow size => inside arrows.</listitem>
82 <simplesect id="TODO.0.6.0">
83 <title>Road to adg-0.6.0</title>
85 <itemizedlist mark="circle">
86 <listitem override="disc">Implement adg_matrix_normalize() to get rid of the scaling component
87 of a matrix: consider the point (0,0) and (1,1) on the identity matrix
88 and force on the matrix to normalize a distance of 1.4142... between
89 the same points by modifying only the xx and yy components.</listitem>
90 <listitem override="disc">Move the custom get_local_matrix() inside AdgEntity and implement a
91 common way to manage local matrix - entity interaction: for instance,
92 if the model is rotated an AdgToyText should rotate accordling but not
93 scale (usually, at least if it is not a text written on the model).</listitem>
94 <listitem override="disc">Implement AdgMarker as an abstract entity: it will be the base class
95 for arrows, ticks, squares, dots and so on.</listitem>
96 <listitem override="disc">Implement AdgArrow as AdgMarker derived entity.</listitem>
97 <listitem override="disc">Implement AdgArrowStyle directly inside the AdgDimStyle class and
98 provides a way to customize the markers.</listitem>
99 <listitem override="disc">Rework the style approach by detaching the slot and type concepts:
100 rename slot to dress and let the door opened to future expansion by
101 breaking the one style = one dress equation.</listitem>
102 <listitem override="disc">Rewrite AdgLDim to use the new marker APIs instead of hardcoding the
103 arrows and calling the deprecated rendering callbacks.</listitem>
104 <listitem override="disc">Implement the extents infrastructure that computes the bounding box
105 of the entities without rendering them.</listitem>
106 <listitem override="disc">Implement the outside arrows in AdgLDim.</listitem>
107 <listitem>Add AdgADim, the angular dimension.</listitem>
108 <listitem>Add AdgRDim, the radial dimension.</listitem>
109 <listitem override="disc">Rework styles by using GObject and properties.</listitem>
110 <listitem>Implement a basic AdgPatternStyle, abstracting the cairo_pattern_t APIs
111 and providing a way to customize filling, similar to what AdgLineStyle
112 does for stroking.</listitem>
113 <listitem>Add AdgHatch, an entity very similar to AdgStroke but that uses
114 cairo_fill() instead of cairo_stroke().</listitem>
115 <listitem>Add AdgToyTable, a container for AdgToyText in a framed environment.</listitem>
116 <listitem>Add AdgTitleBlock, a complex entity in global space used to frame the
117 sheet and show the general drawing data (title, scale, date and so on).</listitem>
122 <simplesect id="TODO.unknown">
123 <title>Road to unknown</title>
125 <itemizedlist mark="circle">
126 <listitem>Add labeling feature to the models and let AdgDim and children points
127 be expressed as references to these labeled points instead of using
128 explicit coordinates.</listitem>
129 <listitem>Allow the linear dimension to be decentralized by using the pos point
130 as reference and using a dedicated enum instead of a three-state.</listitem>
131 <listitem>Check if the above feature is applicable to the angular dimensions and
132 if it is worth the effort.</listitem>
133 <listitem>The ARROW and TRIANGLE markers should follow the director path that
134 could be a curve. Use the METAPOST solution suggested by John Hobby
135 I don't remember where, that is given <parameter>angle</parameter> and <parameter>size</parameter>, rotate the
136 path by half <parameter>angle</parameter> in both directions, look for intersection with a
137 circle centered at the end of the director path with radius <parameter>size</parameter> and
138 close the resulting path.</listitem>
139 <listitem>Add connectivity feature to AdgModel: enable dependencies of models to
140 external data. Use libgda as sample data provider.</listitem>
141 <listitem override="disc">Add model-view interaction by providing signal propagation from AdgModel
142 to the dependent entities, so when a data changes the entities will be
143 automatically updated.</listitem>
144 <listitem>Implement AdgText, a generic text management, using pango.</listitem>
145 <listitem>Add self-intersection API for CPML segments.</listitem>
146 <listitem>Add datum support: for implementation ideas checkout this
147 <ulink url="http://nvl.nist.gov/pub/nistpubs/jres/104/4/html/j44mac.htm">draft</ulink>.</listitem>
148 <listitem override="disc">Add a CpmlArc primitive and some API to CpmlCurve to be able
149 to check if a curve is an arc approximation. This gives additional
150 information to do some operation, such as a proper arc offseting.</listitem>
151 <listitem>Improve Bézier offset approximation enabling the choice of approximate
152 a single curve with multiple offset curves.</listitem>