summaryrefslogtreecommitdiff
path: root/pcbnew/class_module.h
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/class_module.h')
-rw-r--r--pcbnew/class_module.h697
1 files changed, 697 insertions, 0 deletions
diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h
new file mode 100644
index 0000000..fedc62e
--- /dev/null
+++ b/pcbnew/class_module.h
@@ -0,0 +1,697 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file class_module.h
+ * @brief Module description (excepted pads)
+ */
+
+
+#ifndef MODULE_H_
+#define MODULE_H_
+
+
+#include <dlist.h>
+#include <layers_id_colors_and_visibility.h> // ALL_LAYERS definition.
+#include <class_board_item.h>
+#include <fpid.h>
+
+#include <class_text_mod.h>
+#include <PolyLine.h>
+#include "zones.h"
+
+#include <boost/function.hpp>
+
+class LINE_READER;
+class EDA_3D_CANVAS;
+class S3D_MASTER;
+class EDA_DRAW_PANEL;
+class D_PAD;
+class BOARD;
+class MSG_PANEL_ITEM;
+
+
+enum INCLUDE_NPTH_T
+{
+ DO_NOT_INCLUDE_NPTH = false,
+ INCLUDE_NPTH = true
+};
+
+/**
+ * Enum MODULE_ATTR_T
+ * is the set of attributes allowed within a MODULE, using MODULE::SetAttributes()
+ * and MODULE::GetAttributes(). These are to be ORed together when calling
+ * MODULE::SetAttributes()
+ */
+enum MODULE_ATTR_T
+{
+ MOD_DEFAULT = 0, ///< default
+ MOD_CMS = 1, ///< Set for modules listed in the automatic insertion list
+ ///< (usually SMD footprints)
+ MOD_VIRTUAL = 2 ///< Virtual component: when created by copper shapes on
+ ///< board (Like edge card connectors, mounting hole...)
+};
+
+
+class MODULE : public BOARD_ITEM
+{
+public:
+ MODULE( BOARD* parent );
+
+ MODULE( const MODULE& aModule );
+
+ ~MODULE();
+
+ static inline bool ClassOf( const EDA_ITEM* aItem )
+ {
+ return PCB_MODULE_T == aItem->Type();
+ }
+
+ MODULE* Next() const { return static_cast<MODULE*>( Pnext ); }
+ MODULE* Back() const { return static_cast<MODULE*>( Pback ); }
+
+ void Copy( MODULE* Module ); // Copy structure
+
+ /**
+ * Function Add
+ * adds the given item to this MODULE and takes ownership of its memory.
+ * @param aBoardItem The item to add to this board.
+ * @param doAppend If true, then append, else insert.
+ */
+ void Add( BOARD_ITEM* aBoardItem, bool doAppend = true );
+
+ /**
+ * Function Delete
+ * removes the given single item from this MODULE and deletes its memory.
+ * @param aBoardItem The item to remove from this module and delete
+ */
+ void Delete( BOARD_ITEM* aBoardItem )
+ {
+ // developers should run DEBUG versions and fix such calls with NULL
+ wxASSERT( aBoardItem );
+
+ if( aBoardItem )
+ delete Remove( aBoardItem );
+ }
+
+ /**
+ * Function Remove
+ * removes \a aBoardItem from this MODULE and returns it to caller without deleting it.
+ * @param aBoardItem The item to remove from this module.
+ * @return BOARD_ITEM* \a aBoardItem which was passed in.
+ */
+ BOARD_ITEM* Remove( BOARD_ITEM* aBoardItem );
+
+ /**
+ * Function ClearAllNets
+ * Clear (i.e. force the ORPHANED dummy net info) the net info which
+ * depends on a given board for all pads of the footprint.
+ * This is needed when a footprint is copied between the fp editor and
+ * the board editor for instance, because net info become fully broken
+ */
+ void ClearAllNets();
+
+ /**
+ * Function CalculateBoundingBox
+ * calculates the bounding box in board coordinates.
+ */
+ void CalculateBoundingBox();
+
+ /**
+ * Function GetFootprintRect()
+ * Returns the area of the module footprint excluding any text.
+ * @return EDA_RECT - The rectangle containing the footprint.
+ */
+ EDA_RECT GetFootprintRect() const;
+
+ // Virtual function
+ const EDA_RECT GetBoundingBox() const;
+
+ DLIST<D_PAD>& Pads() { return m_Pads; }
+ const DLIST<D_PAD>& Pads() const { return m_Pads; }
+
+ DLIST<BOARD_ITEM>& GraphicalItems() { return m_Drawings; }
+ const DLIST<BOARD_ITEM>& GraphicalItems() const { return m_Drawings; }
+
+ DLIST<S3D_MASTER>& Models() { return m_3D_Drawings; }
+ const DLIST<S3D_MASTER>& Models() const { return m_3D_Drawings; }
+
+ void SetPosition( const wxPoint& aPos ); // was overload
+ const wxPoint& GetPosition() const { return m_Pos; } // was overload
+
+ void SetOrientation( double newangle );
+ double GetOrientation() const { return m_Orient; }
+
+ const FPID& GetFPID() const { return m_fpid; }
+ void SetFPID( const FPID& aFPID ) { m_fpid = aFPID; }
+
+ const wxString& GetDescription() const { return m_Doc; }
+ void SetDescription( const wxString& aDoc ) { m_Doc = aDoc; }
+
+ const wxString& GetKeywords() const { return m_KeyWord; }
+ void SetKeywords( const wxString& aKeywords ) { m_KeyWord = aKeywords; }
+
+ const wxString& GetPath() const { return m_Path; }
+ void SetPath( const wxString& aPath ) { m_Path = aPath; }
+
+ int GetLocalSolderMaskMargin() const { return m_LocalSolderMaskMargin; }
+ void SetLocalSolderMaskMargin( int aMargin ) { m_LocalSolderMaskMargin = aMargin; }
+
+ int GetLocalClearance() const { return m_LocalClearance; }
+ void SetLocalClearance( int aClearance ) { m_LocalClearance = aClearance; }
+
+ int GetLocalSolderPasteMargin() const { return m_LocalSolderPasteMargin; }
+ void SetLocalSolderPasteMargin( int aMargin ) { m_LocalSolderPasteMargin = aMargin; }
+
+ double GetLocalSolderPasteMarginRatio() const { return m_LocalSolderPasteMarginRatio; }
+ void SetLocalSolderPasteMarginRatio( double aRatio ) { m_LocalSolderPasteMarginRatio = aRatio; }
+
+ void SetZoneConnection( ZoneConnection aType ) { m_ZoneConnection = aType; }
+ ZoneConnection GetZoneConnection() const { return m_ZoneConnection; }
+
+ void SetThermalWidth( int aWidth ) { m_ThermalWidth = aWidth; }
+ int GetThermalWidth() const { return m_ThermalWidth; }
+
+ void SetThermalGap( int aGap ) { m_ThermalGap = aGap; }
+ int GetThermalGap() const { return m_ThermalGap; }
+
+ int GetAttributes() const { return m_Attributs; }
+ void SetAttributes( int aAttributes ) { m_Attributs = aAttributes; }
+
+ void SetFlag( int aFlag ) { m_arflag = aFlag; }
+ void IncrementFlag() { m_arflag += 1; }
+ int GetFlag() const { return m_arflag; }
+
+ void Move( const wxPoint& aMoveVector );
+
+ void Rotate( const wxPoint& aRotCentre, double aAngle );
+
+ void Flip( const wxPoint& aCentre );
+
+ /**
+ * Function MoveAnchorPosition
+ * Move the reference point of the footprint
+ * It looks like a move footprint:
+ * the footprints elements (pads, outlines, edges .. ) are moved
+ * However:
+ * - the footprint position is not modified.
+ * - the relative (local) coordinates of these items are modified
+ * (a move footprint does not change these local coordinates,
+ * but changes the footprint position)
+ */
+ void MoveAnchorPosition( const wxPoint& aMoveVector );
+
+ /**
+ * function IsFlipped
+ * @return true if the module is flipped, i.e. on the back side of the board
+ */
+ bool IsFlipped() const {return GetLayer() == B_Cu; }
+
+// m_ModuleStatus bits:
+#define MODULE_is_LOCKED 0x01 ///< module LOCKED: no autoplace allowed
+#define MODULE_is_PLACED 0x02 ///< In autoplace: module automatically placed
+#define MODULE_to_PLACE 0x04 ///< In autoplace: module waiting for autoplace
+#define MODULE_PADS_LOCKED 0x08 ///< In autoplace: module waiting for autoplace
+
+
+ bool IsLocked() const
+ {
+ return (m_ModuleStatus & MODULE_is_LOCKED) != 0;
+ }
+
+ /**
+ * Function SetLocked
+ * sets the MODULE_is_LOCKED bit in the m_ModuleStatus
+ * @param isLocked When true means turn on locked status, else unlock
+ */
+ void SetLocked( bool isLocked )
+ {
+ if( isLocked )
+ m_ModuleStatus |= MODULE_is_LOCKED;
+ else
+ m_ModuleStatus &= ~MODULE_is_LOCKED;
+ }
+
+ bool IsPlaced() const { return (m_ModuleStatus & MODULE_is_PLACED); }
+ void SetIsPlaced( bool isPlaced )
+ {
+ if( isPlaced )
+ m_ModuleStatus |= MODULE_is_PLACED;
+ else
+ m_ModuleStatus &= ~MODULE_is_PLACED;
+ }
+
+ bool NeedsPlaced() const { return (m_ModuleStatus & MODULE_to_PLACE); }
+ void SetNeedsPlaced( bool needsPlaced )
+ {
+ if( needsPlaced )
+ m_ModuleStatus |= MODULE_to_PLACE;
+ else
+ m_ModuleStatus &= ~MODULE_to_PLACE;
+ }
+
+ bool PadsLocked() const { return ( m_ModuleStatus & MODULE_PADS_LOCKED ); }
+
+ void SetPadsLocked( bool aPadsLocked )
+ {
+ if( aPadsLocked )
+ m_ModuleStatus |= MODULE_PADS_LOCKED;
+ else
+ m_ModuleStatus &= ~MODULE_PADS_LOCKED;
+ }
+
+ void SetLastEditTime( time_t aTime ) { m_LastEditTime = aTime; }
+ void SetLastEditTime( ) { m_LastEditTime = time( NULL ); }
+ time_t GetLastEditTime() const { return m_LastEditTime; }
+
+ /* drawing functions */
+
+ /**
+ * Function Draw
+ * draws the footprint to the \a aDC.
+ * @param aPanel = draw panel, Used to know the clip box
+ * @param aDC = Current Device Context
+ * @param aDrawMode = GR_OR, GR_XOR..
+ * @param aOffset = draw offset (usually wxPoint(0,0)
+ */
+ void Draw( EDA_DRAW_PANEL* aPanel,
+ wxDC* aDC,
+ GR_DRAWMODE aDrawMode,
+ const wxPoint& aOffset = ZeroOffset );
+
+ /**
+ * Function DrawOutlinesWhenMoving
+ * draws in XOR mode the footprint when moving it to the \a aDC.
+ * To speed up the drawing, only a simplified shape is drawn
+ * @param aPanel = draw panel, Used to know the clip box
+ * @param aDC = Current Device Context
+ * @param aMoveVector = the offset between the curr position and
+ * the draw position.
+ */
+ void DrawOutlinesWhenMoving( EDA_DRAW_PANEL* aPanel,
+ wxDC* aDC, const wxPoint& aMoveVector );
+
+ /**
+ * function TransformPadsShapesWithClearanceToPolygon
+ * generate pads shapes on layer aLayer as polygons,
+ * and adds these polygons to aCornerBuffer
+ * Useful to generate a polygonal representation of a footprint
+ * in 3D view and plot functions, when a full polygonal approach is needed
+ * @param aLayer = the current layer: pads on this layer are considered
+ * @param aCornerBuffer = the buffer to store polygons
+ * @param aInflateValue = an additionnal size to add to pad shapes
+ * aInflateValue = 0 to have the exact pad size
+ * @param aCircleToSegmentsCount = number of segments to generate a circle
+ * @param aCorrectionFactor = the correction to apply to a circle radius
+ * to approximate a circle by the polygon.
+ * if aCorrectionFactor = 1.0, the polygon is inside the circle
+ * the radius of circle approximated by segments is
+ * initial radius * aCorrectionFactor
+ * @param aSkipNPTHPadsWihNoCopper = if true, do not add a NPTH pad shape,
+ * if the shape has same size and position as the hole. Usually, these
+ * pads are not drawn on copper layers, because there is actually no copper
+ * Due to diff between layers and holes, these pads must be skipped to be sure
+ * there is no copper left on the board (for instance when creating Gerber Files or 3D shapes)
+ * default = false
+ */
+ void TransformPadsShapesWithClearanceToPolygon( LAYER_ID aLayer,
+ SHAPE_POLY_SET& aCornerBuffer,
+ int aInflateValue,
+ int aCircleToSegmentsCount,
+ double aCorrectionFactor,
+ bool aSkipNPTHPadsWihNoCopper = false );
+
+ /**
+ * function TransformGraphicShapesWithClearanceToPolygonSet
+ * generate shapes of graphic items (outlines) on layer aLayer as polygons,
+ * and adds these polygons to aCornerBuffer
+ * Useful to generate a polygonal representation of a footprint
+ * in 3D view and plot functions, when a full polygonal approach is needed
+ * @param aLayer = the current layer: items on this layer are considered
+ * @param aCornerBuffer = the buffer to store polygons
+ * @param aInflateValue = a value to inflate shapes
+ * aInflateValue = 0 to have the exact shape size
+ * @param aCircleToSegmentsCount = number of segments to generate a circle
+ * @param aCorrectionFactor = the correction to apply to a circle radius
+ * to approximate a circle by the polygon.
+ * if aCorrectionFactor = 1.0, the polygon is inside the circle
+ * the radius of circle approximated by segments is
+ * initial radius * aCorrectionFactor
+ * @param aCircleToSegmentsCountForTexts = number of segments to generate
+ * a circle when building the texts polygonal shapes of the stroke font
+ * if 0, use the aCircleToSegmentsCount value
+ */
+ void TransformGraphicShapesWithClearanceToPolygonSet(
+ LAYER_ID aLayer,
+ SHAPE_POLY_SET& aCornerBuffer,
+ int aInflateValue,
+ int aCircleToSegmentsCount,
+ double aCorrectionFactor,
+ int aCircleToSegmentsCountForTexts = 0 );
+
+ /**
+ * Function DrawEdgesOnly
+ * Draws the footprint edges only to the current Device Context
+ * @param panel = The active Draw Panel (used to know the clip box)
+ * @param DC = current Device Context
+ * @param offset = draw offset (usually wxPoint(0,0)
+ * @param draw_mode = GR_OR, GR_XOR, GR_AND
+ */
+ void DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,
+ GR_DRAWMODE draw_mode );
+
+ void DrawAncre( EDA_DRAW_PANEL* panel, wxDC* DC,
+ const wxPoint& offset, int dim_ancre, GR_DRAWMODE draw_mode );
+
+ void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
+
+ bool HitTest( const wxPoint& aPosition ) const;
+
+ /** @copydoc BOARD_ITEM::HitTest(const EDA_RECT& aRect,
+ * bool aContained = true, int aAccuracy ) const
+ */
+ bool HitTest( const EDA_RECT& aRect, bool aContained = true, int aAccuracy = 0 ) const;
+
+ /**
+ * Function GetReference
+ * @return const wxString& - the reference designator text.
+ */
+ const wxString& GetReference() const
+ {
+ return m_Reference->GetText();
+ }
+
+ /**
+ * Function SetReference
+ * @param aReference A reference to a wxString object containing the reference designator
+ * text.
+ */
+ void SetReference( const wxString& aReference )
+ {
+ m_Reference->SetText( aReference );
+ }
+
+ /**
+ * Function GetReference prefix
+ * Gets the alphabetic prefix of the module reference - e.g.
+ * R1 -> R
+ * IC34 -> IC
+ * @return the reference prefix (may be empty)
+ */
+ wxString GetReferencePrefix() const;
+
+ /**
+ * Function GetValue
+ * @return const wxString& - the value text.
+ */
+ const wxString& GetValue() const
+ {
+ return m_Value->GetText();
+ }
+
+ /**
+ * Function SetValue
+ * @param aValue A reference to a wxString object containing the value text.
+ */
+ void SetValue( const wxString& aValue )
+ {
+ m_Value->SetText( aValue );
+ }
+
+ /// read/write accessors:
+ TEXTE_MODULE& Value() { return *m_Value; }
+ TEXTE_MODULE& Reference() { return *m_Reference; }
+
+ /// The const versions to keep the compiler happy.
+ TEXTE_MODULE& Value() const { return *m_Value; }
+ TEXTE_MODULE& Reference() const { return *m_Reference; }
+
+ /*!
+ * Function IncrementItemReference
+ * Implementation of the generic "reference" incrementing interface
+ * Increments the numeric suffix, filling any sequence gaps
+ */
+ bool IncrementItemReference(); //override
+
+ /**
+ * Function IncrementReference
+ * Increments the module's reference, if possible. A reference with
+ * a numerical suffix and an optional alphabetical prefix can be
+ * incremented: "A1" and "1" can be, "B" can't.
+ *
+ * @param aFillSequenceGaps if true, the next reference in a sequence
+ * like A1,A3,A4 will be A2. If false, it will be A5.
+ * @return true if the reference was incremented.
+ */
+ bool IncrementReference( bool aFillSequenceGaps );
+
+ /**
+ * Function FindPadByName
+ * returns a D_PAD* with a matching name. Note that names may not be
+ * unique, depending on how the foot print was created.
+ * @param aPadName the pad name to find
+ * @return D_PAD* - The first matching name is returned, or NULL if not
+ * found.
+ */
+ D_PAD* FindPadByName( const wxString& aPadName ) const;
+
+ /**
+ * Function GetPad
+ * get a pad at \a aPosition on \a aLayerMask in the footprint.
+ *
+ * @param aPosition A wxPoint object containing the position to hit test.
+ * @param aLayerMask A layer or layers to mask the hit test.
+ * @return A pointer to a D_PAD object if found otherwise NULL.
+ */
+ D_PAD* GetPad( const wxPoint& aPosition, LSET aLayerMask = LSET::AllLayersMask() );
+
+ /**
+ * GetPadCount
+ * returns the number of pads.
+ *
+ * @param aIncludeNPTH includes non-plated through holes when true. Does not include
+ * non-plated through holes when false.
+ * @return the number of pads according to \a aIncludeNPTH.
+ */
+ unsigned GetPadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T( INCLUDE_NPTH ) ) const;
+
+ /**
+ * GetUniquePadCount
+ * returns the number of unique pads.
+ * A complex pad can be built with many pads having the same pad name
+ * to create a complex shape or fragmented solder paste areas.
+ *
+ * GetUniquePadCount calculate the count of not blank pad names
+ *
+ * @param aIncludeNPTH includes non-plated through holes when true. Does not include
+ * non-plated through holes when false.
+ * @return the number of unique pads according to \a aIncludeNPTH.
+ */
+ unsigned GetUniquePadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T( INCLUDE_NPTH ) ) const;
+
+ /**
+ * Function GetNextPadName
+ * returns the next available pad name in the module
+ *
+ * @param aFillSequenceGaps true if the numbering should "fill in" gaps in
+ * the sequence, else return the highest value + 1
+ * @return the next available pad name
+ */
+ wxString GetNextPadName( bool aFillSequenceGaps ) const;
+
+ double GetArea() const { return m_Surface; }
+
+ time_t GetLink() const { return m_Link; }
+ void SetLink( time_t aLink ) { m_Link = aLink; }
+
+ int GetPlacementCost180() const { return m_CntRot180; }
+ void SetPlacementCost180( int aCost ) { m_CntRot180 = aCost; }
+
+ int GetPlacementCost90() const { return m_CntRot90; }
+ void SetPlacementCost90( int aCost ) { m_CntRot90 = aCost; }
+
+ /**
+ * Function DuplicateAndAddItem
+ * Duplicate a given item within the module
+ * @return the new item, or NULL if the item could not be duplicated
+ */
+ BOARD_ITEM* DuplicateAndAddItem( const BOARD_ITEM* item,
+ bool aIncrementPadNumbers );
+
+ /**
+ * Function Add3DModel
+ * adds \a a3DModel definition to the end of the 3D model list.
+ *
+ * @param a3DModel A pointer to a #S3D_MASTER to add to the list.
+ */
+ void Add3DModel( S3D_MASTER* a3DModel );
+
+ SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
+ const KICAD_T scanTypes[] );
+
+ wxString GetClass() const
+ {
+ return wxT( "MODULE" );
+ }
+
+ wxString GetSelectMenuText() const;
+
+ BITMAP_DEF GetMenuImage() const { return module_xpm; }
+
+ EDA_ITEM* Clone() const;
+
+ /**
+ * Function RunOnChildren
+ *
+ * Invokes a function on all BOARD_ITEMs that belong to the module (pads, drawings, texts).
+ * @param aFunction is the function to be invoked.
+ */
+ void RunOnChildren( boost::function<void (BOARD_ITEM*)> aFunction );
+
+ /// @copydoc VIEW_ITEM::ViewUpdate()
+ void ViewUpdate( int aUpdateFlags = KIGFX::VIEW_ITEM::ALL );
+
+ /// @copydoc VIEW_ITEM::ViewGetLayers()
+ virtual void ViewGetLayers( int aLayers[], int& aCount ) const;
+
+ /// @copydoc VIEW_ITEM::ViewGetLOD()
+ virtual unsigned int ViewGetLOD( int aLayer ) const;
+
+ /// @copydoc VIEW_ITEM::ViewBBox()
+ virtual const BOX2I ViewBBox() const;
+
+ /**
+ * Function CopyNetlistSettings
+ * copies the netlist settings to \a aModule.
+ * Used to copy some footprint parameters when replacing a footprint by an other
+ * footprint when reading a netlist, or in exchange footprint dialog
+ *
+ * The netlist settings are all of the #MODULE settings not define by a #MODULE in
+ * a netlist. These setting include placement prms (position, orientation, side)
+ * and optionally local prms( clearances, zone connection type, etc).
+ * The reference designator, value, path, and physical geometry settings are not
+ * copied.
+ *
+ * @param aModule is the #MODULE to copy the settings to.
+ * @param aCopyLocalSettings = false to copy only module placement
+ * true to also copy local prms
+ */
+ void CopyNetlistSettings( MODULE* aModule, bool aCopyLocalSettings );
+
+ /**
+ * static function IsLibNameValid
+ * Test for validity of a name of a footprint to be used in a footprint library
+ * ( no spaces, dir separators ... )
+ * @param aName = the name in library to validate
+ * @return true if the given name is valid
+ */
+ static bool IsLibNameValid( const wxString & aName );
+
+ /**
+ * static function StringLibNameInvalidChars
+ * Test for validity of the name in a library of the footprint
+ * ( no spaces, dir separators ... )
+ * @param aUserReadable = false to get the list of invalid chars
+ * true to get a readable form (i.e ' ' = 'space' '\\t'= 'tab')
+ * @return a constant std::string giving the list of invalid chars in lib name
+ */
+ static const wxChar* StringLibNameInvalidChars( bool aUserReadable );
+
+ /**
+ * Function SetInitialComments
+ * takes ownership of caller's heap allocated aInitialComments block. The comments
+ * are single line strings already containing the s-expression comments with
+ * optional leading whitespace and then a '#' character followed by optional
+ * single line text (text with no line endings, not even one).
+ * This block of single line comments will be output upfront of any generated
+ * s-expression text in the PCBIO::Format() function.
+ * <p>
+ * Note that a block of single line comments constitutes a multiline block of
+ * single line comments. That is, the block is made of consecutive single line
+ * comments.
+ * @param aInitialComments is a heap allocated wxArrayString or NULL, which the caller
+ * gives up ownership of over to this MODULE.
+ */
+ void SetInitialComments( wxArrayString* aInitialComments )
+ {
+ delete m_initial_comments;
+ m_initial_comments = aInitialComments;
+ }
+
+ /**
+ * Function PadCoverageRatio
+ * Calculates the ratio of total area of the footprint pads to the area of the
+ * footprint. Used by selection tool heuristics.
+ * @return the ratio
+ */
+ double PadCoverageRatio() const;
+
+ /// Return the initial comments block or NULL if none, without transfer of ownership.
+ const wxArrayString* GetInitialComments() const { return m_initial_comments; }
+
+#if defined(DEBUG)
+ virtual void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
+#endif
+
+private:
+ DLIST<D_PAD> m_Pads; ///< Linked list of pads.
+ DLIST<BOARD_ITEM> m_Drawings; ///< Linked list of graphical items.
+ DLIST<S3D_MASTER> m_3D_Drawings; ///< Linked list of 3D models.
+ double m_Orient; ///< Orientation in tenths of a degree, 900=90.0 degrees.
+ wxPoint m_Pos; ///< Position of module on the board in internal units.
+ TEXTE_MODULE* m_Reference; ///< Component reference designator value (U34, R18..)
+ TEXTE_MODULE* m_Value; ///< Component value (74LS00, 22K..)
+ FPID m_fpid; ///< The #FPID of the MODULE.
+ int m_Attributs; ///< Flag bits ( see Mod_Attribut )
+ int m_ModuleStatus; ///< For autoplace: flags (LOCKED, AUTOPLACED)
+ EDA_RECT m_BoundaryBox; ///< Bounding box : coordinates on board, real orientation.
+
+ // The final margin is the sum of these 2 values
+ int m_ThermalWidth;
+ int m_ThermalGap;
+ wxString m_Doc; ///< File name and path for documentation file.
+ wxString m_KeyWord; ///< Search keywords to find module in library.
+ wxString m_Path;
+ ZoneConnection m_ZoneConnection;
+ time_t m_LastEditTime;
+ int m_arflag; ///< Use to trace ratsnest and auto routing.
+ double m_Surface; ///< Bounding box area
+ time_t m_Link; ///< Temporary logical link used in edition
+ int m_CntRot90; ///< Horizontal automatic placement cost ( 0..10 ).
+ int m_CntRot180; ///< Vertical automatic placement cost ( 0..10 ).
+
+ // Local tolerances. When zero, this means the corresponding netclass value
+ // is used. Usually theses local tolerances zero, in deference to the
+ // corresponding netclass values.
+ int m_LocalClearance;
+ int m_LocalSolderMaskMargin; ///< Solder mask margin
+ int m_LocalSolderPasteMargin; ///< Solder paste margin absolute value
+ double m_LocalSolderPasteMarginRatio; ///< Solder mask margin ratio
+ ///< value of pad size
+
+ wxArrayString* m_initial_comments; ///< leading s-expression comments in the module,
+ ///< lazily allocated only if needed for speed
+};
+
+#endif // MODULE_H_