lib_pin.h 15.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
 * Copyright (C) 2004-2011 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
 */
24

25 26 27
/**
 * @file class_libentry.h
 * @brief Class LIB_PIN definition.
28 29 30 31
 */
#ifndef CLASS_PIN_H
#define CLASS_PIN_H

32
#include <lib_draw_item.h>
33

34

35
#define TARGET_PIN_RADIUS   12  // Circle diameter drawn at the active end of pins
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

/**
 * The component library pin object electrical types used in ERC tests.
 */
enum ElectricPinType {
    PIN_INPUT,
    PIN_OUTPUT,
    PIN_BIDI,
    PIN_TRISTATE,
    PIN_PASSIVE,
    PIN_UNSPECIFIED,
    PIN_POWER_IN,
    PIN_POWER_OUT,
    PIN_OPENCOLLECTOR,
    PIN_OPENEMITTER,
    PIN_NC,             /* No connect */
    PIN_NMAX            /* End of List (no used as pin type) */
};

/* Electrical pin type names. */
extern const wxChar* MsgPinElectricType[];

/* Pin visibility flag bit. */
59
#define PIN_INVISIBLE 1    /* Set makes pin invisible */
60 61 62 63 64 65 66 67 68 69


/**
 * The component library pin object drawing shapes.
 */
enum DrawPinShape {
    NONE         = 0,
    INVERT       = 1,
    CLOCK        = 2,
    LOWLEVEL_IN  = 4,
Vovanium's avatar
Vovanium committed
70 71
    LOWLEVEL_OUT = 8,
    CLOCK_FALL   = 0x10, /* this is common form for inverted clock in Eastern Block */
jean-pierre charras's avatar
jean-pierre charras committed
72
    NONLOGIC     = 0x20
73 74 75 76 77 78 79 80 81 82
};


/**
 *  The component library pin object orientations.
 */
enum DrawPinOrient {
    PIN_RIGHT = 'R',
    PIN_LEFT  = 'L',
    PIN_UP    = 'U',
jean-pierre charras's avatar
jean-pierre charras committed
83
    PIN_DOWN  = 'D'
84 85 86
};


87
class LIB_PIN : public LIB_ITEM
88
{
89 90 91 92 93 94 95 96 97 98 99
    wxPoint  m_position;     ///< Position of the pin.
    int      m_length;       ///< Length of the pin.
    int      m_orientation;  ///< Pin orientation (Up, Down, Left, Right)
    int      m_shape;        ///< Bitwise ORed of pin shapes (see enum DrawPinShape)
    int      m_width;        ///< Line width of the pin.
    int      m_type;         ///< Electrical type of the pin.  See enum ElectricPinType.
    int      m_attributes;   ///< Set bit 0 to indicate pin is invisible.
    wxString m_name;
    long     m_number;       ///< Pin number defined as 4 ASCII characters like "12", "anod",
                             ///< "G6", or "12".  It is stored as "12\0\0" and does not
                             ///< depend on endian type.
100 101
    int      m_numTextSize;
    int      m_nameTextSize; /* Pin num and Pin name sizes */
102

103
    void drawGraphic( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset,
104
                      EDA_COLOR_T aColor, GR_DRAWMODE aDrawMode, void* aData,
105
                      const TRANSFORM& aTransform );
106

107
public:
108
    LIB_PIN( LIB_PART*      aParent );
109 110 111

    // Do not create a copy constructor.  The one generated by the compiler is adequate.

112 113
    ~LIB_PIN() { }

114
    wxString GetClass() const
115 116 117 118
    {
        return wxT( "LIB_PIN" );
    }

119
#if defined(DEBUG)
120
    void Show( int nestLevel, std::ostream& os ) const;   // virtual override
121 122
#endif

123
    bool Save( OUTPUTFORMATTER& aFormatter );
124

125
    bool Load( LINE_READER& aLineReader, wxString& aErrorMsg );
126

127
    bool HitTest( const wxPoint& aPosition ) const;
128

129
    bool HitTest( const wxPoint &aPosRef, int aThreshold, const TRANSFORM& aTransform ) const;
130

131
    void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList );
132

133
    bool Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxPoint* aFindLocation );
134

135
    const EDA_RECT GetBoundingBox() const;    // Virtual
136

137
    /**
138
     * Function PinEndPoint
139 140 141
     *
     * @return The pin end position for a component in the normal orientation.
     */
142
    wxPoint PinEndPoint() const;
143

144
    /**
145
     * Function PinDrawOrient
146 147
     * returns the pin real orientation (PIN_UP, PIN_DOWN, PIN_RIGHT, PIN_LEFT),
     * according to its orientation and the matrix transform (rot, mirror) \a aTransform
148 149
     *
     * @param aTransform Transform matrix
150
     */
151
    int PinDrawOrient( const TRANSFORM& aTransform ) const;
152 153 154 155 156 157 158

    /**
     * Fill a string buffer with pin number.
     *
     * Pin numbers are coded as a long or 4 ASCII characters.  Used to print
     * or draw the pin number.
     *
159
     * @param aStringBuffer - the wxString to store the pin num as an unicode string
160
     */
161
    void PinStringNum( wxString& aStringBuffer ) const;
162

163
    long GetNumber() const { return m_number; }
164

165
    wxString GetNumberString() const { return PinStringNum( m_number ); }
166

167
    /**
168
     * Function PinStringNum (static function)
169 170 171 172 173
     * Pin num is coded as a long or 4 ascii chars
     * @param aPinNum = a long containing a pin num
     * @return aStringBuffer = the wxString to store the pin num as an
     *                         unicode string
     */
174
    static wxString PinStringNum( long aPinNum );
175

176 177 178 179
    /**
     * Function SetPinNumFromString
     * fill the pin number buffer with \a aBuffer.
     */
180
    void SetPinNumFromString( wxString& aBuffer );
181

182 183
    wxString GetName() const { return m_name; }

184 185 186 187 188
    /**
     * Set the pin name.
     *
     * This will also all of the pin names marked by EnableEditMode().
     *
189
     * @param aName New pin name.
190 191 192 193
     */
    void SetName( const wxString& aName );

    /**
194
     * Set the \a aSize of the pin name text.
195 196 197 198
     *
     * This will also update the text size of the name of the pins marked
     * by EnableEditMode().
     *
199
     * @param aSize The text size of the pin name in schematic units ( mils ).
200 201 202
     */
    void SetNameTextSize( int aSize );

203 204
    int GetNameTextSize() const { return m_nameTextSize; }

205 206 207 208 209
    /**
     * Set the pin number.
     *
     * Others pin numbers marked by EnableEditMode() are not modified
     * because each pin has its own number
210
     * @param aNumber New pin number.
211 212 213 214 215 216 217 218 219
     */
    void SetNumber( const wxString& aNumber );

    /**
     * Set the size of the pin number text.
     *
     * This will also update the text size of the number of the pins marked
     * by EnableEditMode().
     *
220
     * @param aSize The text size of the pin number in schematic units ( mils ).
221 222 223
     */
    void SetNumberTextSize( int aSize );

224 225
    int GetNumberTextSize() const { return m_numTextSize; }

226 227
    int GetOrientation() const { return m_orientation; }

228 229 230
    /**
     * Set orientation on the pin.
     *
231
     * This will also update the orientation of the pins marked by EnableEditMode().
232 233 234 235 236
     *
     * @param aOrientation - The orientation of the pin.
     */
    void SetOrientation( int aOrientation );

237 238
    void Rotate();

239 240
    int GetShape() const { return m_shape; }

241
    /**
242
     * Set the shape of the pin to \a aShape.
243
     *
244
     * This will also update the draw style of the pins marked by EnableEditMode().
245
     *
246
     * @param aShape - The draw shape of the pin.  See enum DrawPinShape.
247
     */
248 249
    void SetShape( int aShape );

250 251 252 253 254
    /**
     * Get the electrical type of the pin.
     *
     * @return The electrical type of the pin (see enun ElectricPinType for values).
     */
255
    int GetType() const { return m_type; }
256

257 258 259 260 261 262 263
    /**
     * return a string giving the electrical type of the pin.
     *
     * @return The electrical name of the pin (see enun MsgPinElectricType for names).
     */
    wxString GetTypeString() const { return MsgPinElectricType[m_type]; }

264 265 266 267 268 269
    /**
     * Set the electrical type of the pin.
     *
     * This will also update the electrical type of the pins marked by
     * EnableEditMode().
     *
270
     * @param aType - The electrical type of the pin(see enun ElectricPinType for values).
271
     */
272
    void SetType( int aType );
273 274 275 276 277 278 279 280 281 282

    /**
     * Set the pin length.
     *
     * This will also update the length of the pins marked by EnableEditMode().
     *
     * @param aLength - The length of the pin in mils.
     */
    void SetLength( int aLength );

283 284
    int GetLength() { return m_length; }

285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
    /**
     * Set the pin part number.
     *
     * If the pin is changed from not common to common to all parts, any
     * linked pins will be removed from the parent component.
     *
     * @param aPart - Number of the part the pin belongs to.  Set to zero to
     *                make pin common to all parts in a multi-part component.
     */
    void SetPartNumber( int aPart );

    /**
     * Set the body style (conversion) of the pin.
     *
     * If the pin is changed from not common to common to all body styles, any
     * linked pins will be removed from the parent component.
     *
302 303
     * @param aConversion - Body style of the pin.  Set to zero to make pin
     *                      common to all body styles.
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
     */
    void SetConversion( int aConversion );

    /**
     * Set or clear the visibility flag for the pin.
     *
     * This will also update the visibility of the pins marked by
     * EnableEditMode().
     *
     * @param aVisible - True to make the pin visible or false to hide the pin.
     */
    void SetVisible( bool aVisible );

    /**
     * Enable or clear pin editing mode.
     *
     * The pin editing mode marks or unmarks all pins common to this
321
     * pin object for further editing.  If any of the pin modification
322 323 324 325 326 327
     * methods are called after enabling the editing mode, all pins
     * marked for editing will have the same attribute changed.  The
     * only case were this is not true making this pin common to all
     * parts or body styles in the component.  See SetCommonToAllParts()
     * and SetCommonToAllBodyStyles() for more information.
     *
328 329 330
     * @param aEnable True marks all common pins for editing mode.  False
     *                clears the editing mode.
     * @param aEditPinByPin Enables the edit pin by pin mode.
331 332 333 334 335 336 337 338
     */
    void EnableEditMode( bool aEnable, bool aEditPinByPin = false );

    /**
     * Return the visibility status of the draw object.
     *
     * @return True if draw object is visible otherwise false.
     */
339
    bool IsVisible() { return ( m_attributes & PIN_INVISIBLE ) == 0; }
340

341
    int GetPenSize() const;
342

343 344 345 346 347
    /**
     * Function DrawPinSymbol
     * Draw the pin symbol without text.
     * If \a aColor != 0, draw with \a aColor, else with the normal pin color.
     */
348
    void DrawPinSymbol( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
349
                        int aOrientation, GR_DRAWMODE aDrawMode,
350
                        EDA_COLOR_T aColor = UNSPECIFIED_COLOR );
351

352 353 354
    /**
     * Function DrawPinTexts
     * puts the pin number and pin text info, given the pin line coordinates.
355 356 357
     * The line must be vertical or horizontal.
     * If DrawPinName == false the pin name is not printed.
     * If DrawPinNum = false the pin number is not printed.
358 359 360 361
     * If TextInside then the text is been put inside,otherwise all is drawn outside.
     * Pin Name:    substring between '~' is negated
     * DrawMode = GR_OR, XOR ...
     */
362
    void DrawPinTexts( EDA_DRAW_PANEL* aPanel, wxDC* aDC, wxPoint& aPosition,
363
                       int aOrientation, int TextInside, bool DrawPinNum, bool DrawPinName,
364
                       EDA_COLOR_T aColor, GR_DRAWMODE aDrawMode );
365

366 367 368 369 370 371 372 373
    /**
     * Function PlotPinTexts
     * plots the pin number and pin text info, given the pin line coordinates.
     * Same as DrawPinTexts((), but output is the plotter
     * The line must be vertical or horizontal.
     * If TextInside then the text is been put inside (moving from x1, y1 in
     * the opposite direction to x2,y2), otherwise all is drawn outside.
     */
374 375 376 377 378 379 380 381
    void PlotPinTexts( PLOTTER *aPlotter,
                       wxPoint& aPosition,
                       int      aOrientation,
                       int      aTextInside,
                       bool     aDrawPinNum,
                       bool     aDrawPinName,
                       int      aWidth );

382 383
    void PlotSymbol( PLOTTER* aPlotter, const wxPoint& aPosition, int aOrientation );

384 385 386 387 388 389 390 391
    /**
     * Get a list of pin orientation names.
     *
     * @return List of valid pin orientation names.
     */
    static wxArrayString GetOrientationNames();

    /**
392
     * Get a list of pin orientation bitmaps for menus and dialogs.
393 394 395
     *
     * @return  List of valid pin orientation bitmaps symbols in .xpm format
     */
396
    static const BITMAP_DEF* GetOrientationSymbols();
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427

    /**
     * Get the orientation code by index used to set the pin orientation.
     *
     * @param aIndex - The index of the orientation code to look up.
     * @return Orientation code if index is valid.  Returns right
     *         orientation on index error.
     */
    static int GetOrientationCode( int aIndex );

    /**
     * Get the index of the orientation code.
     *
     * @param aCode - The orientation code to look up.
     * @return  The index of the orientation code if found.  Otherwise,
     *          return wxNOT_FOUND.
     */
    static int GetOrientationCodeIndex( int aCode );

    /**
     * Get a list of pin draw style names.
     *
     * @return  List of valid pin draw style names.
     */
    static wxArrayString GetStyleNames();

    /**
     * Get a list of pin styles bitmaps for menus and dialogs.
     *
     * @return  List of valid pin electrical type bitmaps symbols in .xpm format.
     */
428
    static const BITMAP_DEF* GetStyleSymbols();
429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459

    /**
     * Get the pin draw style code by index used to set the pin draw style.
     *
     * @param aIndex - The index of the pin draw style code to look up.
     * @return  Pin draw style code if index is valid.  Returns NONE
     *          style on index error.
     */
    static int GetStyleCode( int aIndex );

    /**
     * Get the index of the pin draw style code.
     *
     * @param aCode - The pin draw style code to look up.
     * @return The index of the pin draw style code if found.  Otherwise,
     *         return wxNOT_FOUND.
     */
    static int GetStyleCodeIndex( int aCode );

    /**
     * Get a list of pin electrical type names.
     *
     * @return  List of valid pin electrical type names.
     */
    static wxArrayString GetElectricalTypeNames();

    /**
     * Get a list of pin electrical bitmaps for menus and dialogs.
     *
     * @return  List of valid pin electrical type bitmaps symbols in .xpm format
     */
460
    static const BITMAP_DEF* GetElectricalTypeSymbols();
461

462
    void SetOffset( const wxPoint& aOffset );
463

464
    bool Inside( EDA_RECT& aRect ) const;
465

466
    void Move( const wxPoint& aPosition );
467

468
    wxPoint GetPosition() const { return m_position; }
469

470
    void MirrorHorizontal( const wxPoint& aCenter );
471

472
    void MirrorVertical( const wxPoint& aCenter );
473

474
    void Rotate( const wxPoint& aCenter, bool aRotateCCW = true );
475

476 477
    void Plot( PLOTTER* aPlotter, const wxPoint& aOffset, bool aFill,
               const TRANSFORM& aTransform );
478

479
    int GetWidth() const { return m_width; }
480

481
    void SetWidth( int aWidth );
482

483
    BITMAP_DEF GetMenuImage() const;
484

485
    wxString GetSelectMenuText() const;
486

487
    EDA_ITEM* Clone() const;
488

489
private:
490 491

    /**
492
     * @copydoc LIB_ITEM::compare()
493
     *
494
     * The pin specific sort order is as follows:
495 496 497 498 499
     *      - Pin number.
     *      - Pin name, case insensitive compare.
     *      - Pin horizontal (X) position.
     *      - Pin vertical (Y) position.
     */
500
    int compare( const LIB_ITEM& aOther ) const;
501 502 503 504
};


#endif  //  CLASS_PIN_H