Introduction
GeoIO lib is a simple geometry library that encapsulates the drawing of various geometrical entities (like lines, circle, arc, text etc), storing them in a list with support for undo/redo operations. There is a sample application called Cad2D attached which exposes some of the basic drawing and serilaization functionality of the GeoIO library.
Background
Couple of developers/programmers have come across a situation to develop simple application to draw 2-Dimensional geometry entities. However they are blocked due to many reasons like lack of time, unwilling to explore OpenGL, develop the module from base etc. The MFC set of classes (DeviceContext
) gives some good functionality to draw simple entities like lines, circles, rectangles etc, but a first timer may take sometime to learn, understand and experiment it. GeoIO library has encapsulated the complete functionality of MFC into set of core geometry classes. All that you have to do is add this module into your project and start with it. The module also supports drawing, dragging operation OnMouseMove handler and serialization.
Using the code
GeoIO is simple MFC DLL. Add this as dynamic-linked or static-linked to your project. Initially the usage of this module might look difficult, but once you read the below fundamental concepts you should sail through easily. Open the sample project Cad2D (SDI MFC application) which uses GeoIO to draw 2D basic geometry objects. Please explore this sample project to learn and understand the usage of GeoIO.
NOTE: The project has .vcproj and .vcxproj files so it should open in VS2010 and earlier versions of Visual Studio.
Geometry classes in GeoIO:
CPrimitive
- the principle base class for all the below mentioned classes.-
CGeoArc
- class to draw and serialize an arc -
CGeoCircle
- class to draw and serialize a circle -
CGeoLine
- class to draw and serialize a line -
CGeoPolybezier
- class to draw and serialize a polybezier -
CGeoPolygon
- class to draw and serialize a polygon CGeoRectangle
- class to draw and serialize a rectangle-
CGeoText
- class to draw and serialize a string
Note: Some drawing logic have been inspired from various online articles.
Collection classes:
-
CEntityList
- class to hold objects of CPrimitive
(like
CGeoArc
, CGeoLine
, CGeoRectangle
, etc). -
CLayerList
- class to hold objects of CLayer
CLayer
- class stores an instance of CEntityList
. A
CLayer
object is identified by a layer ID.
So, in your application follow the below procedure:
CLayer *pLayer = new CLayer(); CPrimitive *pEntity = new CGeoLine(); pEntity->m_StPnt = CPoint(10, 10);
pEntity->m_EndPoint = CPoint(100, 100); pEntity->m_clr = RGB(255, 255, 255); pLayer->AddEntityToLayer(pEntity);
In the
OnDraw(CDC *pDC)
method of your window class, call the
pLayer->DrawLayer(pDC);
Also note that in the example above I have hard-coded the
pEntity->m_StPnt
and pEntity->m_EndPnt
to some random
CPoint
values. Ideally this should be done in the OnLButtonDown
handler which gives you the
CPoint
data as a parameter.
Concept of layers
In your application, you can create 'N' number layers and maintain them in the
CLayerList
class. In the OnDraw()
method of your window class, you can select which
CLayer
to be drawn. If you wish to draw all the layers then iterate each layer in the
CLayerList
and then call DrawLayer()
method of the
CLayer
.
History
Initial upload: 14 July
2012.