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 )
158static inline double IU2um(
int kicadDist )
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();
302 case PAD_SHAPE::CIRCLE:
304 double diameter =
scale( padSize.
x );
306 for(
int ndx = 0; ndx < reportedLayers; ++ndx )
310 padstack->
Append( shape );
321 std::ostringstream oss;
322 oss <<
"Round" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
323 <<
IU2um( padSize.
x ) <<
"_um";
329 case PAD_SHAPE::RECTANGLE:
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";
362 case PAD_SHAPE::OVAL:
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 );
401 path->aperture_width = 2.0 * radius;
404 std::ostringstream oss;
405 oss <<
"Oval" << uniqifier <<
"Pad_" << std::fixed << std::setprecision(6)
406 <<
IU2um( padSize.
x ) <<
"x" <<
IU2um( padSize.
y ) <<
"_um";
412 case PAD_SHAPE::TRAPEZOID:
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 ) <<
"_"
463 case PAD_SHAPE::CHAMFERED_RECT:
464 case PAD_SHAPE::ROUNDRECT:
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
539 case PAD_SHAPE::CUSTOM:
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(
unsigned idx = 0; idx < polygonal_shape.size(); idx++ )
573 POINT corner(
scale( polygonal_shape[idx].x ),
scale( -polygonal_shape[idx].y ) );
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 );
654 if( !mask_copper_layers.any() )
658 PADSTACKSET::iterator iter =
m_padstackset.find( *padstack );
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();
706 for(
int i = 0; i < fpItems.
GetCount(); ++i )
714 case SHAPE_T::SEGMENT:
717 image->Append( outline );
722 path->SetLayerId(
"signal" );
727 case SHAPE_T::CIRCLE:
732 image->Append( outline );
738 path->SetLayerId(
"signal" );
747 for(
int ii = 0; ii < polyline.
PointCount(); ++ii )
750 path->AppendPoint(
mapPt( corner, aFootprint ) );
756 case SHAPE_T::RECTANGLE:
760 image->Append( outline );
765 path->SetLayerId(
"signal" );
767 path->AppendPoint(
mapPt( corner, aFootprint ) );
770 path->AppendPoint(
mapPt( corner, aFootprint ) );
773 path->AppendPoint(
mapPt( corner, aFootprint ) );
776 path->AppendPoint(
mapPt( corner, aFootprint ) );
787 image->Append( outline );
791 path->SetAperture( 0 );
792 path->SetLayerId(
"signal" );
812 arcAngle = -arcAngle;
831 for(
int ii = polyline.
PointCount() - 1; ii >= 0; --ii )
849 for(
int ii = 0; ii < poly.
PointCount(); ++ii )
852 path->AppendPoint(
mapPt( corner, aFootprint ) );
865 if( !zone->GetIsRuleArea() )
869 ZONE untransformedZone( *zone );
881 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
882 keepout_type = T_keepout;
883 else if( zone->GetDoNotAllowVias() )
884 keepout_type = T_via_keepout;
885 else if( zone->GetDoNotAllowTracks() )
886 keepout_type = T_wire_keepout;
888 keepout_type = T_keepout;
894 for(
int layer = 0; layer < copperCount; layer++ )
896 if( layer == copperCount-1 )
903 image->m_keepouts.push_back( keepout );
905 PATH* mainPolygon =
new PATH( keepout, T_polygon );
912 bool is_first_point =
true;
915 for( iterator = untransformedZone.
IterateWithHoles(); iterator; iterator++ )
917 VECTOR2I point( iterator->x, iterator->y );
924 is_first_point =
false;
938 PATH* cutout =
nullptr;
939 bool isStartContour =
true;
942 for( iterator++; iterator; iterator++ )
946 is_first_point =
true;
947 window =
new WINDOW( keepout );
950 cutout =
new PATH( window, T_polygon );
962 VECTOR2I point( iterator->x, iterator->y );
969 is_first_point =
false;
986 int aTopLayer,
int aBotLayer )
990 double dsnDiameter =
scale( aCopperDiameter );
992 for(
int layer=aTopLayer; layer<=aBotLayer; ++layer )
996 padstack->
Append( shape );
1006 snprintf(
name,
sizeof(
name ),
"Via[%d-%d]_%.6g:%.6g_um",
1007 aTopLayer, aBotLayer, dsnDiameter,
1009 IU2um( aDrillDiameter ) );
1023 aVia->
LayerPair( &topLayerNum, &botLayerNum );
1028 if( topLayer > botLayer )
1029 std::swap( topLayer, botLayer );
1033 topLayer, botLayer );
1043 path->layer_id =
"pcb";
1047 for(
int ii = 0; ii < outline.
PointCount(); ii++ )
1062 PATH* poly_ko =
new PATH(
nullptr, T_polygon );
1070 for(
int jj = 0; jj < hole.
PointCount(); jj++ )
1099 if( footprint->GetReference() == wxEmptyString )
1101 THROW_IO_ERROR( wxString::Format(
_(
"Footprint with value of '%s' has an empty "
1102 "reference designator." ),
1103 footprint->GetValue() ) );
1109 if( !refpair.second )
1111 THROW_IO_ERROR( wxString::Format(
_(
"Multiple footprints have the reference "
1112 "designator '%s'." ),
1113 footprint->GetReference() ) );
1130 for(
int pcbNdx=0; pcbNdx<layerCount; ++pcbNdx )
1143 case LT_SIGNAL: layerType = T_signal;
break;
1144 case LT_POWER: layerType = T_power;
break;
1148 case LT_MIXED: layerType = T_signal;
break;
1149 case LT_JUMPER: layerType = T_jumper;
break;
1156 property->name =
"index";
1157 property->value = std::to_string( pcbNdx );
1187 int defaultTrackWidth = netSettings->GetDefaultNetclass()->GetTrackWidth();
1188 int defaultClearance = netSettings->GetDefaultNetclass()->GetClearance();
1189 double clearance =
scale( defaultClearance );
1193 std::snprintf( rule,
sizeof( rule ),
"(width %.6g)",
scale( defaultTrackWidth ) );
1194 rules.push_back( rule );
1196 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g)", clearance );
1197 rules.push_back( rule );
1205 double default_smd = clearance;
1207 if( default_smd <= 6.0 )
1210 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type default_smd))", default_smd );
1212 rules.push_back( rule );
1217 clearance =
scale( defaultClearance ) / 4;
1219 std::snprintf( rule,
sizeof( rule ),
"(clearance %.6g (type smd_smd))", clearance );
1220 rules.push_back( rule );
1226 int netlessZones = 0;
1230 if( zone->GetIsRuleArea() )
1234 if( ! zone->IsOnCopperLayer() )
1241 for(
int layer = 0; layer < copperCount; layer++ )
1243 if( layer == copperCount-1 )
1253 PATH* mainPolygon =
new PATH( plane, T_polygon );
1258 if( plane->
m_name.size() == 0 )
1265 no_net->
m_net_id =
"@:no_net_" + std::to_string( netlessZones++ );
1279 bool is_first_point =
true;
1281 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1283 VECTOR2I point( iterator->x, iterator->y );
1285 if( is_first_point )
1288 is_first_point =
false;
1302 WINDOW* window =
nullptr;
1303 PATH* cutout =
nullptr;
1305 bool isStartContour =
true;
1308 for( iterator++; iterator; iterator++ )
1310 if( isStartContour )
1312 is_first_point =
true;
1313 window =
new WINDOW( plane );
1316 cutout =
new PATH( window, T_polygon );
1328 VECTOR2I point( iterator->x, iterator->y );
1330 if( is_first_point )
1333 is_first_point =
false;
1350 if( !zone->GetIsRuleArea() )
1358 if( zone->GetDoNotAllowVias() && zone->GetDoNotAllowTracks() )
1359 keepout_type = T_keepout;
1360 else if( zone->GetDoNotAllowVias() )
1361 keepout_type = T_via_keepout;
1362 else if( zone->GetDoNotAllowTracks() )
1363 keepout_type = T_wire_keepout;
1365 keepout_type = T_keepout;
1371 for(
int layer = 0; layer < copperCount; layer++ )
1373 if( layer == copperCount - 1 )
1382 PATH* mainPolygon =
new PATH( keepout, T_polygon );
1389 bool is_first_point =
true;
1392 for( iterator = zone->IterateWithHoles(); iterator; iterator++ )
1394 VECTOR2I point( iterator->x, iterator->y );
1396 if( is_first_point )
1399 is_first_point =
false;
1412 WINDOW* window =
nullptr;
1413 PATH* cutout =
nullptr;
1415 bool isStartContour =
true;
1418 for( iterator++; iterator; iterator++ )
1420 if( isStartContour )
1422 is_first_point =
true;
1423 window =
new WINDOW( keepout );
1426 cutout =
new PATH( window, T_polygon );
1436 VECTOR2I point( iterator->x, iterator->y );
1438 if( is_first_point )
1441 is_first_point =
false;
1457 std::string componentId;
1458 int highestNetCode = 0;
1463 highestNetCode = std::max( highestNetCode, i->GetNetCode() );
1468 m_nets.resize( highestNetCode + 1,
nullptr );
1470 for(
unsigned i = 1 ; i <
m_nets.size(); ++i )
1475 if( i->GetNetCode() > 0 )
1476 m_nets[i->GetNetCode()]->m_net_id =
TO_UTF8( i->GetNetname() );
1485 componentId =
TO_UTF8( footprint->GetReference() );
1493 for(
unsigned p = 0; p <
image->m_pins.size(); ++p )
1496 int netcode =
pin->m_kiNetCode;
1526 place->
SetRotation( footprint->GetOrientationDegrees() );
1532 if( footprint->GetFlag() )
1553 for(
unsigned n = 1; n <
m_nets.size(); ++n )
1592 for(
const auto& [
name, netclass] : netSettings->GetNetclasses() )
1594 via =
makeVia( netclass->GetViaDiameter(), netclass->GetViaDrill(),
1608 std::string netname;
1612 int old_netcode = -1;
1618 if( !track->IsType( { PCB_TRACE_T, PCB_ARC_T } ) )
1621 int netcode = track->GetNetCode();
1626 if( old_netcode != netcode
1627 || old_width != track->GetWidth()
1628 || old_layer != track->GetLayer()
1629 || (
path &&
path->points.back() !=
mapPt( track->GetStart() ) ) )
1631 old_width = track->GetWidth();
1632 old_layer = track->GetLayer();
1634 if( old_netcode != netcode )
1636 old_netcode = netcode;
1644 wiring->
wires.push_back( wire );
1647 if( track->IsLocked() )
1652 int kiLayer = track->GetLayer();
1658 path->aperture_width =
scale( old_width );
1659 path->AppendPoint(
mapPt( track->GetStart() ) );
1663 path->AppendPoint(
mapPt( track->GetEnd() ) );
1676 int netcode =
via->GetNetCode();
1701 if(
via->IsLocked() )
1726 for(
const auto& [
name, netclass] : netSettings->GetNetclasses() )
1773 if( net->GetNetClass()->GetVariableSubstitutionName() == clazz->
m_class_id )
1780 int trackWidth = aNetClass->GetTrackWidth();
1781 std::snprintf(
text,
sizeof(
text ),
"(width %.6g)",
scale( trackWidth ) );
1785 int clearance = aNetClass->GetClearance();
1786 std::snprintf(
text,
sizeof(
text ),
"(clearance %.6g)",
scale( clearance ) );
1799 snprintf(
text,
sizeof(
text),
"(use_via %s)",
via->GetPadstackId().c_str() );
1813 footprint->SetFlag( 0 );
1815 if( footprint->GetLayer() ==
B_Cu )
1817 footprint->Flip( footprint->GetPosition(), FLIP_DIRECTION::TOP_BOTTOM );
1818 footprint->SetFlag( 1 );
1836 if( footprint->GetFlag() )
1838 footprint->Flip( footprint->GetPosition(), FLIP_DIRECTION::TOP_BOTTOM );
1839 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.
bool GetBoardPolygonOutlines(SHAPE_POLY_SET &aOutlines, 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...
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
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.
void SetLayerId(const std::string &aLayerId)
void SetVertex(const POINT &aVertex)
void SetDiameter(double aDiameter)
The <class_descriptor> in the specctra spec.
STRINGS m_circuit
circuit descriptor list
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
PADSTACK * LookupVia(PADSTACK *aVia)
Add the via only if one exactly like it does not already exist in the padstack container.
void AppendVia(PADSTACK *aVia)
Add aVia to the internal via container.
IMAGE * LookupIMAGE(IMAGE *aImage)
Add the image only if one exactly like it does not already exist in the image container.
void AddPadstack(PADSTACK *aPadstack)
A <net_descriptor> in the DSN spec.
Hold either a via or a pad definition.
std::string m_padstack_id
void SetPadstackId(const char *aPadstackId)
bool space_in_quoted_tokens
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)
COMPONENT * LookupCOMPONENT(const std::string &imageName)
Look up a COMPONENT by name.
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)
A <rule_descriptor> in the specctra dsn spec.
STRINGS 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...
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.
STRINGS m_layerIds
indexed by PCB layer number
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.
static PCB * MakePCB()
Make a PCB with all the default ELEMs and parts on the heap.
std::vector< PCB_LAYER_ID > m_pcbLayer2kicad
maps PCB layer number to BOARD layer numbers
bool BuiltBoardOutlines(BOARD *aBoard)
Build the board outlines and store it in m_brd_outlines.
std::vector< int > m_kicadLayer2pcb
maps BOARD layer number to PCB layer numbers
PADSTACK * makeVia(int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer)
Make a round through hole PADSTACK using the given KiCad diameter in deci-mils.
std::vector< NET * > m_nets
we don't want ownership here permanently, so we don't use boost::ptr_vector
PADSTACKSET m_padstackset
void exportNETCLASS(const std::shared_ptr< NETCLASS > &aNetClass, BOARD *aBoard)
Export aNetClass to the DSN file.
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.
void SetBOUNDARY(BOUNDARY *aBoundary)
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
A <wire_shape_descriptor> in the specctra dsn spec.
void SetShape(ELEM *aShape)
A <wiring_descriptor> in the specctra dsn spec.
EDA_ANGLE GetArcAngle() const
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 LSET AllCuMask(int aCuLayerCount=MAX_CU_LAYERS)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
static const char Default[]
the name of the default NETCLASS
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 & GetDrillSize() const
const VECTOR2I & GetDelta(PCB_LAYER_ID aLayer) const
PAD_SHAPE GetShape(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetOffset(PCB_LAYER_ID aLayer) const
int GetChamferPositions(PCB_LAYER_ID aLayer) const
double GetChamferRectRatio(PCB_LAYER_ID aLayer) const
const VECTOR2I & GetSize(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.
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
int GetWidth() const override
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.
void Clear()
Remove all points from the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Base class for iterating over all vertices in a given SHAPE_POLY_SET.
bool IsEndContour() const
Represent a set of closed polygons.
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
int HoleCount(int aOutline) const
Returns the number of holes in a given outline.
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(POLYGON_MODE aFastMode)
Simplify the polyset (merges overlapping polys, eliminates degeneracy/self-intersections) For aFastMo...
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
SHAPE_LINE_CHAIN & Hole(int aOutline, int aHole)
Return the reference to aHole-th hole in the aIndex-th outline.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) 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 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 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
a few functions useful in geometry calculations.
#define THROW_IO_ERROR(msg)
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
This source file implements export and import capabilities to the specctra dsn file format.
std::vector< std::string > STRINGS
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
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)
#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
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