19 #ifndef __WXDRAWER_H__
20 #define __WXDRAWER_H__
27 #include "wx/dataobj.h"
28 #include "wx/clipbrd.h"
29 #include "wx/metafile.h"
30 #include <wx/wfstream.h>
31 #include <wx/stdstream.h>
33 #include "wx/geometry.h"
66 #ifdef CLASS_MEM_MANAGEMENT
71 void*
operator new(
size_t bytes )
73 return sm_memManager.
Allocate( bytes );
82 void operator delete(
void* space,
size_t bytes )
84 sm_memManager.Deallocate( space, bytes );
86 #endif //CLASS_MEM_MANAGEMENT
89 a2dUpdateArea(
int x,
int y,
int width,
int height, wxUint8
id = 0 );
102 #include <wx/listimpl.cpp>
105 WX_DECLARE_LIST_WITH_DECL(
a2dUpdateArea, a2dUpdateListBase,
class A2DCANVASDLLEXP );
114 #ifdef CLASS_MEM_MANAGEMENT
119 void*
operator new(
size_t bytes )
121 return sm_memManager.
Allocate( bytes );
130 void operator delete(
void* space,
size_t bytes )
132 sm_memManager.Deallocate( space, bytes );
134 #endif //CLASS_MEM_MANAGEMENT
143 #define a2d_TILESHIFT 8
144 #define a2d_TILESIZE 256 //(1 << a2d_TILESHIFT)
156 a2dTileBox(
int x1 = 0,
int y1 = 0,
int x2 = 0,
int y2 = 0 );
162 void Init(
int x1 = 0,
int y1 = 0,
int x2 = 0,
int y2 = 0 );
165 void Expand(
int x1,
int y1,
int x2,
int y2 );
168 inline int x1p() {
return m_x1 << a2d_TILESHIFT; }
170 inline int y1p() {
return m_y1 << a2d_TILESHIFT; }
172 inline int x2p() {
return m_x2 << a2d_TILESHIFT; }
174 inline int y2p() {
return m_y2 << a2d_TILESHIFT; }
193 #define a2d_INIT_TILES 100
195 #if (defined(__WXMSW__) && defined(WXUSINGDLL) )
196 template class A2DCANVASDLLEXP a2dArrayGrow < a2dTileBox >;
221 void SetSize(
int width,
int height );
233 inline int toP(
int tilexy ) {
return tilexy << a2d_TILESHIFT; }
236 inline int toT(
int xy ) {
return xy >> a2d_TILESHIFT; }
239 inline int ModT(
int xy ) {
return xy & ( a2d_TILESIZE - 1 ); }
242 void FillTiles(
const wxRect& rect,
bool expand =
true );
255 void FillTiles(
int x,
int y,
int w,
int h,
bool expand );
258 bool HasFilledTiles();
269 void GenerateUpdateRectangles(
a2dUpdateList* rects, wxUint8
id );
279 assert( i < ( m_width * m_height - 1 ) );
311 m_layervisible =
true;
312 m_layeravailable =
false;
314 m_canvasObjectCount = 0;
315 m_canvasPreviousObjectCount = 0;
341 return ( m_layeravailable && m_layervisible ) || m_check;
348 void SetObjectCount( wxUint32 numberOfObjects ) { m_canvasObjectCount = numberOfObjects; }
368 mutable wxUint32 m_canvasPreviousObjectCount;
393 a2dLayerView* SmrtPtrOwn() { m_refcount++;
return this; }
398 bool SmrtPtrRelease()
401 wxASSERT_MSG( m_refcount >= 0, wxT(
"a2dLayerView Own/Release not matched (extra Release calls)" ) );
402 if ( m_refcount <= 0 )
415 typedef std::vector<a2dLayerView> a2dLayerViewList;
472 #if defined(_DEBUG) && defined (SMART_POINTER_DEBUG)
473 a2dInitCurrentSmartPointerOwner m_initCurrentSmartPointerOwner;
475 DECLARE_EVENT_TABLE()
481 void SetUpdateVisible(
bool updatesVisible ) { m_updatesVisible = updatesVisible; }
483 bool m_updatesVisible;
512 virtual void SetDisplayWindow( wxWindow* display );
514 virtual wxWindow* GetDisplayWindow() {
return m_drawingDisplay; }
527 #if wxUSE_PRINTING_ARCHITECTURE
533 virtual wxPrintout* OnCreatePrintout(
a2dPrintWhat typeOfPrint,
const wxPageSetupDialogData& pageSetupData );
543 virtual void SetBufferSize(
int w,
int h );
545 virtual bool GetTrippleBuf() {
return false; }
547 virtual bool GetTrippleBufHasAlpha() {
return false; }
549 virtual bool HasAlhpa() {
return m_drawer2D->HasAlpha(); }
576 void SetLayerCheck( wxUint16 layer );
586 void SetReverseOrder(
bool revorder );
603 double GetHitMarginWorld()
const;
617 virtual bool ProcessEvent( wxEvent& event );
628 void SetMouseEvents(
bool onoff );
692 void ClearPushInStack();
695 bool HasPopOut()
const {
return m_pushInStack.size() != 0; }
709 void AddPendingUpdateArea(
a2dCanvasObject* obj, wxUint8
id = 0,
bool refsalso =
true );
721 void AddPendingUpdateArea(
const a2dBoundingBox& box, wxUint8
id = 0 );
724 void AddPendingUpdateArea(
const wxRect& recnew, wxUint8
id = 0 );
734 void AddPendingUpdateArea(
int x,
int y,
int w,
int h, wxUint8
id = 0 );
736 void AddOverlayAreas(
bool update );
787 , wxObject* hintObject = NULL );
793 virtual void UpdateArea(
int x,
int y,
int width,
int height, wxUint8
id = 0 );
795 virtual void ClearArea(
int x,
int y,
int width,
int height );
800 virtual void BlitBuffer(
int x,
int y,
int width,
int height,
int xbuf,
int ybuf );
804 virtual void DrawOrigin();
808 virtual void PaintGrid(
int x,
int y,
int width,
int height );
812 virtual void PaintBackground(
int x,
int y,
int width,
int height );
815 void SetCrossHair(
bool onoff );
833 void SetCrossHairStroke(
const a2dStroke& stroke );
839 virtual void UpdateCrossHair(
int x,
int y );
872 void SetBackgroundFill(
const a2dFill& backgroundfill );
884 void SetGridStroke(
const a2dStroke& gridstroke );
890 void SetGridFill(
const a2dFill& gridfill );
949 void Thaw(
bool update );
954 virtual bool BlitPendingUpdateAreas();
968 a2dToolContr* GetCanvasToolContr() {
return m_toolcontroller; }
970 void SetCursor(
const wxCursor& cursor );
973 void PushCursor(
const wxCursor& cursor );
979 void ClearCursorStack();
995 int layer = wxLAYER_ALL,
997 bool filterSelectableLayers =
false
1015 int layer = wxLAYER_ALL,
1017 bool filterSelectableLayers =
false
1031 int layer = wxLAYER_ALL
1049 virtual bool ProcessCanvasObjectEvent( wxEvent& event,
bool& isHit,
1050 double x,
double y,
int margin,
1051 int layer = wxLAYER_ALL );
1069 double x,
double y,
int margin,
1070 int layer = wxLAYER_ALL );
1086 bool FindAndSetCorridorPath(
a2dCanvasObject* findObject,
bool capture );
1097 void SetCorridorPath(
const a2dCorridor& corridor );
1105 void ClearCorridorPath(
bool uncapture );
1112 void SetMappingShowAll();
1122 void SetDrawer2D(
a2dDrawer2D* drawer2d,
bool noDelete =
false );
1135 void SetDocumentDrawStyle( wxUint32 drawstyle );
1150 virtual void Scroll(
int dxy,
bool yscroll,
bool total );
1153 void OnDrop(wxCoord x, wxCoord y,
a2dDrawing* drawing);
1160 virtual void RenderTopObject( wxUint32 documentDrawStyle, wxUint8
id );
1183 void UpdateViewDependentObjects();
1212 void MouseToToolWorld(
int x,
int y,
double& xWorldLocal,
double& yWorldLocal );
1216 void ToolWorldToMouse(
double xWorld,
double yWorld,
int& x,
int& y );
1226 void OnSetFocus( wxFocusEvent& focusevent );
1228 void OnKillFocus( wxFocusEvent& focusevent );
1230 void OnEnter( wxMouseEvent& WXUNUSED( event ) );
1233 void OnIdle( wxIdleEvent& event );
1236 void OnMouseEvent( wxMouseEvent& event );
1242 void OnCharEvent( wxKeyEvent& event );
1265 void RedrawPendingUpdateAreas(
bool noblit =
false );
1270 void DeleteAllPendingAreas();
1276 void Aberration(
double angle,
double radius,
double& dphi,
unsigned int& segments );
1413 wxWindow* m_drawingDisplay;
1465 bool m_viewDependentObjects;
1519 #if (defined(__WXMSW__) && defined(WXUSINGDLL) )
1524 #if wxUSE_PRINTING_ARCHITECTURE
1525 #include "wx/prntbase.h"
1530 #if wxUSE_PRINTING_ARCHITECTURE && (!defined(__WXUNIVERSAL__) || !wxUSE_POSTSCRIPT_ARCHITECTURE_IN_MSW)
1536 virtual wxPrinterBase *CreatePrinter( wxPrintDialogData *data );
1538 virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
1539 wxPrintout *printout = NULL,
1540 wxPrintDialogData *data = NULL );
1541 virtual wxPrintPreviewBase *CreatePrintPreview( wxPrintout *preview,
1542 wxPrintout *printout,
1543 wxPrintData *data );
1549 #if defined(__WXMSW__)
1550 #include "wx/msw/printwin.h"
1552 class WXDLLIMPEXP_CORE a2dWindowsPrintPreview :
public wxWindowsPrintPreview
1555 a2dWindowsPrintPreview(wxPrintout *printout,
1556 wxPrintout *printoutForPrinting = NULL,
1557 wxPrintDialogData *data = NULL);
1558 a2dWindowsPrintPreview(wxPrintout *printout,
1559 wxPrintout *printoutForPrinting,
1561 virtual ~a2dWindowsPrintPreview();
1565 virtual bool RenderPageIntoBitmap(wxBitmap& bmp,
int pageNum);
1567 DECLARE_DYNAMIC_CLASS_NO_COPY(a2dWindowsPrintPreview)
1575 #endif // wxUSE_PRINTING_ARCHITECTURE
1580 #if wxUSE_DRAG_AND_DROP
1589 template <
class parserTypeIn,
class parserTypeOut >
1590 class a2dDnDCanvasObjectData :
public wxDataObject
1594 a2dDnDCanvasObjectData(
a2dDrawingPart* drawingPart = NULL, wxDataObject::Direction dir = wxDataObject::Set );
1596 virtual ~a2dDnDCanvasObjectData();
1604 a2dDrawing* GetDrawing()
const {
return m_drawing; }
1609 wxString GetURL ()
const;
1612 wxString GetText()
const;
1615 void SetImportWidthHeightImage(
double importWidthHeightImage ) { m_importWidthHeightImage = importWidthHeightImage; }
1618 double GetImportWidthHeightImage()
const {
return m_importWidthHeightImage; }
1621 void SetExportWidthHeightImage(
double exportWidthHeightImage ) { m_exportWidthHeightImage = exportWidthHeightImage; }
1624 double GetExportWidthHeightImage()
const {
return m_exportWidthHeightImage; }
1629 virtual wxDataFormat GetPreferredFormat(Direction dir = Get )
const;
1631 virtual size_t GetFormatCount(Direction dir = Get )
const;
1633 virtual void GetAllFormats(wxDataFormat *formats, Direction dir = Get )
const;
1635 virtual size_t GetDataSize(
const wxDataFormat& format)
const;
1637 virtual bool GetDataHere(
const wxDataFormat& format,
void *pBuf)
const;
1639 virtual bool SetData(
const wxDataFormat& format,
1640 size_t WXUNUSED(len),
const void *buf);
1647 void CreateBitmap()
const;
1649 void CreateMetaFile()
const;
1650 #endif // wxUSE_METAFILE
1653 wxDataFormat m_formatShape;
1657 wxTextDataObject m_dobjText;
1660 wxBitmapDataObject m_dobjBitmap;
1663 wxURLDataObject m_dobjURL;
1667 wxMetaFileDataObject m_dobjMetaFile;
1669 #endif // wxUSE_METAFILE
1675 a2dSmrtPtr<a2dDrawingPart> m_drawingPart;
1677 double m_dragStartX;
1678 double m_dragStartY;
1680 double m_importWidthHeightImage;
1681 double m_exportWidthHeightImage;
1684 typedef a2dDnDCanvasObjectData< a2dIOHandlerCVGIn, a2dIOHandlerCVGOut > a2dDnDCanvasObjectDataCVG;
1686 extern const wxChar *a2dCanvasObjectFormatId;
1688 template <
class parserTypeIn,
class parserTypeOut >
1689 a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::a2dDnDCanvasObjectData(
a2dDrawingPart* drawingPart, wxDataObject::Direction dir )
1691 m_drawingPart = drawingPart;
1696 m_drawing->SetCommandProcessor( NULL );
1700 m_formatShape.SetId(a2dCanvasObjectFormatId);
1704 m_hasShapes =
false;
1707 m_hasBitmap =
false;
1709 m_hasMetaFile =
false;
1710 #endif // wxUSE_METAFILE
1711 m_importWidthHeightImage = 0;
1712 m_exportWidthHeightImage = 0;
1714 if ( dir == wxDataObject::Set )
1719 if ( m_drawingPart )
1746 if ( !text->GetSelectedText().IsEmpty() && !m_hasURL )
1749 m_dobjURL.SetURL( text->GetSelectedText() );
1751 if ( !text->GetSelectedText().IsEmpty() && !m_hasText )
1754 m_dobjText.SetText( text->GetSelectedText() );
1761 if ( m_drawingPart && !m_hasURL && !m_hasText )
1773 m_dobjURL.SetURL( text->
GetText() );
1778 m_dobjText.SetText( text->
GetText() );
1785 template <
class parserTypeIn,
class parserTypeOut >
1786 a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::~a2dDnDCanvasObjectData()
1791 template <
class parserTypeIn,
class parserTypeOut >
1792 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::Append(
a2dCanvasObject* canvasobject )
1797 m_drawing->SetCommandProcessor( NULL );
1803 m_drawing->
Append( copy );
1807 template <
class parserTypeIn,
class parserTypeOut >
1808 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::Reconnect()
1811 m_refs.LinkReferences(
true );
1817 template <
class parserTypeIn,
class parserTypeOut >
1818 a2dCanvasObjectList* a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetObjects()
const
1820 return m_drawing->GetRootObject()->CreateChildObjectList();
1823 template <
class parserTypeIn,
class parserTypeOut >
1824 wxString a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetURL ()
const
1827 return m_dobjURL.GetURL();
1828 return wxEmptyString;
1831 template <
class parserTypeIn,
class parserTypeOut >
1832 wxString a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetText()
const
1835 return m_dobjText.GetText();
1836 return wxEmptyString;
1839 template <
class parserTypeIn,
class parserTypeOut >
1840 wxDataFormat a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetPreferredFormat(Direction WXUNUSED(dir))
const
1842 return m_formatShape;
1845 template <
class parserTypeIn,
class parserTypeOut >
1846 size_t a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetFormatCount(Direction dir)
const
1849 size_t nFormats = 0;
1859 nFormats += m_dobjURL.GetFormatCount(dir);
1861 nFormats += m_dobjText.GetFormatCount(dir);
1864 nFormats += m_dobjBitmap.GetFormatCount(dir);
1868 nFormats += m_dobjMetaFile.GetFormatCount(dir);
1876 nFormats += m_dobjURL.GetFormatCount(dir);
1877 nFormats += m_dobjText.GetFormatCount(dir);
1878 nFormats += m_dobjBitmap.GetFormatCount(dir);
1883 template <
class parserTypeIn,
class parserTypeOut >
1884 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetAllFormats(wxDataFormat *formats, Direction dir)
const
1891 formats[index++] = m_formatShape;
1896 m_dobjURL.GetAllFormats(&formats[index], dir);
1897 index += m_dobjURL.GetFormatCount(dir);
1901 m_dobjText.GetAllFormats(&formats[index], dir);
1902 index += m_dobjText.GetFormatCount(dir);
1908 m_dobjBitmap.GetAllFormats(&formats[index], dir);
1909 index += m_dobjBitmap.GetFormatCount(dir);
1914 m_dobjMetaFile.GetAllFormats(&formats[index], dir);
1915 #endif // wxUSE_METAFILE
1920 formats[index++] = m_formatShape;
1922 m_dobjURL.GetAllFormats(&formats[index], dir);
1923 index += m_dobjURL.GetFormatCount(dir);
1924 m_dobjText.GetAllFormats(&formats[index], dir);
1925 index += m_dobjText.GetFormatCount(dir);
1929 m_dobjBitmap.GetAllFormats(&formats[index], dir);
1930 index += m_dobjBitmap.GetFormatCount(dir);
1934 template <
class parserTypeIn,
class parserTypeOut >
1935 size_t a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetDataSize(
const wxDataFormat& format)
const
1937 if ( format == m_formatShape )
1949 wxString oldLocale = wxSetlocale( LC_NUMERIC, NULL );
1951 wxSetlocale( LC_NUMERIC, wxString( wxT(
"English" ) ) );
1953 wxSetlocale( LC_NUMERIC, wxString( wxT(
"en_US" ) ) );
1957 if ( m_drawing->GetRootObject()->GetChildObjectsCount() )
1959 parserTypeOut CVGwriter;
1960 CVGwriter.SaveStartAt( m_mem, m_drawing, m_drawing->GetRootObject() );
1963 wxSetlocale( LC_NUMERIC, oldLocale );
1973 return m_mem.str().length() + 10;
1976 else if ( m_dobjMetaFile.IsSupported(format) )
1978 if ( !m_hasMetaFile )
1981 return m_dobjMetaFile.GetDataSize(format);
1983 #endif // wxUSE_METAFILE
1984 else if ( m_dobjURL.IsSupported(format) )
1986 return m_dobjURL.GetDataSize(format);
1988 else if ( m_dobjText.IsSupported(format) )
1990 return m_dobjText.GetDataSize();
1994 wxASSERT_MSG( m_dobjBitmap.IsSupported(format),
1995 wxT(
"unexpected format") );
2000 return m_dobjBitmap.GetDataSize();
2004 template <
class parserTypeIn,
class parserTypeOut >
2005 bool a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::GetDataHere(
const wxDataFormat& format,
void *pBuf)
const
2007 if ( format == m_formatShape )
2010 #if wxUSE_STD_IOSTREAM
2011 wxString str = m_mem.str();
2012 wxStrcpy( (
char*) pBuf, str );
2014 pBuf = m_mem.GetString();
2017 if ( str.Len() <= 10 )
2022 else if ( m_dobjMetaFile.IsSupported(format) )
2024 if ( !m_hasMetaFile )
2027 return m_dobjMetaFile.GetDataHere(format, pBuf);
2029 #endif // wxUSE_METAFILE
2030 else if ( m_dobjURL.IsSupported(format) )
2032 return m_dobjURL.GetDataHere(format, pBuf);
2034 else if ( m_dobjText.IsSupported(format) )
2036 return m_dobjText.GetDataHere(format, pBuf);
2040 wxASSERT_MSG( m_dobjBitmap.IsSupported(format),
2041 wxT(
"unexpected format") );
2047 return m_dobjBitmap.GetDataHere(pBuf);
2051 template <
class parserTypeIn,
class parserTypeOut >
2052 bool a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::SetData(
const wxDataFormat& format,
size_t len,
const void *buf )
2057 m_drawing->SetCommandProcessor( NULL );
2060 if ( format == m_formatShape )
2062 wxCharBuffer cvgString = wxCharBuffer( (
const char*) buf );
2069 wxString oldLocale = wxSetlocale( LC_NUMERIC, NULL );
2071 wxSetlocale( LC_NUMERIC, wxString( wxT(
"English" ) ) );
2073 wxSetlocale( LC_NUMERIC, wxString( wxT(
"en_US" ) ) );
2076 #if wxART2D_USE_CVGIO
2077 #if wxUSE_STD_IOSTREAM
2082 #endif // wxUSE_UNICODE
2087 parserTypeIn CvgString;
2090 CvgString.Load( stream, m_drawing, m_drawing->GetRootObject() );
2097 obj->
Translate( -m_dragStartX, -m_dragStartY);
2104 m_hasURL = m_hasText =
false;
2116 m_dobjURL.SetURL( text->
GetText() );
2121 m_dobjText.SetText( text->
GetText() );
2127 m_hasBitmap =
false;
2128 wxSetlocale( LC_NUMERIC, oldLocale );
2131 m_hasMetaFile =
false;
2132 #endif // wxUSE_METAFILE
2136 #endif //wxART2D_USE_CVGIO
2141 else if ( m_dobjURL.IsSupported(format) )
2144 m_dobjURL.SetData( format, len, buf);
2150 text->
SetText( m_dobjURL.GetURL() );
2151 m_drawing->Append( text );
2156 else if ( m_dobjText.IsSupported(format) )
2159 m_dobjText.SetData(len, buf);
2165 text->
SetText( m_dobjText.GetText() );
2166 m_drawing->Append( text );
2171 else if ( m_dobjBitmap.IsSupported(format) )
2173 m_dobjBitmap.SetData(len, buf);
2176 double w = m_dobjBitmap.GetBitmap().GetWidth();
2177 double h = m_dobjBitmap.GetBitmap().GetHeight();
2178 if ( m_importWidthHeightImage )
2182 h = m_importWidthHeightImage * h/w;
2183 w = m_importWidthHeightImage;
2187 w = m_importWidthHeightImage * w/h;
2188 h = m_importWidthHeightImage;
2190 a2dImage* im =
new a2dImage( m_dobjBitmap.GetBitmap().ConvertToImage(), 0, 0, w, h );
2193 m_drawing->Append( im );
2197 a2dImage* im =
new a2dImage( m_dobjBitmap.GetBitmap().ConvertToImage(), 0, 0, w, h );
2200 m_drawing->Append( im );
2213 template <
class parserTypeIn,
class parserTypeOut >
2214 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::CreateMetaFile()
const
2220 m_drawing->GetRootObject()->GetBbox().SetValid(
false );
2222 RenderToDc( &dcMF, m_drawing->GetRootObject() );
2224 wxMetafile *mf = dcMF.Close();
2226 a2dDnDCanvasObjectData *
self = (a2dDnDCanvasObjectData *)
this;
2227 self->m_dobjMetaFile.SetMetafile(*mf);
2228 self->m_hasMetaFile =
true;
2233 #endif // wxUSE_METAFILE
2235 template <
class parserTypeIn,
class parserTypeOut >
2236 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::CreateBitmap()
const
2238 wxBitmap bitmap = RenderImage( m_drawing->GetRootObject() );
2239 a2dDnDCanvasObjectData *
self = (a2dDnDCanvasObjectData *)
this;
2240 self->m_dobjBitmap.SetBitmap(bitmap);
2241 self->m_hasBitmap =
true;
2245 template <
class parserTypeIn,
class parserTypeOut >
2246 wxBitmap a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::RenderImage(
a2dCanvasObject* canvasobject )
const
2248 wxSize imageSize = wxSize( 1000, 1000 );
2249 if ( m_drawingPart )
2250 imageSize = wxSize( m_drawingPart->GetDrawer2D()->GetWidth(), m_drawingPart->GetDrawer2D()->GetHeight() );
2252 int maxWidthHeight = wxMax( imageSize.x, imageSize.y );
2253 if ( m_exportWidthHeightImage )
2254 maxWidthHeight = m_exportWidthHeightImage;
2260 viewBox = canvasobject->
GetBbox();
2284 xpp = w / maxWidthHeight;
2285 ypp = h / maxWidthHeight;
2287 imageSize = wxSize( maxWidthHeight, (
int ) ( h / xpp ) );
2289 imageSize = wxSize( (
int ) ( w / ypp ), maxWidthHeight );
2295 int clientw = imageSize.GetWidth();
2296 int clienth = imageSize.GetHeight();
2299 int borderpercentual = 10;
2300 int border = ( int ) ( wxMin( clientw, clienth ) * borderpercentual / 100.0 ) ;
2302 if ( clientw - border > 0 )
2303 clientw = clientw - border;
2305 if ( clienth - border > 0 )
2306 clienth = clienth - border;
2313 double middlexworld = viewBox.
GetMinX() + w / 2.0;
2314 double middleyworld = viewBox.
GetMinY() + h / 2.0;
2315 virt_minX = middlexworld - ( clientw + border ) / 2.0 * uppx;
2316 virt_minY = middleyworld - ( clienth + border ) / 2.0 * uppx;
2320 a2dMemDcDrawer dcdrawer( imageSize.GetWidth(), imageSize.GetHeight() );
2323 a2dSmrtPtr<a2dDrawingPart> drawPart;
2324 if ( m_drawingPart )
2327 drawPart =
new a2dDrawingPart( imageSize.GetWidth(), imageSize.GetHeight() );
2330 drawPart->SetEvtHandlerEnabled(
false );
2335 dcdrawer.SetYaxis(
false );
2336 if ( m_drawingPart )
2339 dcdrawer.SetYaxis( m_drawingPart->GetDrawer2D()->GetYaxis() );
2344 setflags2.SetSkipNotRenderedInDrawing(
true );
2345 setflags2.Start( canvasobject,
false );
2348 dcdrawer.BeginDraw();
2350 drawPart->
UpdateArea( 0, 0, imageSize.GetWidth(), imageSize.GetHeight() );
2354 wxBitmap bitmap = dcdrawer.GetBuffer();
2361 template <
class parserTypeIn,
class parserTypeOut >
2362 void a2dDnDCanvasObjectData< parserTypeIn, parserTypeOut >::RenderToDc( wxDC* dc,
a2dCanvasObject* canvasobject )
const
2365 dc->GetSize( &dcw, &dch );
2367 wxSize imageSize = wxSize( 1000, 1000 );
2368 if ( m_drawingPart )
2369 imageSize = wxSize( m_drawingPart->GetDrawer2D()->GetWidth(), m_drawingPart->GetDrawer2D()->GetHeight() );
2371 int maxWidthHeight = wxMax( imageSize.x, imageSize.y );
2372 if ( m_exportWidthHeightImage )
2373 maxWidthHeight = m_exportWidthHeightImage;
2379 viewBox = canvasobject->
GetBbox();
2403 xpp = w / maxWidthHeight;
2404 ypp = h / maxWidthHeight;
2406 imageSize = wxSize( maxWidthHeight, (
int ) ( h / xpp ) );
2408 imageSize = wxSize( (
int ) ( w / ypp ), maxWidthHeight );
2414 int clientw = imageSize.GetWidth();
2415 int clienth = imageSize.GetHeight();
2418 int borderpercentual = 10;
2419 int border = ( int ) ( wxMin( clientw, clienth ) * borderpercentual / 100.0 ) ;
2421 if ( clientw - border > 0 )
2422 clientw = clientw - border;
2424 if ( clienth - border > 0 )
2425 clienth = clienth - border;
2432 double middlexworld = viewBox.
GetMinX() + w / 2.0;
2433 double middleyworld = viewBox.
GetMinY() + h / 2.0;
2434 virt_minX = middlexworld - ( clientw + border ) / 2.0 * uppx;
2435 virt_minY = middleyworld - ( clienth + border ) / 2.0 * uppx;
2439 a2dDcDrawer dcdrawer( imageSize.GetWidth(), imageSize.GetHeight() );
2442 a2dSmrtPtr<a2dDrawingPart> drawPart;
2443 if ( m_drawingPart )
2446 drawPart =
new a2dDrawingPart( imageSize.GetWidth(), imageSize.GetHeight() );
2449 drawPart->SetEvtHandlerEnabled(
false );
2451 dcdrawer.SetRenderDC( dc );
2455 dcdrawer.SetYaxis(
false );
2456 if ( m_drawingPart )
2459 dcdrawer.SetYaxis( m_drawingPart->GetDrawer2D()->GetYaxis() );
2464 setflags2.SetSkipNotRenderedInDrawing(
true );
2465 setflags2.Start( canvasobject,
false );
2468 dcdrawer.BeginDraw();
2470 drawPart->
UpdateArea( 0, 0, imageSize.GetWidth(), imageSize.GetHeight() );
2473 dcdrawer.SetRenderDC( NULL );
2484 class a2dDnDCameleonData :
public a2dDnDCanvasObjectDataCVG
2490 virtual ~a2dDnDCameleonData();
2495 virtual size_t GetDataSize(
const wxDataFormat& format)
const;
2497 virtual bool SetData(
const wxDataFormat& format,
2498 size_t WXUNUSED(len),
const void *buf);
2507 class a2dDnDCanvasObjectDropTarget :
public wxDropTarget
2511 : wxDropTarget(new a2dDnDCanvasObjectDataCVG )
2513 m_drawingPart = drawingPart;
2517 virtual wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def)
2522 #endif // wxUSE_STATUSBAR
2523 return OnDragOver(x, y, def);
2525 virtual void OnLeave()
2530 #endif // wxUSE_STATUSBAR
2532 virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def)
2536 wxLogError(wxT(
"Failed to get drag and drop data"));
2541 if ( m_drawingPart && m_drawingPart->GetDisplayWindow() )
2543 m_drawingPart->OnDrop(x, y,
2544 ((a2dDnDCanvasObjectDataCVG *)GetDataObject())->GetDrawing());
2553 #endif //wxUSE_DRAG_AND_DROP
2556 #if wxUSE_PRINTING_ARCHITECTURE
2604 a2dDrawingPrintOut(
const wxPageSetupDialogData& pageSetupData,
a2dDrawingPart* drawingPart,
const wxString& title,
const wxString& filename,
a2dPrintWhat typeOfPrint,
bool drawframe,
double scalelimit,
bool fitToPage );
2620 bool OnPrintPage(
int );
2622 bool HasPage(
int pageNum );
2624 bool OnBeginDocument(
int startPage,
int endPage );
2626 void GetPageInfo(
int* minPage,
int* maxPage,
int* selPageFrom,
int* selPageTo );
2630 const wxPageSetupDialogData& m_pageSetupData;
Prevent cloning a a2dCameleon reference at a deeper level.
static const a2dCanvasObjectFlagsMask SELECTED2
void SetMappingUpp(double vx1, double vy1, double xpp, double ypp)
Give the virtual size to be displayed, the mapping matrix will be calculated.
Display Part of a a2dDrawing, in which a2dCanvasObjects are shown.
double GetHeight() const
returns height of the boundingbox
bool m_gridlines
show grid as lines
a2dTileBox is a subarea of a tile.
wxUint32 GetPreviousObjectCount()
get currently counted number of objects on this layer inside a document.
#define wxDynamicCast(obj, className)
Define wxDynamicCast so that it will give a compiler error for unrelated types.
Base class for all types of strokes, understood by a2dDrawer2D classes.
Prevent cloning a reference at a deeper level.
bool m_frozen
buffer updating activity possible or not
a2dTiles m_tiles
tiles on drawing surface, used to optimize update areas.
int m_crosshairLengthX
crosshair cursor Length in X in pixels
void SetOverlayStroke(const a2dStroke &overlayStroke)
set a2dStroke to use when RenderFIX_STYLE is set.
void SetSelectStroke(const a2dStroke &selectStroke)
set a2dStroke to use when RenderWIREFRAME_SELECT or RenderWIREFRAME_SELECT_INVERT is set...
a2dFill m_gridfill
grid fill
void SetSelectFill(const a2dFill &selectFill)
set a2dFill to use when RenderWIREFRAME_SELECT or RenderWIREFRAME_SELECT_INVERT is set...
Simple Memory manager for some objects which often create and destroy to replace OS-system calls...
int m_y1
y1 in pixel coordinates
virtual wxString GetName() const
Returns the name of this object, if no name is given the internal id will be returned.
bool m_asrectangle
underneath the threshold draw rectangles.
bool GetGridLines()
Get setting for grid to draw lines instead of points.
bool m_check
if true layer need to be check again document for availability.
const a2dAffineMatrix & GetTransformMatrix() const
get the matrix used to position the object
void SetHighLight(const a2dFill &hightLightFill)
set a2dFill to use when RenderWIREFRAME_HighLight.
bool IsFrozen()
Returns if canvas is frozen.
class to map references to objects stored in XML, in order to make the connection later on...
wxUint16 m_gridsize
grid point size
int m_mouse_x
last mouse position
int m_x1
x1 in pixel coordinates
wxUint16 GetZoomOutBorder()
bool m_layeravailable
is the layer filled with primitives
wxUint32 m_documentDrawStyleRestore
to restore style after a temporary change.
int GetWorldMouseY()
get mouse position Y in world coordinates
a2dLayerViewList & GetLayerRenderArray()
get the layer render array
a2dCanvasObject * GetCaptured() const
are events redirected to a captured corridor? if so return the captured object in it...
void SetMappingDeviceRect(int mapx, int mapy, int mapWidth, int mapHeight, bool remap=false)
to change the default mapping (to the complete buffer).
void SetObjectCount(wxUint32 numberOfObjects)
set currently counted number of objects on this layer inside a document.
virtual bool Update(UpdateMode mode)
Update the state of the object according to its current position etc.
int m_crosshairx
crosshair x
void SetPrintFilename(bool val)
If true render the printout with a filename string, otherwise not.
int m_height
device size height
bool m_crosshair
is croshair visible
a2dStroke m_gridstroke
grid stroke
bool GetReverseOrder() const
Get Setting for draw layers in reverse order.
int toP(int tilexy)
convert internal tile to pixel coordinate tiles area
This class implements drawing functions for wxDC based drawing.
double m_gridx
grid distance in x
record in update list of a2dDrawingPart.
a2dFill m_backgroundfill
background fill of canvas and background color of background fill in case of mono colour fill ...
const a2dFill * a2dWHITE_FILL
global a2dFill stock object for WHITE filling
void SetBackgroundFill(const a2dFill &backgroundfill)
background fill for the canvas
This class implements drawing functions for wxDC based drawing.
void SetGrid(bool grid)
Set grid on/off.
A trivial base class for a2dSmrtPtr. Non-template class, so that it can.
a2dFill m_select2Fill
select style fill
void SetFilename(const wxString filename, wxBitmapType type, bool doread=true)
set filename and type of image for saving.
int toT(int xy)
convert pixel to internal tile coordinate tiles area
void SetDocumentDrawStyle(wxUint32 drawstyle)
set drawstyles to use for drawing the document
int ModT(int xy)
xy modules 256
void SetAvailable(bool status)
set layer available (will be rendered)
#define DECLARE_PROPERTIES()
check if class has the given id as a valid id for this object
wxUint16 GetHitMarginDevice() const
Get HitMargin used to extend a hittest with the number of pixels.
int x1p()
get x1 in pixel coordinates
virtual void UpdateArea(int x, int y, int width, int height, wxUint8 id=0)
update/redraw part of the buffer, using the given a2dDrawing and ShowObject within that root...
int GetCrossHairLengthX()
get crosshair cursor Length in X in pixels
int GetMouseY()
get mouse position Y
a2dCanvasObject is the base class for Canvas Objects.
static const a2dSignal sig_changedLayerVisibleInView
when one layer is set visible in a2dDrawingPart
wxStringOutputStream a2dDocumentStringOutputStream
string output stream based wxStreams
a2dStroke m_overlayStroke
overlay style stroke
wxString m_title
title put above printout
void SetFixedStyleStroke(const a2dStroke &fixStroke)
set a2dStroke to use when RenderFIX_STYLE is set.
static bool m_printAsBitmap
if set print a bitmap that was drawn into
a2dCanvas * GetCanvas() const
Get the Display window of the a2dView. But casted to a a2dCanvas.
int m_crosshairy
crosshair y
bool m_printfittopage
If true, draw a view on all page without real scale.
bool GetMouseEvents() const
return true if this a2dDrawingPart allows mouse events to be processed.
a2dStroke m_selectStroke
select style stroke
double GetGridX()
Get grid distance in X.
int m_x2
x2 in pixel coordinates
int m_height
number of vertical tiles
wxUint32 m_documentDrawStyle
drawstyles to use when rendering document
a2dCanvasObjectPtr m_top
top object for drawer object, from here the rendering starts
a2dUpdateArea * m_rectPrevRow
prev row pointer to combine tiles into rectangles
bool m_drawframe
draw a frame around the page
bool GetSelected() const
is the object selected flag set
a2dLayerViewList m_layerRenderArray
which layer should be rendered ( visible and/or available )
a2dStroke m_crosshairStroke
stroke to use for crosshair
void SetGridSize(wxUint16 gridsize)
set size of grid circle
void SetGridThreshold(wxUint16 gridthres)
a2dPrintWhat m_typeOfPrint
type of print requested
bool IsVisible() const
get visibility (rendering depends on layer settings also)
a2dCanvasObjectPtr m_endCorridorObject
when a corridor is active, this is set.
void SetCrossHairLengthX(int LengthX)
set crosshair cursor Length in X in pixels
bool GetGridAtFront()
Get grid setting for drawing grid in front or back.
wxUint64 a2dCanvasObjectFlagsMask
mask flags for a2dCanvasObject
void IncrementObjectCount()
increment currently counted number of objects on this layer inside a document.
virtual void OnPropertyChanged(const a2dPropertyId *id)
This function is called after a property changed.
void SetGridX(double gridx)
Set grid distance in X.
static const a2dSignal sig_changedLayerAvailable
when an object is added to a layer, and therefore makes this layer available.
a2dText is an abstract base class.
void SetGridAtFront(bool gridatfront)
Set grid setting for drawing grid in front or back.
bool m_showorigin
showorigin?
see a2dCanvasObjectMouseEvent
bool DoRenderLayer()
should this layer be rendered
bool GetValid() const
returns true if boundingbox is calculated properly and therefore its valid flag is set...
double GetMinX() const
get minimum X of the boundingbox
a2dDrawingPart * m_drawingPart
maping defined by this canvas
bool m_mouseevents
enable/ disable mouse events handling by canvas
static const a2dSignal sig_changedShowObject
double m_scalelimit
limit scaling to this value (world/pixel)
#define forEachIn(listtype, list)
easy iteration for a2dlist
double GetGridY()
Get grid distance in Y.
int m_y2
y2 in pixel coordinates
int m_width
device size width
double m_printscalelimit
Set the scaling limit for printing, so that small stuff is not zoomed to full page.
bool GetGrid()
Get grid setting on/off.
wxUint16 a2dPrintWhat
defines what to print
a2dHitOption
Enum for hit test options.
int m_width
number of horizontal tiles
void SetFixedStyleFill(const a2dFill &fixFill)
set a2dFill to use when RenderFIX_STYLE is set.
void SetAvailable()
check which layers do contain objects as seen from the ShowObject()
int GetCrossHairLengthY()
get crosshair cursor Length in Y in pixels
Drawing context abstraction.
void * Allocate(size_t bytes)
function for allocating memory block by size bytes
maintains a list of areas on a view to be redrawn.
a2dCanvasObject * GetShowObject() const
return pointer of then currently shown object on the drawer.
a2dImage (will scale/rotate image when needed)
void SetPrintScaleLimit(double val)
Set the scaling limit for printing, so that small stuff is not zoomed to full page.
int m_crosshairLengthY
crosshair cursor Length in Y in pixels
int y2p()
get y2 in pixel coordinates
void Translate(double x, double y)
relative translate the object to position x,y in world coordinates
wxStringInputStream a2dDocumentStringInputStream
string input stream based wxStreams
static void SetPrintAsBitmap(bool printAsBitmap)
if set, printing is done via a bitmap which is drawn into, and next bitmap is printed.
Contains graphical drawing context specific classes. a2dDcDrawer and derived classes are used for dra...
a2dUpdateList m_updateareas
list of rectangles that need to be blited to the screen.
a2dDrawer2D * GetDrawer2D()
get the internal m_drawer2D that is used for rendering the document
static const a2dCanvasObjectFlagsMask SELECTED
void SetVisible(bool status)
set layer visible
wxUint16 m_gridthres
threshold for grid.
a2dStroke m_fixStroke
fixed style stroke
Contains a2dDrawing Class to hold a drawing.
a2dFill m_selectFill
select style fill
set a2dCanvasObjects flags in a hierarchy of a a2dCanvasDocument
int GetWorldMouseX()
get mouse position X in world coordinates
wxUint16 m_border
border zoomout but leaf around a border of this amount of pixels.
corridor as a direct event path to a a2dCanvasObject
bool GetVisible()
is the layer visible
a2dCanvasObject * GetEndCorridorObject() const
return the corridor object if set else NULL
double m_gridy
grid distance in y
A 2x3 affine matrix class for 2D transformations.
bool GetCrossHair()
get enable crosshair cursor
static bool GetPrintAsBitmap()
if set, printing is done via a bitmap which is drawn into, and next bitmap is printed.
a2dCanvas is used to display one of the a2dCanvasObjects which are part of a a2dCanvasDocument object...
void Set_UpdateAvailableLayers(bool value)
Sets a flag for updating available layers checking, which makes sure layers will be checked first whe...
bool HasPopOut() const
is there structure to popout (see PushIn )
a2dDocumentRenderStyle m_overlayDrawStyle
drawstyles to use when rendering overlay
a storage for a a tiled area
bool m_reverse_order
draw in reverse order if set
Contains graphical drawing context specific classes. a2dDrawer2D and derived classes are used for dra...
static const a2dSignal sig_changedLayers
when more layers changed ( rerendering view is needed).
a2dStroke & GetCrossHairStroke()
get stroke for crosshair
vector< a2dTileBox > m_tiles
array of tiles ( normally m_width * m_height )
bool Get_UpdateAvailableLayers() const
update layers available needed?
a2dWalker based algorithms
All updates of these modes force an update (e.g. update non-pending valid bounding boxes) ...
void SetSelect2Stroke(const a2dStroke &select2Stroke)
set a2dStroke to use when RenderWIREFRAME_SELECT2 or RenderWIREFRAME_SELECT2_INVERT is set...
void MapBbox(const a2dAffineMatrix &matrix)
void Aberration(double aber, double angle, double radius, double &dphi, unsigned int &segments)
calculate number of segments in an arc such that a certain accuracy is maintained ...
void SetGridY(double gridy)
Set grid distance in Y.
bool GetViewDependentObjects() const
see SetViewDependentObjects()
void SetPreviousObjectCount(wxUint32 numberOfObjects)
set currently counted number of objects on this layer inside a document.
a2dSmrtPtr< a2dToolContr > m_toolcontroller
toolscontroller plugged in as first event handler
bool GetCheck()
check this layer?
void SetViewDependentObjects(bool viewDependentObjects)
if set true, drawing can contain objects that depend on this view (size etc).
void SetText(const wxString &text)
set the text for the object ' ' in string means new line
double m_displayaberration
accuracy of arc segment calculation etc. in device coordinates
bool GetRelease() const
get release flag
editing tool for a2dCanvasObject's
void RestoreDrawStyle()
restore drawstyle to the one before the last change
int x2p()
get x2 in pixel coordinates
wxUint32 m_canvasObjectCount
This is the base class for all kinds of property id's for a2dObject.
double GetWidth() const
returns width of the boundingbox
a2dCanvasObject * SetShowObject(const wxString &name)
set object available in the a2dDrawing to be shown on the drawer
wxUint16 m_hitmargin
how close does a hit need to be to the object you are trying to hit.
void SetPrintFrame(bool val)
If true, draw a frame around printouts.
void SetPrintFitToPage(bool val)
If true, draw a view on all page without real scale.
bool m_printtitle
if true, a printout is done with title (document name (description?)), otherwise not ...
bool GetAvailable()
are the objects on this layer
void SetSelect2Fill(const a2dFill &select2Fill)
set a2dFill to use when RenderWIREFRAME_SELECT2 or RenderWIREFRAME_SELECT2_INVERT is set...
Event sent to a2dCommandProcessor.
Used by a2dDrawingPart to decide what layers are to be rendered.
void SetToolWantsEventToContinue(bool continueEvent=true)
if tool want an event to be handled by the view, even if already processed.
bool m_gridatfront
grid drawn at front or back
wxUint16 GetGridThreshold()
Get grid threshold.
wxString m_filename
filename put below printout
bool m_printfilename
if true, a printout is done with filename (document file path), otherwise not
bool m_recur
to prevent recursive updates
The a2dBoundingBox class stores one a2dBoundingBox of a a2dCanvasObject.
bool Invert(void)
Invert matrix.
void SetCheck(bool status)
set the layer to be checked in idle time.
a2dTileBox tile(int i)
get tile at index i
bool m_layervisible
is the layer visible
double GetMinY() const
get minimum Y of the boundingbox
void SetZoomOutBorder(wxUint16 border)
zoomout leafs a border of this amount of pixels around the drawing
void DecrementObjectCount()
decrement currently counted number of objects on this layer inside a document.
void SetHighLight(const a2dStroke &hightLightStroke)
set a2dStroke to use when RenderWIREFRAME_HighLight.
a2dClipRegionList m_clipregionlist
pushed clipping regions
a2dFill m_highLightFill
highLight style fill
void SetCaptured(a2dCanvasObject *captured)
set the object that is captured for events in the a2dDrawing.
void SetHitMargin(wxUint16 pixels)
used to extend a hittest with the number of pixels.
a2dCanvasGlobal * a2dCanvasGlobals
global a2dCanvasGlobal to have easy access to global settings
a2dStroke m_select2Stroke
select style stroke
This template class is for property ids with a known data type.
wxUint32 GetDocumentDrawStyle()
get drawstyles used for drawing the document
int GetMouseX()
get mouse position X
void SetGridLines(bool gridlines)
Get grid setting for line drawing.
bool m_update_available_layers
flag to updatelayers that are available.
void SetShowOrigin(bool show)
Set showorigin on/off.
void SetDrawer2D(a2dDrawer2D *drawer2d, bool noDelete=false)
set the internal m_drawer2D to be used for rendering the document
void Append(a2dCanvasObject *obj)
append a a2dCanvasObject to the childobjects
a2dStroke m_highLightStroke
highLight style stroke
void SetCrossHairLengthY(int LengthY)
set crosshair cursor Length in Y in pixels
bool m_virtualarea_set
is the virtual area set already (used during startup)
wxUint32 GetObjectCount()
get currently counted number of objects on this layer inside a document.
double m_splineaberration
accuracy of spline
a2dDocumentRenderStyle
Define the manner in which a2dCanvasView draws the document to the device.
to print what is displayed on a a2dDrawingPart or the whole document as seen from the showobject of t...
wxString GetText() const
get the text of the object ' ' in string means new line
a2dFill m_fixFill
fixed style fill
bool m_printframe
If true, draw a frame around printouts.
a2dCanvasObjectPtr m_capture
object that is receiving events
a2dText * GetTextTemplateObject()
set template for line object
CloneOptions
options for cloning
int y1p()
get y1 in pixel coordinates
void SetOverlayFill(const a2dFill &overlayFill)
set a2dFill to use when RenderFIX_STYLE is set.
a2dFill & GetBackgroundFill()
get current background fill for the canvas
a2dBoundingBox & GetBbox()
get boundingbox in world coordinates exclusive stroke width relative to its parent ...
structure to give as parameter to member functions of a2dCanvasObject
Contain one drawing as hierarchical tree of a2dCanvasObject's.
void SetFill(const a2dFill &fill)
Set a fill for the object which will be used instead of the layer fill.
a2dFill m_overlayFill
overlay style fill
a2dLayerView()
constructor
void SetPrintTitle(bool val)
If true render the printout with a title string, otherwise not.
static void SetIgnoreAllSetpending(bool value=true)
set static IgnoreAllSetpending flag
const a2dFill * a2dTRANSPARENT_FILL
global a2dFill stock object for TRANSPARENT filling