You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

343 lines
9.6 KiB

  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2011 jean-pierre.charras
  5. * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation; either version 2
  10. * of the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, you may find one here:
  19. * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  20. * or you may search the http://www.gnu.org website for the version 2 license,
  21. * or you may write to the Free Software Foundation, Inc.,
  22. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  23. */
  24. /**
  25. * @file sch_bitmap.cpp
  26. */
  27. #include "sch_bitmap.h"
  28. #include <bitmap_base.h>
  29. #include <bitmaps.h>
  30. #include <base_units.h>
  31. #include <common.h>
  32. #include <core/mirror.h>
  33. #include <eda_draw_frame.h>
  34. #include <geometry/geometry_utils.h>
  35. #include <plotters/plotter.h>
  36. #include <sch_draw_panel.h>
  37. #include <settings/color_settings.h>
  38. #include <trigo.h>
  39. #include <wx/mstream.h>
  40. SCH_BITMAP::SCH_BITMAP( const VECTOR2I& pos ) :
  41. SCH_ITEM( nullptr, SCH_BITMAP_T ),
  42. m_referenceImage( schIUScale)
  43. {
  44. m_referenceImage.SetPosition( pos );
  45. m_layer = LAYER_NOTES; // used only to draw/plot a rectangle,
  46. // when a bitmap cannot be drawn or plotted
  47. }
  48. SCH_BITMAP::SCH_BITMAP( const SCH_BITMAP& aSchBitmap ) :
  49. SCH_ITEM( aSchBitmap ),
  50. m_referenceImage( aSchBitmap.m_referenceImage )
  51. {
  52. }
  53. SCH_BITMAP& SCH_BITMAP::operator=( const SCH_ITEM& aItem )
  54. {
  55. wxCHECK_MSG( Type() == aItem.Type(), *this,
  56. wxT( "Cannot assign object type " ) + aItem.GetClass() + wxT( " to type " ) +
  57. GetClass() );
  58. if( &aItem != this )
  59. {
  60. SCH_ITEM::operator=( aItem );
  61. const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
  62. m_referenceImage = bitmap.m_referenceImage;
  63. }
  64. return *this;
  65. }
  66. EDA_ITEM* SCH_BITMAP::Clone() const
  67. {
  68. return new SCH_BITMAP( *this );
  69. }
  70. void SCH_BITMAP::swapData( SCH_ITEM* aItem )
  71. {
  72. wxCHECK_RET( aItem->Type() == SCH_BITMAP_T,
  73. wxString::Format( wxT( "SCH_BITMAP object cannot swap data with %s object." ),
  74. aItem->GetClass() ) );
  75. SCH_BITMAP* item = (SCH_BITMAP*) aItem;
  76. m_referenceImage.SwapData( item->m_referenceImage );
  77. }
  78. const BOX2I SCH_BITMAP::GetBoundingBox() const
  79. {
  80. return m_referenceImage.GetBoundingBox();
  81. }
  82. VECTOR2I SCH_BITMAP::GetPosition() const
  83. {
  84. return m_referenceImage.GetPosition();
  85. }
  86. void SCH_BITMAP::SetPosition( const VECTOR2I& aPosition )
  87. {
  88. m_referenceImage.SetPosition( aPosition );
  89. }
  90. void SCH_BITMAP::Move( const VECTOR2I& aMoveVector )
  91. {
  92. SetPosition( GetPosition() + aMoveVector );
  93. }
  94. void SCH_BITMAP::MirrorVertically( int aCenter )
  95. {
  96. m_referenceImage.Flip( VECTOR2I( 0, aCenter ), FLIP_DIRECTION::TOP_BOTTOM );
  97. }
  98. void SCH_BITMAP::MirrorHorizontally( int aCenter )
  99. {
  100. m_referenceImage.Flip( VECTOR2I( aCenter, 0 ), FLIP_DIRECTION::LEFT_RIGHT );
  101. }
  102. void SCH_BITMAP::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
  103. {
  104. m_referenceImage.Rotate( aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
  105. }
  106. #if defined(DEBUG)
  107. void SCH_BITMAP::Show( int nestLevel, std::ostream& os ) const
  108. {
  109. // XML output:
  110. wxString s = GetClass();
  111. NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << GetPosition() << "/>\n";
  112. }
  113. #endif
  114. bool SCH_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
  115. {
  116. return KIGEOM::BoxHitTest( aPosition, GetBoundingBox(), aAccuracy );
  117. }
  118. bool SCH_BITMAP::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
  119. {
  120. return KIGEOM::BoxHitTest( aRect, GetBoundingBox(), aContained, aAccuracy );
  121. }
  122. bool SCH_BITMAP::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
  123. {
  124. return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
  125. }
  126. void SCH_BITMAP::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
  127. int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
  128. {
  129. if( aBackground )
  130. {
  131. RENDER_SETTINGS* cfg = aPlotter->RenderSettings();
  132. m_referenceImage.GetImage().PlotImage( aPlotter, GetPosition(),
  133. cfg->GetLayerColor( GetLayer() ),
  134. cfg->GetDefaultPenWidth() );
  135. }
  136. }
  137. BITMAPS SCH_BITMAP::GetMenuImage() const
  138. {
  139. return BITMAPS::image;
  140. }
  141. void SCH_BITMAP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
  142. {
  143. aList.emplace_back( _( "Bitmap" ), wxEmptyString );
  144. aList.emplace_back( _( "PPI" ),
  145. wxString::Format( wxT( "%d " ), m_referenceImage.GetImage().GetPPI() ) );
  146. aList.emplace_back( _( "Scale" ),
  147. wxString::Format( wxT( "%f " ), m_referenceImage.GetImageScale() ) );
  148. aList.emplace_back( _( "Width" ),
  149. aFrame->MessageTextFromValue( m_referenceImage.GetSize().x ) );
  150. aList.emplace_back( _( "Height" ),
  151. aFrame->MessageTextFromValue( m_referenceImage.GetSize().y ) );
  152. }
  153. std::vector<int> SCH_BITMAP::ViewGetLayers() const
  154. {
  155. return { LAYER_DRAW_BITMAPS, LAYER_SELECTION_SHADOWS };
  156. }
  157. bool SCH_BITMAP::operator==( const SCH_ITEM& aItem ) const
  158. {
  159. if( Type() != aItem.Type() )
  160. return false;
  161. const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
  162. return m_referenceImage == bitmap.m_referenceImage;
  163. }
  164. double SCH_BITMAP::Similarity( const SCH_ITEM& aItem ) const
  165. {
  166. if( Type() != aItem.Type() )
  167. return 0.0;
  168. if( m_Uuid == aItem.m_Uuid )
  169. return 1.0;
  170. const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
  171. return m_referenceImage.Similarity( bitmap.m_referenceImage );
  172. }
  173. int SCH_BITMAP::GetTransformOriginOffsetX() const
  174. {
  175. return m_referenceImage.GetTransformOriginOffset().x;
  176. }
  177. void SCH_BITMAP::SetTransformOriginOffsetX( int aX )
  178. {
  179. VECTOR2I offset = m_referenceImage.GetTransformOriginOffset();
  180. offset.x = aX;
  181. m_referenceImage.SetTransformOriginOffset( offset );
  182. }
  183. int SCH_BITMAP::GetTransformOriginOffsetY() const
  184. {
  185. return m_referenceImage.GetTransformOriginOffset().y;
  186. }
  187. void SCH_BITMAP::SetTransformOriginOffsetY( int aY )
  188. {
  189. VECTOR2I offset = m_referenceImage.GetTransformOriginOffset();
  190. offset.y = aY;
  191. m_referenceImage.SetTransformOriginOffset( offset );
  192. }
  193. double SCH_BITMAP::GetImageScale() const
  194. {
  195. return m_referenceImage.GetImageScale();
  196. }
  197. void SCH_BITMAP::SetImageScale( double aScale )
  198. {
  199. m_referenceImage.SetImageScale( aScale );
  200. }
  201. int SCH_BITMAP::GetWidth() const
  202. {
  203. return m_referenceImage.GetImage().GetSize().x;
  204. }
  205. void SCH_BITMAP::SetWidth( int aWidth )
  206. {
  207. m_referenceImage.SetWidth( aWidth );
  208. }
  209. int SCH_BITMAP::GetHeight() const
  210. {
  211. return m_referenceImage.GetImage().GetSize().y;
  212. }
  213. void SCH_BITMAP::SetHeight( int aHeight )
  214. {
  215. m_referenceImage.SetHeight( aHeight );
  216. }
  217. static struct SCH_BITMAP_DESC
  218. {
  219. SCH_BITMAP_DESC()
  220. {
  221. PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance();
  222. REGISTER_TYPE( SCH_BITMAP );
  223. propMgr.InheritsAfter( TYPE_HASH( SCH_BITMAP ), TYPE_HASH( SCH_ITEM ) );
  224. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position X" ),
  225. &SCH_BITMAP::SetX, &SCH_BITMAP::GetX,
  226. PROPERTY_DISPLAY::PT_COORD ) );
  227. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position Y" ),
  228. &SCH_BITMAP::SetY, &SCH_BITMAP::GetY,
  229. PROPERTY_DISPLAY::PT_COORD ) );
  230. const wxString groupImage = _HKI( "Image Properties" );
  231. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, double>( _HKI( "Scale" ),
  232. &SCH_BITMAP::SetImageScale, &SCH_BITMAP::GetImageScale ),
  233. groupImage );
  234. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Transform Offset X" ),
  235. &SCH_BITMAP::SetTransformOriginOffsetX,
  236. &SCH_BITMAP::GetTransformOriginOffsetX,
  237. PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_X_COORD ),
  238. groupImage );
  239. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Transform Offset Y" ),
  240. &SCH_BITMAP::SetTransformOriginOffsetY,
  241. &SCH_BITMAP::GetTransformOriginOffsetY,
  242. PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_Y_COORD ),
  243. groupImage );
  244. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Width" ),
  245. &SCH_BITMAP::SetWidth, &SCH_BITMAP::GetWidth,
  246. PROPERTY_DISPLAY::PT_COORD ),
  247. groupImage );
  248. propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Height" ),
  249. &SCH_BITMAP::SetHeight, &SCH_BITMAP::GetHeight,
  250. PROPERTY_DISPLAY::PT_COORD ),
  251. groupImage );
  252. }
  253. } _SCH_BITMAP_DESC;