70#define EXPORT_CUSTOM_PADS_CONVEX_HULL
89 errorText = ioe.
What();
98 SetStatusText( wxString(
_(
"BOARD exported OK." ) ) );
119 wxLogWarning(
_(
"Board outline is malformed. Run DRC for a full analysis." ) );
150static inline double scale(
int kicadDist )
153 return kicadDist / (
pcbIUScale.IU_PER_MM / 1000.0 );
158static inline double IU2um(
int kicadDist )
160 return kicadDist * ( 1000.0 /
pcbIUScale.IU_PER_MM );
164static inline double mapX(
int x )
170static inline double mapY(
int y )
197 return mapPt( fpRelative );
227 path->AppendPoint( aStart );
228 path->AppendPoint( aEnd );
229 path->SetLayerId( aLayerName );
242 std::string uniqifier;
253 int reportedLayers = 0;
254 std::vector<std::string> layerName( copperCount );
256 bool onAllCopperLayers = ( (aPad->
GetLayerSet() & all_cu) == all_cu );
258 if( onAllCopperLayers )
261 for(
int layer=0; layer < copperCount; ++layer )
265 if( onAllCopperLayers || aPad->
IsOnLayer( kilayer ) )
267 layerName[reportedLayers++] =
m_layerIds[layer];
269 if( !onAllCopperLayers )
273 else if( layer == copperCount - 1 )
276 uniqifier += char(
'0' + layer);
289 if( offset.
x || offset.
y )
291 dsnOffset =
mapPt( offset );
293 std::ostringstream oss;
294 oss.imbue( std::locale::classic() );
295 oss << std::fixed << std::setprecision( 6 )
296 <<
'[' << dsnOffset.
x <<
',' << dsnOffset.
y <<
']';
297 uniqifier += oss.str();
304 double diameter =
scale( padSize.
x );
306 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
310 padstack->
Append( shape );
316 circle->SetLayerId( layerName[ndx] );
317 circle->SetDiameter( diameter );
318 circle->SetVertex( dsnOffset );
321 std::ostringstream oss;
322 oss <<
"Round" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
323 <<
IU2um( padSize.
x ) <<
"_um";
331 double dx =
scale( padSize.
x ) / 2.0;
332 double dy =
scale( padSize.
y ) / 2.0;
334 POINT lowerLeft( -dx, -dy );
335 POINT upperRight( dx, dy );
337 lowerLeft += dsnOffset;
338 upperRight += dsnOffset;
340 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
344 padstack->
Append( shape );
354 std::ostringstream oss;
355 oss <<
"Rect" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
356 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_um";
364 double dx =
scale( padSize.
x ) / 2.0;
365 double dy =
scale( padSize.
y ) / 2.0;
375 pstart =
POINT( -dr, 0.0 );
376 pstop =
POINT( dr, 0.0 );
383 pstart =
POINT( 0.0, -dr );
384 pstop =
POINT( 0.0, dr );
390 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
396 shape =
new SHAPE( padstack );
398 padstack->
Append( shape );
404 std::ostringstream oss;
405 oss <<
"Oval" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
406 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_um";
414 double dx =
scale( padSize.
x ) / 2.0;
415 double dy =
scale( padSize.
y ) / 2.0;
423 POINT lowerLeft( -dx - ddy, -dy - ddx );
424 POINT upperLeft( -dx + ddy, +dy + ddx );
425 POINT upperRight( +dx - ddy, +dy - ddx );
426 POINT lowerRight( +dx + ddy, -dy + ddx );
428 lowerLeft += dsnOffset;
429 upperLeft += dsnOffset;
430 upperRight += dsnOffset;
431 lowerRight += dsnOffset;
433 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
437 padstack->
Append( shape );
440 PATH* polygon =
new PATH( shape, T_polygon );
453 std::ostringstream oss;
454 oss <<
"Trapz" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
455 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_"
467 const int circleToSegmentsCount = 36;
479 double correctionFactor = cos(
M_PI / (
double) circleToSegmentsCount );
480 int extra_clearance =
KiROUND( rradius * ( 1.0 - correctionFactor ) );
482 psize.
x += extra_clearance * 2;
483 psize.
y += extra_clearance * 2;
484 rradius += extra_clearance;
494 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
498 padstack->
Append( shape );
501 PATH* polygon =
new PATH( shape, T_polygon );
510 for(
int idx = 0; idx < polygonal_shape.
PointCount(); idx++ )
518 first_corner = corner;
525 std::ostringstream oss;
526 oss <<
"RoundRect" << uniqifier <<
"Pad_"
527 << std::fixed << std::setprecision(6)
528 <<
IU2um( padSize.
x ) <<
'x'
529 <<
IU2um( padSize.
y ) <<
'_'
530 <<
IU2um( rradius ) <<
"_um_"
532 << std::hex << std::uppercase
541 std::vector<VECTOR2I> polygonal_shape;
545#ifdef EXPORT_CUSTOM_PADS_CONVEX_HULL
550 for(
int ii = 0; ii < p_outline.
PointCount(); ++ii )
551 polygonal_shape.push_back( wxPoint( p_outline.
CPoint( ii ) ) );
555 if( polygonal_shape.front() != polygonal_shape.back() )
556 polygonal_shape.push_back( polygonal_shape.front() );
558 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
562 padstack->
Append( shape );
565 PATH* polygon =
new PATH( shape, T_polygon );
571 for(
const VECTOR2I& pt : polygonal_shape )
583 std::ostringstream oss;
584 oss <<
"Cust" << uniqifier <<
"Pad_"
585 << std::fixed << std::setprecision(6)
586 <<
IU2um( padSize.
x ) <<
'x' <<
IU2um( padSize.
y ) <<
'_'
588 << polygonal_shape.size() <<
"_um_"
619 for(
int p = 0; p < fpItems.
GetCount(); ++p )
626 double diameter =
scale(
pad->GetDrillSize().x );
633 for(
int layer=0; layer<layerCount; ++layer )
637 image->m_keepouts.push_back( keepout );
643 circle->SetDiameter( diameter );
644 circle->SetVertex( vertex );
654 if( !mask_copper_layers.any() )
664 padstack = (
PADSTACK*) *iter.base();
673 padNumber =
pad->GetNumber();
676 if( padNumber != wxEmptyString && pinmap.find( padNumber ) == pinmap.end() )
678 pinmap[ padNumber ] = 0;
682 int duplicates = ++pinmap[ padNumber ];
685 "@" + std::to_string( duplicates );
688 pin->m_kiNetCode =
pad->GetNetCode();
713 image->Append( outline );
718 path->SetAperture( 0 );
719 path->SetLayerId(
"signal" );
721 for(
int ii = 0; ii <
chain.PointCount(); ++ii )
724 path->AppendPoint(
mapPt( corner, aFootprint ) );
732 for(
int i = 0; i < fpItems.
GetCount(); ++i )
746 image->Append( outline );
751 path->SetLayerId(
"signal" );
761 image->Append( outline );
767 path->SetLayerId(
"signal" );
776 for(
int ii = 0; ii < polyline.
PointCount(); ++ii )
779 path->AppendPoint(
mapPt( corner, aFootprint ) );
789 image->Append( outline );
794 path->SetLayerId(
"signal" );
796 path->AppendPoint(
mapPt( corner, aFootprint ) );
799 path->AppendPoint(
mapPt( corner, aFootprint ) );
802 path->AppendPoint(
mapPt( corner, aFootprint ) );
805 path->AppendPoint(
mapPt( corner, aFootprint ) );
808 path->AppendPoint(
mapPt( corner, aFootprint ) );
820 image->Append( outline );
821 path =
new PATH( outline, T_polygon );
824 path->SetAperture( 0 );
825 path->SetLayerId(
"signal" );
833 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
836 path->AppendPoint(
mapPt( corner, aFootprint ) );
849 if( !zone->GetIsRuleArea() )
853 ZONE untransformedZone( *zone );
865 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
866 keepout_type = T_keepout;
867 else if( zone->GetDoNotAllowVias() )
868 keepout_type = T_via_keepout;
869 else if( zone->GetDoNotAllowTracks() )
870 keepout_type = T_wire_keepout;
872 keepout_type = T_keepout;
881 image->m_keepouts.push_back( keepout );
883 PATH* mainPolygon =
new PATH( keepout, T_polygon );
890 bool is_first_point =
true;
893 for( iterator = untransformedZone.
IterateWithHoles(); iterator; iterator++ )
902 is_first_point =
false;
916 PATH* cutout =
nullptr;
917 bool isStartContour =
true;
920 for( iterator++; iterator; iterator++ )
924 is_first_point =
true;
925 window =
new WINDOW( keepout );
928 cutout =
new PATH( window, T_polygon );
947 is_first_point =
false;
964 int aTopLayer,
int aBotLayer )
968 double dsnDiameter =
scale( aCopperDiameter );
970 for(
int layer=aTopLayer; layer<=aBotLayer; ++layer )
974 padstack->
Append( shape );
980 circle->SetDiameter( dsnDiameter );
984 snprintf(
name,
sizeof(
name ),
"Via[%d-%d]_%.6g:%.6g_um",
985 aTopLayer, aBotLayer, dsnDiameter,
987 IU2um( aDrillDiameter ) );
1001 aVia->
LayerPair( &topLayerNum, &botLayerNum );
1006 if( topLayer > botLayer )
1007 std::swap( topLayer, botLayer );
1011 topLayer, botLayer );
1021 path->layer_id =
"pcb";
1025 for(
int ii = 0; ii < outline.
PointCount(); ii++ )
1040 PATH* poly_ko =
new PATH(
nullptr, T_polygon );
1044 m_pcb->m_structure->m_keepouts.push_back( keepout );
1048 for(
int jj = 0; jj < hole.
PointCount(); jj++ )
1077 if( footprint->GetReference() == wxEmptyString )
1079 THROW_IO_ERROR( wxString::Format(
_(
"Footprint with value of '%s' has an empty "
1080 "reference designator." ),
1081 footprint->GetValue() ) );
1087 if( !refpair.second )
1089 THROW_IO_ERROR( wxString::Format(
_(
"Multiple footprints have the reference "
1090 "designator '%s'." ),
1091 footprint->GetReference() ) );
1108 for(
int pcbNdx=0; pcbNdx<layerCount; ++pcbNdx )
1112 m_pcb->m_structure->m_layers.push_back( layer );
1121 case LT_SIGNAL: layerType = T_signal;
break;
1122 case LT_POWER: layerType = T_power;
break;
1126 case LT_MIXED: layerType = T_signal;
break;
1127 case LT_JUMPER: layerType = T_jumper;
break;
1134 property->name =
"index";
1135 property->value = std::to_string( pcbNdx );
1140 m_pcb->m_parser->space_in_quoted_tokens =
true;
1147 m_pcb->m_unit->units = T_um;
1148 m_pcb->m_resolution->units = T_um;
1149 m_pcb->m_resolution->value = 10;
1158 m_pcb->m_structure->SetBOUNDARY( boundary );
1165 int defaultTrackWidth = netSettings->GetDefaultNetclass()->GetTrackWidth();
1166 int defaultClearance = netSettings->GetDefaultNetclass()->GetClearance();
1169 std::vector<std::string>& rules =
m_pcb->m_structure->m_rules->m_rules;
1171 std::snprintf( rule,
sizeof( rule ),
"(width %.6g)",
scale( defaultTrackWidth ) );
1172 rules.push_back( rule );
1174 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g)",
clearance );
1175 rules.push_back( rule );
1182 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type smd_smd))",
clearance );
1183 rules.push_back( rule );
1189 int netlessZones = 0;
1193 if( zone->GetIsRuleArea() )
1197 if( ! zone->IsOnCopperLayer() )
1208 m_pcb->m_structure->m_planes.push_back( plane );
1210 PATH* mainPolygon =
new PATH( plane, T_polygon );
1215 if( plane->
m_name.size() == 0 )
1222 no_net->
m_net_id =
"@:no_net_" + std::to_string( netlessZones++ );
1225 m_pcb->m_network->m_nets.push_back( no_net );
1236 bool is_first_point =
true;
1238 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1242 if( is_first_point )
1245 is_first_point =
false;
1259 WINDOW* window =
nullptr;
1260 PATH* cutout =
nullptr;
1262 bool isStartContour =
true;
1265 for( iterator++; iterator; iterator++ )
1267 if( isStartContour )
1269 is_first_point =
true;
1270 window =
new WINDOW( plane );
1273 cutout =
new PATH( window, T_polygon );
1287 if( is_first_point )
1290 is_first_point =
false;
1307 if( !zone->GetIsRuleArea() )
1315 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
1316 keepout_type = T_keepout;
1317 else if( zone->GetDoNotAllowVias() )
1318 keepout_type = T_via_keepout;
1319 else if( zone->GetDoNotAllowTracks() )
1320 keepout_type = T_wire_keepout;
1322 keepout_type = T_keepout;
1331 m_pcb->m_structure->m_keepouts.push_back( keepout );
1333 PATH* mainPolygon =
new PATH( keepout, T_polygon );
1340 bool is_first_point =
true;
1343 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1347 if( is_first_point )
1350 is_first_point =
false;
1363 WINDOW* window =
nullptr;
1364 PATH* cutout =
nullptr;
1366 bool isStartContour =
true;
1369 for( iterator++; iterator; iterator++ )
1371 if( isStartContour )
1373 is_first_point =
true;
1374 window =
new WINDOW( keepout );
1377 cutout =
new PATH( window, T_polygon );
1389 if( is_first_point )
1392 is_first_point =
false;
1408 std::string componentId;
1409 int highestNetCode = 0;
1414 highestNetCode = std::max( highestNetCode, i->GetNetCode() );
1419 m_nets.resize( highestNetCode + 1,
nullptr );
1421 for(
unsigned i = 1 ; i <
m_nets.size(); ++i )
1426 if( i->GetNetCode() > 0 )
1427 m_nets[i->GetNetCode()]->m_net_id =
TO_UTF8( i->GetNetname() );
1436 componentId =
TO_UTF8( footprint->GetReference() );
1446 int netcode =
pin.m_kiNetCode;
1474 comp->m_places.push_back( place );
1476 place->
SetRotation( footprint->GetOrientationDegrees() );
1482 if( footprint->GetFlag() )
1495 boost::ptr_set<PADSTACK>::auto_type ps =
m_padstackset.release( i );
1498 m_pcb->m_library->AddPadstack( padstack );
1502 for(
unsigned n = 1; n <
m_nets.size(); ++n )
1509 m_pcb->m_network->m_nets.push_back( net );
1516 std::unordered_map<wxString, NETCLASS*> netclassesInUse;
1520 NETCLASS* netclass = net->GetNetClass();
1527 if( !netclassesInUse.contains(
name ) )
1528 netclassesInUse[
name] = netclass;
1550 wxASSERT(
m_pcb->m_library->m_vias.size() == 0 );
1551 m_pcb->m_library->AppendVia(
via );
1557 for(
const auto& [
name, netclass] : netclassesInUse )
1572 std::string netname;
1576 int old_netcode = -1;
1582 if( !track->IsType( { PCB_TRACE_T, PCB_ARC_T } ) )
1585 int netcode = track->GetNetCode();
1590 if( old_netcode != netcode
1591 || old_width != track->GetWidth()
1592 || old_layer != track->GetLayer()
1593 || (
path &&
path->points.back() !=
mapPt( track->GetStart() ) ) )
1595 old_width = track->GetWidth();
1596 old_layer = track->GetLayer();
1598 if( old_netcode != netcode )
1600 old_netcode = netcode;
1608 wiring->
wires.push_back( wire );
1611 if( track->IsLocked() )
1622 path->aperture_width =
scale( old_width );
1623 path->AppendPoint(
mapPt( track->GetStart() ) );
1627 path->AppendPoint(
mapPt( track->GetEnd() ) );
1640 int netcode =
via->GetNetCode();
1655 m_pcb->m_wiring->wire_vias.push_back( dsnVia );
1665 if(
via->IsLocked() )
1680 VIA* vias =
m_pcb->m_structure->m_via;
1682 for(
unsigned viaNdx = 0; viaNdx <
m_pcb->m_library->m_vias.size(); ++viaNdx )
1683 vias->
AppendVia(
m_pcb->m_library->m_vias[viaNdx].m_padstack_id.c_str() );
1689 exportNETCLASS( netSettings->GetDefaultNetclass().get(), aBoard );
1691 for(
const auto& [
name, netclass] : netclassesInUse )
1730 m_pcb->m_network->m_classes.push_back( clazz );
1736 if( net->GetNetClass()->GetName() == clazz->
m_class_id )
1744 std::snprintf(
text,
sizeof(
text ),
"(width %.6g)",
scale( trackWidth ) );
1764 snprintf(
text,
sizeof(
text ),
"(use_via \"%s\")",
via->GetPadstackId().c_str() );
1778 footprint->SetFlag( 0 );
1780 if( footprint->GetLayer() ==
B_Cu )
1783 footprint->SetFlag( 1 );
1801 if( footprint->GetFlag() )
1804 footprint->SetFlag( 0 );
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Handles how to draw a screen (a board, a schematic ...)
bool IsContentModified() const
void SetContentModified(bool aModified=true)
std::shared_ptr< NET_SETTINGS > m_NetSettings
Information pertinent to a Pcbnew printed circuit board.
const NETINFO_LIST & GetNetInfo() const
NETINFO_ITEM * FindNet(int aNetcode) const
Search for a net with the given netcode.
const ZONES & Zones() const
LAYER_T GetLayerType(PCB_LAYER_ID aLayer) const
Return the type of the copper layer given by aLayer.
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
int GetCopperLayerCount() const
const FOOTPRINTS & Footprints() const
const TRACKS & Tracks() const
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, bool aInferOutlineIfNecessary, OUTLINE_ERROR_HANDLER *aErrorHandler=nullptr, bool aAllowUseArcsInPolygons=false, bool aIncludeNPTHAsOutlines=false)
Extract the board outlines and build a closed polygon from lines, arcs and circle items on edge cut l...
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
constexpr size_type GetWidth() const
constexpr size_type GetHeight() const
int GetCount() const
Return the number of objects in the list.
The <class_descriptor> in the specctra spec.
std::vector< std::string > m_circuit
circuit descriptor list
std::vector< std::string > m_net_ids
Implement a <component_descriptor> in the specctra dsn spec.
A <plane_descriptor> in the specctra dsn spec.
Used for <keepout_descriptor> and <plane_descriptor>.
void AddWindow(WINDOW *aWindow)
void SetShape(ELEM *aShape)
DSN_T layer_type
one of: T_signal, T_power, T_mixed, T_jumper
A <net_descriptor> in the DSN spec.
std::vector< PIN_REF > m_pins
Hold either a via or a pad definition.
std::string m_padstack_id
void SetPadstackId(const char *aPadstackId)
Support both the <path_descriptor> and the <polygon_descriptor> per the specctra dsn spec.
void SetLayerId(const std::string &aLayerId)
void AppendPoint(const POINT &aPoint)
Implement a <placement_reference> in the specctra dsn spec.
void SetVertex(const POINT &aVertex)
void SetRotation(double aRotation)
std::string m_part_number
std::string m_component_id
reference designator
void SetLayerId(std::string &aLayerId)
void SetCorners(const POINT &aPoint0, const POINT &aPoint1)
std::vector< std::string > m_rules
rules are saved in std::string form.
A "(shape ..)" element in the specctra dsn spec.
A DSN data tree, usually coming from a DSN file.
int m_top_via_layer
specctra cu layers, 0 based index:
IMAGE * makeIMAGE(BOARD *aBoard, FOOTPRINT *aFootprint)
Allocates an I#MAGE on the heap and creates all the PINs according to the PADs in the FOOTPRINT.
void buildLayerMaps(BOARD *aBoard)
Create a few data translation structures for layer name and number mapping between the DSN::PCB struc...
std::map< int, PCB_LAYER_ID > m_pcbLayer2kicad
maps PCB layer number to BOARD layer numbers
void ExportPCB(const wxString &aFilename, bool aNameChange=false)
Write the internal PCB instance out as a SPECTRA DSN format file.
SHAPE_POLY_SET m_brd_outlines
void FlipFOOTPRINTs(BOARD *aBoard)
Flip the footprints which are on the back side of the board to the front.
bool m_footprintsAreFlipped
void deleteNETs()
Delete all the NETs that may be in here.
void fillBOUNDARY(BOARD *aBoard, BOUNDARY *aBoundary)
Make the board perimeter for the DSN file by filling the BOUNDARY element in the specctra element tre...
PADSTACK * makePADSTACK(BOARD *aBoard, PAD *aPad)
Create a PADSTACK which matches the given pad.
void SetPCB(PCB *aPcb)
Delete any existing PCB and replaces it with the given one.
std::vector< std::string > m_layerIds
indexed by PCB layer number
static PCB * MakePCB()
Make a PCB with all the default ELEMs and parts on the heap.
bool BuiltBoardOutlines(BOARD *aBoard)
Build the board outlines and store it in m_brd_outlines.
void exportNETCLASS(const NETCLASS *aNetClass, const BOARD *aBoard)
Export aNetClass to the DSN file.
PADSTACK * makeVia(int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer)
Make a round through hole PADSTACK using the given KiCad diameter in deci-mils.
boost::ptr_set< PADSTACK > m_padstackset
std::map< PCB_LAYER_ID, int > m_kicadLayer2pcb
maps BOARD layer number to PCB layer numbers
std::vector< NET * > m_nets
we don't want ownership here permanently, so we don't use boost::ptr_vector
void FromBOARD(BOARD *aBoard)
Add the entire BOARD to the PCB but does not write it out.
void RevertFOOTPRINTs(BOARD *aBoard)
Flip the footprints which were on the back side of the board back to the back.
A <via_descriptor> in the specctra dsn spec.
void AppendVia(const char *aViaName)
void SetShape(ELEM *aShape)
A <wire_via_descriptor> in the specctra dsn spec.
std::string m_padstack_id
std::vector< POINT > m_vertexes
A <wire_shape_descriptor> in the specctra dsn spec.
void SetShape(ELEM *aShape)
A <wiring_descriptor> in the specctra dsn spec.
boost::ptr_vector< WIRE > wires
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
A collection of nets and the parameters used to route or test these nets.
int GetViaDiameter() const
static const char Default[]
the name of the default NETCLASS
const wxString GetName() const
Gets the name of this (maybe aggregate) netclass in a format for internal usage or for export to exte...
int GetTrackWidth() const
Handle the data for a net.
const wxString & GetNetname() const
Wrapper class, so you can iterate through NETINFO_ITEM*s, not std::pair<int/wxString,...
Container for NETINFO_ITEM elements, which are the nets.
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void MergePrimitivesAsPolygon(PCB_LAYER_ID aLayer, SHAPE_POLY_SET *aMergedPolygon, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Merge all basic shapes to a SHAPE_POLY_SET.
int GetRoundRectCornerRadius(PCB_LAYER_ID aLayer) const
const BOX2I GetBoundingBox() const override
The bounding box is cached, so this will be efficient most of the time.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
VECTOR2I GetOffset(PCB_LAYER_ID aLayer) const
VECTOR2I GetDrillSize() const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
VECTOR2I GetSize(PCB_LAYER_ID aLayer) const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
bool ExportSpecctraFile(const wxString &aFullFilename)
Export the current BOARD to a specctra dsn file.
int GetWidth() const override
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Collect all BOARD_ITEM objects of a given set of KICAD_T type(s).
void Collect(BOARD_ITEM *aBoard, const std::vector< KICAD_T > &aTypes)
Collect BOARD_ITEM objects using this class's Inspector method, which does the collection.
int GetWidth() const override
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Return the 2 layers used by the via (the via actually uses all layers between these 2 layers)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
bool IsEndContour() const
Represent a set of closed polygons.
ITERATOR_TEMPLATE< VECTOR2I > ITERATOR
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
void Simplify()
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections)
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const std::vector< POLYGON > & CPolygons() const
const char * c_str() const
Handle a list of polygons defining a copper zone.
SHAPE_POLY_SET::ITERATOR IterateWithHoles()
Return an iterator to visit all points of the zone's main outline with holes.
void Rotate(const VECTOR2I &aCentre, const EDA_ANGLE &aAngle) override
Rotate the outlines.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
int ConvertArcToPolyline(SHAPE_LINE_CHAIN &aPolyline, VECTOR2I aCenter, int aRadius, const EDA_ANGLE &aStartAngleDeg, const EDA_ANGLE &aArcAngleDeg, double aAccuracy, ERROR_LOC aErrorLoc)
Generate a polyline to approximate a arc.
void TransformRoundChamferedRectToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aPosition, const VECTOR2I &aSize, const EDA_ANGLE &aRotation, int aCornerRadius, double aChamferRatio, int aChamferCorners, int aInflate, int aError, ERROR_LOC aErrorLoc)
Convert a rectangle with rounded corners and/or chamfered corners to a polygon.
void BuildConvexHull(std::vector< VECTOR2I > &aResult, const std::vector< VECTOR2I > &aPoly)
Calculate the convex hull of a list of points in counter-clockwise order.
static bool empty(const wxTextEntryBase *aCtrl)
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_360
static constexpr EDA_ANGLE ANGLE_180
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
a few functions useful in geometry calculations.
#define THROW_IO_ERROR(msg)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
This source file implements export and import capabilities to the specctra dsn file format.
std::map< wxString, int > PINMAP
data type used to ensure unique-ness of pin names, holding (wxString and int)
static double mapX(int x)
static double mapY(int y)
static double IU2um(int kicadDist)
static POINT mapPt(const VECTOR2I &pt)
Convert a KiCad point into a DSN file point.
static bool isRoundKeepout(PAD *aPad)
Decide if the pad is a copper-less through hole which needs to be made into a round keepout.
std::set< std::string > STRINGSET
static double scale(int kicadDist)
Convert a distance from Pcbnew internal units to the reported Specctra DSN units in floating point fo...
void ExportBoardToSpecctraFile(BOARD *aBoard, const wxString &aFullFilename)
Helper method to export board to DSN file.
static PATH * makePath(const POINT &aStart, const POINT &aEnd, const std::string &aLayerName)
Create a PATH element with a single straight line, a pair of vertices.
std::pair< STRINGSET::iterator, bool > STRINGSET_PAIR
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
@ NET
This item represents a net.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
A <pin_reference> definition in the specctra dsn spec.
A point in the SPECCTRA DSN coordinate system.
void FixNegativeZero()
Change negative zero to positive zero in the IEEE floating point storage format.
A storage class for 128-bit hash value.
std::string ToString() const
const SHAPE_LINE_CHAIN chain
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_PAD_T
class PAD, a pad in a footprint
VECTOR2< int32_t > VECTOR2I