KiCad PCB EDA Suite
EXCELLON_IMAGE Class Reference

Handle a drill image. More...

#include <excellon_image.h>

Inheritance diagram for EXCELLON_IMAGE:
GERBER_FILE_IMAGE EDA_ITEM KIGFX::VIEW_ITEM INSPECTABLE

Public Member Functions

 EXCELLON_IMAGE (int layer)
 
 ~EXCELLON_IMAGE ()
 
virtual void ResetDefaultValues () override
 Set all parameters to a default value, before reading a file. More...
 
bool LoadFile (const wxString &aFullFileName, EXCELLON_DEFAULTS *aDefaults)
 Read and load a drill (EXCELLON format) file. More...
 
wxString GetClass () const override
 Return the class name. More...
 
bool LoadGerberFile (const wxString &aFullFileName)
 Read and load a gerber file. More...
 
const wxArrayString & GetMessages () const
 
int GetDcodesCount ()
 
COLOR4D GetPositiveDrawColor () const
 
GERBER_DRAW_ITEMSGetItems ()
 
int GetItemsCount ()
 
void AddItemToList (GERBER_DRAW_ITEM *aItem)
 Add a new GERBER_DRAW_ITEM item to the drawings list. More...
 
GERBER_DRAW_ITEMGetLastItemInList () const
 
GERBER_LAYERGetLayerParams ()
 
bool HasNegativeItems ()
 
void ClearMessageList ()
 Clear the message list. More...
 
void AddMessageToList (const wxString &aMessage)
 Add a message to the message list. More...
 
void InitToolTable ()
 
VECTOR2I ReadXYCoord (char *&aText, bool aExcellonMode=false)
 Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm). More...
 
VECTOR2I ReadIJCoord (char *&Text)
 Return the current coordinate type pointed to by InnJnn Text (InnnnJmmmm) More...
 
int CodeNumber (char *&aText)
 Reads the next number and returns the value. More...
 
D_CODEGetDCODEOrCreate (int aDCODE, bool aCreateIfNoExist=true)
 Return a pointer to the D_CODE within this GERBER for the given aDCODE. More...
 
D_CODEGetDCODE (int aDCODE) const
 Return a pointer to the D_CODE within this GERBER for the given aDCODE. More...
 
APERTURE_MACROFindApertureMacro (const APERTURE_MACRO &aLookup)
 Look up a previously read in aperture macro. More...
 
void StepAndRepeatItem (const GERBER_DRAW_ITEM &aItem)
 Gerber format has a command Step an Repeat. More...
 
void DisplayImageInfo (GERBVIEW_FRAME *aMainFrame)
 Display information about image parameters in the status bar. More...
 
void RemoveAttribute (X2_ATTRIBUTE &aAttribute)
 Called when a TD command is found the Gerber file. More...
 
INSPECT_RESULT Visit (INSPECTOR inspector, void *testData, const KICAD_T scanTypes[]) override
 May be re-implemented for each derived class in order to handle all the types given by its member data. More...
 
KICAD_T Type () const
 Returns the type of object. More...
 
EDA_ITEMGetParent () const
 
virtual void SetParent (EDA_ITEM *aParent)
 
bool IsModified () const
 
bool IsNew () const
 
bool IsMoving () const
 
bool IsDragging () const
 
bool IsWireImage () const
 
bool IsSelected () const
 
bool IsEntered () const
 
bool IsResized () const
 
bool IsBrightened () const
 
void SetWireImage ()
 
void SetSelected ()
 
void SetBrightened ()
 
void ClearSelected ()
 
void ClearBrightened ()
 
void SetModified ()
 
int GetState (EDA_ITEM_FLAGS type) const
 
void SetState (EDA_ITEM_FLAGS type, bool state)
 
EDA_ITEM_FLAGS GetStatus () const
 
void SetStatus (EDA_ITEM_FLAGS aStatus)
 
void SetFlags (EDA_ITEM_FLAGS aMask)
 
