summaryrefslogtreecommitdiff
path: root/eeschema/class_libentry.h
diff options
context:
space:
mode:
authorsaurabhb172020-02-26 16:01:28 +0530
committerGitHub2020-02-26 16:01:28 +0530
commitd51317f0193609fb43e932730d78aa86a4984083 (patch)
tree6acee185a4dc19113fcbf0f9a3d6941085dedaf7 /eeschema/class_libentry.h
parent0db48f6533517ecebfd9f0693f89deca28408b76 (diff)
parent886d9cb772e81d2e5262284bc3082664f084337f (diff)
downloadKiCad-eSim-d51317f0193609fb43e932730d78aa86a4984083.tar.gz
KiCad-eSim-d51317f0193609fb43e932730d78aa86a4984083.tar.bz2
KiCad-eSim-d51317f0193609fb43e932730d78aa86a4984083.zip
Merge pull request #2 from FOSSEE/develop
Develop
Diffstat (limited to 'eeschema/class_libentry.h')
-rw-r--r--eeschema/class_libentry.h773
1 files changed, 773 insertions, 0 deletions
diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h
new file mode 100644
index 0000000..b81859e
--- /dev/null
+++ b/eeschema/class_libentry.h
@@ -0,0 +1,773 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2004-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
+ * Copyright (C) 2008-2015 Wayne Stambaugh <stambaughw@verizon.net>
+ * Copyright (C) 2004-2015 KiCad Developers, see change_log.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_libentry.h
+ */
+
+#ifndef CLASS_LIBENTRY_H
+#define CLASS_LIBENTRY_H
+
+#include <general.h>
+#include <lib_draw_item.h>
+#include <lib_field.h>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <vector>
+
+class LINE_READER;
+class OUTPUTFORMATTER;
+class PART_LIB;
+class LIB_ALIAS;
+class LIB_PART;
+class LIB_FIELD;
+
+
+/// Compiler controlled string compare function, either case independent or not:
+inline int Cmp_KEEPCASE( const wxString& aString1, const wxString& aString2 )
+{
+#ifdef KICAD_KEEPCASE
+ // case specificity, the normal behavior:
+ return aString1.Cmp( aString2 );
+#else
+ // case independence (only for guys who want that: not recommended)
+ return aString1.CmpNoCase( aString2 );
+#endif
+}
+
+
+typedef std::vector<LIB_ALIAS*> LIB_ALIASES;
+typedef boost::shared_ptr<LIB_PART> PART_SPTR; ///< shared pointer to LIB_PART
+typedef boost::weak_ptr<LIB_PART> PART_REF; ///< weak pointer to LIB_PART
+
+
+/* values for member .m_options */
+enum LIBRENTRYOPTIONS
+{
+ ENTRY_NORMAL, // Libentry is a standard part (real or alias)
+ ENTRY_POWER // Libentry is a power symbol
+};
+
+
+/// WXTRACE value to enable schematic library memory deletion debug output.
+extern const wxChar traceSchLibMem[];
+
+
+/**
+ * Part library alias object definition.
+ *
+ * Part aliases are not really parts. An alias uses the part definition
+ * (graphic, pins...) but has its own name, keywords and documentation. Therefore, when
+ * the part is modified, alias of this part are modified. This is a simple
+ * method to create parts that have the same physical layout with different names
+ * such as 74LS00, 74HC00 ... and many op amps.
+ */
+class LIB_ALIAS : public EDA_ITEM
+{
+ /**
+ * Actual LIB_PART referenced by [multiple] aliases.
+ *
+ * @note - Do not delete the shared part. The shared part is shared by
+ * all of the aliases associated with it. A shared LIB_PART will
+ * be deleted when all LIB_ALIASes pointing to it are deleted.
+ */
+ LIB_PART* shared;
+
+ friend class LIB_PART;
+
+protected:
+ wxString name;
+ wxString description; ///< documentation for info
+ wxString keyWords; ///< keyword list (used for search for parts by keyword)
+ wxString docFileName; ///< Associate doc file name
+
+public:
+ LIB_ALIAS( const wxString& aName, LIB_PART* aRootComponent );
+ LIB_ALIAS( const LIB_ALIAS& aAlias, LIB_PART* aRootComponent = NULL );
+
+ virtual ~LIB_ALIAS();
+
+ virtual wxString GetClass() const
+ {
+ return wxT( "LIB_ALIAS" );
+ }
+
+ /**
+ * Function GetPart
+ * gets the shared LIB_PART.
+ *
+ * @return LIB_PART* - the LIB_PART shared by
+ * this LIB_ALIAS with possibly other LIB_ALIASes.
+ */
+ LIB_PART* GetPart() const
+ {
+ return shared;
+ }
+
+ const wxString GetLibraryName();
+
+ bool IsRoot() const;
+
+ PART_LIB* GetLib();
+
+ const wxString& GetName() const { return name; }
+
+ void SetName( const wxString& aName ) { name = aName; }
+
+ void SetDescription( const wxString& aDescription )
+ {
+ description = aDescription;
+ }
+
+ wxString GetDescription() const { return description; }
+
+ void SetKeyWords( const wxString& aKeyWords )
+ {
+ keyWords = aKeyWords;
+ }
+
+ wxString GetKeyWords() const { return keyWords; }
+
+ void SetDocFileName( const wxString& aDocFileName )
+ {
+ docFileName = aDocFileName;
+ }
+
+ wxString GetDocFileName() const { return docFileName; }
+
+ /**
+ * Function SaveDocs
+ * write the entry document information to \a aFormatter in "*.dcm" format.
+ *
+ * @param aFormatter The #OUTPUTFORMATTER to write the alias documents to.
+ * @return True if success writing else false.
+ */
+ bool SaveDoc( OUTPUTFORMATTER& aFormatter );
+
+ /**
+ * KEEPCASE sensitive comparison of the part entry name.
+ */
+ bool operator==( const wxChar* aName ) const;
+ bool operator!=( const wxChar* aName ) const
+ {
+ return !( *this == aName );
+ }
+
+ bool operator==( const LIB_ALIAS* aAlias ) const { return this == aAlias; }
+
+#if defined(DEBUG)
+ void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
+#endif
+};
+
+extern bool operator<( const LIB_ALIAS& aItem1, const LIB_ALIAS& aItem2 );
+
+extern int LibraryEntryCompare( const LIB_ALIAS* aItem1, const LIB_ALIAS* aItem2 );
+
+
+/**
+ * Class LIB_PART
+ * defines a library part object.
+ *
+ * A library part object is typically saved and loaded in a part library file (.lib).
+ * Library parts are different from schematic components.
+ */
+class LIB_PART : public EDA_ITEM
+{
+ friend class PART_LIB;
+ friend class LIB_ALIAS;
+
+ PART_SPTR m_me; ///< http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/sp_techniques.html#weak_without_shared
+ wxString m_name;
+ int m_pinNameOffset; ///< The offset in mils to draw the pin name. Set to 0
+ ///< to draw the pin name above the pin.
+ bool m_unitsLocked; ///< True if part has multiple units and changing
+ ///< one unit does not automatically change another unit.
+ bool m_showPinNames; ///< Determines if part pin names are visible.
+ bool m_showPinNumbers; ///< Determines if part pin numbers are visible.
+ long m_dateModified; ///< Date the part was last modified.
+ LIBRENTRYOPTIONS m_options; ///< Special part features such as POWER or NORMAL.)
+ int m_unitCount; ///< Number of units (parts) per package.
+ LIB_ITEMS drawings; ///< How to draw this part.
+ wxArrayString m_FootprintList; /**< List of suitable footprint names for the
+ part (wild card names accepted). */
+ LIB_ALIASES m_aliases; ///< List of alias object pointers associated with the
+ ///< part.
+ PART_LIB* m_library; ///< Library the part belongs to if any.
+
+ static int m_subpartIdSeparator; ///< the separator char between
+ ///< the subpart id and the reference
+ ///< like U1A ( m_subpartIdSeparator = 0 ) or U1.A or U1-A
+ static int m_subpartFirstId; ///< the ascii char value to calculate the subpart symbol id
+ ///< from the part number: only 'A', 'a' or '1' can be used,
+ ///< other values have no sense.
+private:
+ void deleteAllFields();
+
+ // LIB_PART() { } // not legal
+
+public:
+
+ LIB_PART( const wxString& aName, PART_LIB* aLibrary = NULL );
+ LIB_PART( LIB_PART& aPart, PART_LIB* aLibrary = NULL );
+
+ virtual ~LIB_PART();
+
+ PART_SPTR SharedPtr()
+ {
+ // clone a shared pointer
+ return m_me;
+ }
+
+ virtual wxString GetClass() const
+ {
+ return wxT( "LIB_PART" );
+ }
+
+ virtual void SetName( const wxString& aName );
+
+ const wxString& GetName() { return m_name; }
+
+ const wxString GetLibraryName();
+
+ PART_LIB* GetLib() { return m_library; }
+
+ wxArrayString GetAliasNames( bool aIncludeRoot = true ) const;
+
+ size_t GetAliasCount() const { return m_aliases.size(); }
+
+ LIB_ALIAS* GetAlias( size_t aIndex );
+
+ LIB_ALIAS* GetAlias( const wxString& aName );
+
+ /**
+ * Function AddAlias
+ *
+ * Add an alias \a aName to the part.
+ *
+ * Duplicate alias names are not added to the alias list. Debug builds will raise an
+ * assertion. Release builds will fail silently.
+ *
+ * @param aName - Name of alias to add.
+ */
+ void AddAlias( const wxString& aName );
+
+ /**
+ * Test if alias \a aName is in part alias list.
+ *
+ * Alias name comparisons are case insensitive.
+ *
+ * @param aName - Name of alias.
+ * @return True if alias name in alias list.
+ */
+ bool HasAlias( const wxString& aName ) const;
+
+ void SetAliases( const wxArrayString& aAliasList );
+
+ void RemoveAlias( const wxString& aName );
+ LIB_ALIAS* RemoveAlias( LIB_ALIAS* aAlias );
+
+ void RemoveAllAliases();
+
+ wxArrayString& GetFootPrints() { return m_FootprintList; }
+
+ /**
+ * Function GetBoundingBox
+ * @return the part bounding box ( in user coordinates )
+ * @param aUnit = unit selection = 0, or 1..n
+ * @param aConvert = 0, 1 or 2
+ * If aUnit == 0, unit is not used
+ * if aConvert == 0 Convert is non used
+ * Invisible fields are not taken in account
+ **/
+ const EDA_RECT GetBoundingBox( int aUnit, int aConvert ) const;
+
+ /**
+ * Function GetBodyBoundingBox
+ * @return the part bounding box ( in user coordinates ) without fields
+ * @param aUnit = unit selection = 0, or 1..n
+ * @param aConvert = 0, 1 or 2
+ * If aUnit == 0, unit is not used
+ * if aConvert == 0 Convert is non used
+ * Fields are not taken in account
+ **/
+ const EDA_RECT GetBodyBoundingBox( int aUnit, int aConvert ) const;
+
+ /**
+ * Function SaveDateAndTime
+ * write the date and time of part to \a aFile in the format:
+ * "Ti yy/mm/jj hh:mm:ss"
+ *
+ * @param aFormatter A reference to an #OUTPUTFORMATTER object containing the
+ * output format to write to.
+ * @return True if the date and time were successfully written to \a aFormatter.
+ */
+ bool SaveDateAndTime( OUTPUTFORMATTER& aFormatter );
+
+ bool LoadDateAndTime( char* aLine );
+
+ /**
+ * Function Save
+ * writes the data structures out to \a aFormatter in the part library "*.lib"
+ * format.
+ *
+ * @param aFormatter A reference to an OUTPUTFORMATTER to write to.
+ * @return True if success writing else false.
+ */
+ bool Save( OUTPUTFORMATTER& aFormatter );
+
+ /**
+ * Load part definition from \a aReader.
+ *
+ * @param aReader A LINE_READER object to load file from.
+ * @param aErrorMsg - Description of error on load failure.
+ * @return True if the load was successful, false if there was an error.
+ */
+ bool Load( LINE_READER& aReader, wxString& aErrorMsg );
+ bool LoadField( LINE_READER& aReader, wxString& aErrorMsg );
+ bool LoadDrawEntries( LINE_READER& aReader, wxString& aErrorMsg );
+ bool LoadAliases( char* aLine, wxString& aErrorMsg );
+ bool LoadFootprints( LINE_READER& aReader, wxString& aErrorMsg );
+
+ bool IsPower() const { return m_options == ENTRY_POWER; }
+ bool IsNormal() const { return m_options == ENTRY_NORMAL; }
+
+ void SetPower() { m_options = ENTRY_POWER; }
+ void SetNormal() { m_options = ENTRY_NORMAL; }
+
+ void LockUnits( bool aLockUnits ) { m_unitsLocked = aLockUnits; }
+ bool UnitsLocked() const { return m_unitsLocked; }
+
+ /**
+ * Function SetFields
+ * overwrites all the existing in this part with fields supplied
+ * in \a aFieldsList. The only known caller of this function is the
+ * library part field editor, and it establishes needed behavior.
+ *
+` * @param aFieldsList is a set of fields to import, removing all previous fields.
+ */
+ void SetFields( const std::vector <LIB_FIELD>& aFieldsList );
+
+ /**
+ * Function GetFields
+ * returns a list of fields withing this part. The only known caller of
+ * this function is the library part field editor, and it establishes
+ * needed behavior.
+ *
+ * @param aList - List to add fields to
+ */
+ void GetFields( LIB_FIELDS& aList );
+
+ /**
+ * Function FindField
+ * finds a field within this part matching \a aFieldName and returns
+ * it or NULL if not found.
+ */
+ LIB_FIELD* FindField( const wxString& aFieldName );
+
+ /**
+ * Return pointer to the requested field.
+ *
+ * @param aId - Id of field to return.
+ * @return The field if found, otherwise NULL.
+ */
+ LIB_FIELD* GetField( int aId );
+
+ /** Return reference to the value field. */
+ LIB_FIELD& GetValueField();
+
+ /** Return reference to the reference designator field. */
+ LIB_FIELD& GetReferenceField();
+
+ /**
+ * Draw part.
+ *
+ * @param aPanel - Window to draw on. Can be NULL if not available.
+ * @param aDc - Device context to draw on.
+ * @param aOffset - Position of part.
+ * @param aMulti - unit if multiple units per part.
+ * @param aConvert - Component conversion (DeMorgan) if available.
+ * @param aDrawMode - Device context drawing mode, see wxDC.
+ * @param aColor - Color to draw part.
+ * @param aTransform - Coordinate adjustment settings.
+ * @param aShowPinText - Show pin text if true.
+ * @param aDrawFields - Draw field text if true otherwise just draw
+ * body items (useful to draw a body in schematic,
+ * because fields of schematic components replace
+ * the lib part fields).
+ * @param aOnlySelected - Draws only the body items that are selected.
+ * Used for block move redraws.
+ * @param aPinsDangling - if not NULL, this should be a pointer to
+ * vector<bool> exactly the same length as the number of pins,
+ * indicating whether each pin is dangling. If NULL, all pins
+ * will be drawn as if they were dangling.
+ */
+ void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDc, const wxPoint& aOffset,
+ int aMulti, int aConvert, GR_DRAWMODE aDrawMode,
+ EDA_COLOR_T aColor = UNSPECIFIED_COLOR,
+ const TRANSFORM& aTransform = DefaultTransform,
+ bool aShowPinText = true, bool aDrawFields = true,
+ bool aOnlySelected = false,
+ const std::vector<bool>* aPinsDangling = NULL );
+
+ /**
+ * Plot lib part to plotter.
+ * Lib Fields not are plotted here, because this plot function
+ * is used to plot schematic items, which have they own fields
+ *
+ * @param aPlotter - Plotter object to plot to.
+ * @param aUnit - Component part to plot.
+ * @param aConvert - Component alternate body style to plot.
+ * @param aOffset - Distance to shift the plot coordinates.
+ * @param aTransform - Component plot transform matrix.
+ */
+ void Plot( PLOTTER* aPlotter, int aUnit, int aConvert, const wxPoint& aOffset,
+ const TRANSFORM& aTransform );
+
+ /**
+ * Plot Lib Fields only of the part to plotter.
+ * is used to plot the full lib part, outside the schematic
+ *
+ * @param aPlotter - Plotter object to plot to.
+ * @param aUnit - Component part to plot.
+ * @param aConvert - Component alternate body style to plot.
+ * @param aOffset - Distance to shift the plot coordinates.
+ * @param aTransform - Component plot transform matrix.
+ */
+ void PlotLibFields( PLOTTER* aPlotter, int aUnit, int aConvert,
+ const wxPoint& aOffset, const TRANSFORM& aTransform );
+
+ /**
+ * Add a new draw \a aItem to the draw object list.
+ *
+ * @param aItem - New draw object to add to part.
+ */
+ void AddDrawItem( LIB_ITEM* aItem );
+
+ /**
+ * Remove draw \a aItem from list.
+ *
+ * @param aItem - Draw item to remove from list.
+ * @param aPanel - Panel to remove part from.
+ * @param aDc - Device context to remove part from.
+ */
+ void RemoveDrawItem( LIB_ITEM* aItem, EDA_DRAW_PANEL* aPanel = NULL, wxDC* aDc = NULL );
+
+ /**
+ * Return the next draw object pointer.
+ *
+ * @param aItem - Pointer to the current draw item. Setting item NULL
+ * with return the first item of type in the list.
+ * @param aType - type of searched item (filter).
+ * if TYPE_NOT_INIT search for all items types
+ * @return - The next drawing object in the list if found, otherwise NULL.
+ */
+ LIB_ITEM* GetNextDrawItem( LIB_ITEM* aItem = NULL, KICAD_T aType = TYPE_NOT_INIT );
+
+ /**
+ * Return the next pin object from the draw list.
+ *
+ * This is just a pin object specific version of GetNextDrawItem().
+ *
+ * @param aItem - Pointer to the previous pin item, or NULL to get the
+ * first pin in the draw object list.
+ * @return - The next pin object in the list if found, otherwise NULL.
+ */
+ LIB_PIN* GetNextPin( LIB_PIN* aItem = NULL )
+ {
+ return (LIB_PIN*) GetNextDrawItem( (LIB_ITEM*) aItem, LIB_PIN_T );
+ }
+
+
+ /**
+ * Return a list of pin object pointers from the draw item list.
+ *
+ * Note pin objects are owned by the draw list of the part.
+ * Deleting any of the objects will leave list in a unstable state
+ * and will likely segfault when the list is destroyed.
+ *
+ * @param aList - Pin list to place pin object pointers into.
+ * @param aUnit - Unit number of pin to add to list. Set to 0 to
+ * get pins from any part unit.
+ * @param aConvert - Convert number of pin to add to list. Set to 0 to
+ * get pins from any convert of part.
+ */
+ void GetPins( LIB_PINS& aList, int aUnit = 0, int aConvert = 0 );
+
+ /**
+ * Return pin object with the requested pin \a aNumber.
+ *
+ * @param aNumber - Number of the pin to find.
+ * @param aUnit - Unit of the part to find. Set to 0 if a specific
+ * unit number is not required.
+ * @param aConvert - Alternate body style filter (DeMorgan). Set to 0 if
+ * no alternate body style is required.
+ * @return The pin object if found. Otherwise NULL.
+ */
+ LIB_PIN* GetPin( const wxString& aNumber, int aUnit = 0, int aConvert = 0 );
+
+ /**
+ * Function PinsConflictWith
+ * returns true if this part's pins do not match another part's pins. This
+ * is used to detect whether the project cache is out of sync with the
+ * system libs.
+ *
+ * @param aOtherPart - The other library part to test
+ * @param aTestNums - Whether two pins at the same point must have the same number.
+ * @param aTestNames - Whether two pins at the same point must have the same name.
+ * @param aTestType - Whether two pins at the same point must have the same electrical type.
+ * @param aTestOrientation - Whether two pins at the same point must have the same orientation.
+ * @param aTestLength - Whether two pins at the same point must have the same length.
+ */
+ bool PinsConflictWith( LIB_PART& aOtherPart, bool aTestNums, bool aTestNames,
+ bool aTestType, bool aTestOrientation, bool aTestLength );
+
+ /**
+ * Move the part \a aOffset.
+ *
+ * @param aOffset - Offset displacement.
+ */
+ void SetOffset( const wxPoint& aOffset );
+
+ /**
+ * Remove duplicate draw items from list.
+ */
+ void RemoveDuplicateDrawItems();
+
+ /**
+ * Test if part has more than one body conversion type (DeMorgan).
+ *
+ * @return True if part has more than one conversion.
+ */
+ bool HasConversion() const;
+
+ /**
+ * Clears the status flag all draw objects in this part.
+ */
+ void ClearStatus();
+
+ /**
+ * Checks all draw objects of part to see if they are with block.
+ *
+ * Use this method to mark draw objects as selected during block
+ * functions.
+ *
+ * @param aRect - The bounding rectangle to test in draw items are inside.
+ * @param aUnit - The current unit number to test against.
+ * @param aConvert - Are the draw items being selected a conversion.
+ * @param aEditPinByPin - Used to ignore pin selections when in edit pin
+ * by pin mode is enabled.
+ * @return The number of draw objects found inside the block select
+ * rectangle.
+ */
+ int SelectItems( EDA_RECT& aRect, int aUnit, int aConvert, bool aEditPinByPin );
+
+ /**
+ * Clears all the draw items marked by a block select.
+ */
+ void ClearSelectedItems();
+
+ /**
+ * Deletes the select draw items marked by a block select.
+ *
+ * The name and reference field will not be deleted. They are the
+ * minimum drawing items required for any part. Their properties
+ * can be changed but the cannot be removed.
+ */
+ void DeleteSelectedItems();
+
+ /**
+ * Move the selected draw items marked by a block select.
+ */
+ void MoveSelectedItems( const wxPoint& aOffset );
+
+ /**
+ * Make a copy of the selected draw items marked by a block select.
+ *
+ * Fields are not copied. Only part body items are copied.
+ * Copying fields would result in duplicate fields which does not
+ * make sense in this context.
+ */
+ void CopySelectedItems( const wxPoint& aOffset );
+
+ /**
+ * Horizontally (X axis) mirror selected draw items about a point.
+ *
+ * @param aCenter - Center point to mirror around.
+ */
+ void MirrorSelectedItemsH( const wxPoint& aCenter );
+
+ /**
+ * Vertically (Y axis) mirror selected draw items about a point.
+ *
+ * @param aCenter - Center point to mirror around.
+ */
+ void MirrorSelectedItemsV( const wxPoint& aCenter );
+
+ /**
+ * Rotate CCW selected draw items about a point.
+ *
+ * @param aCenter - Center point to mirror around.
+ */
+ void RotateSelectedItems( const wxPoint& aCenter );
+
+ /**
+ * Locate a draw object.
+ *
+ * @param aUnit - Unit number of draw item.
+ * @param aConvert - Body style of draw item.
+ * @param aType - Draw object type, set to 0 to search for any type.
+ * @param aPoint - Coordinate for hit testing.
+ * @return The draw object if found. Otherwise NULL.
+ */
+ LIB_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType, const wxPoint& aPoint );
+
+ /**
+ * Locate a draw object (overlaid)
+ *
+ * @param aUnit - Unit number of draw item.
+ * @param aConvert - Body style of draw item.
+ * @param aType - Draw object type, set to 0 to search for any type.
+ * @param aPoint - Coordinate for hit testing.
+ * @param aTransform = the transform matrix
+ * @return The draw object if found. Otherwise NULL.
+ */
+ LIB_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType,
+ const wxPoint& aPoint, const TRANSFORM& aTransform );
+
+ /**
+ * Return a reference to the draw item list.
+ *
+ * @return LIB_ITEMS& - Reference to the draw item object list.
+ */
+ LIB_ITEMS& GetDrawItemList() { return drawings; }
+
+ /**
+ * Set the units per part count.
+ *
+ * If the count is greater than the current count, then the all of the
+ * current draw items are duplicated for each additional part. If the
+ * count is less than the current count, all draw objects for units
+ * greater that count are removed from the part.
+ *
+ * @param count - Number of units per package.
+ */
+ void SetUnitCount( int count );
+
+ int GetUnitCount() const { return m_unitCount; }
+
+ /**
+ * Function IsMulti
+ * @return true if the part has multiple units per part.
+ * When happens, the reference has a sub reference ti identify part
+ */
+ bool IsMulti() const { return m_unitCount > 1; }
+
+ /**
+ * Function SubReference
+ * @return the sub reference for part having multiple units per part.
+ * The sub reference identify the part (or unit)
+ * @param aUnit = the part identifier ( 1 to max count)
+ * @param aAddSeparator = true (default) to prpebd the sub ref
+ * by the separator symbol (if any)
+ * Note: this is a static function.
+ */
+ static wxString SubReference( int aUnit, bool aAddSeparator = true );
+
+ // Accessors to sub ref parameters
+ static int GetSubpartIdSeparator() { return m_subpartIdSeparator; }
+
+ /** return a reference to m_subpartIdSeparator,
+ * only for read/save setting functions
+ */
+ static int* SubpartIdSeparatorPtr() { return &m_subpartIdSeparator; }
+
+ static int GetSubpartFirstId() { return m_subpartFirstId; }
+
+ /** return a reference to m_subpartFirstId, only for read/save setting functions
+ */
+ static int* SubpartFirstIdPtr() { return &m_subpartFirstId; }
+
+ /** Set the separator char between the subpart id and the reference
+ * 0 (no separator) or '.' , '-' and '_'
+ * and the ascii char value to calculate the subpart symbol id from the part number:
+ * 'A' or '1' only are allowed. (to print U1.A or U1.1)
+ * if this is a digit, a number is used as id symbol
+ * Note also if the subpart symbol is a digit, the separator cannot be null.
+ * @param aSep = the separator symbol (0 (no separator) or '.' , '-' and '_')
+ * @param aFirstId = the Id of the first part ('A' or '1')
+ */
+ static void SetSubpartIdNotation( int aSep, int aFirstId );
+
+ /**
+ * Set or clear the alternate body style (DeMorgan) for the part.
+ *
+ * If the part already has an alternate body style set and a
+ * asConvert if false, all of the existing draw items for the alternate
+ * body style are remove. If the alternate body style is not set and
+ * asConvert is true, than the base draw items are duplicated and
+ * added to the part.
+ *
+ * @param aSetConvert - Set or clear the part alternate body style.
+ */
+ void SetConversion( bool aSetConvert );
+
+ /**
+ * Set the offset in mils of the pin name text from the pin symbol.
+ *
+ * Set the offset to 0 to draw the pin name above the pin symbol.
+ *
+ * @param aOffset - The offset in mils.
+ */
+ void SetPinNameOffset( int aOffset ) { m_pinNameOffset = aOffset; }
+
+ int GetPinNameOffset() { return m_pinNameOffset; }
+
+ /**
+ * Set or clear the pin name visibility flag.
+ *
+ * @param aShow - True to make the part pin names visible.
+ */
+ void SetShowPinNames( bool aShow ) { m_showPinNames = aShow; }
+
+ bool ShowPinNames() { return m_showPinNames; }
+
+ /**
+ * Set or clear the pin number visibility flag.
+ *
+ * @param aShow - True to make the part pin numbers visible.
+ */
+ void SetShowPinNumbers( bool aShow ) { m_showPinNumbers = aShow; }
+
+ bool ShowPinNumbers() { return m_showPinNumbers; }
+
+ bool operator==( const LIB_PART* aPart ) const { return this == aPart; }
+
+#if defined(DEBUG)
+ void Show( int nestLevel, std::ostream& os ) const { ShowDummy( os ); } // override
+#endif
+};
+
+#endif // CLASS_LIBENTRY_H