KiCad PCB EDA Suite
Loading...
Searching...
No Matches
board_adapter.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2015-2016 Mario Luzeiro <[email protected]>
5 * Copyright (C) 2023 CERN
6 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#ifndef BOARD_ADAPTER_H
27#define BOARD_ADAPTER_H
28
29#include <array>
30#include <vector>
31#include "../3d_rendering/raytracing/accelerators/container_2d.h"
32#include "../3d_rendering/raytracing/accelerators/container_3d.h"
33#include "../3d_rendering/raytracing/shapes3D/bbox_3d.h"
34#include <gal/3d/camera.h>
35#include "../3d_enums.h"
36#include "../3d_cache/3d_cache.h"
37#include "../common_ogl/ogl_attr_list.h"
38#include "../3d_viewer/eda_3d_viewer_settings.h"
39
40#include <layer_ids.h>
41#include <pad.h>
42#include <pcb_track.h>
43#include <pcb_base_frame.h>
44#include <pcb_text.h>
45#include <pcb_shape.h>
46#include <pcb_dimension.h>
47#include <zone.h>
48#include <footprint.h>
49#include <reporter.h>
51
52class COLOR_SETTINGS;
53
55typedef std::map<PCB_LAYER_ID, BVH_CONTAINER_2D*> MAP_CONTAINER_2D_BASE;
56
58typedef std::map<PCB_LAYER_ID, SHAPE_POLY_SET*> MAP_POLY;
59
63#define RANGE_SCALE_3D 8.0f
64
65
70{
71public:
73
75
81 void Set3dCacheManager( S3D_CACHE* aCacheMgr ) noexcept { m_3dModelManager = aCacheMgr; }
82 S3D_CACHE* Get3dCacheManager() const noexcept { return m_3dModelManager; }
83
89 bool Is3dLayerEnabled( PCB_LAYER_ID aLayer,
90 const std::bitset<LAYER_3D_END>& aVisibilityFlags ) const;
91
95 bool IsFootprintShown( FOOTPRINT_ATTR_T aFPAttributes ) const;
96
102 void SetBoard( BOARD* aBoard ) noexcept { m_board = aBoard; }
103 const BOARD* GetBoard() const noexcept { return m_board; }
104
105 void ReloadColorSettings() noexcept;
106
107 std::map<int, COLOR4D> GetLayerColors() const;
108 std::map<int, COLOR4D> GetDefaultColors() const;
109 void SetLayerColors( const std::map<int, COLOR4D>& aColors );
110
111 std::bitset<LAYER_3D_END> GetVisibleLayers() const;
112 void SetVisibleLayers( const std::bitset<LAYER_3D_END>& aLayers );
113
120 void InitSettings( REPORTER* aStatusReporter, REPORTER* aWarningReporter );
121
127 double BiuTo3dUnits() const noexcept { return m_biuTo3Dunits; }
128
134 const BBOX_3D& GetBBox() const noexcept { return m_boardBoundingBox; }
135
139 float GetBoardBodyThickness() const noexcept { return m_boardBodyThickness3DU; }
140
145
149 float GetFrontCopperThickness() const noexcept { return m_frontCopperThickness3DU; }
150 float GetBackCopperThickness() const noexcept { return m_backCopperThickness3DU; }
151
155 int GetHolePlatingThickness() const noexcept;
156
162 VECTOR2I GetBoardSize() const noexcept { return m_boardSize; }
163
169 VECTOR2I GetBoardPos() const noexcept { return m_boardPos; }
170
176 const SFVEC3F& GetBoardCenter() const noexcept { return m_boardCenter; }
177
185 float GetFootprintZPos( bool aIsFlipped ) const ;
186
192 const SHAPE_POLY_SET& GetBoardPoly() const noexcept { return m_board_poly; }
193
200 SFVEC4F GetLayerColor( PCB_LAYER_ID aLayerId ) const;
201
208 SFVEC4F GetItemColor( int aItemId ) const;
209
214 SFVEC4F GetColor( const COLOR4D& aColor ) const;
215
216 SFVEC2F GetSphericalCoord( int i ) const;
217
224 float GetLayerTopZPos( PCB_LAYER_ID aLayerId ) const noexcept
225 {
226 return m_layerZcoordTop[aLayerId];
227 }
228
235 float GetLayerBottomZPos( PCB_LAYER_ID aLayerId ) const noexcept
236 {
237 return m_layerZcoordBottom[aLayerId];
238 }
239
245 const MAP_CONTAINER_2D_BASE& GetLayerMap() const noexcept { return m_layerMap; }
246 const BVH_CONTAINER_2D* GetPlatedPadsFront() const noexcept { return m_platedPadsFront; }
247 const BVH_CONTAINER_2D* GetPlatedPadsBack() const noexcept { return m_platedPadsBack; }
249 const BVH_CONTAINER_2D* GetOffboardPadsBack() const noexcept { return m_offboardPadsBack; }
250
251 const MAP_CONTAINER_2D_BASE& GetLayerHoleMap() const noexcept { return m_layerHoleMap; }
252 const BVH_CONTAINER_2D& GetTH_IDs() const noexcept { return m_TH_IDs; }
253 const BVH_CONTAINER_2D& GetTH_ODs() const noexcept { return m_TH_ODs; }
254
262 const SHAPE_POLY_SET& GetTH_ODPolys() const noexcept
263 {
264 return m_TH_ODPolys;
265 }
266
267 const BVH_CONTAINER_2D& GetViaAnnuli() const noexcept
268 {
269 return m_viaAnnuli;
270 }
271
272 const SHAPE_POLY_SET& GetViaAnnuliPolys() const noexcept
273 {
274 return m_viaAnnuliPolys;
275 }
276
277 const SHAPE_POLY_SET& GetNPTH_ODPolys() const noexcept
278 {
279 return m_NPTH_ODPolys;
280 }
281
285 const BVH_CONTAINER_2D& GetViaTH_ODs() const noexcept
286 {
287 return m_viaTH_ODs;
288 }
289
290 const SHAPE_POLY_SET& GetViaTH_ODPolys() const noexcept
291 {
292 return m_viaTH_ODPolys;
293 }
294
295 unsigned int GetViaCount() const noexcept { return m_viaCount; }
296 unsigned int GetHoleCount() const noexcept { return m_holeCount; }
297
301 float GetAverageViaHoleDiameter() const noexcept { return m_averageViaHoleDiameter; }
302
306 float GetAverageHoleDiameter() const noexcept { return m_averageHoleDiameter; }
307
311 float GetAverageTrackWidth() const noexcept { return m_averageTrackWidth; }
312
317 unsigned int GetCircleSegmentCount( float aDiameter3DU ) const;
318
323 unsigned int GetCircleSegmentCount( int aDiameterBIU ) const;
324
330 const MAP_POLY& GetPolyMap() const noexcept { return m_layers_poly; }
331
334 const MAP_POLY& GetHoleIdPolysMap() const noexcept { return m_layerHoleIdPolys; }
335 const MAP_POLY& GetHoleOdPolysMap() const noexcept { return m_layerHoleOdPolys; }
336
337private:
343 bool createBoardPolygon( wxString* aErrorMsg );
344 void createLayers( REPORTER* aStatusReporter );
345 void destroyLayers();
346
347 // Helper functions to create the board
348 void createViaWithMargin( const PCB_TRACK* aTrack, CONTAINER_2D_BASE* aDstContainer,
349 int aMargin );
350
351 void createTrack( const PCB_TRACK* aTrack, CONTAINER_2D_BASE* aDstContainer );
352
353 void createPadWithMargin( const PAD *aPad, CONTAINER_2D_BASE* aDstContainer,
354 PCB_LAYER_ID aLayer, const VECTOR2I& aMargin ) const;
355
356 void createPadWithHole( const PAD* aPad, CONTAINER_2D_BASE* aDstContainer,
357 int aInflateValue );
358
359 void addPads( const FOOTPRINT* aFootprint, CONTAINER_2D_BASE* aDstContainer,
360 PCB_LAYER_ID aLayerId, bool aSkipPlatedPads, bool aSkipNonPlatedPads );
361
362 void addFootprintShapes( const FOOTPRINT* aFootprint, CONTAINER_2D_BASE* aDstContainer,
363 PCB_LAYER_ID aLayerId,
364 const std::bitset<LAYER_3D_END>& aVisibilityFlags );
365
366 void addText( const EDA_TEXT* aText, CONTAINER_2D_BASE* aDstContainer,
367 const BOARD_ITEM* aOwner );
368
369 void addShape( const PCB_SHAPE* aShape, CONTAINER_2D_BASE* aContainer,
370 const BOARD_ITEM* aOwner );
371
372 void addShape( const PCB_DIMENSION_BASE* aDimension, CONTAINER_2D_BASE* aDstContainer,
373 const BOARD_ITEM* aOwner );
374
375 void addSolidAreasShapes( const ZONE* aZone, CONTAINER_2D_BASE* aDstContainer,
376 PCB_LAYER_ID aLayerId );
377
378 void createArcSegments( const VECTOR2I& aCentre, const VECTOR2I& aStart,
379 const EDA_ANGLE& aArcAngle, int aCircleToSegmentsCount, int aWidth,
380 CONTAINER_2D_BASE* aContainer, const BOARD_ITEM& aOwner );
381
382 void buildPadOutlineAsSegments( const PAD* aPad, CONTAINER_2D_BASE* aDstContainer, int aWidth );
383
384public:
390
400
401public:
403
408
422
423private:
427
432
435
440
443
448
450
453
458
463
465
468
469 std::array<float, PCB_LAYER_ID_COUNT> m_layerZcoordTop;
471
472 std::array<float, PCB_LAYER_ID_COUNT> m_layerZcoordBottom;
474
480
481 unsigned int m_trackCount;
483 unsigned int m_viaCount;
485 unsigned int m_holeCount;
487
493 static const wxChar* m_logTrace;
494
495};
496
497
499{
500public:
501 virtual BOARD_ADAPTER& GetAdapter() = 0;
502 virtual CAMERA& GetCurrentCamera() = 0;
503
505};
506
507#endif // BOARD_ADAPTER_H
std::map< PCB_LAYER_ID, SHAPE_POLY_SET * > MAP_POLY
A type that stores polysets for each layer id.
Definition: board_adapter.h:58
std::map< PCB_LAYER_ID, BVH_CONTAINER_2D * > MAP_CONTAINER_2D_BASE
A type that stores a container of 2d objects for each layer id.
Definition: board_adapter.h:55
Define an abstract camera.
Helper class to handle information needed to display 3D board.
Definition: board_adapter.h:70
MAP_CONTAINER_2D_BASE m_layerHoleMap
Holes for each layer.
double BiuTo3dUnits() const noexcept
Board integer units To 3D units.
BVH_CONTAINER_2D * m_offboardPadsBack
SFVEC4F m_BgColorTop
background top color
SFVEC4F m_ECO2Color
void SetVisibleLayers(const std::bitset< LAYER_3D_END > &aLayers)
float m_solderPasteLayerThickness3DU
const MAP_CONTAINER_2D_BASE & GetLayerHoleMap() const noexcept
S3D_CACHE * m_3dModelManager
void createLayers(REPORTER *aStatusReporter)
VECTOR2I m_boardPos
Board center position in board internal units.
float m_backCopperThickness3DU
SHAPE_POLY_SET m_TH_ODPolys
PTH outer diameters.
static KIGFX::COLOR4D g_DefaultComments
SFVEC4F m_SolderPasteColor
in realistic mode: solder paste color
static CUSTOM_COLORS_LIST g_PasteColors
BBOX_3D m_boardBoundingBox
3D bounding box of the board in 3D units.
static CUSTOM_COLORS_LIST g_FinishColors
static KIGFX::COLOR4D g_DefaultBoardBody
const SHAPE_POLY_SET & GetBoardPoly() const noexcept
Get the current polygon of the epoxy board.
const SHAPE_POLY_SET & GetNPTH_ODPolys() const noexcept
unsigned int m_viaCount
const BVH_CONTAINER_2D * GetOffboardPadsFront() const noexcept
COLOR_SETTINGS * m_colors
bool IsFootprintShown(FOOTPRINT_ATTR_T aFPAttributes) const
Test if footprint should be displayed in relation to attributes and the flags.
static KIGFX::COLOR4D g_DefaultSolderMask
std::map< int, COLOR4D > GetLayerColors() const
const SHAPE_POLY_SET & GetViaTH_ODPolys() const noexcept
const MAP_POLY & GetPolyMap() const noexcept
Get map of polygon's layers.
std::array< float, PCB_LAYER_ID_COUNT > m_layerZcoordBottom
Bottom (Start) Z position of each layer in 3D units.
MAP_POLY m_layerHoleOdPolys
Hole outer diameters (per layer)
void addSolidAreasShapes(const ZONE *aZone, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayerId)
VECTOR2I GetBoardSize() const noexcept
Get the board size.
const MAP_POLY & GetHoleOdPolysMap() const noexcept
SHAPE_POLY_SET * m_frontPlatedCopperPolys
MAP_CONTAINER_2D_BASE m_layerMap
2D elements for each layer.
BVH_CONTAINER_2D m_TH_ODs
List of PTH outer diameters.
float GetAverageTrackWidth() const noexcept
unsigned int m_trackCount
const BBOX_3D & GetBBox() const noexcept
Get the board outling bounding box.
float m_averageTrackWidth
SHAPE_POLY_SET m_board_poly
Board outline polygon.
std::bitset< LAYER_3D_END > GetVisibleLayers() const
SFVEC4F m_SolderMaskColorBot
in realistic mode: solder mask color ( bot )
bool m_IsPreviewer
true if we're in a 3D preview panel, false for the standard 3D viewer
void addFootprintShapes(const FOOTPRINT *aFootprint, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayerId, const std::bitset< LAYER_3D_END > &aVisibilityFlags)
void createArcSegments(const VECTOR2I &aCentre, const VECTOR2I &aStart, const EDA_ANGLE &aArcAngle, int aCircleToSegmentsCount, int aWidth, CONTAINER_2D_BASE *aContainer, const BOARD_ITEM &aOwner)
VECTOR2I GetBoardPos() const noexcept
Get the board center.
static CUSTOM_COLORS_LIST g_MaskColors
MAP_POLY m_layerHoleIdPolys
Hole inner diameters (per layer)
int GetHolePlatingThickness() const noexcept
Get the hole plating thickness (NB: in BOARD UNITS!).
void InitSettings(REPORTER *aStatusReporter, REPORTER *aWarningReporter)
Function to be called by the render when it need to reload the settings for the board.
const BVH_CONTAINER_2D & GetViaAnnuli() const noexcept
float GetLayerBottomZPos(PCB_LAYER_ID aLayerId) const noexcept
Get the bottom z position.
static KIGFX::COLOR4D g_DefaultECOs
const BVH_CONTAINER_2D * GetOffboardPadsBack() const noexcept
const BVH_CONTAINER_2D & GetTH_IDs() const noexcept
SFVEC4F m_SolderMaskColorTop
in realistic mode: solder mask color ( top )
SFVEC4F GetColor(const COLOR4D &aColor) const
SHAPE_POLY_SET m_viaAnnuliPolys
Via annular ring outer diameters.
BVH_CONTAINER_2D * m_offboardPadsFront
float m_averageViaHoleDiameter
BVH_CONTAINER_2D m_viaTH_ODs
List of via hole outer diameters.
static KIGFX::COLOR4D g_DefaultBackgroundTop
const BVH_CONTAINER_2D * GetPlatedPadsBack() const noexcept
static CUSTOM_COLORS_LIST g_SilkColors
const MAP_POLY & GetHoleIdPolysMap() const noexcept
float GetBackCopperThickness() const noexcept
float m_averageHoleDiameter
static KIGFX::COLOR4D g_DefaultSurfaceFinish
SFVEC4F m_CopperColor
in realistic mode: copper color
SHAPE_POLY_SET m_viaTH_ODPolys
Via hole outer diameters.
void ReloadColorSettings() noexcept
void createPadWithMargin(const PAD *aPad, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayer, const VECTOR2I &aMargin) const
float GetAverageViaHoleDiameter() const noexcept
void addPads(const FOOTPRINT *aFootprint, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayerId, bool aSkipPlatedPads, bool aSkipNonPlatedPads)
const SHAPE_POLY_SET * GetFrontPlatedPadPolys()
SFVEC2F GetSphericalCoord(int i) const
unsigned int GetViaCount() const noexcept
const BOARD * GetBoard() const noexcept
BVH_CONTAINER_2D * m_platedPadsBack
void createPadWithHole(const PAD *aPad, CONTAINER_2D_BASE *aDstContainer, int aInflateValue)
void SetBoard(BOARD *aBoard) noexcept
Set current board to be rendered.
const SFVEC3F & GetBoardCenter() const noexcept
The board center position in 3D units.
float GetFootprintZPos(bool aIsFlipped) const
Get the position of the footprint in 3d integer units considering if it is flipped or not.
float m_frontCopperThickness3DU
float GetNonCopperLayerThickness() const noexcept
Get the non copper layers thickness (in 3D units).
static KIGFX::COLOR4D g_DefaultSolderPaste
float GetLayerTopZPos(PCB_LAYER_ID aLayerId) const noexcept
Get the top z position.
const BVH_CONTAINER_2D & GetTH_ODs() const noexcept
float m_boardBodyThickness3DU
void buildPadOutlineAsSegments(const PAD *aPad, CONTAINER_2D_BASE *aDstContainer, int aWidth)
const SHAPE_POLY_SET * GetBackPlatedPadPolys()
std::array< float, PCB_LAYER_ID_COUNT > m_layerZcoordTop
Top (End) Z position of each layer in 3D units.
static CUSTOM_COLORS_LIST g_BoardColors
void addShape(const PCB_SHAPE *aShape, CONTAINER_2D_BASE *aContainer, const BOARD_ITEM *aOwner)
void createTrack(const PCB_TRACK *aTrack, CONTAINER_2D_BASE *aDstContainer)
const MAP_CONTAINER_2D_BASE & GetLayerMap() const noexcept
Get the map of containers that have the objects per layer.
MAP_POLY m_layers_poly
Amalgamated polygon contours for various types of items.
VECTOR2I m_boardSize
Board size in board internal units.
SHAPE_POLY_SET * m_backPlatedCopperPolys
void SetLayerColors(const std::map< int, COLOR4D > &aColors)
SHAPE_POLY_SET * m_backPlatedPadPolys
EDA_3D_VIEWER_SETTINGS * m_Cfg
SFVEC4F m_SilkScreenColorTop
in realistic mode: SilkScreen color ( top )
unsigned int GetHoleCount() const noexcept
SFVEC4F m_SilkScreenColorBot
in realistic mode: SilkScreen color ( bot )
SFVEC4F GetItemColor(int aItemId) const
Get the technical color of a layer.
const BVH_CONTAINER_2D * GetPlatedPadsFront() const noexcept
unsigned int GetCircleSegmentCount(float aDiameter3DU) const
float m_nonCopperLayerThickness3DU
float GetFrontCopperThickness() const noexcept
Get the copper layer thicknesses (in 3D units).
const BVH_CONTAINER_2D & GetViaTH_ODs() const noexcept
unsigned int m_holeCount
BVH_CONTAINER_2D m_viaAnnuli
List of via annular rings.
float GetBoardBodyThickness() const noexcept
Get the board body thickness, including internal copper layers (in 3D units).
SFVEC4F m_BoardBodyColor
in realistic mode: FR4 board color
bool createBoardPolygon(wxString *aErrorMsg)
Create the board outline polygon.
float GetAverageHoleDiameter() const noexcept
const SHAPE_POLY_SET & GetViaAnnuliPolys() const noexcept
unsigned int m_copperLayersCount
bool m_MousewheelPanning
std::map< int, COLOR4D > GetDefaultColors() const
BVH_CONTAINER_2D m_TH_IDs
List of PTH inner diameters.
void createViaWithMargin(const PCB_TRACK *aTrack, CONTAINER_2D_BASE *aDstContainer, int aMargin)
SFVEC4F m_UserCommentsColor
static KIGFX::COLOR4D g_DefaultSilkscreen
BVH_CONTAINER_2D * m_platedPadsFront
void Set3dCacheManager(S3D_CACHE *aCacheMgr) noexcept
Update the cache manager pointer.
Definition: board_adapter.h:81
SFVEC3F m_boardCenter
3D center position of the board in 3D units.
SHAPE_POLY_SET m_NPTH_ODPolys
NPTH outer diameters.
static KIGFX::COLOR4D g_DefaultBackgroundBot
SFVEC4F GetLayerColor(PCB_LAYER_ID aLayerId) const
Get the technical color of a layer.
bool Is3dLayerEnabled(PCB_LAYER_ID aLayer, const std::bitset< LAYER_3D_END > &aVisibilityFlags) const
Check if a layer is enabled.
SFVEC4F m_ECO1Color
SFVEC4F m_UserDrawingsColor
S3D_CACHE * Get3dCacheManager() const noexcept
Definition: board_adapter.h:82
double m_biuTo3Dunits
Scale factor to convert board internal units to 3D units normalized between -1.0 and 1....
SFVEC4F m_BgColorBot
background bottom color
const SHAPE_POLY_SET & GetTH_ODPolys() const noexcept
Get through hole outside diameter 2D polygons.
SHAPE_POLY_SET * m_frontPlatedPadPolys
void addText(const EDA_TEXT *aText, CONTAINER_2D_BASE *aDstContainer, const BOARD_ITEM *aOwner)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:77
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:271
A class used to derive camera objects from.
Definition: camera.h:79
Color settings are a bit different than most of the settings objects in that there can be more than o...
virtual BOARD_ADAPTER & GetAdapter()=0
virtual CAMERA & GetCurrentCamera()=0
virtual ~EDA_3D_BOARD_HOLDER()
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Definition: pad.h:58
Abstract dimension API.
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:71
Cache for storing the 3D shapes.
Definition: 3d_cache.h:53
Represent a set of closed polygons.
Handle a list of polygons defining a copper zone.
Definition: zone.h:72
std::vector< CUSTOM_COLOR_ITEM > CUSTOM_COLORS_LIST
FOOTPRINT_ATTR_T
The set of attributes allowed within a FOOTPRINT, using FOOTPRINT::SetAttributes() and FOOTPRINT::Get...
Definition: footprint.h:71
static const wxChar * m_logTrace
Trace mask used to enable or disable debug output for this class.
@ LAYER_3D_END
Definition: layer_ids.h:467
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
STL namespace.
Manage a bounding box defined by two SFVEC3F min max points.
Definition: bbox_3d.h:42
glm::vec2 SFVEC2F
Definition: xv3d_types.h:42
glm::vec3 SFVEC3F
Definition: xv3d_types.h:44
glm::vec4 SFVEC4F
Definition: xv3d_types.h:46