void ClearFlags (EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
 
EDA_ITEM_FLAGS GetFlags () const
 
bool HasFlag (EDA_ITEM_FLAGS aFlag) const
 
EDA_ITEM_FLAGS GetEditFlags () const
 
void ClearTempFlags ()
 
void ClearEditFlags ()
 
virtual bool RenderAsBitmap (double aWorldScale) const
 
void SetIsShownAsBitmap (bool aBitmap)
 
bool IsShownAsBitmap () const
 
virtual bool IsType (const KICAD_T aScanTypes[]) const
 Check whether the item is one of the listed types. More...
 
void SetForceVisible (bool aEnable)
 Set and clear force visible flag used to force the item to be drawn even if it's draw attribute is set to not visible. More...
 
bool IsForceVisible () const
 
virtual void GetMsgPanelInfo (EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
 Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes. More...
 
virtual bool HitTest (const VECTOR2I &aPosition, int aAccuracy=0) const
 Test if aPosition is inside or on the boundary of this item. More...
 
virtual bool HitTest (const EDA_RECT &aRect, bool aContained, int aAccuracy=0) const
 Test if aRect intersects this item. More...
 
virtual const EDA_RECT GetBoundingBox () const
 Return the orthogonal bounding box of this object for display purposes. More...
 
virtual VECTOR2I GetPosition () const
 
virtual void SetPosition (const VECTOR2I &aPos)
 
virtual const VECTOR2I GetFocusPosition () const
 Similar to GetPosition, but allows items to return their visual center rather than their anchor. More...
 
virtual VECTOR2I GetSortPosition () const
 Return the coordinates that should be used for sorting this element visually compared to other elements. More...
 
virtual EDA_ITEMClone () const
 Create a duplicate of this item with linked list members set to NULL. More...
 
virtual wxString GetSelectMenuText (EDA_UNITS aUnits) const
 Return the text to display to be used in the selection clarification context menu when multiple items are found at the current cursor position. More...
 
virtual BITMAPS GetMenuImage () const
 Return a pointer to an image to be used in menus. More...
 
virtual bool Matches (const wxFindReplaceData &aSearchData, void *aAuxData) const
 Compare the item against the search criteria in aSearchData. More...
 
virtual bool Replace (const wxFindReplaceData &aSearchData, void *aAuxData=nullptr)
 Perform a text replace using the find and replace criteria in aSearchData on items that support text find and replace. More...
 
virtual bool IsReplaceable () const
 Override this method in any derived object that supports test find and replace. More...
 
bool operator< (const EDA_ITEM &aItem) const
 Test if another item is less than this object. More...
 
virtual const BOX2I ViewBBox () const override
 Return the bounding box of the item covering all its layers. More...
 
virtual void ViewGetLayers (int aLayers[], int &aCount) const override
 Return the all the layers within the VIEW the object is painted on. More...
 
virtual void ViewDraw (int aLayer, VIEW *aView) const
 Draw the parts of the object belonging to layer aLayer. More...
 
virtual double ViewGetLOD (int aLayer, VIEW *aView) const
 Return the level of detail (LOD) of the item. More...
 
VIEW_ITEM_DATA * viewPrivData () const
 
void ClearViewPrivData ()
 
bool Set (PROPERTY_BASE *aProperty, wxAny &aValue)
 
template<typename T >
bool Set (PROPERTY_BASE *aProperty, T aValue)
 
template<typename T >
bool Set (const wxString &aProperty, T aValue)
 
wxAny Get (PROPERTY_BASE *aProperty)
 
template<typename T >
Get (PROPERTY_BASE *aProperty)
 
template<typename T >
boost::optional< T > Get (const wxString &aProperty)
 

Static Public Member Functions

static bool TestFileIsExcellon (const wxString &aFullFileName)
 Performs a heuristics-based check of whether the file is an Excellon drill file. More...
 
static bool TestFileIsRS274 (const wxString &aFullFileName)
 Performs a heuristics-based check of whether the file is an RS274 gerber file. More...
 
template<class T >
static INSPECT_RESULT IterateForward (std::deque< T > &aList, INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
 This changes first parameter to avoid the DList and use the main queue instead. More...
 
template<class T >
static INSPECT_RESULT IterateForward (std::vector< T > &aList, INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
 Change first parameter to avoid the DList and use std::vector instead. More...
 
static bool Replace (const wxFindReplaceData &aSearchData, wxString &aText)
 Perform a text replace on aText using the find and replace criteria in aSearchData on items that support text find and replace. More...
 
static bool Sort (const EDA_ITEM *aLeft, const EDA_ITEM *aRight)
 Helper function to be used by the C++ STL sort algorithm for sorting a STL container of EDA_ITEM pointers. More...
 

Public Attributes

bool m_InUse
 
bool m_IsVisible
 < True if the draw layer is visible and must be drawn. More...
 
COLOR4D m_PositiveDrawColor
 
wxString m_FileName
 
wxString m_ImageName
 
bool m_IsX2_file
 < True if a X2 gerber attribute was found in file. More...
 
X2_ATTRIBUTE_FILEFUNCTIONm_FileFunction
 
wxString m_MD5_value
 
wxString m_PartString
 
int m_GraphicLayer
 
bool m_ImageNegative
 
bool m_ImageJustifyXCenter
 < Image Justify Center on X axis (default = false). More...
 
bool m_ImageJustifyYCenter
 Image Justify Offset on XY axis (default = 0,0). More...
 
VECTOR2I m_ImageJustifyOffset
 
bool m_GerbMetric
 
bool m_Relative
 < false = absolute Coord, true = relative Coord. More...
 
bool m_NoTrailingZeros
 
VECTOR2I m_ImageOffset
 
wxSize m_FmtScale
 < Fmt 2.3: m_FmtScale = 3, fmt 3.4: m_FmtScale = 4. More...
 
wxSize m_FmtLen
 Image rotation (0, 90, 180, 270 only) in degrees. More...
 
int m_ImageRotation
 Local rotation in degrees added to m_ImageRotation. More...
 
double m_LocalRotation
 
VECTOR2I m_Offset
 
VECTOR2I m_Scale
 
bool m_SwapAxis
 
bool m_MirrorA
 
bool m_MirrorB
 
int m_Iterpolation
 
int m_Current_Tool
 
int m_Last_Pen_Command
 < Current or last pen state (0..9, set by Dn option with n < 10. More...
 
int m_CommandState
 
int m_LineNum
 < Line number of the gerber file while reading. More...
 
VECTOR2I m_CurrentPos
 
VECTOR2I m_PreviousPos
 
VECTOR2I m_IJPos
 
bool m_LastCoordIsIJPos
 < True if a IJ coord was read (for arcs & circles ). More...
 
int m_ArcRadius
 Identifier for arc data type (IJ (center) or A## (radius)). More...
 
LAST_EXTRA_ARC_DATA_TYPE m_LastArcDataType
 
FILE * m_Current_File
 
int m_Selected_Tool
 
bool m_Has_DCode
 < True if has DCodes in file or false if no DCodes found. Perhaps deprecated RS274D file. More...
 
bool m_Has_MissingDCode
 
bool m_360Arc_enbl
 
bool m_AsArcG74G75Cmd
 
bool m_PolygonFillMode
 
int m_PolygonFillModeState
 a collection of APERTURE_MACROS, sorted by name More...
 
APERTURE_MACRO_SET m_aperture_macros
 
GBR_NETLIST_METADATA m_NetAttributeDict
 
wxString m_AperFunction
 
std::map< wxString, int > m_ComponentsList
 
std::map< wxString, int > m_NetnamesList
 
D_CODEm_Aperture_List [TOOLS_MAX_COUNT]
 < Dcode (Aperture) List for this layer (max TOOLS_MAX_COUNT: see dcode.h) More...
 
bool m_Exposure
 
GERBER_LAYER m_GBRLayerParams
 
GERBER_DRAW_ITEMS m_drawings
 
const KIID m_Uuid
 

Protected Member Functions

bool Matches (const wxString &aText, const wxFindReplaceData &aSearchData) const
 Compare aText against search criteria in aSearchData. More...
 

Protected Attributes

EDA_ITEM_FLAGS m_status
 
EDA_ITEMm_parent
 Linked list: Link (parent struct) More...
 
bool m_forceVisible
 
EDA_ITEM_FLAGS m_flags
 

Private Types

enum  EXCELLON_STATE { READ_HEADER_STATE , READ_PROGRAM_STATE }
 

Private Member Functions

bool Execute_HEADER_And_M_Command (char *&text)
 
bool Select_Tool (char *&text)
 
bool Execute_EXCELLON_G_Command (char *&text)
 
bool Execute_Drill_Command (char *&text)
 
void readFileFormat (char *&aText)
 Read an Altium-specific FILE_FORMAT=X:X attribute that specifies the length and mantissa of the numbers in the gerber file. More...
 
bool readToolInformation (char *&aText)
 Read a tool definition like T1C0.02 or T1F00S00C0.02 or T1C0.02F00S00 and enter params in TCODE list. More...
 
void FinishRouteCommand ()
 End a route command started by M15 ot G01, G02 or G03 command. More...
 
void SelectUnits (bool aMetric, EXCELLON_DEFAULTS *aDefaults)
 Switch unit selection, and the coordinate format (nn:mm) if not yet set. More...
 
char * GetNextLine (char *aBuff, unsigned int aBuffSize, char *aText, FILE *aFile)
 Test for an end of line. More...
 
bool GetEndOfBlock (char *aBuff, unsigned int aBuffSize, char *&aText, FILE *aGerberFile)
 
bool ReadRS274XCommand (char *aBuff, unsigned int aBuffSize, char *&aText)
 Read a single RS274X command terminated with a %. More...
 
bool ExecuteRS274XCommand (int aCommand, char *aBuff, unsigned int aBuffSize, char *&aText)
 Execute a RS274X command. More...
 
int ReadXCommandID (char *&text)
 Read two bytes of data and assembles them into an int with the first byte in the sequence put into the most significant part of a 16 bit value to build a RS274X command identifier. More...
 
bool ReadApertureMacro (char *aBuff, unsigned int aBuffSize, char *&text, FILE *gerber_file)
 Read in an aperture macro and saves it in m_aperture_macros. More...
 
bool Execute_G_Command (char *&text, int G_command)
 
bool Execute_DCODE_Command (char *&text, int D_command)
 

Private Attributes

EXCELLON_STATE m_State
 
bool m_SlotOn
 
bool m_RouteModeOn
 
std::vector< EXCELLON_ROUTE_COORDm_RoutePositions
 
bool m_hasFormat
 Excellon file do not have a format statement to specify the coordinate format like nn:mm. More...
 
wxArrayString m_messagesList
 
int m_hasNegativeItems
 True if the image is negative or has some negative items. More...
 
KICAD_T m_structType
 Run time identification, keep private so it can never be changed after a ctor sets it. More...
 
VIEW_ITEM_DATA * m_viewPrivData
 

Detailed Description

Handle a drill image.

It is derived from GERBER_FILE_IMAGE because there is a lot of likeness between EXCELLON files and GERBER files. DCode apertures are also similar to T Codes.

Definition at line 137 of file excellon_image.h.

Member Enumeration Documentation

◆ EXCELLON_STATE

Enumerator
READ_HEADER_STATE 
READ_PROGRAM_STATE 

Definition at line 209 of file excellon_image.h.

209 {
210 READ_HEADER_STATE, // When we are in this state, we are reading header
211 READ_PROGRAM_STATE // When we are in this state, we are reading drill data
212 };

Constructor & Destructor Documentation

◆ EXCELLON_IMAGE()

EXCELLON_IMAGE::EXCELLON_IMAGE ( int  layer)
inline

Definition at line 139 of file excellon_image.h.

139 : EXCELLON_IMAGE( int layer ) :
140 GERBER_FILE_IMAGE( layer )
141 {
143 m_SlotOn = false;
144 m_RouteModeOn = false;
145 m_hasFormat = false;
146 }
EXCELLON_STATE m_State
bool m_hasFormat
Excellon file do not have a format statement to specify the coordinate format like nn:mm.
EXCELLON_IMAGE(int layer)
Hold the image data and parameters for one gerber file and layer parameters.

References m_hasFormat, m_RouteModeOn, m_SlotOn, m_State, and READ_HEADER_STATE.

◆ ~EXCELLON_IMAGE()

EXCELLON_IMAGE::~EXCELLON_IMAGE ( )
inline

Definition at line 149 of file excellon_image.h.

149{};

Member Function Documentation

◆ AddItemToList()

void GERBER_FILE_IMAGE::AddItemToList ( GERBER_DRAW_ITEM aItem)
inlineinherited

Add a new GERBER_DRAW_ITEM item to the drawings list.

Parameters
aItemis the GERBER_DRAW_ITEM to add to list

Definition at line 170 of file gerber_file_image.h.

171 {
172 m_drawings.push_back( aItem );
173 }
GERBER_DRAW_ITEMS m_drawings

References GERBER_FILE_IMAGE::m_drawings.

Referenced by GERBER_FILE_IMAGE::Execute_DCODE_Command(), Execute_Drill_Command(), FinishRouteCommand(), and GERBER_FILE_IMAGE::StepAndRepeatItem().

◆ AddMessageToList()

◆ ClearBrightened()

void EDA_ITEM::ClearBrightened ( )
inlineinherited

Definition at line 132 of file eda_item.h.

void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: eda_item.h:153
#define BRIGHTENED
item is drawn with a bright contour

References BRIGHTENED, and EDA_ITEM::ClearFlags().

Referenced by SCH_EDIT_FRAME::FocusOnItem(), PCB_BASE_FRAME::FocusOnItems(), EE_SELECTION_TOOL::unhighlight(), PL_SELECTION_TOOL::unhighlight(), PCB_SELECTION_TOOL::unhighlightInternal(), and SCH_EDITOR_CONTROL::UpdateNetHighlighting().

◆ ClearEditFlags()

◆ ClearFlags()

void EDA_ITEM::ClearFlags ( EDA_ITEM_FLAGS  aMask = EDA_ITEM_ALL_FLAGS)
inlineinherited

Definition at line 153 of file eda_item.h.

153{ m_flags &= ~aMask; }
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:500

References EDA_ITEM::m_flags.

Referenced by FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), PNS_KICAD_IFACE::AddItem(), SCH_EDIT_FRAME::AddItemToScreenAndUndoList(), SCH_MOVE_TOOL::AlignElements(), FOOTPRINT::BuildCourtyardCaches(), EDA_ITEM::ClearBrightened(), EDA_ITEM::ClearEditFlags(), EDA_ITEM::ClearSelected(), EDA_ITEM::ClearTempFlags(), ConvertOutlineToPolygon(), SCH_EDIT_FRAME::ConvertPart(), SYMBOL_EDITOR_EDIT_TOOL::Copy(), FOOTPRINT_EDITOR_CONTROL::CreateFootprint(), SYMBOL_EDITOR_PIN_TOOL::CreateImagePins(), MICROWAVE_TOOL::createMicrowaveInductor(), DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES(), KIGFX::SCH_PAINTER::draw(), SCH_ITEM::Duplicate(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PCB_EDIT_FRAME::ExchangeFootprint(), PCB_SELECTION_TOOL::ExitGroup(), SYMBOL_EDIT_FRAME::GetSymbolFromRedoList(), SYMBOL_EDIT_FRAME::GetSymbolFromUndoList(), FOOTPRINT_EDITOR_CONTROL::ImportFootprint(), DRC_TEST_PROVIDER_COURTYARD_CLEARANCE_ON_MOVE::Init(), EE_COLLECTOR::Inspect(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromLibrary(), EE_SELECTION_TOOL::Main(), FOOTPRINT_EDITOR_CONTROL::NewFootprint(), FOOTPRINT_EDIT_FRAME::OpenProjectFiles(), PCB_BASE_FRAME::PlaceFootprint(), SYMBOL_EDITOR_PIN_TOOL::PlacePin(), BOARD_COMMIT::Push(), PCB_SELECTION_TOOL::RebuildSelection(), SCH_EDIT_TOOL::RepeatDrawItem(), SYMBOL_EDIT_FRAME::RollbackSymbolFromUndo(), DRC_TEST_PROVIDER_DISALLOW::Run(), SCH_EDIT_FRAME::SaveCopyForRepeatItem(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), SCH_SEXPR_PLUGIN_CACHE::savePin(), SCH_EDIT_FRAME::SelectUnit(), EDA_ITEM::SetIsShownAsBitmap(), DIALOG_SYMBOL_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PROPERTIES::TransferDataFromWindow(), SCH_DRAWING_TOOLS::TwoClickPlace(), and EE_SELECTION_TOOL::unhighlight().

◆ ClearMessageList()

void GERBER_FILE_IMAGE::ClearMessageList ( )
inlineinherited

Clear the message list.

Call it before reading a Gerber file

Definition at line 202 of file gerber_file_image.h.

203 {
204 m_messagesList.Clear();
205 }

References GERBER_FILE_IMAGE::m_messagesList.

Referenced by LoadFile(), and GERBER_FILE_IMAGE::LoadGerberFile().

◆ ClearSelected()

◆ ClearTempFlags()

void EDA_ITEM::ClearTempFlags ( )
inlineinherited

Definition at line 165 of file eda_item.h.

166 {
168 }
#define IS_LINKED
Used in calculation to mark linked items (temporary use)
#define SELECTED_BY_DRAG
Item was algorithmically selected as a dragged item.
#define DO_NOT_DRAW
Used to disable draw function.
#define SKIP_STRUCT
flag indicating that the structure should be ignored
#define CANDIDATE
flag indicating that the structure is connected

References CANDIDATE, EDA_ITEM::ClearFlags(), DO_NOT_DRAW, IS_LINKED, SELECTED_BY_DRAG, and SKIP_STRUCT.

Referenced by PCB_EDIT_FRAME::OpenProjectFiles(), and SCH_EDIT_FRAME::PutDataInPreviousState().

◆ ClearViewPrivData()

void KIGFX::VIEW_ITEM::ClearViewPrivData ( )
inlineinherited

Definition at line 143 of file view_item.h.

144 {
145 m_viewPrivData = nullptr;
146 }
VIEW_ITEM_DATA * m_viewPrivData
Definition: view_item.h:151

References KIGFX::VIEW_ITEM::m_viewPrivData.

Referenced by KIGFX::VIEW::OnDestroy().

◆ Clone()

EDA_ITEM * EDA_ITEM::Clone ( ) const
virtualinherited

Create a duplicate of this item with linked list members set to NULL.

The default version will return NULL in release builds and likely crash the program. In debug builds, a warning message indicating the derived class has not implemented cloning. This really should be a pure virtual function. Due to the fact that there are so many objects derived from EDA_ITEM, the decision was made to return NULL until all the objects derived from EDA_ITEM implement cloning. Once that happens, this function should be made pure.

Returns
A clone of the item.

Reimplemented in LIB_FIELD, LIB_PIN, LIB_SHAPE, LIB_TEXT, LIB_TEXTBOX, SCH_BITMAP, SCH_BUS_WIRE_ENTRY, SCH_BUS_BUS_ENTRY, SCH_FIELD, SCH_JUNCTION, SCH_LABEL, SCH_DIRECTIVE_LABEL, SCH_GLOBALLABEL, SCH_HIERLABEL, SCH_LINE, SCH_MARKER, SCH_NO_CONNECT, SCH_PIN, SCH_SHAPE, SCH_SHEET, SCH_SHEET_PIN, SCH_SYMBOL, SCH_TEXT, SCH_TEXTBOX, KIGFX::ORIGIN_VIEWITEM, PCB_GROUP, FOOTPRINT, FP_SHAPE, FP_TEXT, FP_TEXTBOX, NETINFO_ITEM, PAD, PCB_BITMAP, PCB_DIM_ALIGNED, PCB_DIM_ORTHOGONAL, PCB_DIM_RADIAL, PCB_DIM_LEADER, PCB_DIM_CENTER, PCB_MARKER, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TEXTBOX, PCB_TRACK, PCB_ARC, PCB_VIA, ZONE, and FP_ZONE.

Definition at line 83 of file eda_item.cpp.

84{
85 wxCHECK_MSG( false, nullptr, wxT( "Clone not implemented in derived class " ) + GetClass() +
86 wxT( ". Bad programmer!" ) );
87}
virtual wxString GetClass() const =0
Return the class name.

References EDA_ITEM::GetClass().

Referenced by DIALOG_DIMENSION_PROPERTIES::DIALOG_DIMENSION_PROPERTIES(), BOARD_ITEM::Duplicate(), SCH_ITEM::Duplicate(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PCB_DIMENSION_BASE::GetEffectiveShape(), LIB_SYMBOL::LIB_SYMBOL(), new_clone(), LIB_SYMBOL::operator=(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), SCH_LIB_PLUGIN_CACHE::removeSymbol(), SCH_EDIT_FRAME::SaveCopyForRepeatItem(), PCB_BASE_EDIT_FRAME::saveCopyInUndoList(), CLIPBOARD_IO::SaveSelection(), LIB_SYMBOL::SetConversion(), LIB_SYMBOL::SetUnitCount(), SCH_DRAWING_TOOLS::SingleClickPlace(), COMMIT::Stage(), SCH_DRAWING_TOOLS::TwoClickPlace(), and SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace().

◆ CodeNumber()

int GERBER_FILE_IMAGE::CodeNumber ( char *&  aText)
inherited

Reads the next number and returns the value.

Parameters
aTextPointer to the input string vector
Returns

Definition at line 401 of file rs274d.cpp.

402{
403 int retval;
404 char* endptr;
405
406 errno = 0;
407
408 retval = strtol( aText + 1, &endptr, 10 );
409
410 if( endptr == aText || errno != 0 )
411 return 0;
412
413 wxCHECK_MSG( retval < std::numeric_limits<int>::max(), 0, _( "Invalid Code Number" ) );
414
415 aText = endptr;
416
417 return static_cast<int>( retval );
418}
#define _(s)

References _.

Referenced by GERBER_FILE_IMAGE::Execute_G_Command(), GERBER_FILE_IMAGE::LoadGerberFile(), and Select_Tool().

◆ DisplayImageInfo()

void GERBER_FILE_IMAGE::DisplayImageInfo ( GERBVIEW_FRAME aMainFrame)
inherited

Display information about image parameters in the status bar.

Function DisplayImageInfo has knowledge about the frame and how and where to put status information about this object into the frame's message panel.

Parameters
aMainFrameThe GERBVIEW_FRAME to display messages.

Display info about Image Parameters. These parameters are valid for the entire file, and must set only once (If more than once, only the last value is used) Some are deprecated

Definition at line 332 of file gerber_file_image.cpp.

333{
334 wxString msg;
335
336 aMainFrame->ClearMsgPanel();
337
338 // Display the Gerber variant (X1 / X2
339 aMainFrame->AppendMsgPanel( _( "Format" ), m_IsX2_file ? wxT( "X2" ) : wxT( "X1" ) );
340
341 // Display Image name (Image specific). IM command (Image Name) is deprecated
342 // So non empty image name is very rare, probably never found
343 if( !m_ImageName.IsEmpty() )
344 aMainFrame->AppendMsgPanel( _( "Image name" ), m_ImageName );
345
346 // Display graphic layer number used to draw this Image
347 // (not a Gerber parameter but is also image specific)
348 msg.Printf( wxT( "%d" ), m_GraphicLayer + 1 );
349 aMainFrame->AppendMsgPanel( _( "Graphic layer" ), msg );
350
351 // Display Image rotation (Image specific)
352 msg.Printf( wxT( "%d" ), m_ImageRotation );
353 aMainFrame->AppendMsgPanel( _( "Img Rot." ), msg );
354
355 // Display Image polarity (Image specific)
356 msg = m_ImageNegative ? _("Negative") : _("Normal");
357 aMainFrame->AppendMsgPanel( _( "Polarity" ), msg );
358
359 // Display Image justification and offset for justification (Image specific)
360 msg = m_ImageJustifyXCenter ? _("Center") : _("Normal");
361 aMainFrame->AppendMsgPanel( _( "X Justify" ), msg );
362
363 msg = m_ImageJustifyYCenter ? _("Center") : _("Normal");
364 aMainFrame->AppendMsgPanel( _( "Y Justify" ), msg );
365
366 switch( aMainFrame->GetUserUnits() )
367 {
368 case EDA_UNITS::MILS:
369 msg.Printf( wxT( "X=%f Y=%f" ), Iu2Mils( m_ImageJustifyOffset.x ),
370 Iu2Mils( m_ImageJustifyOffset.y ) );
371 break;
372
374 msg.Printf( wxT( "X=%f Y=%f" ), Iu2Mils( m_ImageJustifyOffset.x ) / 1000.0,
375 Iu2Mils( m_ImageJustifyOffset.y ) / 1000.0 );
376 break;
377
379 msg.Printf( wxT( "X=%f Y=%f" ), Iu2Millimeter( m_ImageJustifyOffset.x ),
380 Iu2Millimeter( m_ImageJustifyOffset.y ) );
381 break;
382
383 default:
384 wxASSERT_MSG( false, wxT( "Invalid unit" ) );
385 }
386
387 aMainFrame->AppendMsgPanel( _( "Image Justify Offset" ), msg );
388}
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
virtual void ClearMsgPanel()
Clear all messages from the message panel.
void AppendMsgPanel(const wxString &aTextUpper, const wxString &aTextLower, int aPadding=6)
Append a message to the message panel.
bool m_ImageJustifyXCenter
< Image Justify Center on X axis (default = false).
bool m_ImageJustifyYCenter
Image Justify Offset on XY axis (default = 0,0).
bool m_IsX2_file
< True if a X2 gerber attribute was found in file.
int m_ImageRotation
Local rotation in degrees added to m_ImageRotation.

References _, EDA_DRAW_FRAME::AppendMsgPanel(), EDA_DRAW_FRAME::ClearMsgPanel(), EDA_BASE_FRAME::GetUserUnits(), INCHES, GERBER_FILE_IMAGE::m_GraphicLayer, GERBER_FILE_IMAGE::m_ImageJustifyOffset, GERBER_FILE_IMAGE::m_ImageJustifyXCenter, GERBER_FILE_IMAGE::m_ImageJustifyYCenter, GERBER_FILE_IMAGE::m_ImageName, GERBER_FILE_IMAGE::m_ImageNegative, GERBER_FILE_IMAGE::m_ImageRotation, GERBER_FILE_IMAGE::m_IsX2_file, MILLIMETRES, MILS, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by GERBVIEW_FRAME::UpdateTitleAndInfo().

◆ Execute_DCODE_Command()

bool GERBER_FILE_IMAGE::Execute_DCODE_Command ( char *&  text,
int  D_command 
)
privateinherited

Definition at line 557 of file rs274d.cpp.

558{
559 wxSize size( 15, 15 );
560
561 APERTURE_T aperture = APT_CIRCLE;
562 GERBER_DRAW_ITEM* gbritem;
563
564 int dcode = 0;
565 D_CODE* tool = nullptr;
566 wxString msg;
567
568 if( D_commande >= FIRST_DCODE ) // This is a "Set tool" command
569 {
570 if( D_commande > (TOOLS_MAX_COUNT - 1) )
571 D_commande = TOOLS_MAX_COUNT - 1;
572
573 // remember which tool is selected, nothing is done with it in this
574 // call
575 m_Current_Tool = D_commande;
576
577 D_CODE* pt_Dcode = GetDCODE( D_commande );
578
579 if( pt_Dcode )
580 pt_Dcode->m_InUse = true;
581 else
582 m_Has_MissingDCode = true;
583
584 return true;
585 }
586 else // D_commande = 0..9: this is a pen command (usually D1, D2 or D3)
587 {
588 m_Last_Pen_Command = D_commande;
589 }
590
591 if( m_PolygonFillMode ) // Enter a polygon description:
592 {
593 switch( D_commande )
594 {
595 case 1: // code D01 Draw line, exposure ON
596 if( !m_Exposure ) // Start a new polygon outline:
597 {
598 m_Exposure = true;
599 gbritem = new GERBER_DRAW_ITEM( this );
600 AddItemToList( gbritem );
601 gbritem->m_Shape = GBR_POLYGON;
602 gbritem->m_Flashed = false;
603 gbritem->m_DCode = 0; // No DCode for a Polygon (Region in Gerber dialect)
604
605
606 if( gbritem->m_GerberImageFile )
607 {
610 }
611 }
612
613 switch( m_Iterpolation )
614 {
617 // Before any arc command, a G74 or G75 command must be set.
618 // Otherwise the Gerber file is invalid
619 if( !m_AsArcG74G75Cmd )
620 {
621 AddMessageToList( _( "Invalid Gerber file: missing G74 or G75 arc command" ) );
622
623 // Disable further warning messages:
624 m_AsArcG74G75Cmd = true;
625 }
626
627 gbritem = GetLastItemInList();
628
629 fillArcPOLY( gbritem, m_PreviousPos,
631 ( m_Iterpolation == GERB_INTERPOL_ARC_NEG ) ? false : true,
632 m_360Arc_enbl, GetLayerParams().m_LayerNegative );
633 break;
634
635 default:
636 gbritem = GetLastItemInList();
637
638 gbritem->m_Start = m_PreviousPos; // m_Start is used as temporary storage
639
640 if( gbritem->m_Polygon.OutlineCount() == 0 )
641 {
642 gbritem->m_Polygon.NewOutline();
643 gbritem->m_Polygon.Append( VECTOR2I( gbritem->m_Start ) );
644 }
645
646 gbritem->m_End = m_CurrentPos; // m_End is used as temporary storage
647 gbritem->m_Polygon.Append( VECTOR2I( gbritem->m_End ) );
648 break;
649 }
650
653 break;
654
655 case 2: // code D2: exposure OFF (i.e. "move to")
656 if( m_Exposure && GetLastItemInList() ) // End of polygon
657 {
658 gbritem = GetLastItemInList();
659 gbritem->m_Polygon.Append( gbritem->m_Polygon.CVertex( 0 ) );
660 StepAndRepeatItem( *gbritem );
661 }
662
663 m_Exposure = false;
666 break;
667
668 default:
669 return false;
670 }
671 }
672 else
673 {
674 switch( D_commande )
675 {
676 case 1: // code D01 Draw line, exposure ON
677 m_Exposure = true;
678
679 tool = GetDCODE( m_Current_Tool );
680
681 if( tool )
682 {
683 size = tool->m_Size;
684 dcode = tool->m_Num_Dcode;
685 aperture = tool->m_Shape;
686 }
687
688 switch( m_Iterpolation )
689 {
691 gbritem = new GERBER_DRAW_ITEM( this );
692 AddItemToList( gbritem );
693
694 fillLineGBRITEM( gbritem, dcode, m_PreviousPos,
695 m_CurrentPos, size, GetLayerParams().m_LayerNegative );
696 StepAndRepeatItem( *gbritem );
697 break;
698
701 gbritem = new GERBER_DRAW_ITEM( this );
702 AddItemToList( gbritem );
703
705 {
706 fillArcGBRITEM( gbritem, dcode, m_PreviousPos,
707 m_CurrentPos, m_IJPos, size,
709 false : true, m_360Arc_enbl, GetLayerParams().m_LayerNegative );
710 m_LastCoordIsIJPos = false;
711 }
712 else
713 {
714 fillLineGBRITEM( gbritem, dcode, m_PreviousPos,
715 m_CurrentPos, size, GetLayerParams().m_LayerNegative );
716 }
717
718 StepAndRepeatItem( *gbritem );
719
720 break;
721
722 default:
723 msg.Printf( wxT( "RS274D: DCODE Command: interpol error (type %X)" ),
725 AddMessageToList( msg );
726 break;
727 }
728
730 break;
731
732 case 2: // code D2: exposure OFF (i.e. "move to")
733 m_Exposure = false;
735 break;
736
737 case 3: // code D3: flash aperture
738 tool = GetDCODE( m_Current_Tool );
739
740 if( tool )
741 {
742 size = tool->m_Size;
743 dcode = tool->m_Num_Dcode;
744 aperture = tool->m_Shape;
745 }
746
747 gbritem = new GERBER_DRAW_ITEM( this );
748 AddItemToList( gbritem );
749 fillFlashedGBRITEM( gbritem, aperture, dcode, m_CurrentPos,
750 size, GetLayerParams().m_LayerNegative );
751 StepAndRepeatItem( *gbritem );
753 break;
754
755 default:
756 return false;
757 }
758 }
759
760 return true;
761}
A gerber DCODE (also called Aperture) definition.
Definition: dcode.h:81
int m_Num_Dcode
D code value ( >= 10 )
Definition: dcode.h:188
APERTURE_T m_Shape
shape ( Line, rectangle, circle , oval .. )
Definition: dcode.h:187
bool m_InUse
false if the aperture (previously defined) is not used to draw something
Definition: dcode.h:195
wxSize m_Size
Horizontal and vertical dimensions.
Definition: dcode.h:186
SHAPE_POLY_SET m_Polygon
GERBER_FILE_IMAGE * m_GerberImageFile
void SetNetAttributes(const GBR_NETLIST_METADATA &aNetAttributes)
int m_Last_Pen_Command
< Current or last pen state (0..9, set by Dn option with n < 10.
GERBER_DRAW_ITEM * GetLastItemInList() const
void StepAndRepeatItem(const GERBER_DRAW_ITEM &aItem)
Gerber format has a command Step an Repeat.
void AddMessageToList(const wxString &aMessage)
Add a message to the message list.
D_CODE * GetDCODE(int aDCODE) const
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
int m_PolygonFillModeState
a collection of APERTURE_MACROS, sorted by name
void AddItemToList(GERBER_DRAW_ITEM *aItem)
Add a new GERBER_DRAW_ITEM item to the drawings list.
GBR_NETLIST_METADATA m_NetAttributeDict
bool m_LastCoordIsIJPos
< True if a IJ coord was read (for arcs & circles ).
GERBER_LAYER & GetLayerParams()
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Add a new vertex to the contour indexed by aOutline and aHole (defaults to the outline of the last po...
int NewOutline()
Creates a new hole in a given outline.
const VECTOR2I & CVertex(int aIndex, int aOutline, int aHole) const
Return the aGlobalIndex-th vertex in the poly set.
int OutlineCount() const
Return the number of vertices in a given outline/hole.
APERTURE_T
The set of all gerber aperture types allowed, according to page 16 of http://gerbv....
Definition: dcode.h:49
@ APT_CIRCLE
Definition: dcode.h:50
#define FIRST_DCODE
Definition: dcode.h:70
#define TOOLS_MAX_COUNT
Definition: dcode.h:72
@ GBR_POLYGON
@ GERB_INTERPOL_ARC_NEG
Definition: gerbview.h:36
@ GERB_INTERPOL_LINEAR_1X
Definition: gerbview.h:35
@ GERB_INTERPOL_ARC_POS
Definition: gerbview.h:37
void fillLineGBRITEM(GERBER_DRAW_ITEM *aGbrItem, int Dcode_index, const VECTOR2I &aStart, const VECTOR2I &aEnd, wxSize aPenSize, bool aLayerNegative)
Initialize a given GBRITEM so that it can draw a linear D code.
Definition: rs274d.cpp:153
void fillArcGBRITEM(GERBER_DRAW_ITEM *aGbrItem, int Dcode_index, const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aRelCenter, wxSize aPenSize, bool aClockwise, bool aMultiquadrant, bool aLayerNegative)
Initialize a given GBRITEM so that it can draw an arc G code.
Definition: rs274d.cpp:202
static void fillArcPOLY(GERBER_DRAW_ITEM *aGbrItem, const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &rel_center, bool aClockwise, bool aMultiquadrant, bool aLayerNegative)
Create an arc G code when found in polygon outlines.
Definition: rs274d.cpp:328
void fillFlashedGBRITEM(GERBER_DRAW_ITEM *aGbrItem, APERTURE_T aAperture, int Dcode_index, const VECTOR2I &aPos, wxSize aSize, bool aLayerNegative)
Initializes a given GBRITEM so that it can draw a circle which is filled and has no pen border.
Definition: rs274d.cpp:99
VECTOR2< int > VECTOR2I
Definition: vector2d.h:607

References _, GERBER_FILE_IMAGE::AddItemToList(), GERBER_FILE_IMAGE::AddMessageToList(), SHAPE_POLY_SET::Append(), APT_CIRCLE, SHAPE_POLY_SET::CVertex(), fillArcGBRITEM(), fillArcPOLY(), fillFlashedGBRITEM(), fillLineGBRITEM(), FIRST_DCODE, GBR_POLYGON, GERB_INTERPOL_ARC_NEG, GERB_INTERPOL_ARC_POS, GERB_INTERPOL_LINEAR_1X, GERBER_FILE_IMAGE::GetDCODE(), GERBER_FILE_IMAGE::GetLastItemInList(), GERBER_FILE_IMAGE::GetLayerParams(), GERBER_FILE_IMAGE::m_360Arc_enbl, GERBER_DRAW_ITEM::m_AperFunction, GERBER_FILE_IMAGE::m_AperFunction, GERBER_FILE_IMAGE::m_AsArcG74G75Cmd, GERBER_FILE_IMAGE::m_Current_Tool, GERBER_FILE_IMAGE::m_CurrentPos, GERBER_DRAW_ITEM::m_DCode, GERBER_DRAW_ITEM::m_End, GERBER_FILE_IMAGE::m_Exposure, GERBER_DRAW_ITEM::m_Flashed, GERBER_DRAW_ITEM::m_GerberImageFile, GERBER_FILE_IMAGE::m_Has_MissingDCode, GERBER_FILE_IMAGE::m_IJPos, D_CODE::m_InUse, GERBER_FILE_IMAGE::m_Iterpolation, GERBER_FILE_IMAGE::m_Last_Pen_Command, GERBER_FILE_IMAGE::m_LastCoordIsIJPos, GERBER_FILE_IMAGE::m_NetAttributeDict, D_CODE::m_Num_Dcode, GERBER_DRAW_ITEM::m_Polygon, GERBER_FILE_IMAGE::m_PolygonFillMode, GERBER_FILE_IMAGE::m_PolygonFillModeState, GERBER_FILE_IMAGE::m_PreviousPos, D_CODE::m_Shape, GERBER_DRAW_ITEM::m_Shape, D_CODE::m_Size, GERBER_DRAW_ITEM::m_Start, SHAPE_POLY_SET::NewOutline(), SHAPE_POLY_SET::OutlineCount(), GERBER_DRAW_ITEM::SetNetAttributes(), GERBER_FILE_IMAGE::StepAndRepeatItem(), and TOOLS_MAX_COUNT.

Referenced by GERBER_FILE_IMAGE::LoadGerberFile().

◆ Execute_Drill_Command()

bool EXCELLON_IMAGE::Execute_Drill_Command ( char *&  text)
private

Definition at line 809 of file excellon_read_drill_file.cpp.

810{
811 D_CODE* tool;
812 GERBER_DRAW_ITEM * gbritem;
813
814 while( true )
815 {
816 switch( *text )
817 {
818 case 'X':
819 case 'Y':
820 ReadXYCoord( text, true );
821
822 if( *text == 'I' || *text == 'J' )
823 ReadIJCoord( text );
824
825 break;
826
827 case 'G': // G85 is found here for oval holes
830 break;
831
832 case 0: // E.O.L: execute command
833 if( m_RouteModeOn )
834 {
835 // We are in routing mode, and this is an intermediate point.
836 // So just store it
837 int rmode = 0; // linear routing.
838
840 rmode = ROUTE_CW;
842 rmode = ROUTE_CCW;
843
845 {
847 m_RoutePositions.push_back( point );
848 }
849 else
850 {
852 m_RoutePositions.push_back( point );
853 }
854 return true;
855 }
856
857 tool = GetDCODE( m_Current_Tool );
858 if( !tool )
859 {
860 wxString msg;
861 msg.Printf( _( "Tool %d not defined" ), m_Current_Tool );
862 AddMessageToList( msg );
863 return false;
864 }
865
866 gbritem = new GERBER_DRAW_ITEM( this );
867 AddItemToList( gbritem );
868
869 if( m_SlotOn ) // Oblong hole
870 {
871 fillLineGBRITEM( gbritem, tool->m_Num_Dcode,
873 tool->m_Size, false );
874 // the hole is made: reset the slot on command (G85)
875 // (it is needed for each oblong hole)
876 m_SlotOn = false;
877 }
878 else
879 {
880 fillFlashedGBRITEM( gbritem, tool->m_Shape, tool->m_Num_Dcode,
881 m_CurrentPos, tool->m_Size, false );
882 }
883
884 StepAndRepeatItem( *gbritem );
886 return true;
887 break;
888
889 default:
890 text++;
891 break;
892 }
893 }
894
895 return true;
896}
bool Execute_EXCELLON_G_Command(char *&text)
std::vector< EXCELLON_ROUTE_COORD > m_RoutePositions
VECTOR2I ReadIJCoord(char *&Text)
Return the current coordinate type pointed to by InnJnn Text (InnnnJmmmm)
int m_ArcRadius
Identifier for arc data type (IJ (center) or A## (radius)).
LAST_EXTRA_ARC_DATA_TYPE m_LastArcDataType
VECTOR2I ReadXYCoord(char *&aText, bool aExcellonMode=false)
Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm).
#define ROUTE_CW
#define ROUTE_CCW
void fillLineGBRITEM(GERBER_DRAW_ITEM *aGbrItem, int Dcode_index, const VECTOR2I &aStart, const VECTOR2I &aEnd, wxSize aPenSize, bool aLayerNegative)
Initialize a given GBRITEM so that it can draw a linear D code.
Definition: rs274d.cpp:153
void fillFlashedGBRITEM(GERBER_DRAW_ITEM *aGbrItem, APERTURE_T aAperture, int Dcode_index, const VECTOR2I &aPos, wxSize aSize, bool aLayerNegative)
Initializes a given GBRITEM so that it can draw a circle which is filled and has no pen border.
Definition: rs274d.cpp:99
@ ARC_INFO_TYPE_CENTER

References _, GERBER_FILE_IMAGE::AddItemToList(), GERBER_FILE_IMAGE::AddMessageToList(), ARC_INFO_TYPE_CENTER, Execute_EXCELLON_G_Command(), fillFlashedGBRITEM(), fillLineGBRITEM(), GERB_INTERPOL_ARC_NEG, GERB_INTERPOL_ARC_POS, GERBER_FILE_IMAGE::GetDCODE(), GERBER_FILE_IMAGE::m_ArcRadius, GERBER_FILE_IMAGE::m_Current_Tool, GERBER_FILE_IMAGE::m_CurrentPos, GERBER_FILE_IMAGE::m_IJPos, GERBER_FILE_IMAGE::m_Iterpolation, GERBER_FILE_IMAGE::m_LastArcDataType, D_CODE::m_Num_Dcode, GERBER_FILE_IMAGE::m_PreviousPos, m_RouteModeOn, m_RoutePositions, D_CODE::m_Shape, D_CODE::m_Size, m_SlotOn, GERBER_FILE_IMAGE::ReadIJCoord(), GERBER_FILE_IMAGE::ReadXYCoord(), ROUTE_CCW, ROUTE_CW, GERBER_FILE_IMAGE::StepAndRepeatItem(), and text.

Referenced by LoadFile().

◆ Execute_EXCELLON_G_Command()

bool EXCELLON_IMAGE::Execute_EXCELLON_G_Command ( char *&  text)
private

Definition at line 942 of file excellon_read_drill_file.cpp.

943{
944 EXCELLON_CMD* cmd = nullptr;
945 bool success = false;
946 int id = DRILL_G_UNKNOWN;
947
948 // Search command in list
949 EXCELLON_CMD* candidate;
950 char * gcmd = text; // gcmd points the G command, for error messages.
951
952 for( unsigned ii = 0; ; ii++ )
953 {
954 candidate = &excellon_G_CmdList[ii];
955 int len = candidate->m_Name.size();
956 if( len == 0 ) // End of list reached
957 break;
958 if( candidate->m_Name.compare( 0, len, text, len ) == 0 ) // found.
959 {
960 cmd = candidate;
961 text += len;
962 success = true;
963 id = cmd->m_Code;
964 break;
965 }
966 }
967
968 switch( id )
969 {
970 case DRILL_G_ZERO_SET:
971 ReadXYCoord( text, true );
973 break;
974
975 case DRILL_G_ROUT:
976 m_SlotOn = false;
977
978 if( m_RouteModeOn )
980
981 m_RouteModeOn = true;
982 m_RoutePositions.clear();
984 ReadXYCoord( text, true );
985 // This is the first point (starting point) of routing
986 m_RoutePositions.emplace_back( m_CurrentPos );
987 break;
988
989 case DRILL_G_DRILL:
990 m_SlotOn = false;
991
992 if( m_RouteModeOn )
994
995 m_RouteModeOn = false;
996 m_RoutePositions.clear();
998 break;
999
1000 case DRILL_G_SLOT:
1001 m_SlotOn = true;
1002 break;
1003
1004 case DRILL_G_LINEARMOVE:
1007 ReadXYCoord( text, true );
1008 m_RoutePositions.emplace_back( m_CurrentPos );
1009 break;
1010
1011 case DRILL_G_CWMOVE:
1013 ReadXYCoord( text, true );
1014
1015 if( *text == 'I' || *text == 'J' )
1016 ReadIJCoord( text );
1017
1020 else
1022 break;
1023
1024 case DRILL_G_CCWMOVE:
1026 ReadXYCoord( text, true );
1027
1028 if( *text == 'I' || *text == 'J' )
1029 ReadIJCoord( text );
1030
1033 else
1035 break;
1036
1037 case DRILL_G_ABSOLUTE:
1038 m_Relative = false; // false = absolute coord
1039 break;
1040
1042 m_Relative = true; // true = relative coord
1043 break;
1044
1045 case DRILL_G_UNKNOWN:
1046 default:
1047 AddMessageToList( wxString::Format( _( "Unknown Excellon G Code: &lt;%s&gt;" ), FROM_UTF8(gcmd) ) );
1048 while( *text )
1049 text++;
1050 return false;
1051 }
1052
1053 return success;
1054}
void FinishRouteCommand()
End a route command started by M15 ot G01, G02 or G03 command.
bool m_Relative
< false = absolute Coord, true = relative Coord.
@ DRILL_G_CWMOVE
@ DRILL_G_ZERO_SET
@ DRILL_G_INCREMENTAL
@ DRILL_G_DRILL
@ DRILL_G_LINEARMOVE
@ DRILL_G_ABSOLUTE
@ DRILL_G_SLOT
@ DRILL_G_ROUT
@ DRILL_G_UNKNOWN
@ DRILL_G_CCWMOVE
static EXCELLON_CMD excellon_G_CmdList[]
@ ARC_INFO_TYPE_NONE
static wxString FROM_UTF8(const char *cstring)
Convert a UTF8 encoded C string to a wxString for all wxWidgets build modes.
Definition: macros.h:110
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
std::string m_Name

References _, GERBER_FILE_IMAGE::AddMessageToList(), ARC_INFO_TYPE_CENTER, ARC_INFO_TYPE_NONE, DRILL_G_ABSOLUTE, DRILL_G_CCWMOVE, DRILL_G_CWMOVE, DRILL_G_DRILL, DRILL_G_INCREMENTAL, DRILL_G_LINEARMOVE, DRILL_G_ROUT, DRILL_G_SLOT, DRILL_G_UNKNOWN, DRILL_G_ZERO_SET, excellon_G_CmdList, FinishRouteCommand(), Format(), FROM_UTF8(), GERB_INTERPOL_ARC_NEG, GERB_INTERPOL_ARC_POS, GERB_INTERPOL_LINEAR_1X, GERBER_FILE_IMAGE::m_ArcRadius, EXCELLON_CMD::m_Code, GERBER_FILE_IMAGE::m_CurrentPos, GERBER_FILE_IMAGE::m_IJPos, GERBER_FILE_IMAGE::m_Iterpolation, GERBER_FILE_IMAGE::m_LastArcDataType, EXCELLON_CMD::m_Name, GERBER_FILE_IMAGE::m_Offset, GERBER_FILE_IMAGE::m_Relative, m_RouteModeOn, m_RoutePositions, m_SlotOn, GERBER_FILE_IMAGE::ReadIJCoord(), GERBER_FILE_IMAGE::ReadXYCoord(), ROUTE_CCW, ROUTE_CW, and text.

Referenced by Execute_Drill_Command(), and LoadFile().

◆ Execute_G_Command()

bool GERBER_FILE_IMAGE::Execute_G_Command ( char *&  text,
int  G_command 
)
privateinherited

Definition at line 421 of file rs274d.cpp.

422{
423 switch( G_command )
424 {
425 case GC_PHOTO_MODE: // can starts a D03 flash command: redundant, can be safely ignored.
426 break;
427
430 break;
431
434 break;
435
438 break;
439
440 case GC_COMMENT:
441 // Skip comment, but only if the line does not start by "G04 #@! "
442 // which is a metadata, i.e. a X2 command inside the comment.
443 // this comment is called a "structured comment"
444 if( strncmp( text, " #@! ", 5 ) == 0 )
445 {
446 text += 5;
447
448 // The string starting at text is the same as the X2 attribute,
449 // but a X2 attribute ends by '%'. So we build the X2 attribute string
450 std::string x2buf;
451
452 while( *text && (*text != '*') )
453 {
454 x2buf += *text;
455 text++;
456 }
457
458 // add the end of X2 attribute string
459 x2buf += "*%";
460 x2buf += '\0';
461
462 char* cptr = (char*)x2buf.data();
463 int code_command = ReadXCommandID( cptr );
464 ExecuteRS274XCommand( code_command, nullptr, 0, cptr );
465 }
466
467 while( *text && (*text != '*') )
468 text++;
469
470 break;
471
472 case GC_SELECT_TOOL:
473 {
474 int D_commande = CodeNumber( text );
475
476 if( D_commande < FIRST_DCODE )
477 return false;
478
479 if( D_commande > (TOOLS_MAX_COUNT - 1) )
480 D_commande = TOOLS_MAX_COUNT - 1;
481
482 m_Current_Tool = D_commande;
483 D_CODE* pt_Dcode = GetDCODE( D_commande );
484
485 if( pt_Dcode )
486 pt_Dcode->m_InUse = true;
487
488 break;
489 }
490
492 m_GerbMetric = false; // false = Inches, true = metric
493 break;
494
496 m_GerbMetric = true; // false = Inches, true = metric
497 break;
498
499 case GC_TURN_OFF_360_INTERPOL: // disable Multi cadran arc and Arc interpol
500 m_360Arc_enbl = false;
501 m_Iterpolation = GERB_INTERPOL_LINEAR_1X; // not sure it should be done
502 m_AsArcG74G75Cmd = true;
503 break;
504
506 m_360Arc_enbl = true;
507 m_AsArcG74G75Cmd = true;
508 break;
509
511 m_Relative = false; // false = absolute Coord, true = relative
512 // Coord
513 break;
514
516 m_Relative = true; // false = absolute Coord, true = relative
517 // Coord
518 break;
519
521 m_PolygonFillMode = true;
522 m_Exposure = false;
523 break;
524
526 if( m_Exposure && GetLastItemInList() ) // End of polygon
527 {
529
530 if( gbritem->m_Polygon.VertexCount() )
531 gbritem->m_Polygon.Append( gbritem->m_Polygon.CVertex( 0 ) );
532
533 StepAndRepeatItem( *gbritem );
534 }
535
536 m_Exposure = false;
537 m_PolygonFillMode = false;
539 m_Iterpolation = GERB_INTERPOL_LINEAR_1X; // not sure it should be done
540 break;
541
542 case GC_MOVE: // Non existent
543 default:
544 {
545 wxString msg;
546 msg.Printf( wxT( "G%0.2d command not handled" ), G_command );
547 AddMessageToList( msg );
548 return false;
549 }
550 }
551
552
553 return true;
554}
bool ExecuteRS274XCommand(int aCommand, char *aBuff, unsigned int aBuffSize, char *&aText)
Execute a RS274X command.
Definition: rs274x.cpp:198
int ReadXCommandID(char *&text)
Read two bytes of data and assembles them into an int with the first byte in the sequence put into th...
Definition: rs274x.cpp:115
int CodeNumber(char *&aText)
Reads the next number and returns the value.
Definition: rs274d.cpp:401
int VertexCount(int aOutline=-1, int aHole=-1) const
Return the number of points in the shape poly set.
@ GC_SPECIFY_MILLIMETERS
Definition: gerbview.h:54
@ GC_SPECIFY_RELATIVEES_COORD
Definition: gerbview.h:58
@ GC_COMMENT
Definition: gerbview.h:48
@ GC_TURN_ON_360_INTERPOL
Definition: gerbview.h:56
@ GC_LINEAR_INTERPOL_1X
Definition: gerbview.h:45
@ GC_TURN_OFF_360_INTERPOL
Definition: gerbview.h:55
@ GC_SELECT_TOOL
Definition: gerbview.h:51
@ GC_TURN_OFF_POLY_FILL
Definition: gerbview.h:50
@ GC_CIRCLE_POS_INTERPOL
Definition: gerbview.h:47
@ GC_PHOTO_MODE
Definition: gerbview.h:52
@ GC_MOVE
Definition: gerbview.h:44
@ GC_SPECIFY_INCHES
Definition: gerbview.h:53
@ GC_TURN_ON_POLY_FILL
Definition: gerbview.h:49
@ GC_CIRCLE_NEG_INTERPOL
Definition: gerbview.h:46
@ GC_SPECIFY_ABSOLUES_COORD
Definition: gerbview.h:57

References GERBER_FILE_IMAGE::AddMessageToList(), SHAPE_POLY_SET::Append(), GERBER_FILE_IMAGE::CodeNumber(), SHAPE_POLY_SET::CVertex(), GERBER_FILE_IMAGE::ExecuteRS274XCommand(), FIRST_DCODE, GC_CIRCLE_NEG_INTERPOL, GC_CIRCLE_POS_INTERPOL, GC_COMMENT, GC_LINEAR_INTERPOL_1X, GC_MOVE, GC_PHOTO_MODE, GC_SELECT_TOOL, GC_SPECIFY_ABSOLUES_COORD, GC_SPECIFY_INCHES, GC_SPECIFY_MILLIMETERS, GC_SPECIFY_RELATIVEES_COORD, GC_TURN_OFF_360_INTERPOL, GC_TURN_OFF_POLY_FILL, GC_TURN_ON_360_INTERPOL, GC_TURN_ON_POLY_FILL, GERB_INTERPOL_ARC_NEG, GERB_INTERPOL_ARC_POS, GERB_INTERPOL_LINEAR_1X, GERBER_FILE_IMAGE::GetDCODE(), GERBER_FILE_IMAGE::GetLastItemInList(), GERBER_FILE_IMAGE::m_360Arc_enbl, GERBER_FILE_IMAGE::m_AsArcG74G75Cmd, GERBER_FILE_IMAGE::m_Current_Tool, GERBER_FILE_IMAGE::m_Exposure, GERBER_FILE_IMAGE::m_GerbMetric, D_CODE::m_InUse, GERBER_FILE_IMAGE::m_Iterpolation, GERBER_DRAW_ITEM::m_Polygon, GERBER_FILE_IMAGE::m_PolygonFillMode, GERBER_FILE_IMAGE::m_PolygonFillModeState, GERBER_FILE_IMAGE::m_Relative, GERBER_FILE_IMAGE::ReadXCommandID(), GERBER_FILE_IMAGE::StepAndRepeatItem(), text, TOOLS_MAX_COUNT, and SHAPE_POLY_SET::VertexCount().

Referenced by GERBER_FILE_IMAGE::LoadGerberFile().

◆ Execute_HEADER_And_M_Command()

bool EXCELLON_IMAGE::Execute_HEADER_And_M_Command ( char *&  text)
private

Definition at line 553 of file excellon_read_drill_file.cpp.

554{
555 EXCELLON_CMD* cmd = nullptr;
556 wxString msg;
557
558 // Search command in list
559 for( unsigned ii = 0; ; ii++ )
560 {
561 EXCELLON_CMD* candidate = &excellonHeaderCmdList[ii];
562 int len = candidate->m_Name.size();
563
564 if( len == 0 ) // End of list reached
565 break;
566
567 if( candidate->m_Name.compare( 0, len, text, len ) == 0 ) // found.
568 {
569 cmd = candidate;
570 text += len;
571 break;
572 }
573 }
574
575 if( !cmd )
576 {
577 msg.Printf( _( "Unknown Excellon command &lt;%s&gt;" ), text );
578 AddMessageToList( msg );
579 while( *text )
580 text++;
581
582 return false;
583 }
584
585 // Execute command
586 // some do nothing
587 switch( cmd->m_Code )
588 {
589 case DRILL_SKIP:
590 case DRILL_M_UNKNOWN:
591 break;
592
593 case DRILL_M_END:
594 case DRILL_M_ENDFILE:
595 // if a route command is in progress, finish it
596 if( m_RouteModeOn )
598
599 break;
600
601 case DRILL_M_MESSAGE:
602 break;
603
605 break;
606
607 case DRILL_M_HEADER:
609 break;
610
613 break;
614
615 case DRILL_REWIND_STOP: // End of header. No action in a viewer
617 break;
618
621 break;
622
624 break;
625
626 case DRILL_M_METRIC:
627 SelectUnits( true, nullptr );
628 break;
629
630 case DRILL_IMPERIAL_HEADER: // command like INCH,TZ or INCH,LZ
631 case DRILL_METRIC_HEADER: // command like METRIC,TZ or METRIC,LZ
632 SelectUnits( cmd->m_Code == DRILL_METRIC_HEADER ? true : false, nullptr );
633
634 if( *text != ',' )
635 {
636 // No TZ or LZ specified. Should be a decimal format
637 // but this is not always the case. Use our default setting
638 break;
639 }
640
641 text++; // skip separator
642 if( *text == 'T' )
643 m_NoTrailingZeros = false;
644 else
645 m_NoTrailingZeros = true;
646 break;
647
649 break;
650
652 break;
653
655 break;
656
657 case DRILL_M_TIPCHECK:
658 break;
659
661 break;
662
664 if( *text != ',' )
665 {
666 AddMessageToList( wxT( "ICI command has no parameter" ) );
667 break;
668 }
669 text++; // skip separator
670 // Parameter should be ON or OFF
671 if( strncasecmp( text, "OFF", 3 ) == 0 )
672 m_Relative = false;
673 else if( strncasecmp( text, "ON", 2 ) == 0 )
674 m_Relative = true;
675 else
676 AddMessageToList( wxT( "ICI command has incorrect parameter" ) );
677 break;
678
680 break;
681
683 break;
684
686 break;
687
688 case DRILL_RESET_CMD:
689 break;
690
692 break;
693
694 case DRILL_FMT:
695 break;
696
699 break;
700
701 case DRILL_M_TOOL_DOWN: // tool down (starting a routed hole or polyline)
702 // Only the last position is useful:
703 if( m_RoutePositions.size() > 1 )
704 m_RoutePositions.erase( m_RoutePositions.begin(), m_RoutePositions.begin() + m_RoutePositions.size() - 1 );
705
706 break;
707
708 case DRILL_M_TOOL_UP: // tool up (ending a routed polyline)
710 break;
711 }
712
713 while( *text )
714 text++;
715
716 return true;
717}
void readFileFormat(char *&aText)
Read an Altium-specific FILE_FORMAT=X:X attribute that specifies the length and mantissa of the numbe...
bool readToolInformation(char *&aText)
Read a tool definition like T1C0.02 or T1F00S00C0.02 or T1C0.02F00S00 and enter params in TCODE list.
void SelectUnits(bool aMetric, EXCELLON_DEFAULTS *aDefaults)
Switch unit selection, and the coordinate format (nn:mm) if not yet set.
@ DRILL_M_UNKNOWN
@ DRILL_M_TOOL_UP
@ DRILL_SKIP
@ DRILL_M_ENDPATTERN
@ DRILL_M_TOOL_DOWN
@ DRILL_AUTOMATIC_SPEED
@ DRILL_M_END
@ DRILL_TOOL_CHANGE_STOP
@ DRILL_TOOL_INFORMATION
@ DRILL_AUTOMATIC_TOOL_CHANGE
@ DRILL_M_ENDHEADER
@ DRILL_M_HEADER
@ DRILL_FORMAT_ALTIUM
@ DRILL_M_METRIC
@ DRILL_DETECT_BROKEN
@ DRILL_HEADER_SKIP
@ DRILL_REWIND_STOP
@ DRILL_M_TIPCHECK
@ DRILL_M_LONGMESSAGE
@ DRILL_INCREMENTALHEADER
@ DRILL_AXIS_VERSION
@ DRILL_RESET_CMD
@ DRILL_M_MESSAGE
@ DRILL_METRIC_HEADER
@ DRILL_M_BEGINPATTERN
@ DRILL_IMPERIAL_HEADER
@ DRILL_M_ENDFILE
@ DRILL_FMT
@ DRILL_M_CANNEDTEXT
static EXCELLON_CMD excellonHeaderCmdList[]

References _, GERBER_FILE_IMAGE::AddMessageToList(), DRILL_AUTOMATIC_SPEED, DRILL_AUTOMATIC_TOOL_CHANGE, DRILL_AXIS_VERSION, DRILL_DETECT_BROKEN, DRILL_FMT, DRILL_FORMAT_ALTIUM, DRILL_HEADER_SKIP, DRILL_IMPERIAL_HEADER, DRILL_INCREMENTALHEADER, DRILL_M_BEGINPATTERN, DRILL_M_CANNEDTEXT, DRILL_M_END, DRILL_M_ENDFILE, DRILL_M_ENDHEADER, DRILL_M_ENDPATTERN, DRILL_M_HEADER, DRILL_M_LONGMESSAGE, DRILL_M_MESSAGE, DRILL_M_METRIC, DRILL_M_TIPCHECK, DRILL_M_TOOL_DOWN, DRILL_M_TOOL_UP, DRILL_M_UNKNOWN, DRILL_METRIC_HEADER, DRILL_RESET_CMD, DRILL_REWIND_STOP, DRILL_SKIP, DRILL_TOOL_CHANGE_STOP, DRILL_TOOL_INFORMATION, excellonHeaderCmdList, FinishRouteCommand(), EXCELLON_CMD::m_Code, EXCELLON_CMD::m_Name, GERBER_FILE_IMAGE::m_NoTrailingZeros, GERBER_FILE_IMAGE::m_Relative, m_RouteModeOn, m_RoutePositions, m_State, READ_HEADER_STATE, READ_PROGRAM_STATE, readFileFormat(), readToolInformation(), SelectUnits(), and text.

Referenced by LoadFile().

◆ ExecuteRS274XCommand()

bool GERBER_FILE_IMAGE::ExecuteRS274XCommand ( int  aCommand,
char *  aBuff,
unsigned int  aBuffSize,
char *&  aText 
)
privateinherited

Execute a RS274X command.

Definition at line 198 of file rs274x.cpp.

200{
201 int code;
202 int seq_len; // not used, just provided
203 int seq_char;
204 bool ok = true;
205 wxString msg;
206 double fcoord;
207 bool x_fmt_known = false;
208 bool y_fmt_known = false;
209
210 // conv_scale = scaling factor from inch to Internal Unit
211 double conv_scale = IU_PER_MILS * 1000;
212
213 if( m_GerbMetric )
214 conv_scale /= 25.4;
215
216 switch( aCommand )
217 {
218 case FORMAT_STATEMENT:
219 seq_len = 2;
220
221 while( *aText != '*' )
222 {
223 switch( *aText )
224 {
225 case ' ':
226 aText++;
227 break;
228
229 case 'D': // Non-standard option for all zeros (leading + tailing)
230 msg.Printf( _( "RS274X: Invalid GERBER format command '%c' at line %d: \"%s\"" ),
231 'D', m_LineNum, aBuff );
232 AddMessageToList( msg );
233 msg.Printf( _("GERBER file \"%s\" may not display as intended." ),
234 m_FileName.ToAscii() );
235 AddMessageToList( msg );
237
238 case 'L': // No Leading 0
239 m_NoTrailingZeros = false;
240 aText++;
241 break;
242
243 case 'T': // No trailing 0
244 m_NoTrailingZeros = true;
245 aText++;
246 break;
247
248 case 'A': // Absolute coord
249 m_Relative = false;
250 aText++;
251 break;
252
253 case 'I': // Relative coord
254 m_Relative = true;
255 aText++;
256 break;
257
258 case 'G':
259 case 'N': // Sequence code (followed by one digit: the sequence len)
260 // (sometimes found before the X,Y sequence)
261 // Obscure option
262 aText++;
263 seq_char = *aText++;
264
265 if( (seq_char >= '0') && (seq_char <= '9') )
266 seq_len = seq_char - '0';
267
268 break;
269
270 case 'M': // Sequence code (followed by one digit: the sequence len)
271 // (sometimes found after the X,Y sequence)
272 // Obscure option
273 aText++;
274 code = *aText;
275
276 if( ( code >= '0' ) && ( code <= '9' ) )
277 aText++; // skip the digit
278
279 break;
280
281 case 'X':
282 case 'Y':
283 {
284 code = *(aText++);
285 char ctmp = *(aText++) - '0';
286
287 if( code == 'X' )
288 {
289 x_fmt_known = true;
290 // number of digits after the decimal point (0 to 7 allowed)
291 m_FmtScale.x = *aText - '0';
292 m_FmtLen.x = ctmp + m_FmtScale.x;
293
294 // m_FmtScale is 0 to 7
295 // (Old Gerber specification was 0 to 6)
296 if( m_FmtScale.x < 0 )
297 m_FmtScale.x = 0;
298
299 if( m_FmtScale.x > 7 )
300 m_FmtScale.x = 7;
301 }
302 else
303 {
304 y_fmt_known = true;
305 m_FmtScale.y = *aText - '0';
306 m_FmtLen.y = ctmp + m_FmtScale.y;
307
308 if( m_FmtScale.y < 0 )
309 m_FmtScale.y = 0;
310
311 if( m_FmtScale.y > 7 )
312 m_FmtScale.y = 7;
313 }
314
315 aText++;
316 }
317 break;
318
319 case '*':
320 break;
321
322 default:
323 msg.Printf( wxT( "Unknown id (%c) in FS command" ),
324 *aText );
325 AddMessageToList( msg );
326 GetEndOfBlock( aBuff, aBuffSize, aText, m_Current_File );
327 ok = false;
328 break;
329 }
330 }
331
332 if( !x_fmt_known || !y_fmt_known )
333 AddMessageToList( wxT( "RS274X: Format Statement (FS) without X or Y format" ) );
334
335 break;
336
337 case AXIS_SELECT: // command ASAXBY*% or %ASAYBX*%
338 m_SwapAxis = false;
339
340 if( strncasecmp( aText, "AYBX", 4 ) == 0 )
341 m_SwapAxis = true;
342
343 break;
344
345 case MIRROR_IMAGE: // command %MIA0B0*%, %MIA0B1*%, %MIA1B0*%, %MIA1B1*%
346 m_MirrorA = m_MirrorB = false;
347
348 while( *aText && *aText != '*' )
349 {
350 switch( *aText )
351 {
352 case 'A': // Mirror A axis ?
353 aText++;
354
355 if( *aText == '1' )
356 m_MirrorA = true;
357
358 break;
359
360 case 'B': // Mirror B axis ?
361 aText++;
362
363 if( *aText == '1' )
364 m_MirrorB = true;
365
366 break;
367
368 default:
369 aText++;
370 break;
371 }
372 }
373 break;
374
375 case MODE_OF_UNITS:
376 code = ReadXCommandID( aText );
377
378 if( code == INCH )
379 m_GerbMetric = false;
380 else if( code == MILLIMETER )
381 m_GerbMetric = true;
382
383 conv_scale = m_GerbMetric ? IU_PER_MILS / 25.4 : IU_PER_MILS;
384 break;
385
386 case FILE_ATTRIBUTE: // Command %TF ...
387 {
389 dummy.ParseAttribCmd( m_Current_File, aBuff, aBuffSize, aText, m_LineNum );
390
391 if( dummy.IsFileFunction() )
392 {
393 delete m_FileFunction;
395
396 // Don't set this until we get a file function; other code expects m_IsX2_file == true
397 // to mean that we have a valid m_FileFunction
398 m_IsX2_file = true;
399 }
400 else if( dummy.IsFileMD5() )
401 {
402 m_MD5_value = dummy.GetPrm( 1 );
403 }
404 else if( dummy.IsFilePart() )
405 {
406 m_PartString = dummy.GetPrm( 1 );
407 }
408 }
409 break;
410
411 case APERTURE_ATTRIBUTE: // Command %TA
412 {
414 dummy.ParseAttribCmd( m_Current_File, aBuff, aBuffSize, aText, m_LineNum );
415
416 if( dummy.GetAttribute() == wxT( ".AperFunction" ) )
417 {
418 m_AperFunction = dummy.GetPrm( 1 );
419
420 // A few function values can have other parameters. Add them
421 for( int ii = 2; ii < dummy.GetPrmCount(); ii++ )
422 m_AperFunction << wxT( "," ) << dummy.GetPrm( ii );
423 }
424 }
425 break;
426
427 case NET_ATTRIBUTE: // Command %TO currently %TO.P %TO.N and %TO.C
428 {
430
431 dummy.ParseAttribCmd( m_Current_File, aBuff, aBuffSize, aText, m_LineNum );
432
433 if( dummy.GetAttribute() == wxT( ".N" ) )
434 {
437 }
438 else if( dummy.GetAttribute() == wxT( ".C" ) )
439 {
442 }
443 else if( dummy.GetAttribute() == wxT( ".P" ) )
444 {
448
449 if( dummy.GetPrmCount() > 3 )
450 {
452 FormatStringFromGerber( dummy.GetPrm( 3 ) ), true, true );
453 }
454 else
455 {
457 }
458 }
459 }
460 break;
461
462 case REMOVE_APERTURE_ATTRIBUTE: // Command %TD ...
463 {
465 dummy.ParseAttribCmd( m_Current_File, aBuff, aBuffSize, aText, m_LineNum );
467 }
468 break;
469
470 case OFFSET: // command: OFAnnBnn (nn = float number) = layer Offset
471 m_Offset.x = m_Offset.y = 0;
472 while( *aText != '*' )
473 {
474 switch( *aText )
475 {
476 case 'A': // A axis offset in current unit (inch or mm)
477 aText++;
478 fcoord = ReadDouble( aText );
479 m_Offset.x = KiROUND( fcoord * conv_scale );
480 break;
481
482 case 'B': // B axis offset in current unit (inch or mm)
483 aText++;
484 fcoord = ReadDouble( aText );
485 m_Offset.y = KiROUND( fcoord * conv_scale );
486 break;
487 }
488 }
489 break;
490
491 case SCALE_FACTOR:
492 m_Scale.x = m_Scale.y = 1.0;
493 while( *aText != '*' )
494 {
495 switch( *aText )
496 {
497 case 'A': // A axis scale
498 aText++;
499 m_Scale.x = ReadDouble( aText );
500 break;
501
502 case 'B': // B axis scale
503 aText++;
504 m_Scale.y = ReadDouble( aText );
505 break;
506 }
507 }
508 break;
509
510 case IMAGE_OFFSET: // command: IOAnnBnn (nn = float number) = Image Offset
512 while( *aText != '*' )
513 {
514 switch( *aText )
515 {
516 case 'A': // A axis offset in current unit (inch or mm)
517 aText++;
518 fcoord = ReadDouble( aText );
519 m_ImageOffset.x = KiROUND( fcoord * conv_scale );
520 break;
521
522 case 'B': // B axis offset in current unit (inch or mm)
523 aText++;
524 fcoord = ReadDouble( aText );
525 m_ImageOffset.y = KiROUND( fcoord * conv_scale );
526 break;
527 }
528 }
529 break;
530
531 case IMAGE_ROTATION: // command IR0* or IR90* or IR180* or IR270*
532 if( strncasecmp( aText, "0*", 2 ) == 0 )
533 m_ImageRotation = 0;
534 else if( strncasecmp( aText, "90*", 3 ) == 0 )
535 m_ImageRotation = 90;
536 else if( strncasecmp( aText, "180*", 4 ) == 0 )
537 m_ImageRotation = 180;
538 else if( strncasecmp( aText, "270*", 4 ) == 0 )
539 m_ImageRotation = 270;
540 else
541 AddMessageToList( _( "RS274X: Command \"IR\" rotation value not allowed" ) );
542
543 break;
544
545 case STEP_AND_REPEAT: // command SR, like %SRX3Y2I5.0J2*%
546 m_Iterpolation = GERB_INTERPOL_LINEAR_1X; // Start a new Gerber layer
548 GetLayerParams().m_StepForRepeat.x = 0.0; // offset for Step and Repeat command
550 GetLayerParams().m_YRepeatCount = 1; // The repeat count
552
553 while( *aText && *aText != '*' )
554 {
555 switch( *aText )
556 {
557 case 'I': // X axis offset
558 aText++;
560 break;
561
562 case 'J': // Y axis offset
563 aText++;
565 break;
566
567 case 'X': // X axis repeat count
568 aText++;
570 break;
571
572 case 'Y': // Y axis offset
573 aText++;
575 break;
576
577 default:
578 aText++;
579 break;
580 }
581 }
582 break;
583
584 case IMAGE_JUSTIFY: // Command IJAnBn*
585 m_ImageJustifyXCenter = false; // Image Justify Center on X axis (default = false)
586 m_ImageJustifyYCenter = false; // Image Justify Center on Y axis (default = false)
587 m_ImageJustifyOffset = VECTOR2I( 0, 0 ); // Image Justify Offset on XY axis (default = 0,0)
588 while( *aText && *aText != '*' )
589 {
590 // IJ command is (for A or B axis) AC or AL or A<coordinate>
591 switch( *aText )
592 {
593 case 'A': // A axis justify
594 aText++;
595
596 if( *aText == 'C' )
597 {
599 aText++;
600 }
601 else if( *aText == 'L' )
602 {
604 aText++;
605 }
606 else
607 {
608 m_ImageJustifyOffset.x = KiROUND( ReadDouble( aText ) * conv_scale);
609 }
610
611 break;
612
613 case 'B': // B axis justify
614 aText++;
615
616 if( *aText == 'C' )
617 {
619 aText++;
620 }
621 else if( *aText == 'L' )
622 {
624 aText++;
625 }
626 else
627 {
628 m_ImageJustifyOffset.y = KiROUND( ReadDouble( aText ) * conv_scale);
629 }
630
631 break;
632
633 default:
634 aText++;
635 break;
636 }
637 }
638
641
644
645 break;
646
647 case KNOCKOUT:
648 m_Iterpolation = GERB_INTERPOL_LINEAR_1X; // Start a new Gerber layer
649 msg = _( "RS274X: Command KNOCKOUT ignored by GerbView" ) ;
650 AddMessageToList( msg );
651 break;
652
653 case ROTATE: // Layer rotation: command like %RO45*%
654 m_Iterpolation = GERB_INTERPOL_LINEAR_1X; // Start a new Gerber layer
655 m_LocalRotation = ReadDouble( aText ); // Store layer rotation in degrees
656 break;
657
658 case IMAGE_NAME:
659 m_ImageName.Empty();
660
661 while( *aText != '*' )
662 m_ImageName.Append( *aText++ );
663
664 break;
665
666 case LOAD_NAME:
667 // %LN is a (deprecated) equivalentto G04: a comment
668 while( *aText && *aText != '*' )
669 aText++; // Skip text
670
671 break;
672
673 case IMAGE_POLARITY:
674 if( strncasecmp( aText, "NEG", 3 ) == 0 )
675 m_ImageNegative = true;
676 else
677 m_ImageNegative = false;
678
679 break;
680
681 case LOAD_POLARITY:
682 if( *aText == 'C' )
684 else
686
687 break;
688
689 case AP_MACRO: // lines like %AMMYMACRO*
690 // 5,1,8,0,0,1.08239X$1,22.5*
691 // %
692 /*ok = */ReadApertureMacro( aBuff, aBuffSize, aText, m_Current_File );
693 break;
694
695 case AP_DEFINITION:
696 /* input example: %ADD30R,0.081800X0.101500*%
697 * Aperture definition has 4 options: C, R, O, P
698 * (Circle, Rect, Oval, regular Polygon)
699 * and shapes can have a hole (round or rectangular).
700 * All optional parameters values start by X
701 * at this point, text points to 2nd 'D'
702 */
703 if( *aText++ != 'D' )
704 {
705 ok = false;
706 break;
707 }
708
709 m_Has_DCode = true;
710
711 code = ReadInt( aText );
712
713 D_CODE* dcode;
714 dcode = GetDCODEOrCreate( code );
715
716 if( dcode == nullptr )
717 break;
718
720
721 // at this point, text points to character after the ADD<num>,
722 // i.e. R in example above. If aText[0] is one of the usual
723 // apertures: (C,R,O,P), there is a comma after it.
724 if( aText[1] == ',' )
725 {
726 char stdAperture = *aText;
727
728 aText += 2; // skip "C," for example
729
730 // First parameter is the size X:
731 dcode->m_Size.x = KiROUND( ReadDouble( aText ) * conv_scale );
732 dcode->m_Size.y = dcode->m_Size.x;
733
734 switch( stdAperture ) // Aperture desceiption has optional parameters. Read them
735 {
736 case 'C': // Circle
737 dcode->m_Shape = APT_CIRCLE;
738 while( *aText == ' ' )
739 aText++;
740
741 if( *aText == 'X' )
742 {
743 aText++;
744 dcode->m_Drill.x = dcode->m_Drill.y =
745 KiROUND( ReadDouble( aText ) * conv_scale );
747 }
748
749 while( *aText == ' ' )
750 aText++;
751
752 if( *aText == 'X' )
753 {
754 aText++;
755 dcode->m_Drill.y =
756 KiROUND( ReadDouble( aText ) * conv_scale );
757
759 }
760 dcode->m_Defined = true;
761 break;
762
763 case 'O': // oval
764 case 'R': // rect
765 dcode->m_Shape = (stdAperture == 'O') ? APT_OVAL : APT_RECT;
766
767 while( *aText == ' ' )
768 aText++;
769
770 if( *aText == 'X' ) // Second parameter: size Y
771 {
772 aText++;
773 dcode->m_Size.y =
774 KiROUND( ReadDouble( aText ) * conv_scale );
775 }
776
777 while( *aText == ' ' )
778 aText++;
779
780 if( *aText == 'X' ) // third parameter: drill size (or drill size X)
781 {
782 aText++;
783 dcode->m_Drill.x = KiROUND( ReadDouble( aText ) * conv_scale );
784 dcode->m_Drill.y = dcode->m_Drill.x;
786 }
787
788 while( *aText == ' ' )
789 aText++;
790
791 if( *aText == 'X' ) // fourth parameter: drill size Y
792 {
793 aText++;
794 dcode->m_Drill.y =
795 KiROUND( ReadDouble( aText ) * conv_scale );
797 }
798
799 dcode->m_Defined = true;
800 break;
801
802 case 'P':
803
804 /* Regular polygon: a command line like %ADD12P,0.040X10X25X0.025X0.025X0.0150*%
805 * params are: <diameter>, X<edge count>, X<Rotation>, X<X hole dim>, X<Y hole dim>
806 */
807 dcode->m_Shape = APT_POLYGON;
808 while( *aText == ' ' )
809 aText++;
810
811 if( *aText == 'X' )
812 {
813 aText++;
814 dcode->m_EdgesCount = ReadInt( aText );
815 }
816
817 while( *aText == ' ' )
818 aText++;
819
820 if( *aText == 'X' )
821 {
822 aText++;
823 dcode->m_Rotation = EDA_ANGLE( ReadDouble( aText ), DEGREES_T );
824 }
825
826 while( *aText == ' ' )
827 aText++;
828
829 if( *aText == 'X' )
830 {
831 aText++;
832 dcode->m_Drill.x = KiROUND( ReadDouble( aText ) * conv_scale );
833 dcode->m_Drill.y = dcode->m_Drill.x;
835 }
836
837 while( *aText == ' ' )
838 aText++;
839
840 if( *aText == 'X' )
841 {
842 aText++;
843 dcode->m_Drill.y = KiROUND( ReadDouble( aText ) * conv_scale );
845 }
846 dcode->m_Defined = true;
847 break;
848 }
849 }
850 else // aText[0] starts an aperture macro name
851 {
852 APERTURE_MACRO am_lookup;
853
854 while( *aText && *aText != '*' && *aText != ',' )
855 am_lookup.name.Append( *aText++ );
856
857 // When an aperture definition is like %AMLINE2* 22,1,$1,$2,0,0,-45*
858 // the ADDxx<MACRO_NAME> command has parameters, like %ADD14LINE2,0.8X0.5*%
859 if( *aText == ',' )
860 { // Read aperture macro parameters and store them
861 aText++; // aText points the first parameter
862
863 while( *aText && *aText != '*' )
864 {
865 double param = ReadDouble( aText );
866 dcode->AppendParam( param );
867
868 while( isspace( *aText ) )
869 aText++;
870
871 // Skip 'X' separator:
872 if( *aText == 'X' || *aText == 'x' )
873 aText++;
874 }
875 }
876
877 // lookup the aperture macro here.
878 APERTURE_MACRO* pam = FindApertureMacro( am_lookup );
879
880 if( !pam )
881 {
882 msg.Printf( wxT( "RS274X: aperture macro %s not found\n" ),
883 TO_UTF8( am_lookup.name ) );
884 AddMessageToList( msg );
885 ok = false;
886 break;
887 }
888
889 dcode->m_Shape = APT_MACRO;
890 dcode->SetMacro( pam );
891 dcode->m_Defined = true;
892 }
893
894 break;
895
896 default:
897 ok = false;
898 break;
899 }
900
901 ignore_unused( seq_len );
902
903 ok = GetEndOfBlock( aBuff, aBuffSize, aText, m_Current_File );
904
905 return ok;
906}
wxString m_AperFunction
the aperture attribute (created by a TA.AperFunction command).
Definition: dcode.h:198
EDA_ANGLE m_Rotation
shape rotation
Definition: dcode.h:192
void SetMacro(APERTURE_MACRO *aMacro)
Definition: dcode.h:120
wxSize m_Drill
dimension of the hole (if any) (drill file)
Definition: dcode.h:189
int m_EdgesCount
in aperture definition Polygon only: number of edges for the polygon
Definition: dcode.h:193
bool m_Defined
false if the aperture is not defined in the header
Definition: dcode.h:197
APERTURE_DEF_HOLETYPE m_DrillShape
shape of the hole (0 = no hole, round = 1, rect = 2).
Definition: dcode.h:190
void AppendParam(double aValue)
Add a parameter to the D_CODE parameter list.
Definition: dcode.h:92
void SetField(const wxString &aField, bool aUseUTF8, bool aEscapeString)
int m_NetAttribType
the type of net info (used to define the gerber string to create)
wxString m_Cmpref
the component reference parent of the data
@ GBR_NETINFO_NET
print info associated to a net (TO.N attribute)
@ GBR_NETINFO_CMP
print info associated to a component (TO.C attribute)
@ GBR_NETINFO_PAD
print info associated to a flashed pad (TO.P attribute)
GBR_DATA_FIELD m_PadPinFunction
for a pad: the pin function (defined in schematic)
GBR_DATA_FIELD m_Padname
for a flashed pad: the pad name ((TO.P attribute)
wxString m_Netname
for items associated to a net: the netname
APERTURE_MACRO * FindApertureMacro(const APERTURE_MACRO &aLookup)
Look up a previously read in aperture macro.
X2_ATTRIBUTE_FILEFUNCTION * m_FileFunction
void RemoveAttribute(X2_ATTRIBUTE &aAttribute)
Called when a TD command is found the Gerber file.
wxSize m_FmtScale
< Fmt 2.3: m_FmtScale = 3, fmt 3.4: m_FmtScale = 4.
int m_LineNum
< Line number of the gerber file while reading.
bool m_Has_DCode
< True if has DCodes in file or false if no DCodes found. Perhaps deprecated RS274D file.
bool GetEndOfBlock(char *aBuff, unsigned int aBuffSize, char *&aText, FILE *aGerberFile)
Definition: rs274x.cpp:909
bool ReadApertureMacro(char *aBuff, unsigned int aBuffSize, char *&text, FILE *gerber_file)
Read in an aperture macro and saves it in m_aperture_macros.
Definition: rs274x.cpp:963
D_CODE * GetDCODEOrCreate(int aDCODE, bool aCreateIfNoExist=true)
Return a pointer to the D_CODE within this GERBER for the given aDCODE.
wxSize m_FmtLen
Image rotation (0, 90, 180, 270 only) in degrees.
wxRealPoint m_StepForRepeat
bool m_StepForRepeatMetric
X2_ATTRIBUTE_FILEFUNCTION ( from TF.FileFunction in Gerber file) Example file function: TF....
The attribute value consists of a number of substrings separated by a comma.
@ APT_DEF_ROUND_HOLE
Definition: dcode.h:63
@ APT_DEF_RECT_HOLE
Definition: dcode.h:64
@ APT_RECT
Definition: dcode.h:51
@ APT_OVAL
Definition: dcode.h:52
@ APT_POLYGON
Definition: dcode.h:53
@ APT_MACRO
Definition: dcode.h:55
@ DEGREES_T
Definition: eda_angle.h:31
wxString FormatStringFromGerber(const wxString &aString)
Convert a gerber string into a 16 bit Unicode string.
void ignore_unused(const T &)
Definition: ignore.h:24
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: macros.h:96
#define IU_PER_MILS
Definition: plotter.cpp:129
@ FILE_ATTRIBUTE
Definition: rs274x.cpp:86
@ IMAGE_JUSTIFY
Definition: rs274x.cpp:70
@ APERTURE_ATTRIBUTE
Definition: rs274x.cpp:94
@ FORMAT_STATEMENT
Definition: rs274x.cpp:60
@ NET_ATTRIBUTE
Definition: rs274x.cpp:91
@ IMAGE_OFFSET
Definition: rs274x.cpp:72
@ ROTATE
Definition: rs274x.cpp:108
@ STEP_AND_REPEAT
Definition: rs274x.cpp:107
@ LOAD_NAME
Definition: rs274x.cpp:111
@ REMOVE_APERTURE_ATTRIBUTE
Definition: rs274x.cpp:100
@ KNOCKOUT
Definition: rs274x.cpp:106
@ AP_MACRO
Definition: rs274x.cpp:79
@ MIRROR_IMAGE
Definition: rs274x.cpp:61
@ MODE_OF_UNITS
Definition: rs274x.cpp:62
@ INCH
Definition: rs274x.cpp:63
@ IMAGE_NAME
Definition: rs274x.cpp:71
@ OFFSET
Definition: rs274x.cpp:65
@ MILLIMETER
Definition: rs274x.cpp:64
@ AXIS_SELECT
Definition: rs274x.cpp:59
@ SCALE_FACTOR
Definition: rs274x.cpp:66
@ IMAGE_ROTATION
Definition: rs274x.cpp:74
@ LOAD_POLARITY
Definition: rs274x.cpp:110
@ IMAGE_POLARITY
Definition: rs274x.cpp:73
@ AP_DEFINITION
Definition: rs274x.cpp:78
int ReadInt(char *&text, bool aSkipSeparator=true)
Read an integer from an ASCII character buffer.
double ReadDouble(char *&text, bool aSkipSeparator=true)
Read a double precision floating point number from an ASCII character buffer.
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:73
Support the "aperture macro" defined within standard RS274X.
Definition: am_primitive.h:168
wxString name
The name of the aperture macro.
Definition: am_primitive.h:231
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:80

References _, GERBER_FILE_IMAGE::AddMessageToList(), AP_DEFINITION, AP_MACRO, APERTURE_ATTRIBUTE, D_CODE::AppendParam(), APT_CIRCLE, APT_DEF_RECT_HOLE, APT_DEF_ROUND_HOLE, APT_MACRO, APT_OVAL, APT_POLYGON, APT_RECT, AXIS_SELECT, GBR_DATA_FIELD::Clear(), DEGREES_T, dummy(), FILE_ATTRIBUTE, GERBER_FILE_IMAGE::FindApertureMacro(), FORMAT_STATEMENT, FormatStringFromGerber(), GBR_NETLIST_METADATA::GBR_NETINFO_CMP, GBR_NETLIST_METADATA::GBR_NETINFO_NET, GBR_NETLIST_METADATA::GBR_NETINFO_PAD, GERB_INTERPOL_LINEAR_1X, GERBER_FILE_IMAGE::GetDCODEOrCreate(), GERBER_FILE_IMAGE::GetEndOfBlock(), GERBER_FILE_IMAGE::GetLayerParams(), ignore_unused(), IMAGE_JUSTIFY, IMAGE_NAME, IMAGE_OFFSET, IMAGE_POLARITY, IMAGE_ROTATION, INCH, IU_PER_MILS, KI_FALLTHROUGH, KiROUND(), KNOCKOUT, LOAD_NAME, LOAD_POLARITY, D_CODE::m_AperFunction, GERBER_FILE_IMAGE::m_AperFunction, GBR_NETLIST_METADATA::m_Cmpref, GERBER_FILE_IMAGE::m_Current_File, D_CODE::m_Defined, D_CODE::m_Drill, D_CODE::m_DrillShape, D_CODE::m_EdgesCount, GERBER_FILE_IMAGE::m_FileFunction, GERBER_FILE_IMAGE::m_FileName, GERBER_FILE_IMAGE::m_FmtLen, GERBER_FILE_IMAGE::m_FmtScale, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_Has_DCode, GERBER_FILE_IMAGE::m_ImageJustifyOffset, GERBER_FILE_IMAGE::m_ImageJustifyXCenter, GERBER_FILE_IMAGE::m_ImageJustifyYCenter, GERBER_FILE_IMAGE::m_ImageName, GERBER_FILE_IMAGE::m_ImageNegative, GERBER_FILE_IMAGE::m_ImageOffset, GERBER_FILE_IMAGE::m_ImageRotation, GERBER_FILE_IMAGE::m_IsX2_file, GERBER_FILE_IMAGE::m_Iterpolation, GERBER_LAYER::m_LayerNegative, GERBER_FILE_IMAGE::m_LineNum, GERBER_FILE_IMAGE::m_LocalRotation, GERBER_FILE_IMAGE::m_MD5_value, GERBER_FILE_IMAGE::m_MirrorA, GERBER_FILE_IMAGE::m_MirrorB, GBR_NETLIST_METADATA::m_NetAttribType, GERBER_FILE_IMAGE::m_NetAttributeDict, GBR_NETLIST_METADATA::m_Netname, GERBER_FILE_IMAGE::m_NoTrailingZeros, GERBER_FILE_IMAGE::m_Offset, GBR_NETLIST_METADATA::m_Padname, GBR_NETLIST_METADATA::m_PadPinFunction, GERBER_FILE_IMAGE::m_PartString, GERBER_FILE_IMAGE::m_Relative, D_CODE::m_Rotation, GERBER_FILE_IMAGE::m_Scale, D_CODE::m_Shape, D_CODE::m_Size, GERBER_LAYER::m_StepForRepeat, GERBER_LAYER::m_StepForRepeatMetric, GERBER_FILE_IMAGE::m_SwapAxis, GERBER_LAYER::m_XRepeatCount, GERBER_LAYER::m_YRepeatCount, MILLIMETER, MIRROR_IMAGE, MODE_OF_UNITS, APERTURE_MACRO::name, NET_ATTRIBUTE, OFFSET, GERBER_FILE_IMAGE::ReadApertureMacro(), ReadDouble(), ReadInt(), GERBER_FILE_IMAGE::ReadXCommandID(), REMOVE_APERTURE_ATTRIBUTE, GERBER_FILE_IMAGE::RemoveAttribute(), ROTATE, SCALE_FACTOR, GBR_DATA_FIELD::SetField(), D_CODE::SetMacro(), STEP_AND_REPEAT, TO_UTF8, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by GERBER_FILE_IMAGE::Execute_G_Command(), and GERBER_FILE_IMAGE::ReadRS274XCommand().

◆ FindApertureMacro()

APERTURE_MACRO * GERBER_FILE_IMAGE::FindApertureMacro ( const APERTURE_MACRO aLookup)
inherited

Look up a previously read in aperture macro.

Parameters
aLookupA dummy APERTURE_MACRO with [only] the name field set.
Returns
the aperture macro with a matching name or NULL if not found.

Definition at line 146 of file gerber_file_image.cpp.

147{
148 APERTURE_MACRO_SET::iterator iter = m_aperture_macros.find( aLookup );
149
150 if( iter != m_aperture_macros.end() )
151 {
152 APERTURE_MACRO* pam = (APERTURE_MACRO*) &(*iter);
153 return pam;
154 }
155
156 return nullptr; // not found
157}
APERTURE_MACRO_SET m_aperture_macros

References GERBER_FILE_IMAGE::m_aperture_macros.

Referenced by GERBER_FILE_IMAGE::ExecuteRS274XCommand().

◆ FinishRouteCommand()

void EXCELLON_IMAGE::FinishRouteCommand ( )
private

End a route command started by M15 ot G01, G02 or G03 command.

Definition at line 1115 of file excellon_read_drill_file.cpp.

1116{
1117 // Ends a route command started by M15 ot G01, G02 or G03 command
1118 // if a route command is not in progress, do nothing
1119
1120 if( !m_RouteModeOn )
1121 return;
1122
1123 D_CODE* tool = GetDCODE( m_Current_Tool );
1124
1125 if( !tool )
1126 {
1127 AddMessageToList( wxString::Format( wxT( "Unknown tool code %d" ), m_Current_Tool ) );
1128 return;
1129 }
1130
1131 for( size_t ii = 1; ii < m_RoutePositions.size(); ii++ )
1132 {
1133 GERBER_DRAW_ITEM* gbritem = new GERBER_DRAW_ITEM( this );
1134
1135 if( m_RoutePositions[ii].m_rmode == 0 ) // linear routing
1136 {
1137 fillLineGBRITEM( gbritem, tool->m_Num_Dcode,
1138 m_RoutePositions[ii-1].GetPos(), m_RoutePositions[ii].GetPos(),
1139 tool->m_Size, false );
1140 }
1141 else // circular (cw or ccw) routing
1142 {
1143 bool rot_ccw = m_RoutePositions[ii].m_rmode == ROUTE_CW;
1144 int radius = m_RoutePositions[ii].m_radius; // Can be adjusted by computeCenter.
1145 VECTOR2I center;
1146
1147 if( m_RoutePositions[ii].m_arc_type_info == ARC_INFO_TYPE_CENTER )
1148 center = VECTOR2I( m_RoutePositions[ii].m_cx, m_RoutePositions[ii].m_cy );
1149 else
1150 center = computeCenter( m_RoutePositions[ii-1].GetPos(),
1151 m_RoutePositions[ii].GetPos(), radius, rot_ccw );
1152
1153 fillArcGBRITEM( gbritem, tool->m_Num_Dcode,
1154 m_RoutePositions[ii-1].GetPos(), m_RoutePositions[ii].GetPos(),
1155 center - m_RoutePositions[ii-1].GetPos(),
1156 tool->m_Size, not rot_ccw , true,
1157 false );
1158 }
1159
1160 AddItemToList( gbritem );
1161
1162 StepAndRepeatItem( *gbritem );
1163 }
1164
1165 m_RoutePositions.clear();
1166 m_RouteModeOn = false;
1167}
void fillArcGBRITEM(GERBER_DRAW_ITEM *aGbrItem, int Dcode_index, const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aRelCenter, wxSize aPenSize, bool aClockwise, bool aMultiquadrant, bool aLayerNegative)
Initialize a given GBRITEM so that it can draw an arc G code.
Definition: rs274d.cpp:202
static VECTOR2I computeCenter(VECTOR2I aStart, VECTOR2I aEnd, int &aRadius, bool aRotCCW)

References GERBER_FILE_IMAGE::AddItemToList(), GERBER_FILE_IMAGE::AddMessageToList(), ARC_INFO_TYPE_CENTER, computeCenter(), fillArcGBRITEM(), fillLineGBRITEM(), Format(), GERBER_FILE_IMAGE::GetDCODE(), GERBER_FILE_IMAGE::m_Current_Tool, D_CODE::m_Num_Dcode, m_RouteModeOn, m_RoutePositions, D_CODE::m_Size, ROUTE_CW, and GERBER_FILE_IMAGE::StepAndRepeatItem().

Referenced by Execute_EXCELLON_G_Command(), and Execute_HEADER_And_M_Command().

◆ Get() [1/3]

template<typename T >
boost::optional< T > INSPECTABLE::Get ( const wxString &  aProperty)
inlineinherited

Definition at line 104 of file inspectable.h.

105 {
107 TYPE_ID thisType = TYPE_HASH( *this );
108 PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty );
109 boost::optional<T> ret = T();
110
111 if( prop )
112 {
113 void* object = propMgr.TypeCast( this, thisType, prop->OwnerHash() );
114
115 if( object )
116 ret = prop->get<T>( object );
117 }
118
119 return ret;
120 }
T get(void *aObject)
Definition: property.h:268
virtual size_t OwnerHash() const =0
Return type-id of the Owner class.
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:63
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:65
PROPERTY_BASE * GetProperty(TYPE_ID aType, const wxString &aProperty) const
Return a property for a specific type.
const void * TypeCast(const void *aSource, TYPE_ID aBase, TYPE_ID aTarget) const
Cast a type to another type.
#define TYPE_HASH(x)
Definition: property.h:59
size_t TYPE_ID
Unique type identifier.
Definition: property_mgr.h:42

References PROPERTY_BASE::get(), PROPERTY_MANAGER::GetProperty(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Get() [2/3]

wxAny INSPECTABLE::Get ( PROPERTY_BASE aProperty)
inlineinherited

Definition at line 86 of file inspectable.h.

87 {
89 TYPE_ID thisType = TYPE_HASH( *this );
90 void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
91 return object ? aProperty->getter( object ) : wxAny();
92 }
virtual wxAny getter(void *aObject) const =0

References PROPERTY_BASE::getter(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

Referenced by BOOST_AUTO_TEST_CASE(), CLASS_D_DESC::CLASS_D_DESC(), PCB_EXPR_VAR_REF::GetValue(), and PAD_DESC::PAD_DESC().

◆ Get() [3/3]

template<typename T >
T INSPECTABLE::Get ( PROPERTY_BASE aProperty)
inlineinherited

Definition at line 95 of file inspectable.h.

96 {
98 TYPE_ID thisType = TYPE_HASH( *this );
99 void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
100 return object ? aProperty->get<T>( object ) : T();
101 }

References PROPERTY_BASE::get(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ GetBoundingBox()

const EDA_RECT EDA_ITEM::GetBoundingBox ( ) const
virtualinherited

Return the orthogonal bounding box of this object for display purposes.

This box should be an enclosing perimeter for visible components of this object, and the units should be in the pcb or schematic coordinate system. It is OK to overestimate the size by a few counts.

Reimplemented in LIB_FIELD, LIB_ITEM, LIB_PIN, LIB_SHAPE, LIB_SYMBOL, LIB_TEXT, SCH_BITMAP, SCH_BUS_ENTRY_BASE, SCH_FIELD, SCH_JUNCTION, SCH_LABEL_BASE, SCH_LINE, SCH_MARKER, SCH_NO_CONNECT, SCH_PIN, SCH_SHAPE, SCH_SHEET, SCH_SYMBOL, SCH_TEXT, GBR_LAYOUT, GERBER_DRAW_ITEM, DS_DRAW_ITEM_LINE, DS_DRAW_ITEM_POLYPOLYGONS, DS_DRAW_ITEM_RECT, DS_DRAW_ITEM_PAGE, DS_DRAW_ITEM_TEXT, DS_DRAW_ITEM_BITMAP, PCB_GROUP, BOARD, FOOTPRINT, FP_TEXT, NETINFO_ITEM, PAD, PCB_BITMAP, PCB_DIMENSION_BASE, PCB_DIM_CENTER, PCB_MARKER, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TRACK, ZONE, and DS_DRAW_ITEM_BASE.

Definition at line 75 of file eda_item.cpp.

76{
77 // return a zero-sized box per default. derived classes should override
78 // this
79 return EDA_RECT( VECTOR2I( 0, 0 ), VECTOR2I( 0, 0 ) );
80}
Handle the component boundary box.
Definition: eda_rect.h:44

Referenced by CADSTAR_SCH_ARCHIVE_LOADER::applyTextSettings(), CN_ITEM::BBox(), SCH_EDIT_TOOL::ChangeTextType(), TEST_BOARD_ITEM_FIXTURE::CompareItems(), TEST_EE_ITEM_FIXTURE::CompareItems(), EE_RTREE::contains(), BOARD_COMMIT::dirtyIntersectingZones(), KIGFX::PCB_PAINTER::Draw(), SCH_DRAWING_TOOLS::DrawSheet(), PCB_SELECTION_TOOL::FindItem(), SCH_EDITOR_CONTROL::FindNext(), LIB_ITEM::GetBoundingBox(), GetBoundingBoxes(), BOARD_ITEM::GetCenter(), GERBVIEW_SELECTION::GetCenter(), SCH_MOVE_TOOL::getConnectedDragItems(), SCH_MOVE_TOOL::getConnectedItems(), EE_SELECTION_TOOL::GuessSelectionCandidates(), EE_RTREE::insert(), insideArea(), insideBackCourtyard(), insideCourtyard(), insideFrontCourtyard(), SCH_SCREEN::MarkConnections(), SCH_EDIT_TOOL::Mirror(), DRC_RTREE::QueryColliding(), EE_RTREE::remove(), SCH_EDIT_TOOL::Rotate(), DRC_TEST_PROVIDER_COPPER_CLEARANCE::testItemAgainstZone(), DRC_TEST_PROVIDER_PHYSICAL_CLEARANCE::testItemAgainstZones(), DRC_TEST_PROVIDER_SOLDER_MASK::testMaskBridges(), DRC_TEST_PROVIDER_SOLDER_MASK::testMaskItemAgainstZones(), GERBVIEW_SELECTION::ViewBBox(), and EDA_ITEM::ViewBBox().

◆ GetClass()

wxString GERBER_FILE_IMAGE::GetClass ( ) const
inlineoverridevirtualinherited

Return the class name.

Implements EDA_ITEM.

Definition at line 116 of file gerber_file_image.h.

117 {
118 return wxT( "GERBER_FILE_IMAGE" );
119 }

◆ GetDCODE()

D_CODE * GERBER_FILE_IMAGE::GetDCODE ( int  aDCODE) const
inherited

Return a pointer to the D_CODE within this GERBER for the given aDCODE.

Parameters
aDCODEThe numeric value of the D_CODE to look up.
Returns
The D code implied by the given aDCODE or NULL if the requested aDCODE is out of range.

Definition at line 135 of file gerber_file_image.cpp.

136{
137 unsigned ndx = aDCODE - FIRST_DCODE;
138
139 if( ndx < (unsigned) arrayDim( m_Aperture_List ) )
140 return m_Aperture_List[ndx];
141
142 return nullptr;
143}
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
D_CODE * m_Aperture_List[TOOLS_MAX_COUNT]
< Dcode (Aperture) List for this layer (max TOOLS_MAX_COUNT: see dcode.h)

References arrayDim(), FIRST_DCODE, and GERBER_FILE_IMAGE::m_Aperture_List.

Referenced by GERBER_FILE_IMAGE::Execute_DCODE_Command(), Execute_Drill_Command(), GERBER_FILE_IMAGE::Execute_G_Command(), FinishRouteCommand(), GERBER_DRAW_ITEM::GetDcodeDescr(), Select_Tool(), GERBVIEW_INSPECTION_TOOL::ShowDCodes(), GERBVIEW_FRAME::updateAperAttributesSelectBox(), and GERBVIEW_FRAME::updateDCodeSelectBox().

◆ GetDCODEOrCreate()

D_CODE * GERBER_FILE_IMAGE::GetDCODEOrCreate ( int  aDCODE,
bool  aCreateIfNoExist = true 
)
inherited

Return a pointer to the D_CODE within this GERBER for the given aDCODE.

Parameters
aDCODEThe numeric value of the D_CODE to look up.
aCreateIfNoExistIf true, then create the D_CODE if it does not exist in list.
Returns
The one implied by the given aDCODE or NULL if the requested aDCODE is out of range.

Definition at line 115 of file gerber_file_image.cpp.

116{
117 unsigned ndx = aDCODE - FIRST_DCODE;
118
119 if( ndx < (unsigned) arrayDim( m_Aperture_List ) )
120 {
121 // lazily create the D_CODE if it does not exist.
122 if( aCreateIfNoExist )
123 {
124 if( m_Aperture_List[ndx] == nullptr )
125 m_Aperture_List[ndx] = new D_CODE( ndx + FIRST_DCODE );
126 }
127
128 return m_Aperture_List[ndx];
129 }
130
131 return nullptr;
132}

References arrayDim(), FIRST_DCODE, and GERBER_FILE_IMAGE::m_Aperture_List.

Referenced by GERBER_FILE_IMAGE::ExecuteRS274XCommand(), readToolInformation(), and Select_Tool().

◆ GetDcodesCount()

int GERBER_FILE_IMAGE::GetDcodesCount ( )
inherited
Returns
the count of Dcode tools in use in the image

Definition at line 254 of file gerber_file_image.cpp.

255{
256 int count = 0;
257
258 for( unsigned ii = 0; ii < arrayDim( m_Aperture_List ); ii++ )
259 {
260 if( m_Aperture_List[ii] )
261 {
262 if( m_Aperture_List[ii]->m_InUse || m_Aperture_List[ii]->m_Defined )
263 ++count;
264 }
265
266 }
267
268 return count;
269}

References arrayDim(), GERBER_FILE_IMAGE::m_Aperture_List, and GERBER_FILE_IMAGE::m_InUse.

Referenced by GERBVIEW_INSPECTION_TOOL::ShowDCodes(), GERBVIEW_FRAME::updateAperAttributesSelectBox(), and GERBVIEW_FRAME::updateDCodeSelectBox().

◆ GetEditFlags()

EDA_ITEM_FLAGS EDA_ITEM::GetEditFlags ( ) const
inlineinherited

Definition at line 157 of file eda_item.h.

158 {
159 constexpr int mask = ( IS_NEW | IS_PASTED | IS_MOVING | IS_RESIZING | IS_DRAGGING
161
162 return m_flags & mask;
163 }
#define IS_PASTED
Modifier on IS_NEW which indicates it came from clipboard.
#define IS_CHANGED
Item was edited, and modified.
#define IS_NEW
New item, just created.
#define IS_DRAGGING
Item being dragged.
#define IS_WIRE_IMAGE
Item to be drawn as wireframe while editing.
#define STRUCT_DELETED
flag indication structures to be erased
#define IS_MOVING
Item being moved.
#define IS_RESIZING
Item being resized.

References IS_CHANGED, IS_DRAGGING, IS_MOVING, IS_NEW, IS_PASTED, IS_RESIZING, IS_WIRE_IMAGE, EDA_ITEM::m_flags, and STRUCT_DELETED.

Referenced by SCH_EDIT_TOOL::ChangeTextType(), EDA_ITEM::ClearEditFlags(), SCH_EDIT_FRAME::DeleteJunction(), SCH_EDIT_TOOL::editFieldText(), SYMBOL_EDITOR_PIN_TOOL::EditPinProperties(), SCH_EDITOR_CONTROL::EditWithSymbolEditor(), SCH_SYMBOL::GetMsgPanelInfo(), SELECTION_CONDITIONS::Idle(), SELECTION_CONDITIONS::IdleSelection(), SYMBOL_EDITOR_MOVE_TOOL::Main(), PCB_POINT_EDITOR::OnSelectionChange(), SYMBOL_EDITOR_EDIT_TOOL::Properties(), PAD_TOOL::recombinePad(), SCH_EDIT_FRAME::SelectUnit(), DIALOG_IMAGE_PROPERTIES::TransferDataFromWindow(), DIALOG_LABEL_PROPERTIES::TransferDataFromWindow(), DIALOG_SYMBOL_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXT_PROPERTIES::TransferDataFromWindow(), DIALOG_DIMENSION_PROPERTIES::TransferDataFromWindow(), DIALOG_FOOTPRINT_PROPERTIES::TransferDataFromWindow(), DIALOG_TARGET_PROPERTIES::TransferDataFromWindow(), and DIALOG_TEXTBOX_PROPERTIES::TransferDataFromWindow().

◆ GetEndOfBlock()

bool GERBER_FILE_IMAGE::GetEndOfBlock ( char *  aBuff,
unsigned int  aBuffSize,
char *&  aText,
FILE *  aGerberFile 
)
privateinherited

Definition at line 909 of file rs274x.cpp.

910{
911 for( ; ; )
912 {
913 while( (aText < aBuff + aBuffSize) && *aText )
914 {
915 if( *aText == '*' )
916 return true;
917
918 if( *aText == '%' )
919 return true;
920
921 aText++;
922 }
923
924 if( fgets( aBuff, aBuffSize, gerber_file ) == nullptr )
925 break;
926
927 m_LineNum++;
928 aText = aBuff;
929 }
930
931 return false;
932}

References gerber_file, and GERBER_FILE_IMAGE::m_LineNum.

Referenced by GERBER_FILE_IMAGE::ExecuteRS274XCommand().

◆ GetFlags()

◆ GetFocusPosition()

virtual const VECTOR2I EDA_ITEM::GetFocusPosition ( ) const
inlinevirtualinherited

Similar to GetPosition, but allows items to return their visual center rather than their anchor.

Reimplemented in BOARD, PCB_SHAPE, and PCB_TRACK.

Definition at line 269 of file eda_item.h.

269{ return GetPosition(); }
virtual VECTOR2I GetPosition() const
Definition: eda_item.h:262

References EDA_ITEM::GetPosition().

Referenced by SCH_EDIT_FRAME::FocusOnItem().

◆ GetItems()

◆ GetItemsCount()

int GERBER_FILE_IMAGE::GetItemsCount ( )
inlineinherited
Returns
the count of GERBER_DRAW_ITEMS in the image

Definition at line 163 of file gerber_file_image.h.

163{ return m_drawings.size(); }

References GERBER_FILE_IMAGE::m_drawings.

Referenced by GERBVIEW_FRAME::Read_GERBER_File().

◆ GetLastItemInList()

GERBER_DRAW_ITEM * GERBER_FILE_IMAGE::GetLastItemInList ( ) const
inlineinherited
Returns
the last GERBER_DRAW_ITEM* item of the items list

Definition at line 178 of file gerber_file_image.h.

179 {
180 return m_drawings.back();
181 }

References GERBER_FILE_IMAGE::m_drawings.

Referenced by GERBER_FILE_IMAGE::Execute_DCODE_Command(), and GERBER_FILE_IMAGE::Execute_G_Command().

◆ GetLayerParams()

GERBER_LAYER & GERBER_FILE_IMAGE::GetLayerParams ( )
inlineinherited

◆ GetMenuImage()

BITMAPS EDA_ITEM::GetMenuImage ( ) const
virtualinherited

Return a pointer to an image to be used in menus.

The default version returns the right arrow image. Override this function to provide object specific menu images.

Returns
The menu image associated with the item.

Reimplemented in LIB_FIELD, LIB_PIN, LIB_SHAPE, LIB_TEXT, LIB_TEXTBOX, SCH_BITMAP, SCH_BUS_WIRE_ENTRY, SCH_BUS_BUS_ENTRY, SCH_FIELD, SCH_JUNCTION, SCH_LABEL, SCH_GLOBALLABEL, SCH_HIERLABEL, SCH_LINE, SCH_MARKER, SCH_NO_CONNECT, SCH_SHAPE, SCH_SHEET, SCH_SHEET_PIN, SCH_SYMBOL, SCH_TEXT, SCH_TEXTBOX, GERBER_DRAW_ITEM, PCB_GROUP, FOOTPRINT, FP_SHAPE, FP_TEXT, FP_TEXTBOX, PAD, PCB_BITMAP, PCB_DIM_ALIGNED, PCB_DIM_ORTHOGONAL, PCB_DIM_RADIAL, PCB_DIM_LEADER, PCB_DIM_CENTER, PCB_MARKER, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TEXTBOX, PCB_TRACK, PCB_VIA, and ZONE.

Definition at line 274 of file eda_item.cpp.

275{
276 return BITMAPS::dummy_item;
277}

References dummy_item.

Referenced by SELECTION_TOOL::doSelectionMenu().

◆ GetMessages()

const wxArrayString & GERBER_FILE_IMAGE::GetMessages ( ) const
inlineinherited

◆ GetMsgPanelInfo()

◆ GetNextLine()

char * GERBER_FILE_IMAGE::GetNextLine ( char *  aBuff,
unsigned int  aBuffSize,
char *  aText,
FILE *  aFile 
)
privateinherited

Test for an end of line.

If a end of line is found, read a new line.

Parameters
aBuff= buffer (size = GERBER_BUFZ) to fill with a new line
aText= pointer to the last useful char in aBuff on return: points the beginning of the next line.
aBuffSize= the size in bytes of aBuff
aFile= the opened GERBER file to read
Returns
a pointer to the beginning of the next line or NULL if end of file

Definition at line 935 of file rs274x.cpp.

936{
937 for( ; ; )
938 {
939 switch (*aText )
940 {
941 case ' ': // skip blanks
942 case '\n':
943 case '\r': // Skip line terminators
944 ++aText;
945 break;
946
947 case 0: // End of text found in aBuff: Read a new string
948 if( fgets( aBuff, aBuffSize, aFile ) == nullptr )
949 return nullptr;
950
951 m_LineNum++;
952 aText = aBuff;
953 return aText;
954
955 default:
956 return aText;
957 }
958 }
959 return aText;
960}

References GERBER_FILE_IMAGE::m_LineNum.

Referenced by GERBER_FILE_IMAGE::ReadApertureMacro().

◆ GetParent()

◆ GetPosition()

virtual VECTOR2I EDA_ITEM::GetPosition ( ) const
inlinevirtualinherited

Reimplemented in LIB_FIELD, LIB_PIN, LIB_SHAPE, LIB_TEXT, SCH_BITMAP, SCH_BUS_ENTRY_BASE, SCH_FIELD, SCH_JUNCTION, SCH_LINE, SCH_MARKER, SCH_NO_CONNECT, SCH_PIN, SCH_SHAPE, SCH_SHEET, SCH_SYMBOL, SCH_TEXT, GERBER_DRAW_ITEM, DELETED_BOARD_ITEM, DS_DRAW_ITEM_LINE, DS_DRAW_ITEM_POLYPOLYGONS, DS_DRAW_ITEM_RECT, DS_DRAW_ITEM_PAGE, DS_DRAW_ITEM_TEXT, DS_DRAW_ITEM_BITMAP, KIGFX::ORIGIN_VIEWITEM, PCB_GROUP, BOARD, FOOTPRINT, FP_TEXT, NETINFO_ITEM, PAD, PCB_BITMAP, PCB_DIMENSION_BASE, PCB_MARKER, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TRACK, PCB_ARC, PCB_VIA, and ZONE.

Definition at line 262 of file eda_item.h.

262{ return VECTOR2I(); }

Referenced by SCH_MOVE_TOOL::AlignElements(), SCH_EDIT_TOOL::ChangeTextType(), TEST_BOARD_ITEM_FIXTURE::CompareItems(), TEST_EE_ITEM_FIXTURE::CompareItems(), PCB_GRID_HELPER::computeAnchors(), EE_GRID_HELPER::computeAnchors(), SCH_EDIT_FRAME::DeleteJunction(), KIGFX::PCB_PAINTER::draw(), CONNECTION_GRAPH::ercCheckBusToBusConflicts(), CONNECTION_GRAPH::ercCheckBusToNetConflicts(), CONNECTION_GRAPH::ercCheckMultipleDrivers(), CONNECTION_GRAPH::ercCheckNoConnects(), PCB_SELECTION_TOOL::FindItem(), GERBVIEW_SELECTION::GetCenter(), EDA_ITEM::GetFocusPosition(), getMinDist(), SCH_FIELD::GetParentPosition(), SCH_SCREEN::GetSheets(), EDA_ITEM::GetSortPosition(), PCB_SELECTION::GetTopLeftItem(), EE_SELECTION::GetTopLeftItem(), BOARD_ITEM::GetX(), BOARD_ITEM::GetY(), SCH_MOVE_TOOL::Main(), SCH_EDIT_TOOL::Mirror(), SYMBOL_EDITOR_EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), SCH_EDITOR_CONTROL::nextMatch(), DIALOG_MIGRATE_BUSES::onItemSelected(), BOARD::cmp_items::operator()(), SCH_ITEM::operator<(), SCH_EDITOR_CONTROL::Paste(), PL_EDIT_TOOL::Paste(), PCB_CONTROL::placeBoardItems(), BACK_ANNOTATE::processNetNameChange(), PCB_BASE_EDIT_FRAME::PutDataInPreviousState(), SCH_EDIT_TOOL::RepeatDrawItem(), SCH_EDIT_TOOL::Rotate(), SYMBOL_EDITOR_EDIT_TOOL::Rotate(), DRC_TEST_PROVIDER_TEXT_DIMS::Run(), RC_ITEM::ShowReport(), DRC_TEST_PROVIDER_PHYSICAL_CLEARANCE::testShapeLineChain(), DRC_TEST_PROVIDER_MISC::testTextVars(), TransformItem(), DIALOG_POSITION_RELATIVE::UpdateAnchor(), EDIT_TOOL::updateModificationPoint(), PL_EDIT_TOOL::updateModificationPoint(), and EE_POINT_EDITOR::updatePoints().

◆ GetPositiveDrawColor()

COLOR4D GERBER_FILE_IMAGE::GetPositiveDrawColor ( ) const
inlineinherited

Definition at line 153 of file gerber_file_image.h.

153{ return m_PositiveDrawColor; }

References GERBER_FILE_IMAGE::m_PositiveDrawColor.

Referenced by GERBER_DRAW_ITEM::Print().

◆ GetSelectMenuText()

wxString EDA_ITEM::GetSelectMenuText ( EDA_UNITS  aUnits) const
virtualinherited

Return the text to display to be used in the selection clarification context menu when multiple items are found at the current cursor position.

The default version of this function raises an assertion in the debug mode and returns a string to indicate that it was not overridden to provide the object specific text.

Returns
The menu text string.

Reimplemented in LIB_FIELD, LIB_PIN, LIB_SHAPE, LIB_TEXT, LIB_TEXTBOX, SCH_BITMAP, SCH_BUS_WIRE_ENTRY, SCH_BUS_BUS_ENTRY, SCH_FIELD, SCH_JUNCTION, SCH_LABEL, SCH_DIRECTIVE_LABEL, SCH_GLOBALLABEL, SCH_HIERLABEL, SCH_LINE, SCH_MARKER, SCH_NO_CONNECT, SCH_PIN, SCH_SHAPE, SCH_SHEET, DELETED_SHEET_ITEM, SCH_SHEET_PIN, SCH_SYMBOL, SCH_TEXT, SCH_TEXTBOX, GERBER_DRAW_ITEM, DELETED_BOARD_ITEM, DS_DRAW_ITEM_LINE, DS_DRAW_ITEM_POLYPOLYGONS, DS_DRAW_ITEM_RECT, DS_DRAW_ITEM_PAGE, DS_DRAW_ITEM_TEXT, DS_DRAW_ITEM_BITMAP, PCB_GROUP, BOARD, FOOTPRINT, FP_SHAPE, FP_TEXT, FP_TEXTBOX, PAD, PCB_BITMAP, PCB_DIMENSION_BASE, PCB_MARKER, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TEXTBOX, PCB_TRACK, PCB_VIA, and ZONE.

Definition at line 109 of file eda_item.cpp.

110{
111 wxFAIL_MSG( wxT( "GetSelectMenuText() was not overridden for schematic item type " ) +
112 GetClass() );
113
114 return wxString( wxT( "Undefined menu text for " ) + GetClass() );
115}

References EDA_ITEM::GetClass().

Referenced by CONNECTION_GRAPH::collectAllDriverValues(), DIALOG_GROUP_PROPERTIES::DoAddMember(), SELECTION_TOOL::doSelectionMenu(), DRC_ENGINE::EvalRules(), BOARD_INSPECTION_TOOL::getItemDescription(), PCB_MARKER::GetMsgPanelInfo(), RC_TREE_MODEL::GetValue(), RC_ITEM::ShowReport(), DIALOG_POSITION_RELATIVE::UpdateAnchor(), and PCB_CONTROL::UpdateMessagePanel().

◆ GetSortPosition()

virtual VECTOR2I EDA_ITEM::GetSortPosition ( ) const
inlinevirtualinherited

Return the coordinates that should be used for sorting this element visually compared to other elements.

For instance, for lines the midpoint might be a better sorting point than either end.

Returns
X,Y coordinate of the sort point

Reimplemented in SCH_LINE.

Definition at line 278 of file eda_item.h.

278{ return GetPosition(); }

References EDA_ITEM::GetPosition().

◆ GetState()

int EDA_ITEM::GetState ( EDA_ITEM_FLAGS  type) const
inlineinherited

Definition at line 136 of file eda_item.h.

137 {
138 return m_status & type;
139 }
EDA_ITEM_FLAGS m_status
Definition: eda_item.h:497

References EDA_ITEM::m_status.

◆ GetStatus()

EDA_ITEM_FLAGS EDA_ITEM::GetStatus ( ) const
inlineinherited

Definition at line 149 of file eda_item.h.

149{ return m_status; }

References EDA_ITEM::m_status.

◆ HasFlag()

◆ HasNegativeItems()

bool GERBER_FILE_IMAGE::HasNegativeItems ( )
inherited
Returns
true if at least one item must be drawn in background color used to optimize screen refresh (when no items are in background color refresh can be faster).

Definition at line 225 of file gerber_file_image.cpp.

226{
227 if( m_hasNegativeItems < 0 ) // negative items are not yet searched: find them if any
228 {
229 if( m_ImageNegative ) // A negative layer is expected having always negative objects.
230 {
232 }
233 else
234 {
236
237 for( GERBER_DRAW_ITEM* item : GetItems() )
238 {
239 if( item->GetLayer() != m_GraphicLayer )
240 continue;
241
242 if( item->HasNegativeItems() )
243 {
245 break;
246 }
247 }
248 }
249 }
250
251 return m_hasNegativeItems == 1;
252}
int m_hasNegativeItems
True if the image is negative or has some negative items.
GERBER_DRAW_ITEMS & GetItems()

References GERBER_FILE_IMAGE::GetItems(), GERBER_FILE_IMAGE::m_GraphicLayer, GERBER_FILE_IMAGE::m_hasNegativeItems, and GERBER_FILE_IMAGE::m_ImageNegative.

◆ HitTest() [1/2]

virtual bool EDA_ITEM::HitTest ( const EDA_RECT aRect,
bool  aContained,
int  aAccuracy = 0 
) const
inlinevirtualinherited

Test if aRect intersects this item.

Parameters
aRectA reference to a EDA_RECT object containing the rectangle to test.
aContainedSet to true to test for containment instead of an intersection.
aAccuracyIncrease aRect by this amount.
Returns
True if aRect contains or intersects the item bounding box.

Reimplemented in LIB_ITEM, LIB_PIN, LIB_SHAPE, LIB_TEXT, LIB_TEXTBOX, SCH_BITMAP, SCH_BUS_ENTRY_BASE, SCH_FIELD, SCH_JUNCTION, SCH_LABEL_BASE, SCH_LINE, SCH_NO_CONNECT, SCH_PIN, SCH_SHAPE, SCH_SHEET, SCH_SYMBOL, SCH_TEXT, SCH_TEXTBOX, DS_DRAW_ITEM_BASE, DS_DRAW_ITEM_POLYPOLYGONS, DS_DRAW_ITEM_RECT, DS_DRAW_ITEM_TEXT, DS_DRAW_ITEM_BITMAP, PCB_GROUP, FOOTPRINT, FP_TEXT, FP_TEXTBOX, PAD, PCB_BITMAP, PCB_DIMENSION_BASE, PCB_SHAPE, PCB_TARGET, PCB_TEXT, PCB_TEXTBOX, PCB_TRACK, PCB_VIA, PCB_ARC, ZONE, and GERBER_DRAW_ITEM.

Definition at line 248 of file eda_item.h.

249 {
250 return false; // derived classes should override this function
251 }

◆ HitTest() [2/2]

virtual bool EDA_ITEM::HitTest ( const VECTOR2I aPosition,
int  aAccuracy = 0 
) const
inlinevirtualinherited

◆ InitToolTable()

void GERBER_FILE_IMAGE::InitToolTable ( )
inherited

Definition at line 272 of file gerber_file_image.cpp.

273{
274 for( int count = 0; count < TOOLS_MAX_COUNT; count++ )
275 {
276 if( m_Aperture_List[count] == nullptr )
277 continue;
278
279 m_Aperture_List[count]->m_Num_Dcode = count + FIRST_DCODE;
281 }
282
283 m_aperture_macros.clear();
284}
void Clear_D_CODE_Data()
Definition: dcode.cpp:71

References D_CODE::Clear_D_CODE_Data(), FIRST_DCODE, GERBER_FILE_IMAGE::m_Aperture_List, GERBER_FILE_IMAGE::m_aperture_macros, D_CODE::m_Num_Dcode, and TOOLS_MAX_COUNT.

◆ IsBrightened()

◆ IsDragging()

bool EDA_ITEM::IsDragging ( ) const
inlineinherited

Definition at line 120 of file eda_item.h.

120{ return m_flags & IS_DRAGGING; }

References IS_DRAGGING, and EDA_ITEM::m_flags.

Referenced by DIALOG_SYMBOL_PROPERTIES::DIALOG_SYMBOL_PROPERTIES().

◆ IsEntered()

bool EDA_ITEM::IsEntered ( ) const
inlineinherited

Definition at line 123 of file eda_item.h.

123{ return m_flags & ENTERED; }
#define ENTERED
indicates a group has been entered

References ENTERED, and EDA_ITEM::m_flags.

Referenced by KIGFX::PCB_PAINTER::draw().

◆ IsForceVisible()

bool EDA_ITEM::IsForceVisible ( ) const
inlineinherited

Definition at line 216 of file eda_item.h.

216{ return m_forceVisible; }
bool m_forceVisible
Definition: eda_item.h:499

References EDA_ITEM::m_forceVisible.

Referenced by KIGFX::SCH_PAINTER::draw(), and SCH_FIELD::Print().

◆ IsModified()

bool EDA_ITEM::IsModified ( ) const
inlineinherited

Definition at line 117 of file eda_item.h.

117{ return m_flags & IS_CHANGED; }

References IS_CHANGED, and EDA_ITEM::m_flags.

Referenced by PCB_EDIT_FRAME::OpenProjectFiles().

◆ IsMoving()

◆ IsNew()

◆ IsReplaceable()

virtual bool EDA_ITEM::IsReplaceable ( ) const
inlinevirtualinherited

Override this method in any derived object that supports test find and replace.

Returns
True if the item has replaceable text that can be modified using the find and replace dialog.

Reimplemented in LIB_TEXTBOX, SCH_FIELD, SCH_LABEL, SCH_SHEET, SCH_SHEET_PIN, SCH_SYMBOL, SCH_TEXT, and SCH_TEXTBOX.

Definition at line 422 of file eda_item.h.

422{ return false; }

Referenced by EDA_ITEM::Matches().

◆ IsResized()

bool EDA_ITEM::IsResized ( ) const
inlineinherited

Definition at line 124 of file eda_item.h.

124{ return m_flags & IS_RESIZING; }

References IS_RESIZING, and EDA_ITEM::m_flags.

◆ IsSelected()

bool EDA_ITEM::IsSelected ( ) const
inlineinherited

Definition at line 122 of file eda_item.h.

122{ return m_flags & SELECTED; }

References EDA_ITEM::m_flags, and SELECTED.

Referenced by ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), SCH_EDIT_TOOL::ChangeTextType(), SCH_EDIT_FRAME::ConvertPart(), DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersVertically(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsVertically(), KIGFX::SCH_PAINTER::draw(), KIGFX::PCB_PAINTER::draw(), KIGFX::PCB_PAINTER::Draw(), DS_PROXY_UNDO_ITEM::DS_PROXY_UNDO_ITEM(), KIGFX::GERBVIEW_RENDER_SETTINGS::GetColor(), KIGFX::DS_RENDER_SETTINGS::GetColor(), KIGFX::PCB_RENDER_SETTINGS::GetColor(), SCH_MOVE_TOOL::getConnectedDragItems(), KIGFX::SCH_PAINTER::getLineWidth(), KIGFX::SCH_PAINTER::getRenderColor(), DIALOG_EXCHANGE_FOOTPRINTS::isMatch(), DIALOG_CHANGE_SYMBOLS::isMatch(), SCH_MOVE_TOOL::Main(), SCH_SCREEN::MarkConnections(), SCH_LINE::MergeOverlap(), SCH_EDIT_TOOL::Mirror(), EDIT_TOOL::MoveExact(), SCH_MOVE_TOOL::moveItem(), KIGFX::SCH_PAINTER::nonCached(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::processItem(), BOARD_COMMIT::Push(), EE_SELECTION_TOOL::RebuildSelection(), PCB_SELECTION_TOOL::RebuildSelection(), RENDER_3D_OPENGL::renderFootprint(), SCH_EDIT_TOOL::Rotate(), EE_TOOL_BASE< T >::saveCopyInUndoList(), GERBVIEW_SELECTION_TOOL::select(), PCB_SELECTION_TOOL::select(), PCB_SELECTION_TOOL::selectionContains(), PCB_SELECTION_TOOL::selectMultiple(), GERBVIEW_SELECTION_TOOL::selectPoint(), KIGFX::SCH_PAINTER::setDeviceColors(), PCB_BASE_EDIT_FRAME::unitsChangeRefresh(), GERBVIEW_SELECTION_TOOL::unselect(), DIALOG_GLOBAL_EDIT_TEXT_AND_GRAPHICS::visitItem(), and DIALOG_GLOBAL_EDIT_TRACKS_AND_VIAS::visitItem().

◆ IsShownAsBitmap()

bool EDA_ITEM::IsShownAsBitmap ( ) const
inlineinherited

Definition at line 185 of file eda_item.h.

185{ return m_flags & IS_SHOWN_AS_BITMAP; }
#define IS_SHOWN_AS_BITMAP

References IS_SHOWN_AS_BITMAP, and EDA_ITEM::m_flags.

◆ IsType()

virtual bool EDA_ITEM::IsType ( const KICAD_T  aScanTypes[]) const
inlinevirtualinherited

Check whether the item is one of the listed types.

Parameters
aScanTypesList of item types
Returns
true if the item type is contained in the list aScanTypes

Reimplemented in SCH_FIELD, SCH_ITEM, SCH_LABEL_BASE, SCH_LINE, FP_SHAPE, FP_TEXT, FP_TEXTBOX, PAD, PCB_DIMENSION_BASE, PCB_SHAPE, PCB_TEXT, PCB_TEXTBOX, and PCB_VIA.

Definition at line 193 of file eda_item.h.

194 {
195 if( aScanTypes[0] == SCH_LOCATE_ANY_T )
196 return true;
197
198 for( const KICAD_T* p = aScanTypes; *p != EOT; ++p )
199 {
200 if( m_structType == *p )
201 return true;
202 }
203
204 return false;
205 }
KICAD_T m_structType
Run time identification, keep private so it can never be changed after a ctor sets it.
Definition: eda_item.h:507
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ EOT
search types array terminator (End Of Types)
Definition: typeinfo.h:81
@ SCH_LOCATE_ANY_T
Definition: typeinfo.h:174

References EOT, EDA_ITEM::m_structType, and SCH_LOCATE_ANY_T.

Referenced by SCH_EDIT_TOOL::AutoplaceFields(), ROUTER_TOOL::CanInlineDrag(), SCH_FIELD::GetCanonicalName(), KIGFX::SCH_PAINTER::getLineWidth(), SCH_FIELD::GetName(), SCH_FIELD::GetShownText(), SCH_LINE_WIRE_BUS_TOOL::IsDrawingBus(), SCH_LINE_WIRE_BUS_TOOL::IsDrawingLine(), SCH_LINE_WIRE_BUS_TOOL::IsDrawingWire(), SCH_ITEM::IsType(), FP_SHAPE::IsType(), FP_TEXT::IsType(), FP_TEXTBOX::IsType(), PAD::IsType(), PCB_DIMENSION_BASE::IsType(), PCB_SHAPE::IsType(), PCB_TEXT::IsType(), PCB_TEXTBOX::IsType(), PCB_VIA::IsType(), EE_POINT_EDITOR::Main(), PL_POINT_EDITOR::Main(), EE_SELECTION_TOOL::RequestSelection(), SCH_FIELD::SetId(), SCH_BASE_FRAME::UpdateItem(), and EDA_ITEM::Visit().

◆ IsWireImage()

bool EDA_ITEM::IsWireImage ( ) const
inlineinherited

Definition at line 121 of file eda_item.h.

121{ return m_flags & IS_WIRE_IMAGE; }

References IS_WIRE_IMAGE, and EDA_ITEM::m_flags.

◆ IterateForward() [1/2]

template<class T >
static INSPECT_RESULT EDA_ITEM::IterateForward ( std::deque< T > &  aList,
INSPECTOR  inspector,
void *  testData,
const KICAD_T  scanTypes[] 
)
inlinestaticinherited

This changes first parameter to avoid the DList and use the main queue instead.

Definition at line 314 of file eda_item.h.

318 {
319 for( auto it : aList )
320 {
321 if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
324 }
325
327 }
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100
virtual INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const KICAD_T scanTypes[])
May be re-implemented for each derived class in order to handle all the types given by its member dat...
Definition: eda_item.cpp:93

References CONTINUE, QUIT, and EDA_ITEM::Visit().

Referenced by GERBER_FILE_IMAGE::Visit().

◆ IterateForward() [2/2]

template<class T >
static INSPECT_RESULT EDA_ITEM::IterateForward ( std::vector< T > &  aList,
INSPECTOR  inspector,
void *  testData,
const KICAD_T  scanTypes[] 
)
inlinestaticinherited

Change first parameter to avoid the DList and use std::vector instead.

Definition at line 333 of file eda_item.h.

335 {
336 for( auto it : aList )
337 {
338 if( static_cast<EDA_ITEM*>( it )->Visit( inspector, testData, scanTypes )
341 }
342
344 }

References CONTINUE, QUIT, and EDA_ITEM::Visit().

◆ LoadFile()

bool EXCELLON_IMAGE::LoadFile ( const wxString &  aFullFileName,
EXCELLON_DEFAULTS aDefaults 
)

Read and load a drill (EXCELLON format) file.

When the file cannot be loaded, warning and info messages are stored in m_Messages.

Parameters
aFullFileNameis the full filename of the Excellon file.
aDefaultsis the default values when not found in file.
Returns
true if OK, false if the gerber file was not loaded.

Definition at line 455 of file excellon_read_drill_file.cpp.

456{
457 // Set the default parameter values:
460
461 m_Current_File = wxFopen( aFullFileName, wxT( "rt" ) );
462
463 if( m_Current_File == nullptr )
464 return false;
465
466 // Initial format setting, usualy defined in file, but not always...
467 m_NoTrailingZeros = aDefaults->m_LeadingZero;
468 m_GerbMetric = aDefaults->m_UnitsMM;
469
470 wxString msg;
471 m_FileName = aFullFileName;
472
473 LOCALE_IO toggleIo;
474
475 // FILE_LINE_READER will close the file.
476 FILE_LINE_READER excellonReader( m_Current_File, m_FileName );
477
478 while( true )
479 {
480 if( excellonReader.ReadLine() == nullptr )
481 break;
482
483 char* line = excellonReader.Line();
484 char* text = StrPurge( line );
485
486 if( *text == 0 ) // Skip empty lines
487 continue;
488
490 {
492
493 // Now units (inch/mm) are known, set the coordinate format
494 SelectUnits( m_GerbMetric, aDefaults );
495 }
496 else
497 {
498 switch( *text )
499 {
500 case ';':
501 case 'M':
503 break;
504
505 case 'G': // Line type Gxx : command
507 break;
508
509 case 'X':
510 case 'Y': // command like X12550Y19250
512 break;
513
514 case 'I':
515 case 'J': /* Auxiliary Move command */
517 if( *text == '*' ) // command like X35142Y15945J504
518 {
520 }
521 break;
522
523 case 'T': // Select Tool command (can also create
524 // the tool with an embedded definition)
525 Select_Tool( text );
526 break;
527
528 case '%':
529 break;
530
531 default:
532 msg.Printf( wxT( "Unexpected symbol 0x%2.2X &lt;%c&gt;" ), *text, *text );
533 AddMessageToList( msg );
534 break;
535 } // End switch
536 }
537 }
538
539 // Add our file attribute, to identify the drill file
541 char* text = (char*)file_attribute;
542 int dummyline = 0;
543 dummy.ParseAttribCmd( nullptr, nullptr, 0, text, dummyline );
544 delete m_FileFunction;
546
547 m_InUse = true;
548
549 return true;
550}
bool Execute_Drill_Command(char *&text)
bool Execute_HEADER_And_M_Command(char *&text)
virtual void ResetDefaultValues() override
Set all parameters to a default value, before reading a file.
bool Select_Tool(char *&text)
A LINE_READER that reads from an open file.
Definition: richio.h:173
void ClearMessageList()
Clear the message list.
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:41
static const char file_attribute[]
char * StrPurge(char *text)
Remove leading and training spaces, tabs and end of line chars in text.

References GERBER_FILE_IMAGE::AddMessageToList(), GERBER_FILE_IMAGE::ClearMessageList(), dummy(), Execute_Drill_Command(), Execute_EXCELLON_G_Command(), Execute_HEADER_And_M_Command(), file_attribute, LINE_READER::Line(), GERBER_FILE_IMAGE::m_Current_File, GERBER_FILE_IMAGE::m_FileFunction, GERBER_FILE_IMAGE::m_FileName, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_IJPos, GERBER_FILE_IMAGE::m_InUse, EXCELLON_DEFAULTS::m_LeadingZero, GERBER_FILE_IMAGE::m_NoTrailingZeros, m_State, EXCELLON_DEFAULTS::m_UnitsMM, READ_HEADER_STATE, GERBER_FILE_IMAGE::ReadIJCoord(), FILE_LINE_READER::ReadLine(), ResetDefaultValues(), Select_Tool(), SelectUnits(), StrPurge(), and text.

◆ LoadGerberFile()

bool GERBER_FILE_IMAGE::LoadGerberFile ( const wxString &  aFullFileName)
inherited

Read and load a gerber file.

If the file cannot be loaded, warning and information messages are stored in m_messagesList.

Parameters
aFullFileNameThe full filename of the Gerber file.
Returns
true if file loaded successfully, false if the gerber file was not loaded.

Definition at line 236 of file readgerb.cpp.

237{
238 int G_command = 0; // command number for G commands like G04
239 int D_commande = 0; // command number for D commands like D02
240 char* text;
241
244
245 // Read the gerber file */
246 m_Current_File = wxFopen( aFullFileName, wxT( "rt" ) );
247
248 if( m_Current_File == nullptr )
249 return false;
250
251 m_FileName = aFullFileName;
252
253 LOCALE_IO toggleIo;
254
255 wxString msg;
256
257 while( true )
258 {
259 if( fgets( lineBuffer, GERBER_BUFZ, m_Current_File ) == nullptr )
260 break;
261
262 m_LineNum++;
264
265 while( text && *text )
266 {
267 switch( *text )
268 {
269 case ' ':
270 case '\r':
271 case '\n':
272 text++;
273 break;
274
275 case '*': // End command
277 text++;
278 break;
279
280 case 'M': // End file
282 while( *text )
283 text++;
284 break;
285
286 case 'G': /* Line type Gxx : command */
287 G_command = CodeNumber( text );
288 Execute_G_Command( text, G_command );
289 break;
290
291 case 'D': /* Line type Dxx : Tool selection (xx > 0) or
292 * command if xx = 0..9 */
293 D_commande = CodeNumber( text );
294 Execute_DCODE_Command( text, D_commande );
295 break;
296
297 case 'X':
298 case 'Y': /* Move or draw command */
300 if( *text == '*' ) // command like X12550Y19250*
301 {
303 }
304 break;
305
306 case 'I':
307 case 'J': /* Auxiliary Move command */
309
310 if( *text == '*' ) // command like X35142Y15945J504*
311 {
313 }
314 break;
315
316 case '%':
318 {
321 }
322 else //Error
323 {
324 AddMessageToList( wxT( "Expected RS274X Command" ) );
326 text++;
327 }
328 break;
329
330 default:
331 msg.Printf( wxT( "Unexpected char 0x%2.2X" ), *text );
332 AddMessageToList( msg );
333 text++;
334 break;
335 }
336 }
337 }
338
339 fclose( m_Current_File );
340
341 m_InUse = true;
342
343 return true;
344}
bool Execute_G_Command(char *&text, int G_command)
Definition: rs274d.cpp:421
virtual void ResetDefaultValues()
Set all parameters to a default value, before reading a file.
bool Execute_DCODE_Command(char *&text, int D_command)
Definition: rs274d.cpp:557
bool ReadRS274XCommand(char *aBuff, unsigned int aBuffSize, char *&aText)
Read a single RS274X command terminated with a %.
Definition: rs274x.cpp:143
@ END_BLOCK
Definition: gerbview.h:65
@ ENTER_RS274X_CMD
Definition: gerbview.h:66
@ CMD_IDLE
Definition: gerbview.h:64
#define GERBER_BUFZ
Definition: readgerb.cpp:232
static char lineBuffer[GERBER_BUFZ+1]
Definition: readgerb.cpp:234

References GERBER_FILE_IMAGE::AddMessageToList(), GERBER_FILE_IMAGE::ClearMessageList(), CMD_IDLE, GERBER_FILE_IMAGE::CodeNumber(), END_BLOCK, ENTER_RS274X_CMD, GERBER_FILE_IMAGE::Execute_DCODE_Command(), GERBER_FILE_IMAGE::Execute_G_Command(), GERBER_BUFZ, lineBuffer, GERBER_FILE_IMAGE::m_CommandState, GERBER_FILE_IMAGE::m_Current_File, GERBER_FILE_IMAGE::m_CurrentPos, GERBER_FILE_IMAGE::m_FileName, GERBER_FILE_IMAGE::m_IJPos, GERBER_FILE_IMAGE::m_InUse, GERBER_FILE_IMAGE::m_Last_Pen_Command, GERBER_FILE_IMAGE::m_LineNum, GERBER_FILE_IMAGE::ReadIJCoord(), GERBER_FILE_IMAGE::ReadRS274XCommand(), GERBER_FILE_IMAGE::ReadXYCoord(), GERBER_FILE_IMAGE::ResetDefaultValues(), StrPurge(), and text.

◆ Matches() [1/2]

virtual bool EDA_ITEM::Matches ( const wxFindReplaceData &  aSearchData,
void *  aAuxData 
) const
inlinevirtualinherited

Compare the item against the search criteria in aSearchData.

The base class returns false since many of the objects derived from EDA_ITEM do not have any text to search.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search criteria.
aAuxDataA pointer to optional data required for the search or NULL if not used.
Returns
True if the item's text matches the search criteria in aSearchData.

Reimplemented in SCH_MARKER, LIB_TEXTBOX, SCH_FIELD, SCH_PIN, SCH_SHEET, SCH_SHEET_PIN, SCH_SYMBOL, SCH_TEXT, SCH_TEXTBOX, FP_TEXT, FP_TEXTBOX, NETINFO_ITEM, PCB_MARKER, PCB_TEXT, PCB_TEXTBOX, and ZONE.

Definition at line 384 of file eda_item.h.

385 {
386 return false;
387 }

Referenced by SCH_EDITOR_CONTROL::HasMatch(), SCH_MARKER::Matches(), LIB_TEXTBOX::Matches(), SCH_FIELD::Matches(), SCH_PIN::Matches(), SCH_SHEET_PIN::Matches(), SCH_TEXT::Matches(), SCH_TEXTBOX::Matches(), FP_TEXT::Matches(), FP_TEXTBOX::Matches(), NETINFO_ITEM::Matches(), PCB_MARKER::Matches(), PCB_TEXT::Matches(), PCB_TEXTBOX::Matches(), ZONE::Matches(), SCH_EDITOR_CONTROL::ReplaceAndFindNext(), and SCH_EDITOR_CONTROL::UpdateFind().

◆ Matches() [2/2]

bool EDA_ITEM::Matches ( const wxString &  aText,
const wxFindReplaceData &  aSearchData 
) const
protectedinherited

Compare aText against search criteria in aSearchData.

This is a helper function for simplify derived class logic.

Parameters
aTextA reference to a wxString object containing the string to test.
aSearchDataThe criteria to search against.
Returns
True if aText matches the search criteria in aSearchData.

Definition at line 118 of file eda_item.cpp.

119{
120 wxString text = aText;
121 int flags = aSearchData.GetFlags();
122 wxString searchText = aSearchData.GetFindString();
123
124 // Don't match if searching for replaceable item and the item doesn't support text replace.
125 if( ( flags & FR_SEARCH_REPLACE ) && !IsReplaceable() )
126 return false;
127
128 if( !( flags & wxFR_MATCHCASE ) )
129 {
130 text.MakeUpper();
131 searchText.MakeUpper();
132 }
133
134 if( flags & wxFR_WHOLEWORD )
135 {
136 int ii = 0;
137
138 while( ii < (int) text.length() )
139 {
140 int next = text.find( searchText, ii );
141
142 if( next == wxNOT_FOUND )
143 return false;
144
145 ii = next;
146 next += searchText.length();
147
148 bool startOK = ( ii == 0 || !wxIsalnum( text.GetChar( ii - 1 ) ) );
149 bool endOK = ( next == (int) text.length() || !wxIsalnum( text.GetChar( next ) ) );
150
151 if( startOK && endOK )
152 return true;
153 else
154 ii++;
155 }
156
157 return false;
158 }
159 else if( flags & FR_MATCH_WILDCARD )
160 {
161 return text.Matches( searchText );
162 }
163 else
164 {
165 return text.Find( searchText ) != wxNOT_FOUND;
166 }
167}
virtual bool IsReplaceable() const
Override this method in any derived object that supports test find and replace.
Definition: eda_item.h:422
@ FR_MATCH_WILDCARD
Definition: eda_item.h:57
@ FR_SEARCH_REPLACE
Definition: eda_item.h:59
CITER next(CITER it)
Definition: ptree.cpp:126

References FR_MATCH_WILDCARD, FR_SEARCH_REPLACE, EDA_ITEM::IsReplaceable(), next(), and text.

◆ operator<()

bool EDA_ITEM::operator< ( const EDA_ITEM aItem) const
inherited

Test if another item is less than this object.

Parameters
aItem- Item to compare against.
Returns
- True if aItem is less than the item.

Definition at line 234 of file eda_item.cpp.

235{
236 wxFAIL_MSG( wxString::Format( wxT( "Less than operator not defined for item type %s." ),
237 GetClass() ) );
238
239 return false;
240}

References Format(), and EDA_ITEM::GetClass().

◆ ReadApertureMacro()

bool GERBER_FILE_IMAGE::ReadApertureMacro ( char *  aBuff,
unsigned int  aBuffSize,
char *&  text,
FILE *  gerber_file 
)
privateinherited

Read in an aperture macro and saves it in m_aperture_macros.

Parameters
aBuffa character buffer at least GERBER_BUFZ long that can be used to read successive lines from the gerber file.
textA reference to a character pointer which gives the initial text to read from.
aBuffSizeis the size of aBuff
gerber_fileWhich file to read from for continuation.
Returns
true if a macro was read in successfully, else false.

Definition at line 963 of file rs274x.cpp.

966{
967 wxString msg;
969
970 // read macro name
971 while( *aText )
972 {
973 if( *aText == '*' )
974 {
975 ++aText;
976 break;
977 }
978
979 am.name.Append( *aText++ );
980 }
981
982 // Read aperture macro parameters
983 for( ; ; )
984 {
985 if( *aText == '*' )
986 ++aText;
987
988 aText = GetNextLine( aBuff, aBuffSize, aText, gerber_file );
989
990 if( aText == nullptr ) // End of File
991 return false;
992
993 // aText points the beginning of a new line.
994
995 // Test for the last line in aperture macro lis:
996 // last line is % or *% sometime found.
997 if( *aText == '*' )
998 ++aText;
999
1000 if( *aText == '%' )
1001 break; // exit with aText still pointing at %
1002
1003 int paramCount = 0; // will be set to the minimal parameters count,
1004 // depending on the actual primitive
1005 int primitive_type = AMP_UNKNOWN;
1006 // Test for a valid symbol at the beginning of a description:
1007 // it can be: a parameter declaration like $1=$2/4
1008 // or a digit (macro primitive selection)
1009 // all other symbols are illegal.
1010 if( *aText == '$' ) // local parameter declaration, inside the aperture macro
1011 {
1012 am.m_localparamStack.push_back( AM_PARAM() );
1013 AM_PARAM& param = am.m_localparamStack.back();
1014 aText = GetNextLine( aBuff, aBuffSize, aText, gerber_file );
1015 if( aText == nullptr) // End of File
1016 return false;
1017 param.ReadParam( aText );
1018 continue;
1019 }
1020 else if( !isdigit(*aText) ) // Ill. symbol
1021 {
1022 msg.Printf( wxT( "RS274X: Aperture Macro \"%s\": ill. symbol, line: \"%s\"" ),
1023 am.name, FROM_UTF8( aBuff ) );
1024 AddMessageToList( msg );
1025 primitive_type = AMP_COMMENT;
1026 }
1027 else
1028 primitive_type = ReadInt( aText );
1029
1030 bool is_comment = false;
1031
1032 switch( primitive_type )
1033 {
1034 case AMP_COMMENT: // lines starting by 0 are a comment
1035 paramCount = 0;
1036 is_comment = true;
1037
1038 // Skip comment
1039 while( *aText && ( *aText != '*' ) )
1040 aText++;
1041
1042 break;
1043
1044 case AMP_CIRCLE:
1045 paramCount = 4; // minimal count. can have a optional parameter (rotation)
1046 break;
1047
1048 case AMP_LINE2:
1049 case AMP_LINE20:
1050 paramCount = 7;
1051 break;
1052
1053 case AMP_LINE_CENTER:
1055 paramCount = 6;
1056 break;
1057
1058 case AMP_EOF:
1059 paramCount = 0;
1060 break;
1061
1062 case AMP_OUTLINE:
1063 paramCount = 4; // partial count. other parameters are vertices and rotation
1064 // Second parameter is vertice (coordinate pairs) count.
1065 break;
1066
1067 case AMP_POLYGON:
1068 paramCount = 6;
1069 break;
1070
1071 case AMP_MOIRE:
1072 paramCount = 9;
1073 break;
1074
1075 case AMP_THERMAL:
1076 paramCount = 6;
1077 break;
1078
1079 default:
1080 msg.Printf( wxT( "RS274X: Aperture Macro \"%s\": Invalid primitive id code %d, line %d: \"%s\"" ),
1081 am.name, primitive_type, m_LineNum, FROM_UTF8( aBuff ) );
1082 AddMessageToList( msg );
1083 return false;
1084 }
1085
1086 if( is_comment )
1087 continue;
1088
1089 AM_PRIMITIVE prim( m_GerbMetric );
1090 prim.primitive_id = (AM_PRIMITIVE_ID) primitive_type;
1091 int ii;
1092
1093 for( ii = 0; ii < paramCount && *aText && *aText != '*'; ++ii )
1094 {
1095 prim.params.push_back( AM_PARAM() );
1096
1097 AM_PARAM& param = prim.params.back();
1098
1099 aText = GetNextLine( aBuff, aBuffSize, aText, gerber_file );
1100
1101 if( aText == nullptr) // End of File
1102 return false;
1103
1104 param.ReadParam( aText );
1105 }
1106
1107 if( ii < paramCount )
1108 {
1109 // maybe some day we can throw an exception and track a line number
1110 msg.Printf( wxT( "RS274X: read macro descr type %d: read %d parameters, insufficient "
1111 "parameters\n" ),
1112 prim.primitive_id, ii );
1113 AddMessageToList( msg );
1114 }
1115
1116 // there are more parameters to read if this is an AMP_OUTLINE
1117 if( prim.primitive_id == AMP_OUTLINE )
1118 {
1119 // so far we have read [0]:exposure, [1]:#points, [2]:X start, [3]: Y start
1120 // Now read all the points, plus trailing rotation in degrees.
1121
1122 // params[1] is a count of polygon points, so it must be given
1123 // in advance, i.e. be immediate.
1124 wxASSERT( prim.params[1].IsImmediate() );
1125
1126 paramCount = (int) prim.params[1].GetValue( nullptr ) * 2 + 1;
1127
1128 for( int jj = 0; jj < paramCount && *aText != '*'; ++jj )
1129 {
1130 prim.params.push_back( AM_PARAM() );
1131
1132 AM_PARAM& param = prim.params.back();
1133
1134 aText = GetNextLine( aBuff, aBuffSize, aText, gerber_file );
1135
1136 if( aText == nullptr ) // End of File
1137 return false;
1138
1139 param.ReadParam( aText );
1140 }
1141 }
1142
1143 // AMP_CIRCLE can have a optional parameter (rotation)
1144 if( prim.primitive_id == AMP_CIRCLE && aText && *aText != '*' )
1145 {
1146 prim.params.push_back( AM_PARAM() );
1147 AM_PARAM& param = prim.params.back();
1148 param.ReadParam( aText );
1149 }
1150
1151 am.primitives.push_back( prim );
1152 }
1153
1154 m_aperture_macros.insert( am );
1155
1156 return true;
1157}
AM_PRIMITIVE_ID
The set of all "aperture macro primitives" (primitive numbers).
Definition: am_primitive.h:70
@ AMP_POLYGON
Definition: am_primitive.h:81
@ AMP_LINE_LOWER_LEFT
Definition: am_primitive.h:78
@ AMP_LINE2
Definition: am_primitive.h:75
@ AMP_CIRCLE
Definition: am_primitive.h:74
@ AMP_THERMAL
Definition: am_primitive.h:84
@ AMP_EOF
Definition: am_primitive.h:79
@ AMP_UNKNOWN
Definition: am_primitive.h:71
@ AMP_COMMENT
Definition: am_primitive.h:72
@ AMP_LINE_CENTER
Definition: am_primitive.h:77
@ AMP_MOIRE
Definition: am_primitive.h:83
@ AMP_OUTLINE
Definition: am_primitive.h:80
@ AMP_LINE20
Definition: am_primitive.h:76
Hold a parameter value for an "aperture macro" as defined within standard RS274X.
Definition: am_param.h:285
bool ReadParam(char *&aText)
Read one aperture macro parameter.
Definition: am_param.cpp:177
An aperture macro primitive as given in Table 3 of http://gerbv.sourceforge.net/docs/rs274xrevd_e....
Definition: am_primitive.h:94
char * GetNextLine(char *aBuff, unsigned int aBuffSize, char *aText, FILE *aFile)
Test for an end of line.
Definition: rs274x.cpp:935
AM_PRIMITIVES primitives
A sequence of AM_PRIMITIVEs.
Definition: am_primitive.h:232
AM_PARAMS m_localparamStack
Definition: am_primitive.h:240

References GERBER_FILE_IMAGE::AddMessageToList(), AMP_CIRCLE, AMP_COMMENT, AMP_EOF, AMP_LINE2, AMP_LINE20, AMP_LINE_CENTER, AMP_LINE_LOWER_LEFT, AMP_MOIRE, AMP_OUTLINE, AMP_POLYGON, AMP_THERMAL, AMP_UNKNOWN, FROM_UTF8(), gerber_file, GERBER_FILE_IMAGE::GetNextLine(), GERBER_FILE_IMAGE::m_aperture_macros, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_LineNum, APERTURE_MACRO::m_localparamStack, APERTURE_MACRO::name, AM_PRIMITIVE::params, AM_PRIMITIVE::primitive_id, APERTURE_MACRO::primitives, ReadInt(), and AM_PARAM::ReadParam().

Referenced by GERBER_FILE_IMAGE::ExecuteRS274XCommand().

◆ readFileFormat()

void EXCELLON_IMAGE::readFileFormat ( char *&  aText)
private

Read an Altium-specific FILE_FORMAT=X:X attribute that specifies the length and mantissa of the numbers in the gerber file.

Parameters
aTextText containing format and mantissa

Definition at line 720 of file excellon_read_drill_file.cpp.

721{
722 int mantissaDigits = 0;
723 int characteristicDigits = 0;
724
725 // Example String: ;FILE_FORMAT=4:4
726 // The ;FILE_FORMAT potion will already be stripped off.
727 // Parse the rest strictly as single_digit:single_digit like 4:4 or 2:4
728 // Don't allow anything clever like spaces or multiple digits
729 if( *aText != '=' )
730 return;
731
732 aText++;
733
734 if( !isdigit( *aText ) )
735 return;
736
737 characteristicDigits = *aText - '0';
738 aText++;
739
740 if( *aText != ':' )
741 return;
742
743 aText++;
744
745 if( !isdigit( *aText ) )
746 return;
747
748 mantissaDigits = *aText - '0';
749
750 m_hasFormat = true;
751 m_FmtLen.x = m_FmtLen.y = characteristicDigits + mantissaDigits;
752 m_FmtScale.x = m_FmtScale.y = mantissaDigits;
753}

References GERBER_FILE_IMAGE::m_FmtLen, GERBER_FILE_IMAGE::m_FmtScale, and m_hasFormat.

Referenced by Execute_HEADER_And_M_Command().

◆ ReadIJCoord()

VECTOR2I GERBER_FILE_IMAGE::ReadIJCoord ( char *&  Text)
inherited

Return the current coordinate type pointed to by InnJnn Text (InnnnJmmmm)

These coordinates are relative, so if coordinate is absent, its value defaults to 0

Definition at line 163 of file rs274_read_XY_and_IJ_coordinates.cpp.

164{
165 VECTOR2I pos( 0, 0 );
166 bool is_float = false;
167
168 std::string line;
169
170 // Reserve the anticipated length plus an optional sign and decimal
171 line.reserve( std::max( m_FmtLen.x, m_FmtLen.y ) + 3 );
172
173 if( aText == nullptr )
174 return pos;
175
176 while( *aText && ( ( *aText == 'I' ) || ( *aText == 'J' ) ) )
177 {
178 double decimal_scale = 1.0;
179 int nbdigits = 0;
180 int current_coord = 0;
181 char type_coord = *aText++;
182
183 line.clear();
184
185 while( IsNumber( *aText ) )
186 {
187 if( *aText == '.' ) // Force decimal format if reading a floating point number
188 is_float = true;
189
190 // count digits only (sign and decimal point are not counted)
191 if( (*aText >= '0') && (*aText <='9') )
192 nbdigits++;
193
194 line.push_back( *( aText++ ) );
195 }
196
197 double val = strtod( line.data(), nullptr );
198
199 if( is_float )
200 {
201 current_coord = scaletoIU( val, m_GerbMetric );
202 }
203 else
204 {
205 int fmt_scale = ( type_coord == 'I' ) ? m_FmtScale.x : m_FmtScale.y;
206
208 {
209 // no trailing zero format, we need to add missing zeros.
210 int digit_count = ( type_coord == 'I' ) ? m_FmtLen.x : m_FmtLen.y;
211
212 // Truncate the extra digits if the len is more than expected
213 // because the conversion to internal units expect exactly
214 // digit_count digits. Alternatively, add some additional digits
215 // to pad out to the missing zeros
216 if( nbdigits < digit_count )
217 decimal_scale = std::pow<double>( 10, digit_count - nbdigits );
218 }
219
220 double real_scale = scale_list[fmt_scale];
221
222 if( m_GerbMetric )
223 real_scale = real_scale / 25.4;
224
225 current_coord = KiROUND( val * real_scale * decimal_scale );
226 }
227
228 if( type_coord == 'I' )
229 {
230 pos.x = current_coord;
231 }
232 else if( type_coord == 'J' )
233 {
234 pos.y = current_coord;
235 }
236 }
237
238 m_IJPos = pos;
240 m_LastCoordIsIJPos = true;
241
242 return pos;
243}
#define IsNumber(x)
int scaletoIU(double aCoord, bool isMetric)
Convert a coordinate given in floating point to GerbView's internal units (currently = 10 nanometers)...
static double scale_list[SCALE_LIST_SIZE]

References ARC_INFO_TYPE_CENTER, IsNumber, KiROUND(), GERBER_FILE_IMAGE::m_FmtLen, GERBER_FILE_IMAGE::m_FmtScale, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_IJPos, GERBER_FILE_IMAGE::m_LastArcDataType, GERBER_FILE_IMAGE::m_LastCoordIsIJPos, GERBER_FILE_IMAGE::m_NoTrailingZeros, scale_list, scaletoIU(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Execute_Drill_Command(), Execute_EXCELLON_G_Command(), LoadFile(), and GERBER_FILE_IMAGE::LoadGerberFile().

◆ ReadRS274XCommand()

bool GERBER_FILE_IMAGE::ReadRS274XCommand ( char *  aBuff,
unsigned int  aBuffSize,
char *&  aText 
)
privateinherited

Read a single RS274X command terminated with a %.

Definition at line 143 of file rs274x.cpp.

144{
145 bool ok = true;
146 int code_command;
147
148 aText++;
149
150 for( ; ; )
151 {
152 while( *aText )
153 {
154 switch( *aText )
155 {
156 case '%': // end of command
157 aText++;
159 goto exit; // success completion
160
161 case ' ':
162 case '\r':
163 case '\n':
164 aText++;
165 break;
166
167 case '*':
168 aText++;
169 break;
170
171 default:
172 code_command = ReadXCommandID( aText );
173 ok = ExecuteRS274XCommand( code_command, aBuff, aBuffSize, aText );
174
175 if( !ok )
176 goto exit;
177
178 break;
179 }
180 }
181
182 // end of current line, read another one.
183 if( fgets( aBuff, aBuffSize, m_Current_File ) == nullptr )
184 {
185 // end of file
186 ok = false;
187 break;
188 }
189 m_LineNum++;
190 aText = aBuff;
191 }
192
193exit:
194 return ok;
195}

References CMD_IDLE, GERBER_FILE_IMAGE::ExecuteRS274XCommand(), exit, GERBER_FILE_IMAGE::m_CommandState, GERBER_FILE_IMAGE::m_Current_File, GERBER_FILE_IMAGE::m_LineNum, and GERBER_FILE_IMAGE::ReadXCommandID().

Referenced by GERBER_FILE_IMAGE::LoadGerberFile().

◆ readToolInformation()

bool EXCELLON_IMAGE::readToolInformation ( char *&  aText)
private

Read a tool definition like T1C0.02 or T1F00S00C0.02 or T1C0.02F00S00 and enter params in TCODE list.

Definition at line 756 of file excellon_read_drill_file.cpp.

757{
758 // Read a tool definition like T1C0.02 or T1F00S00C0.02 or T1C0.02F00S00
759 // and enter the TCODE param in list (using the D_CODE param management, which
760 // is similar to TCODE params.
761 if( *aText == 'T' ) // This is the beginning of the definition
762 aText++;
763
764 // Read tool number:
765 int iprm = ReadInt( aText, false );
766
767 // Skip Feed rate and Spindle speed, if any here
768 while( *aText && ( *aText == 'F' || *aText == 'S' ) )
769 {
770 aText++;
771 ReadInt( aText, false );
772 }
773
774 // Read tool shape
775 if( ! *aText )
777 _( "Tool definition shape not found" ) ) );
778 else if( *aText != 'C' )
780 _( "Tool definition '%c' not supported" ), *aText ) );
781 if( *aText )
782 aText++;
783
784 //read tool diameter:
785 double dprm = ReadDouble( aText, false );
786 m_Has_DCode = true;
787
788 // Initialize Dcode to handle this Tool
789 // Remember: dcodes are >= FIRST_DCODE
790 D_CODE* dcode = GetDCODEOrCreate( iprm + FIRST_DCODE );
791
792 if( dcode == nullptr )
793 return false;
794
795 // conv_scale = scaling factor from inch to Internal Unit
796 double conv_scale = IU_PER_MILS * 1000;
797
798 if( m_GerbMetric )
799 conv_scale /= 25.4;
800
801 dcode->m_Size.x = dcode->m_Size.y = KiROUND( dprm * conv_scale );
802 dcode->m_Shape = APT_CIRCLE;
803 dcode->m_Defined = true;
804
805 return true;
806}
int ReadInt(char *&text, bool aSkipSeparator=true)
Read an integer from an ASCII character buffer.
double ReadDouble(char *&text, bool aSkipSeparator=true)
Read a double precision floating point number from an ASCII character buffer.

References _, GERBER_FILE_IMAGE::AddMessageToList(), APT_CIRCLE, FIRST_DCODE, Format(), GERBER_FILE_IMAGE::GetDCODEOrCreate(), IU_PER_MILS, KiROUND(), D_CODE::m_Defined, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_Has_DCode, D_CODE::m_Shape, D_CODE::m_Size, ReadDouble(), and ReadInt().

Referenced by Execute_HEADER_And_M_Command(), and Select_Tool().

◆ ReadXCommandID()

int GERBER_FILE_IMAGE::ReadXCommandID ( char *&  text)
privateinherited

Read two bytes of data and assembles them into an int with the first byte in the sequence put into the most significant part of a 16 bit value to build a RS274X command identifier.

Parameters
textA reference to a pointer to read bytes from and to advance as they are read.
Returns
a RS274X command identifier.

Definition at line 115 of file rs274x.cpp.

116{
117 /* reads two bytes of data and assembles them into an int with the first
118 * byte in the sequence put into the most significant part of a 16 bit value
119 */
120 int result;
121 int currbyte;
122
123 if( text && *text )
124 {
125 currbyte = *text++;
126 result = ( currbyte & 0xFF ) << 8;
127 }
128 else
129 return -1;
130
131 if( text && *text )
132 {
133 currbyte = *text++;
134 result += currbyte & 0xFF;
135 }
136 else
137 return -1;
138
139 return result;
140}

References text.

Referenced by GERBER_FILE_IMAGE::Execute_G_Command(), GERBER_FILE_IMAGE::ExecuteRS274XCommand(), and GERBER_FILE_IMAGE::ReadRS274XCommand().

◆ ReadXYCoord()

VECTOR2I GERBER_FILE_IMAGE::ReadXYCoord ( char *&  aText,
bool  aExcellonMode = false 
)
inherited

Return the current coordinate type pointed to by XnnYnn Text (XnnnnYmmmm).

Parameters
aTextis a pointer to the text to parse.
aExcellonMode= true to parse a Excellon drill file. it forces truncation of a digit string to a maximum length because the exact coordinate format is not always known.

Definition at line 71 of file rs274_read_XY_and_IJ_coordinates.cpp.

72{
73 VECTOR2I pos( 0, 0 );
74 bool is_float = false;
75
76 std::string line;
77
78 // Reserve the anticipated length plus an optional sign and decimal
79 line.reserve( std::max( m_FmtLen.x, m_FmtLen.y ) + 3 );
80
81 // Set up return value for case where aText == nullptr
82 if( !m_Relative )
83 pos = m_CurrentPos;
84
85 if( aText == nullptr )
86 return pos;
87
88 while( *aText && ( ( *aText == 'X' ) || ( *aText == 'Y' ) || ( *aText == 'A' ) ) )
89 {
90 double decimal_scale = 1.0;
91 int nbdigits = 0;
92 int current_coord = 0;
93 char type_coord = *aText++;
94
95 line.clear();
96
97 while( IsNumber( *aText ) )
98 {
99 if( *aText == '.' ) // Force decimal format if reading a floating point number
100 is_float = true;
101
102 // count digits only (sign and decimal point are not counted)
103 if( (*aText >= '0') && (*aText <='9') )
104 nbdigits++;
105
106 line.push_back( *( aText++ ) );
107 }
108
109 double val = strtod( line.data(), nullptr );
110
111 if( is_float )
112 {
113 current_coord = scaletoIU( val, m_GerbMetric );
114 }
115 else
116 {
117 int fmt_scale = (type_coord == 'X') ? m_FmtScale.x : m_FmtScale.y;
118
120 {
121 // no trailing zero format, we need to add missing zeros.
122 int digit_count = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y;
123
124 // Truncate the extra digits if the len is more than expected
125 // because the conversion to internal units expect exactly
126 // digit_count digits. Alternatively, add some additional digits
127 // to pad out to the missing zeros
128 if( nbdigits < digit_count || ( aExcellonMode && ( nbdigits > digit_count ) ) )
129 decimal_scale = std::pow<double>( 10, digit_count - nbdigits );
130 }
131
132 double real_scale = scale_list[fmt_scale];
133
134 if( m_GerbMetric )
135 real_scale = real_scale / 25.4;
136
137 current_coord = KiROUND( val * real_scale * decimal_scale );
138 }
139
140 if( type_coord == 'X' )
141 {
142 pos.x = current_coord;
143 }
144 else if( type_coord == 'Y' )
145 {
146 pos.y = current_coord;
147 }
148 else if( type_coord == 'A' )
149 {
150 m_ArcRadius = current_coord;
152 }
153 }
154
155 if( m_Relative )
156 pos += m_CurrentPos;
157
158 m_CurrentPos = pos;
159 return pos;
160}
@ ARC_INFO_TYPE_RADIUS

References ARC_INFO_TYPE_RADIUS, IsNumber, KiROUND(), GERBER_FILE_IMAGE::m_ArcRadius, GERBER_FILE_IMAGE::m_CurrentPos, GERBER_FILE_IMAGE::m_FmtLen, GERBER_FILE_IMAGE::m_FmtScale, GERBER_FILE_IMAGE::m_GerbMetric, GERBER_FILE_IMAGE::m_LastArcDataType, GERBER_FILE_IMAGE::m_NoTrailingZeros, GERBER_FILE_IMAGE::m_Relative, scale_list, scaletoIU(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by Execute_Drill_Command(), Execute_EXCELLON_G_Command(), and GERBER_FILE_IMAGE::LoadGerberFile().

◆ RemoveAttribute()

void GERBER_FILE_IMAGE::RemoveAttribute ( X2_ATTRIBUTE aAttribute)
inherited

Called when a TD command is found the Gerber file.

Remove the attribute specified by the TD command. is no attribute, all current attributes specified by the TO and the TA commands are cleared. if a attribute name is specified (for instance TD.CN*%) is specified, only this attribute is cleared

Parameters
aAttributeis the X2_ATTRIBUTE which stores the full command May be re-implemented for each derived class in order to handle all the types given by its member data.

Implementations should call inspector->Inspect() on types in scanTypes[], and may use IterateForward() to do so on lists of such data.

Parameters
inspectorAn INSPECTOR instance to use in the inspection.
testDataArbitrary data used by the inspector.
scanTypesWhich# KICAD_T types are of interest and the order is significant too, terminated by EOT.
Returns
#SEARCH_RESULT SEARCH_QUIT if the Iterator is to stop the scan, else #SCAN_CONTINUE, and determined by the inspector.

Definition at line 391 of file gerber_file_image.cpp.

392{
393 /* Called when a %TD command is found
394 * Remove the attribute specified by the %TD command.
395 * is no attribute, all current attributes specified by the %TO and the %TA
396 * commands are cleared.
397 * if a attribute name is specified (for instance %TD.CN*%) is specified,
398 * only this attribute is cleared
399 */
400 wxString cmd = aAttribute.GetPrm( 0 );
402
403 if( cmd.IsEmpty() || cmd == wxT( ".AperFunction" ) )
404 m_AperFunction.Clear();
405}
void ClearAttribute(const wxString *aName)
Remove the net attribute specified by aName.
const wxString & GetPrm(int aIdx)

References GBR_NETLIST_METADATA::ClearAttribute(), X2_ATTRIBUTE::GetPrm(), GERBER_FILE_IMAGE::m_AperFunction, and GERBER_FILE_IMAGE::m_NetAttributeDict.

Referenced by GERBER_FILE_IMAGE::ExecuteRS274XCommand().

◆ RenderAsBitmap()

virtual bool EDA_ITEM::RenderAsBitmap ( double  aWorldScale) const
inlinevirtualinherited

Reimplemented in SCH_ITEM.

Definition at line 175 of file eda_item.h.

175{ return false; }

◆ Replace() [1/2]

virtual bool EDA_ITEM::Replace ( const wxFindReplaceData &  aSearchData,
void *  aAuxData = nullptr 
)
inlinevirtualinherited

Perform a text replace using the find and replace criteria in aSearchData on items that support text find and replace.

This function must be overridden for items that support text replace.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search and replace criteria.
aAuxDataA pointer to optional data required for the search or NULL if not used.
Returns
True if the item text was modified, otherwise false.

Reimplemented in LIB_TEXTBOX, SCH_PIN, SCH_TEXT, SCH_TEXTBOX, SCH_FIELD, and SCH_SHEET_PIN.

Definition at line 411 of file eda_item.h.

412 {
413 return false;
414 }

◆ Replace() [2/2]

bool EDA_ITEM::Replace ( const wxFindReplaceData &  aSearchData,
wxString &  aText 
)
staticinherited

Perform a text replace on aText using the find and replace criteria in aSearchData on items that support text find and replace.

Parameters
aSearchDataA reference to a wxFindReplaceData object containing the search and replace criteria.
aTextA reference to a wxString object containing the text to be replaced.
Returns
True if aText was modified, otherwise false.

Definition at line 170 of file eda_item.cpp.

171{
172 wxString text = aText;
173 int flags = aSearchData.GetFlags();
174 wxString searchText = aSearchData.GetFindString();
175 wxString result;
176 bool replaced = false;
177
178 if( flags & wxFR_MATCHCASE )
179 {
180 text = text.Upper();
181 searchText = searchText.Upper();
182 }
183
184 int ii = 0;
185
186 while( ii < (int) text.length() )
187 {
188 int next = text.find( searchText, ii );
189
190 if( next == wxNOT_FOUND )
191 {
192 result += aText.Mid( ii, wxString::npos );
193 break;
194 }
195
196 if( next > ii )
197 result += aText.Mid( ii, next - ii );
198
199 ii = next;
200 next += searchText.length();
201
202 bool startOK;
203 bool endOK;
204
205 if( flags & wxFR_WHOLEWORD )
206 {
207 startOK = ( ii == 0 || !wxIsalnum( text.GetChar( ii - 1 ) ) );
208 endOK = ( next == (int) text.length() || !wxIsalnum( text.GetChar( next ) ) );
209 }
210 else
211 {
212 startOK = true;
213 endOK = true;
214 }
215
216 if( startOK && endOK )
217 {
218 result += aSearchData.GetReplaceString();
219 replaced = true;
220 ii = next;
221 }
222 else
223 {
224 result += aText.GetChar( ii );
225 ii++;
226 }
227 }
228
229 aText = result;
230 return replaced;
231}

References next(), and text.

Referenced by EDA_TEXT::Replace(), SCH_FIELD::Replace(), SCH_EDITOR_CONTROL::ReplaceAll(), and SCH_EDITOR_CONTROL::ReplaceAndFindNext().

◆ ResetDefaultValues()

void EXCELLON_IMAGE::ResetDefaultValues ( )
overridevirtual

Set all parameters to a default value, before reading a file.

Reimplemented from GERBER_FILE_IMAGE.

Definition at line 304 of file excellon_read_drill_file.cpp.

305{
307 SelectUnits( false, nullptr ); // Default unit = inch
308 m_hasFormat = false; // will be true if a Altium file containing
309 // the nn:mm file format is read
310
311 // Files using non decimal can use No Trailing zeros or No leading Zeros
312 // Unfortunately, the identifier (INCH,TZ or INCH,LZ for instance) is not
313 // always set in drill files.
314 // The option leading zeros looks like more frequent, so use this default
315 m_NoTrailingZeros = true;
316}

References m_hasFormat, GERBER_FILE_IMAGE::m_NoTrailingZeros, GERBER_FILE_IMAGE::ResetDefaultValues(), and SelectUnits().

Referenced by LoadFile().

◆ Select_Tool()

bool EXCELLON_IMAGE::Select_Tool ( char *&  text)
private

Definition at line 899 of file excellon_read_drill_file.cpp.

900{
901 // Select the tool from the command line Tn, with n = 1 ... TOOLS_MAX_COUNT - 1
902 // Because some drill file have an embedded TCODE definition (like T1C.008F0S0)
903 // in tool selection command, if the tool is not defined in list,
904 // and the definition is embedded, it will be entered in list
905 char * startline = text; // the tool id starts here.
906 int tool_id = CodeNumber( text );
907
908 // T0 is legal, but is not a selection tool. it is a special command
909 if( tool_id >= 0 )
910 {
911 int dcode_id = tool_id + FIRST_DCODE; // Remember: dcodes are >= FIRST_DCODE
912
913 if( dcode_id > (TOOLS_MAX_COUNT - 1) )
914 dcode_id = TOOLS_MAX_COUNT - 1;
915
916 m_Current_Tool = dcode_id;
917 D_CODE* currDcode = GetDCODE( dcode_id );
918
919 // if the tool does not exist, and the definition is embedded, create this tool
920 if( currDcode == nullptr && tool_id > 0 )
921 {
922 text = startline; // text starts at the beginning of the command
924 currDcode = GetDCODE( dcode_id );
925 }
926
927 // If the Tool is still not existing, create a dummy tool
928 if( !currDcode )
929 currDcode = GetDCODEOrCreate( dcode_id, true );
930
931 if( currDcode )
932 currDcode->m_InUse = true;
933 }
934
935 while( *text )
936 text++;
937
938 return tool_id >= 0;
939}

References GERBER_FILE_IMAGE::CodeNumber(), FIRST_DCODE, GERBER_FILE_IMAGE::GetDCODE(), GERBER_FILE_IMAGE::GetDCODEOrCreate(), GERBER_FILE_IMAGE::m_Current_Tool, D_CODE::m_InUse, readToolInformation(), text, and TOOLS_MAX_COUNT.

Referenced by LoadFile().

◆ SelectUnits()

void EXCELLON_IMAGE::SelectUnits ( bool  aMetric,
EXCELLON_DEFAULTS aDefaults 
)
private

Switch unit selection, and the coordinate format (nn:mm) if not yet set.

Definition at line 1056 of file excellon_read_drill_file.cpp.

1057{
1058 /* Coordinates are measured either in inch or metric (millimeters).
1059 * Inch coordinates are in six digits (00.0000) with increments
1060 * as small as 0.0001 (1/10,000).
1061 * Metric coordinates can be measured in microns (thousandths of a millimeter)
1062 * in one of the following three ways:
1063 * Five digit 10 micron resolution (000.00)
1064 * Six digit 10 micron resolution (0000.00)
1065 * Six digit micron resolution (000.000)
1066 *
1067 * Inches: Default fmt = 2.4 for X and Y axis: 6 digits with 0.0001 resolution
1068 * metric: Default fmt = 3.3 for X and Y axis: 6 digits, 1 micron resolution
1069 *
1070 * However some drill files do not use standard values.
1071 */
1072 if( aMetric )
1073 {
1074 m_GerbMetric = true;
1075
1076 if( !m_hasFormat )
1077 {
1078 if( aDefaults )
1079 {
1080 // number of digits in mantissa
1081 m_FmtScale.x = m_FmtScale.y = aDefaults->m_MmMantissaLen;
1082 // number of digits (mantissa+integer)
1083 m_FmtLen.x = m_FmtLen.y = aDefaults->m_MmIntegerLen
1084 + aDefaults->m_MmMantissaLen;
1085 }
1086 else
1087 {
1090 }
1091 }
1092 }
1093 else
1094 {
1095 m_GerbMetric = false;
1096
1097 if( !m_hasFormat )
1098 {
1099 if( aDefaults )
1100 {
1101 m_FmtScale.x = m_FmtScale.y = aDefaults->m_InchMantissaLen;
1102 m_FmtLen.x = m_FmtLen.y = aDefaults->m_InchIntegerLen
1103 + aDefaults->m_InchMantissaLen;
1104 }
1105 else
1106 {
1109 }
1110 }
1111 }
1112}
#define FMT_MANTISSA_INCH
#define FMT_INTEGER_MM
#define FMT_MANTISSA_MM
#define FMT_INTEGER_INCH

References FMT_INTEGER_INCH, FMT_INTEGER_MM, FMT_MANTISSA_INCH, FMT_MANTISSA_MM, GERBER_FILE_IMAGE::m_FmtLen, GERBER_FILE_IMAGE::m_FmtScale, GERBER_FILE_IMAGE::m_GerbMetric, m_hasFormat, EXCELLON_DEFAULTS::m_InchIntegerLen, EXCELLON_DEFAULTS::m_InchMantissaLen, EXCELLON_DEFAULTS::m_MmIntegerLen, and EXCELLON_DEFAULTS::m_MmMantissaLen.

Referenced by Execute_HEADER_And_M_Command(), LoadFile(), and ResetDefaultValues().

◆ Set() [1/3]

template<typename T >
bool INSPECTABLE::Set ( const wxString &  aProperty,
aValue 
)
inlineinherited

Definition at line 68 of file inspectable.h.

69 {
71 TYPE_ID thisType = TYPE_HASH( *this );
72 PROPERTY_BASE* prop = propMgr.GetProperty( thisType, aProperty );
73 void* object = nullptr;
74
75 if( prop )
76 {
77 object = propMgr.TypeCast( this, thisType, prop->OwnerHash() );
78
79 if( object )
80 prop->set<T>( object, aValue );
81 }
82
83 return object != nullptr;
84 }
void set(void *aObject, T aValue)
Definition: property.h:261

References PROPERTY_MANAGER::GetProperty(), PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::set(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Set() [2/3]

template<typename T >
bool INSPECTABLE::Set ( PROPERTY_BASE aProperty,
aValue 
)
inlineinherited

Definition at line 55 of file inspectable.h.

56 {
58 TYPE_ID thisType = TYPE_HASH( *this );
59 void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
60
61 if( object )
62 aProperty->set<T>( object, aValue );
63
64 return object != nullptr;
65 }

References PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::set(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ Set() [3/3]

bool INSPECTABLE::Set ( PROPERTY_BASE aProperty,
wxAny &  aValue 
)
inlineinherited

Definition at line 42 of file inspectable.h.

43 {
45 TYPE_ID thisType = TYPE_HASH( *this );
46 void* object = propMgr.TypeCast( this, thisType, aProperty->OwnerHash() );
47
48 if( object )
49 aProperty->setter( object, aValue );
50
51 return object != nullptr;
52 }
virtual void setter(void *aObject, wxAny &aValue)=0

References PROPERTY_MANAGER::Instance(), PROPERTY_BASE::OwnerHash(), PROPERTY_BASE::setter(), TYPE_HASH, and PROPERTY_MANAGER::TypeCast().

◆ SetBrightened()

◆ SetFlags()

void EDA_ITEM::SetFlags ( EDA_ITEM_FLAGS  aMask)
inlineinherited

Definition at line 152 of file eda_item.h.

152{ m_flags |= aMask; }

References EDA_ITEM::m_flags.

Referenced by SCH_EAGLE_PLUGIN::addBusEntries(), PCB_BASE_FRAME::AddFootprintToBoard(), FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), SCH_MOVE_TOOL::AlignElements(), PCB_CONTROL::AppendBoard(), FOOTPRINT::BuildCourtyardCaches(), SCH_EDIT_TOOL::ChangeTextType(), GRAPHICS_CLEANER::cleanupShapes(), ConvertOutlineToPolygon(), SCH_EDIT_FRAME::ConvertPart(), SCH_DRAWING_TOOLS::createNewText(), SCH_DRAWING_TOOLS::createSheetPin(), SCH_EDIT_TOOL::DoDelete(), SCH_LINE_WIRE_BUS_TOOL::doDrawSegments(), EDIT_TOOL::doMoveSelection(), SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus(), EDIT_TOOL::DragArcTrack(), KIGFX::SCH_PAINTER::draw(), DRAWING_TOOL::DrawArc(), DRAWING_TOOL::DrawCircle(), DRAWING_TOOL::DrawLine(), DRAWING_TOOL::DrawRectangle(), SCH_DRAWING_TOOLS::DrawShape(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), SCH_DRAWING_TOOLS::DrawSheet(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PCB_SELECTION_TOOL::EnterGroup(), PCB_SELECTION_TOOL::FilterCollectorForHierarchy(), SCH_MOVE_TOOL::getConnectedDragItems(), SYMBOL_EDIT_FRAME::GetSymbolFromRedoList(), SYMBOL_EDIT_FRAME::GetSymbolFromUndoList(), EE_COLLECTOR::Inspect(), EE_SELECTION_TOOL::Main(), SCH_MOVE_TOOL::Main(), CONVERT_TOOL::makePolysFromChainedSegs(), SCH_SCREEN::MarkConnections(), TRACKS_CLEANER::mergeCollinearSegments(), SCH_MOVE_TOOL::moveItem(), SYMBOL_EDITOR_MOVE_TOOL::moveItem(), KIGFX::ORIGIN_VIEWITEM::ORIGIN_VIEWITEM(), SCH_ALTIUM_PLUGIN::ParseBezier(), SCH_ALTIUM_PLUGIN::ParseBus(), SCH_ALTIUM_PLUGIN::ParseBusEntry(), SCH_ALTIUM_PLUGIN::ParseJunction(), SCH_ALTIUM_PLUGIN::ParseLabel(), SCH_ALTIUM_PLUGIN::ParseLine(), SCH_ALTIUM_PLUGIN::ParseNetLabel(), SCH_ALTIUM_PLUGIN::ParseNoERC(), SCH_ALTIUM_PLUGIN::ParsePolygon(), SCH_ALTIUM_PLUGIN::ParsePolyline(), SCH_ALTIUM_PLUGIN::ParsePort(), SCH_ALTIUM_PLUGIN::ParseRectangle(), SCH_ALTIUM_PLUGIN::ParseRoundRectangle(), SCH_ALTIUM_PLUGIN::ParseSheetSymbol(), SCH_ALTIUM_PLUGIN::ParseWire(), SCH_EDITOR_CONTROL::Paste(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), BOARD_EDITOR_CONTROL::PlaceFootprint(), PL_DRAWING_TOOLS::PlaceItem(), DRAWING_TOOL::PlaceText(), SCH_SYMBOL::Plot(), BACK_ANNOTATE::processNetNameChange(), SCH_EDIT_FRAME::PutDataInPreviousState(), PCB_SELECTION_TOOL::RebuildSelection(), BOARD::Remove(), FOOTPRINT::Remove(), SCH_EDIT_TOOL::RepeatDrawItem(), SCH_EDIT_TOOL::Rotate(), SYMBOL_EDIT_FRAME::SaveCopyInUndoList(), EE_SELECTION_TOOL::SelectAll(), SCH_EDIT_FRAME::SelectUnit(), EDA_ITEM::SetBrightened(), EDA_ITEM::SetIsShownAsBitmap(), EDA_ITEM::SetModified(), EDA_ITEM::SetSelected(), EDA_ITEM::SetWireImage(), SCH_DRAWING_TOOLS::SingleClickPlace(), SCH_LINE_WIRE_BUS_TOOL::startSegments(), DS_DATA_ITEM::SyncDrawItems(), DS_DATA_ITEM_BITMAP::SyncDrawItems(), DIALOG_SYMBOL_PROPERTIES::TransferDataFromWindow(), DIALOG_DIMENSION_PROPERTIES::TransferDataFromWindow(), DIALOG_PAD_PROPERTIES::TransferDataFromWindow(), DIALOG_TARGET_PROPERTIES::TransferDataFromWindow(), DIALOG_TEXTBOX_PROPERTIES::TransferDataFromWindow(), SCH_DRAWING_TOOLS::TwoClickPlace(), and SYMBOL_EDITOR_DRAWING_TOOLS::TwoClickPlace().

◆ SetForceVisible()

void EDA_ITEM::SetForceVisible ( bool  aEnable)
inlineinherited

Set and clear force visible flag used to force the item to be drawn even if it's draw attribute is set to not visible.

Parameters
aEnableTrue forces the item to be drawn. False uses the item's visibility setting to determine if the item is to be drawn.

Definition at line 214 of file eda_item.h.

214{ m_forceVisible = aEnable; }

References EDA_ITEM::m_forceVisible.

Referenced by SCH_EDITOR_CONTROL::UpdateFind().

◆ SetIsShownAsBitmap()

void EDA_ITEM::SetIsShownAsBitmap ( bool  aBitmap)
inlineinherited

Definition at line 177 of file eda_item.h.

178 {
179 if( aBitmap )
181 else
183 }

References EDA_ITEM::ClearFlags(), IS_SHOWN_AS_BITMAP, and EDA_ITEM::SetFlags().

◆ SetModified()

◆ SetParent()

virtual void EDA_ITEM::SetParent ( EDA_ITEM aParent)
inlinevirtualinherited

Reimplemented in LIB_SYMBOL, and PCB_DIMENSION_BASE.

Definition at line 115 of file eda_item.h.

115{ m_parent = aParent; }

References EDA_ITEM::m_parent.

Referenced by BOARD::Add(), FOOTPRINT::Add(), FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), BOARD_NETLIST_UPDATER::addNewFootprint(), SCH_SHEET::AddPin(), PAD::AddPrimitive(), PAD::AddPrimitiveArc(), PAD::AddPrimitiveCircle(), PAD::AddPrimitiveCurve(), PAD::AddPrimitivePoly(), PAD::AddPrimitiveRect(), PAD::AddPrimitiveSegment(), SYMBOL_EDITOR_CONTROL::AddSymbolToSchematic(), SCH_SCREEN::Append(), LIB_FIELD::Copy(), SYMBOL_EDIT_FRAME::CreateNewSymbol(), SCH_DRAWING_TOOLS::createNewText(), DIALOG_PAD_PROPERTIES::DIALOG_PAD_PROPERTIES(), DIALOG_PIN_PROPERTIES::DIALOG_PIN_PROPERTIES(), SCH_LINE_WIRE_BUS_TOOL::doUnfoldBus(), SYMBOL_EDITOR_DRAWING_TOOLS::DrawShape(), SYMBOL_EDITOR_EDIT_TOOL::Duplicate(), PCB_EDIT_FRAME::ExchangeFootprint(), LIB_SYMBOL::Flatten(), FOOTPRINT::FOOTPRINT(), PCB_PLUGIN::FootprintSave(), DISPLAY_FOOTPRINTS_FRAME::GetFootprint(), CADSTAR_SCH_ARCHIVE_LOADER::getKiCadSchText(), LIB_SYMBOL::LIB_SYMBOL(), SCH_LEGACY_PLUGIN_CACHE::loadAliases(), CADSTAR_SCH_ARCHIVE_LOADER::loadChildSheets(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), SCH_SEXPR_PLUGIN::loadHierarchy(), SCH_LEGACY_PLUGIN::loadHierarchy(), DIALOG_LIB_EDIT_PIN_TABLE::OnAddRow(), LIB_SYMBOL::operator=(), FOOTPRINT::operator=(), PCB_PARSER::parseFOOTPRINT_unchecked(), SCH_SEXPR_PARSER::ParseSchematic(), SCH_SEXPR_PARSER::ParseSymbol(), SCH_EDITOR_CONTROL::Paste(), SYMBOL_EDITOR_EDIT_TOOL::Paste(), PCB_CONTROL::Paste(), pasteFootprintItemsToFootprintEditor(), BOARD_EDITOR_CONTROL::PlaceFootprint(), BACK_ANNOTATE::processNetNameChange(), BOARD_COMMIT::Push(), SCH_LIB_PLUGIN_CACHE::removeSymbol(), PCB_BASE_EDIT_FRAME::saveCopyInUndoList(), SaveCopyOfZones(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), SCH_SHEET_PIN::SCH_SHEET_PIN(), LIB_SYMBOL::SetFields(), PCB_DIMENSION_BASE::SetParent(), PIN_TABLE_DATA_MODEL::SetValue(), SCH_DRAWING_TOOLS::SingleClickPlace(), SCH_LINE_WIRE_BUS_TOOL::startSegments(), SCH_LABEL_BASE::SwapData(), SCH_SHEET::SwapData(), SCH_SYMBOL::SwapData(), SwapItemData(), and SCH_DRAWING_TOOLS::TwoClickPlace().

◆ SetPosition()

◆ SetSelected()

◆ SetState()

void EDA_ITEM::SetState ( EDA_ITEM_FLAGS  type,
bool  state 
)
inlineinherited

Definition at line 141 of file eda_item.h.

142 {
143 if( state )
144 m_status |= type; // state = ON or OFF
145 else
146 m_status &= ~type;
147 }

References EDA_ITEM::m_status.

Referenced by LEGACY_PLUGIN::loadTrackList(), and TRACKS_CLEANER::mergeCollinearSegments().

◆ SetStatus()

void EDA_ITEM::SetStatus ( EDA_ITEM_FLAGS  aStatus)
inlineinherited

Definition at line 150 of file eda_item.h.

150{ m_status = aStatus; }

References EDA_ITEM::m_status.

Referenced by BOARD_NETLIST_UPDATER::UpdateNetlist().

◆ SetWireImage()

void EDA_ITEM::SetWireImage ( )
inlineinherited

Definition at line 127 of file eda_item.h.

References IS_WIRE_IMAGE, and EDA_ITEM::SetFlags().

◆ Sort()

static bool EDA_ITEM::Sort ( const EDA_ITEM aLeft,
const EDA_ITEM aRight 
)
inlinestaticinherited

Helper function to be used by the C++ STL sort algorithm for sorting a STL container of EDA_ITEM pointers.

Parameters
aLeftThe left hand item to compare.
aRightThe right hand item to compare.
Returns
True if aLeft is less than aRight.

Definition at line 440 of file eda_item.h.

440{ return *aLeft < *aRight; }

◆ StepAndRepeatItem()

void GERBER_FILE_IMAGE::StepAndRepeatItem ( const GERBER_DRAW_ITEM aItem)
inherited

Gerber format has a command Step an Repeat.

Function StepAndRepeatItem Gerber format has a command Step an Repeat This function must be called when reading a gerber file and after creating a new gerber item that must be repeated (i.e when m_XRepeatCount or m_YRepeatCount are > 1)

This function must be called when reading a gerber file and after creating a new gerber item that must be repeated (i.e when m_XRepeatCount or m_YRepeatCount are > 1)

Parameters
aItem= the item to repeat
aItem= the item to repeat

Definition at line 295 of file gerber_file_image.cpp.

296{
297 if( GetLayerParams().m_XRepeatCount < 2 && GetLayerParams().m_YRepeatCount < 2 )
298 return; // Nothing to repeat
299
300 // Duplicate item:
301 for( int ii = 0; ii < GetLayerParams().m_XRepeatCount; ii++ )
302 {
303 for( int jj = 0; jj < GetLayerParams().m_YRepeatCount; jj++ )
304 {
305 // the first gerber item already exists (this is the template)
306 // create duplicate only if ii or jj > 0
307 if( jj == 0 && ii == 0 )
308 continue;
309
310 GERBER_DRAW_ITEM* dupItem = new GERBER_DRAW_ITEM( aItem );
311 VECTOR2I move_vector;
312 move_vector.x = scaletoIU( ii * GetLayerParams().m_StepForRepeat.x,
313 GetLayerParams().m_StepForRepeatMetric );
314 move_vector.y = scaletoIU( jj * GetLayerParams().m_StepForRepeat.y,
315 GetLayerParams().m_StepForRepeatMetric );
316 dupItem->MoveXY( move_vector );
317 AddItemToList( dupItem );
318 }
319 }
320}
void MoveXY(const VECTOR2I &aMoveVector)
Move this object.
int scaletoIU(double aCoord, bool isMetric)
Function scaletoIU converts a distance given in floating point to our internal units.

References GERBER_FILE_IMAGE::AddItemToList(), GERBER_FILE_IMAGE::GetLayerParams(), GERBER_LAYER::m_XRepeatCount, GERBER_LAYER::m_YRepeatCount, GERBER_DRAW_ITEM::MoveXY(), scaletoIU(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by GERBER_FILE_IMAGE::Execute_DCODE_Command(), Execute_Drill_Command(), GERBER_FILE_IMAGE::Execute_G_Command(), and FinishRouteCommand().

◆ TestFileIsExcellon()

bool EXCELLON_IMAGE::TestFileIsExcellon ( const wxString &  aFullFileName)
static

Performs a heuristics-based check of whether the file is an Excellon drill file.

Does not invoke the full parser.

Parameters
aFullFileNameaFullFileName is the full filename of the Excellon file.
Returns
True if drill file, false otherwise

Definition at line 344 of file excellon_read_drill_file.cpp.

345{
346 char* letter;
347 bool foundM48 = false;
348 bool foundM30 = false;
349 bool foundPercent = false;
350 bool foundT = false;
351 bool foundX = false;
352 bool foundY = false;
353
354 FILE* file = wxFopen( aFullFileName, "rb" );
355
356 if( file == nullptr )
357 return false;
358
359 FILE_LINE_READER excellonReader( file, aFullFileName );
360
361 try
362 {
363 while( true )
364 {
365 if( excellonReader.ReadLine() == nullptr )
366 break;
367
368 // Remove all whitespace from the beginning and end
369 char* line = StrPurge( excellonReader.Line() );
370
371 // Skip empty lines
372 if( *line == 0 )
373 continue;
374
375 // Check that file is not binary (non-printing chars)
376 for( size_t i = 0; i < strlen( line ); i++ )
377 {
378 if( !isascii( line[i] ) )
379 return false;
380 }
381
382 // We don't want to look for any commands after a comment so
383 // just end the line early if we find a comment
384 char* buf = strstr( line, ";" );
385 if( buf != nullptr )
386 *buf = 0;
387
388 // Check for M48 = start of drill header
389 if( strstr( line, "M48" ) )
390 foundM48 = true;
391
392 // Check for M30 = end of drill program
393 if( strstr( line, "M30" ) )
394 if( foundPercent )
395 foundM30 = true; // Found M30 after % = good
396
397 // Check for % on its own line at end of header
398 if( ( letter = strstr( line, "%" ) ) != nullptr )
399 if( ( letter[1] == '\r' ) || ( letter[1] == '\n' ) )
400 foundPercent = true;
401
402 // Check for T<number>
403 if( ( letter = strstr( line, "T" ) ) != nullptr )
404 {
405 if( !foundT && ( foundX || foundY ) )
406 foundT = false; /* Found first T after X or Y */
407 else
408 {
409 // verify next char is digit
410 if( isdigit( letter[1] ) )
411 foundT = true;
412 }
413 }
414
415 // look for X<number> or Y<number>
416 if( ( letter = strstr( line, "X" ) ) != nullptr )
417 if( isdigit( letter[1] ) )
418 foundX = true;
419
420 if( ( letter = strstr( line, "Y" ) ) != nullptr )
421 if( isdigit( letter[1] ) )
422 foundY = true;
423 }
424 }
425 catch( IO_ERROR& e )
426 {
427 return false;
428 }
429
430
431 /* Now form logical expression determining if this is a drill file */
432 if( ( ( foundX || foundY ) && foundT ) && ( foundM48 || ( foundPercent && foundM30 ) ) )
433 return true;
434 else if( foundM48 && foundT && foundPercent && foundM30 )
435 /* Pathological case of drill file with valid header
436 and EOF but no drill XY locations. */
437 return true;
438
439 return false;
440}
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76

References LINE_READER::Line(), FILE_LINE_READER::ReadLine(), and StrPurge().

Referenced by GERBVIEW_FRAME::LoadListOfGerberAndDrillFiles(), and GERBVIEW_FRAME::unarchiveFiles().

◆ TestFileIsRS274()

bool GERBER_FILE_IMAGE::TestFileIsRS274 ( const wxString &  aFullFileName)
staticinherited

Performs a heuristics-based check of whether the file is an RS274 gerber file.

Does not invoke the full parser.

Parameters
aFullFileNameaFullFileName is the full filename of the gerber file.
Returns
True if RS274 file, false otherwise

Definition at line 138 of file readgerb.cpp.

139{
140 char* letter;
141 bool foundADD = false;
142 bool foundD0 = false;
143 bool foundD2 = false;
144 bool foundM0 = false;
145 bool foundM2 = false;
146 bool foundStar = false;
147 bool foundX = false;
148 bool foundY = false;
149
150
151 FILE* file = wxFopen( aFullFileName, "rb" );
152
153 if( file == nullptr )
154 return false;
155
156 FILE_LINE_READER gerberReader( aFullFileName );
157
158 try
159 {
160 while( true )
161 {
162 if( gerberReader.ReadLine() == nullptr )
163 break;
164
165 // Remove all whitespace from the beginning and end
166 char* line = StrPurge( gerberReader.Line() );
167
168 // Skip empty lines
169 if( *line == 0 )
170 continue;
171
172 // Check that file is not binary (non-printing chars)
173 for( size_t i = 0; i < strlen( line ); i++ )
174 {
175 if( !isascii( line[i] ) )
176 return false;
177 }
178
179 if( strstr( line, "%ADD" ) )
180 foundADD = true;
181
182 if( strstr( line, "D00" ) || strstr( line, "D0" ) )
183 foundD0 = true;
184
185 if( strstr( line, "D02" ) || strstr( line, "D2" ) )
186 foundD2 = true;
187
188 if( strstr( line, "M00" ) || strstr( line, "M0" ) )
189 foundM0 = true;
190
191 if( strstr( line, "M02" ) || strstr( line, "M2" ) )
192 foundM2 = true;
193
194 if( strstr( line, "*" ) )
195 foundStar = true;
196
197 /* look for X<number> or Y<number> */
198 if( ( letter = strstr( line, "X" ) ) != nullptr )
199 {
200 if( isdigit( letter[1] ) )
201 foundX = true;
202 }
203
204 if( ( letter = strstr( line, "Y" ) ) != nullptr )
205 {
206 if( isdigit( letter[1] ) )
207 foundY = true;
208 }
209 }
210 }
211 catch( IO_ERROR& e )
212 {
213 return false;
214 }
215
216 // RS-274X
217 if( ( foundD0 || foundD2 || foundM0 || foundM2 ) && foundADD && foundStar
218 && ( foundX || foundY ) )
219 return true;
220 // RS-274D. Could be folded into the expression above, but someday
221 // we might want to test for them separately.
222 else if( ( foundD0 || foundD2 || foundM0 || foundM2 ) && !foundADD && foundStar
223 && ( foundX || foundY ) )
224 return true;
225
226
227 return false;
228}

References LINE_READER::Line(), FILE_LINE_READER::ReadLine(), and StrPurge().

Referenced by GERBVIEW_FRAME::LoadListOfGerberAndDrillFiles(), and GERBVIEW_FRAME::unarchiveFiles().

◆ Type()

KICAD_T EDA_ITEM::Type ( ) const
inlineinherited

Returns the type of object.

This attribute should never be changed after a ctor sets it, so there is no public "setter" method.

Returns
the type of object.

Definition at line 112 of file eda_item.h.

112{ return m_structType; }

References EDA_ITEM::m_structType.

Referenced by CN_CONNECTIVITY_ALGO::Add(), BOARD::Add(), FOOTPRINT::Add(), CN_CLUSTER::Add(), KIGFX::PCB_VIEW::Add(), PCB_POINT_EDITOR::addCorner(), CONNECTION_SUBGRAPH::AddItem(), DRC_TEST_PROVIDER_SOLDER_MASK::addItemToRTrees(), SCH_EDIT_FRAME::AddItemToScreenAndUndoList(), SCH_LINE_WIRE_BUS_TOOL::AddJunctionsIfNeeded(), ZONE_FILLER::addKnockout(), SCH_SHEET::AddPin(), ALIGN_DISTRIBUTE_TOOL::AlignBottom(), ALIGN_DISTRIBUTE_TOOL::AlignCenterX(), ALIGN_DISTRIBUTE_TOOL::AlignCenterY(), SCH_MOVE_TOOL::AlignElements(), ALIGN_DISTRIBUTE_TOOL::AlignTop(), CN_ITEM::AnchorCount(), SCH_SCREEN::Append(), CADSTAR_SCH_ARCHIVE_LOADER::applyTextSettings(), PNS::TOPOLOGY::AssembleTuningPath(), SCH_LABEL_BASE::AutoplaceFields(), EE_SELECTION_TOOL::autostartEvent(), DIALOG_NET_INSPECTOR::buildNewItem(), SCH_SCREENS::buildScreenList(), calcIsInsideArea(), BOARD_INSPECTION_TOOL::calculateSelectionRatsnest(), PCB_POINT_EDITOR::canAddCorner(), SCH_BUS_WIRE_ENTRY::CanConnect(), SCH_BUS_BUS_ENTRY::CanConnect(), SCH_JUNCTION::CanConnect(), SCH_LABEL_BASE::CanConnect(), SCH_LINE::CanConnect(), SCH_NO_CONNECT::CanConnect(), SCH_SHEET::CanConnect(), SCH_SYMBOL::CanConnect(), SCH_EDIT_TOOL::ChangeTextType(), KI_TEST::CheckFootprint(), KI_TEST::CheckFpPad(), KI_TEST::CheckFpShape(), KI_TEST::CheckFpText(), KI_TEST::CheckFpZone(), CN_VISITOR::checkZoneItemConnection(), LIB_TEXTBOX::ClassOf(), SCH_BITMAP::ClassOf(), SCH_BUS_WIRE_ENTRY::ClassOf(), SCH_BUS_BUS_ENTRY::ClassOf(), SCH_FIELD::ClassOf(), SCH_JUNCTION::ClassOf(), SCH_LABEL::ClassOf(), SCH_DIRECTIVE_LABEL::ClassOf(), SCH_GLOBALLABEL::ClassOf(), SCH_HIERLABEL::ClassOf(), SCH_LINE::ClassOf(), SCH_MARKER::ClassOf(), SCH_NO_CONNECT::ClassOf(), SCH_PIN::ClassOf(), SCH_SCREEN::ClassOf(), SCH_SHEET::ClassOf(), SCH_SHEET_PIN::ClassOf(), SCH_SYMBOL::ClassOf(), SCH_TEXT::ClassOf(), SCH_TEXTBOX::ClassOf(), PCB_GROUP::ClassOf(), BOARD::ClassOf(), BOARD_CONNECTED_ITEM::ClassOf(), FOOTPRINT::ClassOf(), FP_SHAPE::ClassOf(), FP_TEXT::ClassOf(), FP_TEXTBOX::ClassOf(), NETINFO_ITEM::ClassOf(), PAD::ClassOf(), PCB_BITMAP::ClassOf(), PCB_DIM_ALIGNED::ClassOf(), PCB_DIM_ORTHOGONAL::ClassOf(), PCB_DIM_RADIAL::ClassOf(), PCB_DIM_LEADER::ClassOf(), PCB_DIM_CENTER::ClassOf(), PCB_MARKER::ClassOf(), PCB_SHAPE::ClassOf(), PCB_TARGET::ClassOf(), PCB_TEXT::ClassOf(), PCB_TEXTBOX::ClassOf(), PCB_TRACK::ClassOf(), PCB_ARC::ClassOf(), PCB_VIA::ClassOf(), ZONE::ClassOf(), CONNECTION_GRAPH::collectAllDriverValues(), LIB_ITEM::compare(), LIB_FIELD::compare(), LIB_PIN::compare(), LIB_TEXT::compare(), LIB_TEXTBOX::compare(), LIB_SYMBOL::Compare(), PCB_GRID_HELPER::computeAnchors(), EE_GRID_HELPER::computeAnchors(), TEARDROP_MANAGER::ComputePointsOnPadVia(), SCH_BUS_WIRE_ENTRY::ConnectionPropagatesTo(), SCH_LINE::ConnectionPropagatesTo(), EE_RTREE::contains(), BOARD::ConvertKIIDsToCrossReferences(), SCHEMATIC::ConvertKIIDsToRefs(), PAD_TOOL::copyPadSettings(), FOOTPRINT::CoverageRatio(), BOARD_ADAPTER::createLayers(), PCB_BASE_FRAME::CreateNewFootprint(), SCH_DRAWING_TOOLS::createNewText(), ZONE_CREATE_HELPER::createNewZone(), BOARD_ADAPTER::createTrack(), DRC_TOOL::CrossProbe(), SCH_SCREEN::DeleteItem(), DIALOG_DIMENSION_PROPERTIES::DIALOG_DIMENSION_PROPERTIES(), DIALOG_LABEL_PROPERTIES::DIALOG_LABEL_PROPERTIES(), DIALOG_SCH_FIELD_PROPERTIES::DIALOG_SCH_FIELD_PROPERTIES(), DIALOG_TEXT_PROPERTIES::DIALOG_TEXT_PROPERTIES(), DIALOG_TEXTBOX_PROPERTIES::DIALOG_TEXTBOX_PROPERTIES(), BOARD_COMMIT::dirtyIntersectingZones(), ALIGN_DISTRIBUTE_TOOL::doAlignLeft(), ALIGN_DISTRIBUTE_TOOL::doAlignRight(), SCH_EDITOR_CONTROL::doCopy(), SCH_EDIT_TOOL::DoDelete(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeCentersVertically(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsHorizontally(), ALIGN_DISTRIBUTE_TOOL::doDistributeGapsVertically(), APPEARANCE_CONTROLS::doesBoardItemNeedRebuild(), DIALOG_GLOBAL_DELETION::DoGlobalDeletions(), EDIT_TOOL::DragArcTrack(), KIGFX::PCB_PAINTER::Draw(), KIGFX: