27#include "../3d_rendering/raytracing/shapes2D/filled_circle_2d.h"
41#ifdef PRINT_STATISTICS_3D_VIEWER
49 int aWidth,
int aMaxError,
ERROR_LOC aErrorLoc )
54 aWidth, aMaxError, aErrorLoc );
61 for(
int ii = 0; ii <
path.PointCount(); ++ii )
79 if( item->GetLayer() == aLayer )
80 item->TransformShapeToPolySet( aBuffer, aLayer, 0, aMaxError, aErrorLoc );
92 if( item->GetLayer() != aLayer )
109 text->TransformTextToPolySet( aBuffer, 0, aMaxError, aErrorLoc );
120 textbox->PCB_SHAPE::TransformShapeToPolygon( aBuffer, aLayer, 0, aMaxError, aErrorLoc );
139 if( field->GetLayer() == aLayer && field->IsVisible() )
140 field->TransformTextToPolySet( aBuffer, 0, aMaxError, aErrorLoc );
147#define DELETE_AND_FREE( ptr ) \
153#define DELETE_AND_FREE_MAP( map ) \
155 for( auto& [ layer, poly ] : map ) \
197#ifdef PRINT_STATISTICS_3D_VIEWER
200 int64_t start_Time = stats_startCopperLayersTime;
218 std::vector<const PCB_TRACK*> trackList;
232 trackList.push_back( track );
254 std::vector<PCB_LAYER_ID> layer_ids;
263 layer_ids.push_back( layer );
290 if( aStatusReporter )
291 aStatusReporter->
Report(
_(
"Create tracks and vias" ) );
300 for(
const PCB_TRACK* track : trackList )
303 if( !track->IsOnLayer( layer ) )
319 unsigned int nTracks = trackList.size();
321 for(
unsigned int trackIdx = 0; trackIdx < nTracks; ++trackIdx )
323 const PCB_TRACK *track = trackList[trackIdx];
338 const float thickness =
static_cast<float>( plating / 2.0f );
339 const float hole_inner_radius =
static_cast<float>( holediameter / 2.0f );
340 const float ring_radius =
static_cast<float>( viasize / 2.0f );
345 if( viatype != VIATYPE::THROUGH )
367 else if( layer == layer_ids[0] )
376 if( hole_inner_radius > 0.0 )
398 const unsigned int nTracks = trackList.size();
400 for(
unsigned int trackIdx = 0; trackIdx < nTracks; ++trackIdx )
402 const PCB_TRACK *track = trackList[trackIdx];
413 if( viatype != VIATYPE::THROUGH )
443 const int holediameter =
via->GetDrillValue();
452 else if( layer == layer_ids[0] )
454 const int holediameter =
via->GetDrillValue();
456 const int hole_outer_ring_radius =
KiROUND(
via->GetWidth( layer ) / 2.0 );
486 unsigned int nTracks = trackList.size();
488 for(
unsigned int trackIdx = 0; trackIdx < nTracks; ++trackIdx )
490 const PCB_TRACK *track = trackList[trackIdx];
508 for(
PAD*
pad : footprint->Pads() )
518 if(
pad->GetAttribute() != PAD_ATTRIB::NPTH )
522 double holeDiameter = (
pad->GetDrillSize().x +
pad->GetDrillSize().y ) / 2.0;
540 for(
PAD*
pad : footprint->Pads() )
550 if(
pad->GetAttribute() != PAD_ATTRIB::NPTH )
577 addPads( fp, layerContainer, layer );
585 fp->TransformPadsToPolySet( *layerPoly, layer, 0, fp->GetMaxError(),
ERROR_INSIDE );
597 fp->TransformPadsToPolySet( *layerPoly, layer, 0, fp->GetMaxError(),
ERROR_INSIDE );
614 if( !item->IsOnLayer( layer ) )
617 switch( item->Type() )
647 wxLogTrace(
m_logTrace, wxT(
"createLayers: item type: %d not implemented" ), item->Type() );
664 text_box->PCB_SHAPE::TransformShapeToPolygon( *copperPolys, layer, 0, text_box->
GetMaxError(),
674 item->TransformShapeToPolySet( *copperPolys, layer, 0, item->GetMaxError(),
ERROR_INSIDE );
685 switch( item->Type() )
688 item->TransformShapeToPolySet( *layerPoly, layer, 0, item->GetMaxError(),
ERROR_INSIDE );
705 textbox->PCB_SHAPE::TransformShapeToPolygon( *layerPoly, layer, 0, textbox->
GetMaxError(),
718 cell->TransformTextToPolySet( *layerPoly, 0, cell->GetMaxError(),
ERROR_INSIDE );
740 for(
const std::shared_ptr<SHAPE>& shape : dimension->
GetShapes() )
750 wxLogTrace(
m_logTrace, wxT(
"createLayers: item type: %d not implemented" ), item->Type() );
759 if( aStatusReporter )
760 aStatusReporter->
Report(
_(
"Create zones" ) );
762 std::vector<std::pair<ZONE*, PCB_LAYER_ID>> zones;
763 std::unordered_map<PCB_LAYER_ID, std::unique_ptr<std::mutex>> layer_lock;
769 zones.emplace_back( std::make_pair( zone, layer ) );
770 layer_lock.emplace( layer, std::make_unique<std::mutex>() );
776 zone->TransformShapeToPolygon( *copperPolys, layer, 0, zone->GetMaxError(),
ERROR_INSIDE );
782 std::atomic<size_t> nextZone( 0 );
783 std::atomic<size_t> threadsFinished( 0 );
785 size_t parallelThreadCount = std::min<size_t>( zones.size(),
786 std::max<size_t>( std::thread::hardware_concurrency(), 2 ) );
788 for(
size_t ii = 0; ii < parallelThreadCount; ++ii )
790 std::thread t = std::thread( [&]()
792 for(
size_t areaId = nextZone.fetch_add( 1 );
793 areaId < zones.size();
794 areaId = nextZone.fetch_add( 1 ) )
796 ZONE* zone = zones[areaId].first;
798 if( zone == nullptr )
801 PCB_LAYER_ID layer = zones[areaId].second;
803 if( m_layerMap.contains( layer ) )
804 addSolidAreasShapes( zone, m_layerMap[layer], layer );
806 if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL
807 && m_layers_poly.contains( layer ) )
809 auto mut_it = layer_lock.find( layer );
811 if( mut_it != layer_lock.end() )
813 std::lock_guard< std::mutex > lock( *( mut_it->second ) );
814 zone->TransformSolidAreasShapesToPolygon( layer, *m_layers_poly[layer] );
825 while( threadsFinished < parallelThreadCount )
826 std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
831 m_TH_ODPolys.Simplify();
832 m_NPTH_ODPolys.Simplify();
833 m_viaTH_ODPolys.Simplify();
834 m_viaAnnuliPolys.Simplify();
839 if( aStatusReporter )
840 aStatusReporter->Report(
_(
"Build Tech layers" ) );
906 std::bitset<LAYER_3D_END> enabledFlags = visibilityFlags;
908 if( cfg.subtract_mask_from_silk || cfg.DifferentiatePlatedCopper() )
916 if( aStatusReporter )
917 aStatusReporter->Report( wxString::Format(
_(
"Build Tech layer %d" ), (
int) layer ) );
919 if( !Is3dLayerEnabled( layer, enabledFlags ) )
923 m_layerMap[layer] = layerContainer;
926 m_layers_poly[layer] = layerPoly;
928 if( Is3dLayerEnabled( layer, visibilityFlags ) )
933 if( !item->IsOnLayer( layer ) )
936 switch( item->Type() )
939 addShape(
static_cast<PCB_SHAPE*
>( item ), layerContainer, item, layer );
943 addText(
static_cast<PCB_TEXT*
>( item ), layerContainer, item );
947 addShape(
static_cast<PCB_TEXTBOX*
>( item ), layerContainer, item );
951 addTable(
static_cast<PCB_TABLE*
>( item ), layerContainer, item );
970 for(
PCB_TRACK* track : m_board->Tracks() )
972 if( !track->IsOnLayer( layer ) )
982 if( !
via->FlashLayer( copper_layer ) )
987 createTrackWithMargin( track, layerContainer, layer, maskExpansion );
992 for(
FOOTPRINT* footprint : m_board->Footprints() )
996 int linewidth = m_board->GetDesignSettings().m_LineThickness[
LAYER_CLASS_SILK ];
998 for(
PAD*
pad : footprint->Pads() )
1000 if( !
pad->IsOnLayer( layer ) )
1003 buildPadOutlineAsSegments(
pad, layer, layerContainer, linewidth );
1008 addPads( footprint, layerContainer, layer );
1011 addFootprintShapes( footprint, layerContainer, layer, visibilityFlags );
1015 if( cfg.show_zones )
1017 for(
ZONE* zone : m_board->Zones() )
1019 if( zone->IsOnLayer( layer ) )
1020 addSolidAreasShapes( zone, layerContainer, layer );
1028 || ( cfg.DifferentiatePlatedCopper() && ( layer ==
F_Mask || layer ==
B_Mask ) ) )
1031 for(
BOARD_ITEM* item : m_board->Drawings() )
1033 if( !item->IsOnLayer( layer ) )
1036 switch( item->Type() )
1039 item->TransformShapeToPolySet( *layerPoly, layer, 0, item->GetMaxError(),
ERROR_INSIDE );
1056 textbox->PCB_SHAPE::TransformShapeToPolygon( *layerPoly, layer, 0, textbox->
GetMaxError(),
1069 cell->TransformTextToPolySet( *layerPoly, 0, cell->GetMaxError(),
ERROR_INSIDE );
1092 for(
PCB_TRACK* track : m_board->Tracks() )
1098 if(
via->FlashLayer( layer ) && !
via->IsTented( layer ) )
1106 if( track->HasSolderMask() )
1108 track->TransformShapeToPolySet( *layerPoly, layer, maskExpansion, track->GetMaxError(),
1116 for(
FOOTPRINT* footprint : m_board->Footprints() )
1120 int linewidth = m_board->GetDesignSettings().m_LineThickness[
LAYER_CLASS_SILK ];
1122 for(
PAD*
pad : footprint->Pads() )
1124 if(
pad->IsOnLayer( layer ) )
1133 footprint->TransformPadsToPolySet( *layerPoly, layer, 0, footprint->GetMaxError(),
ERROR_INSIDE );
1141 if( cfg.show_zones || layer ==
F_Mask || layer ==
B_Mask )
1143 for(
ZONE* zone : m_board->Zones() )
1145 if( zone->IsOnLayer( layer ) )
1146 zone->TransformSolidAreasShapesToPolygon( layer, *layerPoly );
1158 if( cfg.show_off_board_silk )
1160 BOX2I boardBBox = m_board_poly.BBox();
1162 for(
FOOTPRINT* footprint : m_board->Footprints() )
1164 if( !footprint->GetBoundingBox().Intersects( boardBBox ) )
1166 if( footprint->IsFlipped() )
1167 addPads( footprint, m_offboardPadsBack,
B_Cu );
1169 addPads( footprint, m_offboardPadsFront,
F_Cu );
1173 m_offboardPadsFront->BuildBVH();
1174 m_offboardPadsBack->BuildBVH();
1179 if( aStatusReporter )
1180 aStatusReporter->Report(
_(
"Simplifying copper layer polygons" ) );
1182 if( cfg.DifferentiatePlatedCopper() )
1184 if( aStatusReporter )
1185 aStatusReporter->Report(
_(
"Calculating plated copper" ) );
1188 if( m_layers_poly.contains(
F_Mask ) )
1189 m_frontPlatedCopperPolys->BooleanIntersection( *m_layers_poly.at(
F_Mask ) );
1191 if( m_layers_poly.contains(
B_Mask ))
1192 m_backPlatedCopperPolys->BooleanIntersection( *m_layers_poly.at(
B_Mask ) );
1195 if( m_layers_poly.contains(
F_Cu ) )
1196 m_layers_poly[
F_Cu]->BooleanSubtract( *m_frontPlatedCopperPolys );
1198 if( m_layers_poly.contains(
B_Cu ) )
1199 m_layers_poly[
B_Cu]->BooleanSubtract( *m_backPlatedCopperPolys );
1208 m_platedPadsFront->BuildBVH();
1209 m_platedPadsBack->BuildBVH();
1214 std::vector<PCB_LAYER_ID> &selected_layer_id = layer_ids;
1215 std::vector<PCB_LAYER_ID> layer_id_without_F_and_B;
1217 if( cfg.DifferentiatePlatedCopper() )
1219 layer_id_without_F_and_B.clear();
1220 layer_id_without_F_and_B.reserve( layer_ids.size() );
1224 if( layer !=
F_Cu && layer !=
B_Cu )
1225 layer_id_without_F_and_B.push_back( layer );
1228 selected_layer_id = layer_id_without_F_and_B;
1231 if( selected_layer_id.size() > 0 )
1233 if( aStatusReporter )
1235 aStatusReporter->Report( wxString::Format(
_(
"Simplifying %d copper layers" ),
1236 (
int) selected_layer_id.size() ) );
1239 std::atomic<size_t> nextItem( 0 );
1240 std::atomic<size_t> threadsFinished( 0 );
1242 size_t parallelThreadCount = std::min<size_t>(
1243 std::max<size_t>( std::thread::hardware_concurrency(), 2 ),
1244 selected_layer_id.size() );
1246 for(
size_t ii = 0; ii < parallelThreadCount; ++ii )
1248 std::thread t = std::thread(
1249 [&nextItem, &threadsFinished, &selected_layer_id,
this]()
1251 for(
size_t i = nextItem.fetch_add( 1 );
1252 i < selected_layer_id.size();
1253 i = nextItem.fetch_add( 1 ) )
1255 if( m_layers_poly.contains( selected_layer_id[i] ) )
1258 m_layers_poly[ selected_layer_id[i] ]->ClearArcs();
1259 m_layers_poly[ selected_layer_id[i] ]->Simplify();
1269 while( threadsFinished < parallelThreadCount )
1270 std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
1275 if( aStatusReporter )
1276 aStatusReporter->Report(
_(
"Simplify holes contours" ) );
1280 if( m_layerHoleOdPolys.contains( layer ) )
1286 wxASSERT( m_layerHoleIdPolys.contains( layer ) );
1288 polyLayer = m_layerHoleIdPolys[layer];
1295 if( aStatusReporter )
1296 aStatusReporter->Report(
_(
"Build BVH for holes and vias" ) );
1298 m_TH_IDs.BuildBVH();
1299 m_TH_ODs.BuildBVH();
1300 m_viaAnnuli.BuildBVH();
1302 if( !m_layerHoleMap.empty() )
1304 for( std::pair<const PCB_LAYER_ID, BVH_CONTAINER_2D*>& hole : m_layerHoleMap )
1305 hole.second->BuildBVH();
1311 m_layerMap[
B_Mask]->BuildBVH();
1314 m_layerMap[
F_Mask]->BuildBVH();
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
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
void createLayers(REPORTER *aStatusReporter)
SHAPE_POLY_SET m_TH_ODPolys
PTH outer diameters.
void addPads(const FOOTPRINT *aFootprint, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayerId)
void createTrackWithMargin(const PCB_TRACK *aTrack, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayer, int aMargin=0)
MAP_POLY m_layerHoleOdPolys
Hole outer diameters (per layer)
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.
unsigned int m_trackCount
float m_averageTrackWidth
std::bitset< LAYER_3D_END > GetVisibleLayers() const
void addFootprintShapes(const FOOTPRINT *aFootprint, CONTAINER_2D_BASE *aDstContainer, PCB_LAYER_ID aLayerId, const std::bitset< LAYER_3D_END > &aVisibilityFlags)
MAP_POLY m_layerHoleIdPolys
Hole inner diameters (per layer)
int GetHolePlatingThickness() const noexcept
Get the hole plating thickness (NB: in BOARD UNITS!).
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.
float m_averageHoleDiameter
SHAPE_POLY_SET m_viaTH_ODPolys
Via hole outer diameters.
BVH_CONTAINER_2D * m_platedPadsBack
void createPadWithHole(const PAD *aPad, CONTAINER_2D_BASE *aDstContainer, int aInflateValue)
MAP_POLY m_layers_poly
Amalgamated polygon contours for various types of items.
SHAPE_POLY_SET * m_backPlatedCopperPolys
EDA_3D_VIEWER_SETTINGS * m_Cfg
void addTable(const PCB_TABLE *aTable, CONTAINER_2D_BASE *aContainer, const BOARD_ITEM *aOwner)
BVH_CONTAINER_2D m_viaAnnuli
List of via annular rings.
unsigned int m_copperLayersCount
BVH_CONTAINER_2D m_TH_IDs
List of PTH inner diameters.
BVH_CONTAINER_2D * m_platedPadsFront
void addShape(const PCB_SHAPE *aShape, CONTAINER_2D_BASE *aContainer, const BOARD_ITEM *aOwner, PCB_LAYER_ID aLayer)
SHAPE_POLY_SET m_NPTH_ODPolys
NPTH outer diameters.
bool Is3dLayerEnabled(PCB_LAYER_ID aLayer, const std::bitset< LAYER_3D_END > &aVisibilityFlags) const
Check if a layer is enabled.
double m_biuTo3Dunits
Scale factor to convert board internal units to 3D units normalized between -1.0 and 1....
void addText(const EDA_TEXT *aText, CONTAINER_2D_BASE *aDstContainer, const BOARD_ITEM *aOwner)
int m_SolderMaskExpansion
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
const ZONES & Zones() const
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const DRAWINGS & Drawings() const
void Add(OBJECT_2D *aObject)
static DELETED_BOARD_ITEM * GetInstance()
KICAD_T Type() const
Returns the type of object.
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
static LSET AllNonCuMask()
Return a mask holding all layer minus CU layers.
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
const std::shared_ptr< SHAPE_POLY_SET > & GetEffectivePolygon(PCB_LAYER_ID aLayer, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
VECTOR2I ShapePos(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetSize(PCB_LAYER_ID aLayer) const
const std::vector< std::shared_ptr< SHAPE > > & GetShapes() const
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
bool IsBorderEnabled() const
Disables the border, this is done by changing the stroke internally.
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
void TransformTextToPolySet(SHAPE_POLY_SET &aBuffer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc) const
Function TransformTextToPolySet Convert the text to a polygonSet describing the actual character stro...
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the track shape to a closed polygon.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
bool FlashLayer(int aLayer) const
Check to see whether the via should have a pad on the specific layer.
int GetSolderMaskExpansion() const
A pure virtual class used to derive REPORTER objects from.
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_SEVERITY_UNDEFINED)
Report a string with a given severity.
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
void RemoveAllContours()
Remove all outlines & holes (clears) the polygon set.
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
void TransformToPolygon(SHAPE_POLY_SET &aBuffer, int aError, ERROR_LOC aErrorLoc) const override
Fills a SHAPE_POLY_SET with a polygon representation of this shape.
Simple container to manage line stroke parameters.
Handle a list of polygons defining a copper zone.
void TransformRingToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aCentre, int aRadius, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arcs to multiple straight segments.
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
#define DELETE_AND_FREE_MAP(map)
void transformFPShapesToPolySet(const FOOTPRINT *aFootprint, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aBuffer, int aMaxError, ERROR_LOC aErrorLoc)
void transformFPTextToPolySet(const FOOTPRINT *aFootprint, PCB_LAYER_ID aLayer, const std::bitset< LAYER_3D_END > &aFlags, SHAPE_POLY_SET &aBuffer, int aMaxError, ERROR_LOC aErrorLoc)
void buildPadOutlineAsPolygon(const PAD *aPad, PCB_LAYER_ID aLayer, SHAPE_POLY_SET &aBuffer, int aWidth, int aMaxError, ERROR_LOC aErrorLoc)
#define DELETE_AND_FREE(ptr)
static const wxChar * m_logTrace
Trace mask used to enable or disable debug output for this class.
bool IsSolderMaskLayer(int aLayer)
@ LAYER_3D_SOLDERMASK_TOP
@ LAYER_3D_SOLDERMASK_BOTTOM
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
int64_t GetRunningMicroSecs()
An alternate way to calculate an elapsed time (in microsecondes) to class PROF_COUNTER.
bool opengl_copper_thickness
bool clip_silk_on_via_annuli
bool DifferentiatePlatedCopper()
return true if platted copper aeras and non platted copper areas must be drawn using a different colo...
void ConvertPolygonToTriangles(const SHAPE_POLY_SET &aPolyList, CONTAINER_2D_BASE &aDstContainer, float aBiuTo3dUnitsScale, const BOARD_ITEM &aBoardItem)
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension